ZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vYWFjRGVjb2Rlci5wZGYgYi9kb2N1bWVudGF0aW9uL2FhY0RlY29kZXIucGRmCmluZGV4IGQzODg1NzYuLjQ1OGZkYTEgMTAwNjQ0Ci0tLSBhL2RvY3VtZW50YXRpb24vYWFjRGVjb2Rlci5wZGYKKysrIGIvZG9jdW1lbnRhdGlvbi9hYWNEZWNvZGVyLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oIGIvbGliQUFDZGVjL2luY2x1ZGUvYWFjZGVjb2Rlcl9saWIuaAppbmRleCBhMGMwODU0Li43YWI2MGYxIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvaW5jbHVkZS9hYWNkZWNvZGVyX2xpYi5oCisrKyBiL2xpYkFBQ2RlYy9pbmNsdWRlL2FhY2RlY29kZXJfbGliLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTM3OCw2ICszNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGV4aXN0LiAqLwogICBBQUNfREVDX05FRURfVE9fUkVTVEFSVCAgICAgICAgICAgICAgICA9IDB4MjAwQiwgIC8qITwgVGhlIGRlY29kZXIgbmVlZHMgdG8gYmUgcmVzdGFydGVkLCBzaW5jZSB0aGUgcmVxdWllcmVkIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGNhbm5vdCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkLiAqLworICBBQUNfREVDX09VVFBVVF9CVUZGRVJfVE9PX1NNQUxMICAgICAgICA9IDB4MjAwQywgIC8qITwgVGhlIHByb3ZpZGVkIG91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsLiAqLwogICBhYWNfZGVjX2luaXRfZXJyb3JfZW5kICAgICAgICAgICAgICAgICA9IDB4MkZGRiwKIAogICAvKiBEZWNvZGUgZXJyb3JzLiBPdXRwdXQgYnVmZmVyIGlzIHZhbGlkIGJ1dCBjb25jZWFsZWQuICovCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNfcm9tLmNwcAppbmRleCA2MDdjYjNiLi5mM2M5YjVhIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY19yb20uY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjX3JvbS5jcHAKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTE2Nyw2ICsxNjcsMzYgQEAKIH0gOwogCiAKKy8qIDQxIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2XzEwMjRbNDJdID0KK3sKKyAgICAgMCwgICAgNCwgICAgOCwgICAxMiwgICAxNiwgICAyMCwgICAyNCwgICAyOCwgICAzMiwgICAzNiwgICA0MCwgICA0NCwKKyAgICA0OCwgICA1MiwgICA1NiwgICA2NCwgICA3MiwgICA4MCwgICA4OCwgICA5NiwgIDEwOCwgIDEyMCwgIDEzMiwgIDE0NCwKKyAgIDE1NiwgIDE3MiwgIDE4OCwgIDIxMiwgIDI0MCwgIDI3NiwgIDMyMCwgIDM4NCwgIDQ0OCwgIDUxMiwgIDU3NiwgIDY0MCwKKyAgIDcwNCwgIDc2OCwgIDgzMiwgIDg5NiwgIDk2MCwgMTAyNAorfTsKKy8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2XzEyOFsxM10gPQoreworICAgICAwLCAgICA0LCAgICA4LCAgIDEyLCAgIDE2LCAgIDIwLCAgIDI0LCAgIDMyLCAgIDQwLCAgIDQ4LCAgICA2NCwgIDkyLAorICAgMTI4Cit9OworCisvKiA0NyBzY2ZiYW5kcyovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0XzEwMjRbNDhdID0KK3sKKyAgICAgMCwgICA0LCAgIDgsICAxMiwgIDE2LCAgMjAsICAyNCwgICAyOCwgIDMyLCAgMzYsICA0MCwgIDQ0LCAgNDgsICA1MiwKKyAgICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAxMDAsIDExMiwgIDEyNCwgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwKKyAgIDI2OCwgMzA0LCAzNDQsIDM4NCwgNDI0LCA0NjQsIDUwNCwgIDU0NCwgNTg0LCA2MjQsIDY2NCwgNzA0LCA3NDQsIDc4NCwKKyAgIDgyNCwgODY0LCA5MDQsIDk0NCwgOTg0LDEwMjQKK307CisKKy8qIDEyIHNjZmJhbmRzICovCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0XzEyOFsxM10gPQoreworICAgICAwLCAgIDQsICAgOCwgIDEyLCAgMTYsICAyMCwgIDI0LAorICAgIDMyLCAgNDAsICA0OCwgIDY0LCAgOTIsIDEyOAorfTsKIAogLyogNDkgc2NmYmFuZHMgKi8KIHN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNDhfMTAyNFs1MF0gPSB7CkBAIC0yMzksNiArMjY5LDM1IEBACiB9OwogCiAKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfOTZfOTYwWzQyXSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMjgsICAgICAzMiwgICAgIDM2LAorICA0MCwgICAgIDQ0LCAgICAgNDgsICAgICA1MiwgICAgIDU2LCAgICAgNjQsICAgICA3MiwgICAgIDgwLCAgICAgODgsICAgICA5NiwKKyAgMTA4LCAgICAxMjAsICAgIDEzMiwgICAgMTQ0LCAgICAxNTYsICAgIDE3MiwgICAgMTg4LCAgICAyMTIsICAgIDI0MCwgICAgMjc2LAorICAzMjAsICAgIDM4NCwgICAgNDQ4LCAgICA1MTIsICAgIDU3NiwgICAgNjQwLCAgICA3MDQsICAgIDc2OCwgICAgODMyLCAgICA4OTYsCisgIDk2MAorfTsgICAvKiA0MCBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzk2XzEyMFsxM10gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDMyLCAgICAgNDAsICAgICA0OCwKKyAgNjQsICAgICA5MiwgICAgIDEyMAorfTsgICAvKiAxMiBzY2ZiYW5kcyAqLworCitzdGF0aWMgY29uc3QgU0hPUlQgc2ZiXzY0Xzk2MFs0N10gPQoreworICAwLCAgICAgIDQsICAgICAgOCwgICAgICAxMiwgICAgIDE2LCAgICAgMjAsICAgICAyNCwgICAgIDI4LCAgICAgMzIsICAgICAzNiwKKyAgNDAsICAgICA0NCwgICAgIDQ4LCAgICAgNTIsICAgICA1NiwgICAgIDY0LCAgICAgNzIsICAgICA4MCwgICAgIDg4LCAgICAgMTAwLAorICAxMTIsICAgIDEyNCwgICAgMTQwLCAgICAxNTYsICAgIDE3MiwgICAgMTkyLCAgICAyMTYsICAgIDI0MCwgICAgMjY4LCAgICAzMDQsCisgIDM0NCwgICAgMzg0LCAgICA0MjQsICAgIDQ2NCwgICAgNTA0LCAgICA1NDQsICAgIDU4NCwgICAgNjI0LCAgICA2NjQsICAgIDcwNCwKKyAgNzQ0LCAgICA3ODQsICAgIDgyNCwgICAgODY0LCAgICA5MDQsICAgIDk0NCwgICAgOTYwCit9OyAgIC8qIDQ2IHNjZmJhbmRzICovCisKK3N0YXRpYyBjb25zdCBTSE9SVCBzZmJfNjRfMTIwWzEzXSA9Cit7CisgIDAsICAgICAgNCwgICAgICA4LCAgICAgIDEyLCAgICAgMTYsICAgICAyMCwgICAgIDI0LCAgICAgMzIsICAgICA0MCwgICAgIDQ4LAorICA2NCwgICAgIDkyLCAgICAgMTIwCit9OyAgIC8qIDEyIHNjZmJhbmRzICovCiAKIHN0YXRpYyBjb25zdCBTSE9SVCBzZmJfNDhfOTYwWzUwXSA9CiB7CkBAIC0zNTgsOSArNDE3LDkgQEAKIGNvbnN0IFNGQl9JTkZPIHNmYk9mZnNldFRhYmxlc1s1XVsxNl0gPQogewogICB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfOTZfMTAyNCwgc2ZiXzk2XzEyOCwgNDEsIDEyIH0sCisgICAgeyBzZmJfOTZfMTAyNCwgc2ZiXzk2XzEyOCwgNDEsIDEyIH0sCisgICAgeyBzZmJfNjRfMTAyNCwgc2ZiXzY0XzEyOCwgNDcsIDEyIH0sCiAgICAgeyBzZmJfNDhfMTAyNCwgc2ZiXzQ4XzEyOCwgNDksIDE0IH0sCiAgICAgeyBzZmJfNDhfMTAyNCwgc2ZiXzQ4XzEyOCwgNDksIDE0IH0sCiAgICAgeyBzZmJfMzJfMTAyNCwgc2ZiXzQ4XzEyOCwgNTEsIDE0IH0sCkBAIC0zNzIsOSArNDMxLDkgQEAKICAgICB7IHNmYl84XzEwMjQsIHNmYl84XzEyOCwgNDAsIDE1IH0sCiAgICAgeyBzZmJfOF8xMDI0LCBzZmJfOF8xMjgsIDQwLCAxNSB9LAogICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfOTZfOTYwLCBzZmJfOTZfMTIwLCA0MCwgMTIgfSwKKyAgICB7IHNmYl85Nl85NjAsIHNmYl85Nl8xMjAsIDQwLCAxMiB9LAorICAgIHsgc2ZiXzY0Xzk2MCwgc2ZiXzY0XzEyMCwgNDYsIDEyIH0sCiAgICAgeyBzZmJfNDhfOTYwLCBzZmJfNDhfMTIwLCA0OSwgMTQgfSwKICAgICB7IHNmYl80OF85NjAsIHNmYl80OF8xMjAsIDQ5LCAxNCB9LAogICAgIHsgc2ZiXzMyXzk2MCwgc2ZiXzQ4XzEyMCwgNDksIDE0IH0sCkBAIC0zODgsOSArNDQ3LDkgQEAKICAgfSwgewogICAgIHsgTlVMTCwgTlVMTCwgMCwgMCB9LAogICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfNDhfNTEyLCAgTlVMTCwgMzYsIDAgfSwKKyAgICB7IHNmYl80OF81MTIsICBOVUxMLCAzNiwgMCB9LAorICAgIHsgc2ZiXzQ4XzUxMiwgIE5VTEwsIDM2LCAwIH0sCiAgICAgeyBzZmJfNDhfNTEyLCAgTlVMTCwgMzYsIDAgfSwKICAgICB7IHNmYl80OF81MTIsIE5VTEwsIDM2LCAwfSwKICAgICB7IHNmYl8zMl81MTIsIE5VTEwsIDM3LCAwIH0sCkBAIC00MDIsOSArNDYxLDkgQEAKICAgICB7IHNmYl8yNF81MTIsIE5VTEwsIDMxLCAwIH0sCiAgICAgeyBzZmJfMjRfNTEyLCBOVUxMLCAzMSwgMCB9LAogICB9LCB7Ci0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCi0gICAgeyBOVUxMLCBOVUxMLCAwLCAwIH0sCisgICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAorICAgIHsgc2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDAgfSwKKyAgICB7IHNmYl80OF80ODAsIE5VTEwsIDM1LCAwIH0sCiAgICAgeyBzZmJfNDhfNDgwLCBOVUxMLCAzNSwgMCB9LAogICAgIHsgc2ZiXzQ4XzQ4MCwgTlVMTCwgMzUsIDAgfSwKICAgICB7IHNmYl8zMl80ODAsIE5VTEwsIDM3LCAwIH0sCmRpZmYgLS1naXQgYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwIGIvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmNwcAppbmRleCA4MjcwZjY5Li41NzllNDcwIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuY3BwCisrKyBiL2xpYkFBQ2RlYy9zcmMvYWFjZGVjb2Rlci5jcHAKQEAgLTE1Nyw2ICsxNTcsNyBAQAogCiAjaW5jbHVkZSAiY29uY2VhbC5oIgogCisgICNpbmNsdWRlICJGREtfY3JjLmgiCiAKIAogdm9pZCBDQWFjRGVjb2Rlcl9TeW5jUW1mTW9kZShIQU5ETEVfQUFDREVDT0RFUiBzZWxmKQpAQCAtNTM3LDggKzUzOCw5IEBACiAgICAgICAgICAgICAgICAgcHJldmlvdXNfZWxlbWVudCwKICAgICAgICAgICAgICAgICBlbEluZGV4LAogICAgICAgICAgICAgICAgIHNlbGYtPmZsYWdzICYgQUNfSU5ERVAgKTsKLSAgICAgICAgLyogRW5hYmxlIFNCUiBmb3IgaW1wbGljaXQgU0JSIHNpZ25hbGxpbmcuICovCi0gICAgICAgIGlmIChzYnJFcnJvciA9PSBTQlJERUNfT0spIHsKKyAgICAgICAgLyogRW5hYmxlIFNCUiBmb3IgaW1wbGljaXQgU0JSIHNpZ25hbGxpbmcgYnV0IG9ubHkgaWYgbm8gc2V2ZXJlIGVycm9yIGhhcHBlbmQuICovCisgICAgICAgIGlmICggKHNickVycm9yID09IFNCUkRFQ19PSykKKyAgICAgICAgICB8fCAoc2JyRXJyb3IgPT0gU0JSREVDX1BBUlNFX0VSUk9SKSApIHsKICAgICAgICAgICBzZWxmLT5zYnJFbmFibGVkID0gMTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKQEAgLTU1Myw3ICs1NTUsNyBAQAogICAgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsICpjb3VudCk7CiAgICAgICAgICpjb3VudCA9IDA7CiAgICAgICB9IGVsc2UgewotICAgICAgICAvKiBJZiB0aGlzIGlzIG5vdCBhIGZpbGwgZWxlbWVudCB3aXRoIGEga25vd24gbGVuZ3RoLCB3ZSBhcmUgc2NyZXdlZCBhbiBubyBmdXJ0aGVyIHBhcnNpbmcgbWFrZXMgc2Vuc2UuICovCisgICAgICAgIC8qIElmIHRoaXMgaXMgbm90IGEgZmlsbCBlbGVtZW50IHdpdGggYSBrbm93biBsZW5ndGgsIHdlIGFyZSBzY3Jld2VkIGFuZCBmdXJ0aGVyIHBhcnNpbmcgbWFrZXMgbm8gc2Vuc2UuICovCiAgICAgICAgIGlmIChzYnJFcnJvciAhPSBTQlJERUNfT0spIHsKICAgICAgICAgICBzZWxmLT5mcmFtZU9LID0gMDsKICAgICAgICAgfQpAQCAtODMyLDEyICs4MzQsMTggQEAKICAgc3dpdGNoIChhc2MtPm1fYW90KSB7CiAgIGNhc2UgQU9UX0FBQ19MQzoKICAgICBzZWxmLT5zdHJlYW1JbmZvLnByb2ZpbGUgPSAxOwotICAgIGJyZWFrOworCisgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgorICAgIGlmIChhc2MtPm1fc2MubV9nYVNwZWNpZmljQ29uZmlnLm1fbGF5ZXIgPiAwKSB7CisgICAgICAvKiBhYWNfc2NhbGFibGVfZXh0ZW5zaW9uX2VsZW1lbnQoKSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC4gKi8KKyAgICAgIHJldHVybiBBQUNfREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgICB9CiAKICAgY2FzZSBBT1RfU0JSOgogICBjYXNlIEFPVF9QUzoKICAgY2FzZSBBT1RfRVJfQUFDX0xEOgogICBjYXNlIEFPVF9FUl9BQUNfRUxEOgorICBjYXNlIEFPVF9EUk1fQUFDOgogICAgIGJyZWFrOwogCiAgIGRlZmF1bHQ6CkBAIC05NTcsMTEgKzk2NSwyMCBAQAogCiAgIGlmIChhc2MtPm1fYW90ID09IEFPVF9FUl9BQUNfRUxEKSB7CiAgICAgc2VsZi0+ZmxhZ3MgfD0gIEFDX0VMRDsKKyAgICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3NiclByZXNlbnRGbGFnKSA/IEFDX1NCUl9QUkVTRU5UIDogMDsgIC8qIE5lZWQgdG8gc2V0IHRoZSBTQlIgZmxhZyBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29ucy4gRXZlbiBpZiBTQlIgaXMgbm90IHN1cHBvcnRlZC4gKi8KICAgICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX3NjLm1fZWxkU3BlY2lmaWNDb25maWcubV9zYnJDcmNGbGFnKSA/IEFDX1NCUkNSQyA6IDA7CiAgICAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9zYy5tX2VsZFNwZWNpZmljQ29uZmlnLm1fdXNlTGRRbWZUaW1lQWxpZ24pID8gQUNfTERfTVBTIDogMDsKICAgfQogICBzZWxmLT5mbGFncyB8PSAoYXNjLT5tX2FvdCA9PSBBT1RfRVJfQUFDX0xEKSA/IEFDX0xEIDogMDsKICAgc2VsZi0+ZmxhZ3MgfD0gKGFzYy0+bV9lcENvbmZpZyA+PSAwKSA/IEFDX0VSIDogMDsKKyAgaWYgKCBhc2MtPm1fYW90ID09IEFPVF9EUk1fQUFDICkgeworICAgIHNlbGYtPmZsYWdzIHw9IEFDX0RSTXxBQ19TQlJDUkN8QUNfU0NBTEFCTEU7CisgIH0KKyAgaWYgKCAoYXNjLT5tX2FvdCA9PSBBT1RfQUFDX1NDQUwpCisgICAgfHwgKGFzYy0+bV9hb3QgPT0gQU9UX0VSX0FBQ19TQ0FMKSApIHsKKyAgICBzZWxmLT5mbGFncyB8PSBBQ19TQ0FMQUJMRTsKKyAgfQogCiAKICAgaWYgKGFzYy0+bV9zYnJQcmVzZW50RmxhZykgewpAQCAtMTE0Nyw2ICsxMTY0LDkgQEAKIAogICAvKiBDaGVjayBzYW1wbGluZyBmcmVxdWVuY3kgICovCiAgIHN3aXRjaCAoIHNlbGYtPnN0cmVhbUluZm8uYWFjU2FtcGxlUmF0ZSApIHsKKyAgICBjYXNlIDk2MDAwOgorICAgIGNhc2UgODgyMDA6CisgICAgY2FzZSA2NDAwMDoKICAgICBjYXNlIDE2MDAwOgogICAgIGNhc2UgMTIwMDA6CiAgICBjYXNlIDExMDI1OgpAQCAtMTQ3NSw3ICsxNDk1LDcgQEAKICAgICAgICAgICAvKiBnZXQgdGhlIHJlbWFpbmluZyBiaXRzIG9mIHRoaXMgZnJhbWUgKi8KICAgICAgICAgICBiaXRDbnQgPSB0cmFuc3BvcnREZWNfR2V0QXVCaXRzUmVtYWluaW5nKHNlbGYtPmhJbnB1dCwgMCk7CiAKLSAgICAgICAgICBpZiAoIChiaXRDbnQgPiAwKSAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgJiYgKHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0VMRCkpICkKKyAgICAgICAgICBpZiAoIChiaXRDbnQgPiAwKSAmJiAoc2VsZi0+ZmxhZ3MgJiBBQ19TQlJfUFJFU0VOVCkgJiYgKHNlbGYtPmZsYWdzICYgKEFDX1VTQUN8QUNfUlNWRDUwfEFDX0VMRHxBQ19EUk0pKSApCiAgICAgICAgICAgewogICAgICAgICAgICAgU0JSX0VSUk9SIGVyciA9IFNCUkRFQ19PSzsKICAgICAgICAgICAgIGludCAgZWxJZHgsIG51bUNoRWxlbWVudHMgPSBlbF9jbnRbSURfU0NFXSArIGVsX2NudFtJRF9DUEVdOwpAQCAtMTUxMyw2ICsxNTMzLDEzIEBACiAgICAgICAgICAgfQogCiAKKyAgICAgICAgICBpZiAoc2VsZi0+ZmxhZ3MgJiBBQ19EUk0pCisgICAgICAgICAgeworICAgICAgICAgICAgaWYgKChiaXRDbnQgPSAoSU5UKUZES2dldFZhbGlkQml0cyhicykpICE9IDApIHsKKyAgICAgICAgICAgICAgRkRLcHVzaEJpRGlyZWN0aW9uYWwoYnMsIGJpdENudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCiAgICAgICAgICAgaWYgKCAhIChzZWxmLT5mbGFncyAmIChBQ19VU0FDfEFDX1JTVkQ1MHxBQ19EUk0pKSApCiAgICAgICAgICAgewogICAgICAgICAgICAgd2hpbGUgKCBiaXRDbnQgPiA3ICkgewpkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyLmggYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaAppbmRleCAzNTQxNzczLi4yNWJjMzVkIDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXIuaApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMjI2LDYgKzIyNiw4IEBACiAgIEZJWFBfREJMICAgICBleHRHYWluWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qITwgR2FpbiB0aGF0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgb3V0cHV0IHNpZ25hbC4gKi8KICAgVUlOVCAgICAgICAgIGV4dEdhaW5EZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgLyohPCBEZWxheSB0aGF0IG11c3QgYmUgYWNjb3VudGVkIGZvciBleHRHYWluLiAqLwogCisgIElOVF9QQ00gICAgICBwY21PdXRwdXRCdWZmZXJbKDgpKigyMDQ4KV07CisKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9hYWNkZWNvZGVyX2xpYi5jcHAgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcAppbmRleCBiNTAxZWI5Li44ODYzZGE1IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2FhY2RlY29kZXJfbGliLmNwcApAQCAtMTEwLDcgKzExMCw3IEBACiAvKiBEZWNvZGVyIGxpYnJhcnkgaW5mbyAqLwogI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDAgMgogI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDEgNQotI2RlZmluZSBBQUNERUNPREVSX0xJQl9WTDIgMTEKKyNkZWZpbmUgQUFDREVDT0RFUl9MSUJfVkwyIDE3CiAjZGVmaW5lIEFBQ0RFQ09ERVJfTElCX1RJVExFICJBQUMgRGVjb2RlciBMaWIiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgQUFDREVDT0RFUl9MSUJfQlVJTERfREFURSAiIgpAQCAtMTgxLDggKzE4MSw5IEBACiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgLyogaWYgYmFzZWxheWVyIGlzIE9LIHdlIGNvbnRpbnVlIGRlY29kaW5nICovCi0gICAgICAgIGlmKGxheWVyICA+PSAxKXsKKyAgICAgICAgaWYobGF5ZXIgPj0gMSl7CiAgICAgICAgICAgc2VsZi0+bnJPZkxheWVycyA9IGxheWVyOworICAgICAgICAgIGVyciA9IEFBQ19ERUNfT0s7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC03ODUsOCArNzg2LDggQEAKIAogTElOS1NQRUNfQ1BQIEFBQ19ERUNPREVSX0VSUk9SIGFhY0RlY29kZXJfRGVjb2RlRnJhbWUoCiAgICAgICAgIEhBTkRMRV9BQUNERUNPREVSICBzZWxmLAotICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhLAotICAgICAgICBjb25zdCBJTlQgICAgICAgICAgdGltZURhdGFTaXplLAorICAgICAgICBJTlRfUENNICAgICAgICAgICAqcFRpbWVEYXRhX2V4dGVybiwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgIHRpbWVEYXRhU2l6ZV9leHRlcm4sCiAgICAgICAgIGNvbnN0IFVJTlQgICAgICAgICBmbGFncykKIHsKICAgICBBQUNfREVDT0RFUl9FUlJPUiBFcnJvclN0YXR1czsKQEAgLTc5NiwxMiArNzk3LDE3IEBACiAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzOwogICAgIGludCBmVHBJbnRlcnJ1cHRpb24gPSAwOyAgLyogVHJhbnNwb3J0IG9yaWdpbmF0ZWQgaW50ZXJydXB0aW9uIGRldGVjdGlvbi4gKi8KICAgICBpbnQgZlRwQ29uY2VhbCA9IDA7ICAgICAgIC8qIFRyYW5zcG9ydCBvcmlnaW5hdGVkIGNvbmNlYWxtZW50LiAqLworICAgIElOVF9QQ00gKnBUaW1lRGF0YSA9IE5VTEw7CisgICAgSU5UIHRpbWVEYXRhU2l6ZSA9IDA7CiAKIAogICAgIGlmIChzZWxmID09IE5VTEwpIHsKICAgICAgIHJldHVybiBBQUNfREVDX0lOVkFMSURfSEFORExFOwogICAgIH0KIAorICAgIHBUaW1lRGF0YSA9IHNlbGYtPnBjbU91dHB1dEJ1ZmZlcjsKKyAgICB0aW1lRGF0YVNpemUgPSBzaXplb2Yoc2VsZi0+cGNtT3V0cHV0QnVmZmVyKS9zaXplb2YoKnNlbGYtPnBjbU91dHB1dEJ1ZmZlcik7CisKICAgICBpZiAoZmxhZ3MgJiBBQUNERUNfSU5UUikgewogICAgICAgc2VsZi0+c3RyZWFtSW5mby5udW1Mb3N0QWNjZXNzVW5pdHMgPSAwOwogICAgIH0KQEAgLTkxOCw3ICs5MjQsOCBAQAogICAgIGlmIChzZWxmLT5zYnJFbmFibGVkKQogICAgIHsKICAgICAgIFNCUl9FUlJPUiBzYnJFcnJvciA9IFNCUkRFQ19PSzsKLSAgICAgIGludCBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM8NykpID8gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscyA6IHNlbGYtPmNoTWFwSW5kZXg7CisgICAgICBpbnQgY2hJZHgsIG51bUNvcmVDaGFubmVsID0gc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVsczsKKyAgICAgIGludCBjaE91dE1hcElkeCA9ICgoc2VsZi0+Y2hNYXBJbmRleD09MCkgJiYgKG51bUNvcmVDaGFubmVsPDcpKSA/IG51bUNvcmVDaGFubmVsIDogc2VsZi0+Y2hNYXBJbmRleDsKIAogICAgICAgLyogc2V0IHBhcmFtcyAqLwogICAgICAgc2JyRGVjb2Rlcl9TZXRQYXJhbSAoIHNlbGYtPmhTYnJEZWNvZGVyLApAQCAtOTc4LDEwICs5ODUsMTAgQEAKIAogICAgICAgIGlmIChzZWxmLT5wc1Bvc3NpYmxlKSB7CiAgICAgICAgICBzZWxmLT5mbGFncyB8PSBBQ19QU19QUkVTRU5UOwotICAgICAgICAgc2VsZi0+Y2hhbm5lbFR5cGVbMF0gPSBBQ1RfRlJPTlQ7Ci0gICAgICAgICBzZWxmLT5jaGFubmVsVHlwZVsxXSA9IEFDVF9GUk9OVDsKLSAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzWzBdID0gMDsKLSAgICAgICAgIHNlbGYtPmNoYW5uZWxJbmRpY2VzWzFdID0gMTsKKyAgICAgICB9CisgICAgICAgZm9yIChjaElkeCA9IG51bUNvcmVDaGFubmVsOyBjaElkeCA8IHNlbGYtPnN0cmVhbUluZm8ubnVtQ2hhbm5lbHM7IGNoSWR4Kz0xKSB7CisgICAgICAgICBzZWxmLT5jaGFubmVsVHlwZVtjaElkeF0gPSBBQ1RfRlJPTlQ7CisgICAgICAgICBzZWxmLT5jaGFubmVsSW5kaWNlc1tjaElkeF0gPSBjaElkeDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KQEAgLTEwMDYsNyArMTAxMyw4IEBACiAgICAgICAgICAgICBzZWxmLT5jaGFubmVsT3V0cHV0TWFwcGluZywKICAgICAgICAgICAgIChzZWxmLT5saW1pdGVyRW5hYmxlQ3VycikgPyAmcGNtTGltaXRlclNjYWxlIDogTlVMTAogICAgICAgKTsKLSAgICBpZiAoZG14RXJyID09IFBDTURNWF9JTlZBTElEX01PREUpIHsKKyAgICBpZiAoIChFcnJvclN0YXR1cyA9PSBBQUNfREVDX09LKQorICAgICAgJiYgKGRteEVyciA9PSBQQ01ETVhfSU5WQUxJRF9NT0RFKSApIHsKICAgICAgIC8qIEFubm91bmNlIHRoZSBmcmFtZXdvcmsgdGhhdCB0aGUgY3VycmVudCBjb21iaW5hdGlvbiBvZiBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIGRvd25taXgKICAgICAgICAqIHNldHRpbmdzIGFyZSBub3Qga25vdyB0byBwcm9kdWNlIGEgcHJlZGljdGFibGUgYmVoYXZpb3IgYW5kIHRodXMgbWF5YmUgcHJvZHVjZSBzdHJhbmdlIG91dHB1dC4gKi8KICAgICAgIEVycm9yU3RhdHVzID0gQUFDX0RFQ19ERUNPREVfRlJBTUVfRVJST1I7CkBAIC0xMDUxLDYgKzEwNTksMTkgQEAKICAgICAvKiBVcGRhdGUgU3RhdGlzdGljcyAqLwogICAgIGFhY0RlY29kZXJfVXBkYXRlQml0U3RyZWFtQ291bnRlcnMoJnNlbGYtPnN0cmVhbUluZm8sIGhCcywgbkJpdHMsIEVycm9yU3RhdHVzKTsKIAorICAgIC8qIENoZWNrIHdoZXRoZXIgZXh0ZXJuYWwgb3V0cHV0IGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2guICovCisgICAgaWYgKHRpbWVEYXRhU2l6ZV9leHRlcm4gPCBzZWxmLT5zdHJlYW1JbmZvLm51bUNoYW5uZWxzKnNlbGYtPnN0cmVhbUluZm8uZnJhbWVTaXplKSB7CisgICAgICBFcnJvclN0YXR1cyA9IEFBQ19ERUNfT1VUUFVUX0JVRkZFUl9UT09fU01BTEw7CisgICAgfQorCisgICAgLyogVXBkYXRlIGV4dGVybmFsIG91dHB1dCBidWZmZXIuICovCisgICAgaWYgKCBJU19PVVRQVVRfVkFMSUQoRXJyb3JTdGF0dXMpICkgeworICAgICAgRkRLbWVtY3B5KHBUaW1lRGF0YV9leHRlcm4sIHBUaW1lRGF0YSwgc2VsZi0+c3RyZWFtSW5mby5udW1DaGFubmVscypzZWxmLT5zdHJlYW1JbmZvLmZyYW1lU2l6ZSpzaXplb2YoKnBUaW1lRGF0YSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEZES21lbWNsZWFyKHBUaW1lRGF0YV9leHRlcm4sIHRpbWVEYXRhU2l6ZV9leHRlcm4qc2l6ZW9mKCpwVGltZURhdGFfZXh0ZXJuKSk7CisgICAgfQorCiAgICAgcmV0dXJuIEVycm9yU3RhdHVzOwogfQogCkBAIC0xMTIwLDYgKzExNDEsNyBAQAogICAvKiBTZXQgZmxhZ3MgKi8KICAgaW5mby0+ZmxhZ3MgPSAwCiAgICAgICB8IENBUEZfQUFDX0xDCisgICAgICB8IENBUEZfRVJfQUFDX1NDQUwKICAgICAgIHwgQ0FQRl9BQUNfVkNCMTEKICAgICAgIHwgQ0FQRl9BQUNfSENSCiAgICAgICB8IENBUEZfQUFDX1JWTEMKQEAgLTExMzAsNiArMTE1Miw3IEBACiAKICAgICAgIHwgQ0FQRl9BQUNfTVBFRzQKIAorICAgICAgfCBDQVBGX0FBQ19EUk1fQlNGT1JNQVQKIAogICAgICAgfCBDQVBGX0FBQ18xMDI0CiAgICAgICB8IENBUEZfQUFDXzk2MApkaWZmIC0tZ2l0IGEvbGliQUFDZGVjL3NyYy9ibG9jay5jcHAgYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcAppbmRleCA5ZDcwM2NjLi4yOTY1ZmE2IDEwMDY0NAotLS0gYS9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcAorKysgYi9saWJBQUNkZWMvc3JjL2Jsb2NrLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMzI0LDExICszMjQsMTEgQEAKIAogICAgICAgaWYgKGZsYWdzICYgQUNfRVJfSENSKSB7CiAgICAgICAgIC8qIEhDUiBpbnB1dCAobG9uZykgLS0gY29sbGVjdGluZyBzaWRlaW5mbyAoZm9yIEhDUi1fbG9uZ18gb25seSkgKi8KLSAgICAgICAgcE51bUxpbmVzSW5TZWNbbnVtTGluZXNJblNlY0lkeF0gPSBCYW5kT2Zmc2V0c1t0b3BdIC0gQmFuZE9mZnNldHNbYmFuZF07Ci0gICAgICAgIG51bUxpbmVzSW5TZWNJZHgrKzsKICAgICAgICAgaWYgKG51bUxpbmVzSW5TZWNJZHggPj0gTUFYX1NGQl9IQ1IpIHsKICAgICAgICAgICByZXR1cm4gQUFDX0RFQ19QQVJTRV9FUlJPUjsKICAgICAgICAgfQorICAgICAgICBwTnVtTGluZXNJblNlY1tudW1MaW5lc0luU2VjSWR4XSA9IEJhbmRPZmZzZXRzW3RvcF0gLSBCYW5kT2Zmc2V0c1tiYW5kXTsKKyAgICAgICAgbnVtTGluZXNJblNlY0lkeCsrOwogICAgICAgICBpZiAoCiAgICAgICAgICAgICAgKHNlY3RfY2IgPT0gQk9PS1NDTCkgKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2FhY2VuYy5oIGIvbGliQUFDZW5jL3NyYy9hYWNlbmMuaAppbmRleCA2MTUyMGRlLi43OTUyNGI1IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2FhY2VuYy5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jLmgKQEAgLTk4LDYgKzk4LDExIEBACiAKICNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIgogCisjZGVmaW5lIEJJVFJFU19NQVhfTEQgICA0MDAwCisjZGVmaW5lIEJJVFJFU19NSU5fTEQgICAgNTAwCisjZGVmaW5lIEJJVFJBVEVfTUFYX0xEIDcwMDAwIC8qIE1heCBhc3N1bWVkIGJpdHJhdGUgZm9yIGJpdHJlcyBjYWxjdWxhdGlvbiAqLworI2RlZmluZSBCSVRSQVRFX01JTl9MRCAxMjAwMCAvKiBNaW4gYXNzdW1lZCBiaXRyYXRlIGZvciBiaXRyZXMgY2FsY3VsYXRpb24gKi8KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfbGliLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX2xpYi5jcHAKaW5kZXggOWEzYjIxNC4uMjg0NTE3NyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfbGliLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2FhY2VuY19saWIuY3BwCkBAIC05OCw3ICs5OCw3IEBACiAvKiBFbmNvZGVyIGxpYnJhcnkgaW5mbyAqLwogI2RlZmluZSBBQUNFTkNPREVSX0xJQl9WTDAgMwogI2RlZmluZSBBQUNFTkNPREVSX0xJQl9WTDEgNAotI2RlZmluZSBBQUNFTkNPREVSX0xJQl9WTDIgMTkKKyNkZWZpbmUgQUFDRU5DT0RFUl9MSUJfVkwyIDIyCiAjZGVmaW5lIEFBQ0VOQ09ERVJfTElCX1RJVExFICJBQUMgRW5jb2RlciIKICNpZmRlZiBfX0FORFJPSURfXwogI2RlZmluZSBBQUNFTkNPREVSX0xJQl9CVUlMRF9EQVRFICIiCkBAIC04MTMsMTEgKzgxMywxNiBAQAogICAgIHN3aXRjaCAoIGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSApIHsKICAgICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6Ci0gICAgICAgIGlmIChjb25maWctPnVzZXJCaXRyYXRlTW9kZT09OCkgewotICAgICAgICAgIGhBYWNDb25maWctPmJpdHJhdGVNb2RlID0gMDsKLSAgICAgICAgfQogICAgICAgICBpZiAoY29uZmlnLT51c2VyQml0cmF0ZU1vZGU9PTApIHsKLSAgICAgICAgICBoQWFjQ29uZmlnLT5iaXRyZXNlcnZvaXIgPSAxMDAqY29uZmlnLT5uQ2hhbm5lbHM7IC8qIGRlZmF1bHQsIHJlZHVjZWQgYml0cmVzZXJ2b2lyICovCisgICAgICAgICAgLyogYml0cmVzZXJ2b2lyICA9IChtYXhCaXRSZXMtbWluQml0UmVzKS8obWF4Qml0UmF0ZS1taW5CaXRyYXRlKSooYml0UmF0ZS1taW5CaXRyYXRlKSttaW5CaXRSZXM7ICovCisgICAgICAgICAgaWYgKCBpc0xvd0RlbGF5KGhBYWNDb25maWctPmF1ZGlvT2JqZWN0VHlwZSkgKSB7CisgICAgICAgICAgICBJTlQgYml0cmVzZXJ2b2lyOworICAgICAgICAgICAgSU5UIGJyUGVyQ2hhbm5lbCA9IGhBYWNDb25maWctPmJpdFJhdGUvaEFhY0NvbmZpZy0+bkNoYW5uZWxzOworICAgICAgICAgICAgYnJQZXJDaGFubmVsICAgICA9IGZNaW4oQklUUkFURV9NQVhfTEQsIGZNYXgoQklUUkFURV9NSU5fTEQsIGJyUGVyQ2hhbm5lbCkpOworICAgICAgICAgICAgRklYUF9EQkwgc2xvcGUgICA9IGZEaXZOb3JtKChiclBlckNoYW5uZWwtQklUUkFURV9NSU5fTEQpLCBCSVRSQVRFX01BWF9MRC1CSVRSQVRFX01JTl9MRCk7IC8qIGNhbGMgc2xvcGUgZm9yIGludGVycG9sYXRpb24gKi8KKyAgICAgICAgICAgIGJpdHJlc2Vydm9pciAgICAgPSBmTXVsdEkoc2xvcGUsIChJTlQpKEJJVFJFU19NQVhfTEQtQklUUkVTX01JTl9MRCkpICsgQklUUkVTX01JTl9MRDsgLyogaW50ZXJwb2xhdGUgKi8KKyAgICAgICAgICAgIGhBYWNDb25maWctPmJpdHJlc2Vydm9pciA9IGJpdHJlc2Vydm9pciAmIH43OyAvKiBhbGlnbiB0byBieXRlcyAqLworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoaEFhY0NvbmZpZy0+Yml0cmF0ZU1vZGUhPTApIHsKICAgICAgICAgICByZXR1cm4gQUFDRU5DX0lOVkFMSURfQ09ORklHOwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmNwcCBiL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5jcHAKaW5kZXggODVhZWE2NS4uOWEwN2U4ZiAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2FhY2VuY190bnMuY3BwCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC05NSwxMyArOTUsNyBAQAogI2luY2x1ZGUgImFhY0VuY19yb20uaCIKICNpbmNsdWRlICJhYWNlbmNfdG5zLmgiCiAKLWVudW0gewotICAgIEhJRklMVCA9IDAsIC8qIGluZGV4IG9mIGhpZ2hlciBmaWx0ZXIgKi8KLSAgICBMT0ZJTFQgPSAxIC8qIGluZGV4IG9mIGxvd2VyIGZpbHRlciAqLwotfTsKLQotCi0jZGVmaW5lIEZJTFRFUl9ESVJFQ1RJT04gMAorI2RlZmluZSBGSUxURVJfRElSRUNUSU9OIDAgLyogMCA9IHVwLCAxID0gZG93biAqLwogCiBzdGF0aWMgY29uc3QgRklYUF9EQkwgYWNmV2luZG93TG9uZ1sxMiszKzFdID0gewogICAweDdmZmZmZmZmLDB4N2ZiODAwMDAsMHg3ZWUwMDAwMCwweDdkNzgwMDAwLDB4N2I4MDAwMDAsMHg3OGY4MDAwMCwweDc1ZTAwMDAwLDB4NzIzODAwMDAsCkBAIC0xMTIsMjAgKzEwNiw2IEBACiAgIDB4N2ZmZmZmZmYsMHg3ZTAwMDAwMCwweDc4MDAwMDAwLDB4NmUwMDAwMDAsMHg2MDAwMDAwMCwweDRlMDAwMDAwLDB4MzgwMDAwMDAsMHgxZTAwMDAwMAogfTsKIAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIElOVCAgICAgIGZpbHRlckVuYWJsZWRbTUFYX05VTV9PRl9GSUxURVJTXTsKLSAgSU5UICAgICAgdGhyZXNoT25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgICAgICAgICAgLyogbWluLiBwcmVkaWN0aW9uIGdhaW4gZm9yIHVzaW5nIHRucyBUQUJVTCovCi0gIElOVCAgICAgIGZpbHRlclN0YXJ0RnJlcVtNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgIC8qIGxvd2VzdCBmcmVxIGZvciBscGMgVEFCVUwqLwotICBJTlQgICAgICB0bnNMaW1pdE9yZGVyW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgICAvKiBMaW1pdCBmb3IgVE5TIG9yZGVyIFRBQlVMKi8KLSAgSU5UICAgICAgdG5zRmlsdGVyRGlyZWN0aW9uW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgLyogRmlsdGVyaW5nIGRpcmVjdGlvbiwgMD11cCwgMT1kb3duIFRBQlVMICovCi0gIElOVCAgICAgIGFjZlNwbGl0W01BWF9OVU1fT0ZfRklMVEVSU107Ci0gIEZJWFBfREJMIHRuc1RpbWVSZXNvbHV0aW9uW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgIC8qIFROUyBtYXguIHRpbWUgcmVzb2x1dGlvbiBUQUJVTC4gU2hvdWxkIGJlIGZyYWN0IGJ1dCBNU1ZDIHdvbid0IGNvbXBpbGUgdGhlbiAqLwotICBJTlQgICAgICBzZXBlcmF0ZUZpbHRlcnNBbGxvd2VkOwotCi19IFROU19QQVJBTUVURVJfVEFCVUxBVEVEOwotCi0KIHR5cGVkZWYgc3RydWN0ewogICBJTlQgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZUZyb21bMl07ICAvKiBub25lU2JyPTAsIHVzZVNicj0xICovCiAgIElOVCAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlVG9bMl07ICAgIC8qIG5vbmVTYnI9MCwgdXNlU2JyPTEgKi8KQEAgLTM3Myw2ICszNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmxvY2tUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpc0xvd0RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZFNiclByZXNlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyAqdEMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX0NPTkZJR1VSQVRJT04gKnBDLApAQCAtMzg1LDYgKzM2Niw4IEBACiAgIGlmIChjaGFubmVscyA8PSAwKQogICAgIHJldHVybiAoQUFDX0VOQ09ERVJfRVJST1IpMTsKIAorICB0Qy0+aXNMb3dEZWxheSA9IGlzTG93RGVsYXk7CisKICAgLyogaW5pdGlhbGl6ZSBUTlMgZmlsdGVyIGZsYWcsIG9yZGVyLCBhbmQgY29lZmZpY2llbnQgcmVzb2x1dGlvbiAoaW4gYml0cyBwZXIgY29lZmYpICovCiAgIHRDLT50bnNBY3RpdmUgICAgICA9IChhY3RpdmUpID8gVFJVRSA6IEZBTFNFOwogICB0Qy0+bWF4T3JkZXIgICAgICAgPSAoYmxvY2tUeXBlID09IFNIT1JUX1dJTkRPVykgPyA1IDogMTI7ICAvKiBtYXhpbXVtOiA3LCAyMCAqLwpAQCAtNDUwLDI3ICs0MzMsMTQgQEAKICAgICAgICAgY29uc3QgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQqIHBDZmcgPSBGREthYWNFbmNfR2V0VG5zUGFyYW0oYml0UmF0ZSwgY2hhbm5lbHMsIGxkU2JyUHJlc2VudCk7CiAKICAgICAgICAgaWYgKCBwQ2ZnICE9IE5VTEwgKSB7CisKKyAgICAgICAgICBGREttZW1jcHkoJih0Qy0+Y29uZlRhYiksIHBDZmcsIHNpemVvZih0Qy0+Y29uZlRhYikpOworCiAgICAgICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdICAgICAgICAgPSBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhwQ2ZnLT5maWx0ZXJTdGFydEZyZXFbSElGSUxUXSwgc2FtcGxlUmF0ZSwgcEMtPnNmYkNudCwgcEMtPnNmYk9mZnNldCk7CiAgICAgICAgICAgdEMtPmxwY1N0YXJ0TGluZVtISUZJTFRdICAgICAgICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbSElGSUxUXV07CiAgICAgICAgICAgdEMtPmxwY1N0YXJ0QmFuZFtMT0ZJTFRdICAgICAgICAgPSBGREthYWNFbmNfRnJlcVRvQmFuZFdpdGhSb3VuZGluZyhwQ2ZnLT5maWx0ZXJTdGFydEZyZXFbTE9GSUxUXSwgc2FtcGxlUmF0ZSwgcEMtPnNmYkNudCwgcEMtPnNmYk9mZnNldCk7CiAgICAgICAgICAgdEMtPmxwY1N0YXJ0TGluZVtMT0ZJTFRdICAgICAgICAgPSBwQy0+c2ZiT2Zmc2V0W3RDLT5scGNTdGFydEJhbmRbTE9GSUxUXV07CiAKLSAgICAgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltISUZJTFRdID0gcENmZy0+dGhyZXNoT25bSElGSUxUXTsKLSAgICAgICAgICB0Qy0+Y29uZlRhYi50aHJlc2hPbltMT0ZJTFRdID0gcENmZy0+dGhyZXNoT25bTE9GSUxUXTsKLQotICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSA9IHBDZmctPnRuc0xpbWl0T3JkZXJbSElGSUxUXTsKLSAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0xPRklMVF0gPSBwQ2ZnLT50bnNMaW1pdE9yZGVyW0xPRklMVF07Ci0KLSAgICAgICAgICB0Qy0+Y29uZlRhYi50bnNGaWx0ZXJEaXJlY3Rpb25bSElGSUxUXSA9IHBDZmctPnRuc0ZpbHRlckRpcmVjdGlvbltISUZJTFRdOwotICAgICAgICAgIHRDLT5jb25mVGFiLnRuc0ZpbHRlckRpcmVjdGlvbltMT0ZJTFRdID0gcENmZy0+dG5zRmlsdGVyRGlyZWN0aW9uW0xPRklMVF07Ci0KLSAgICAgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtISUZJTFRdID0gcENmZy0+YWNmU3BsaXRbSElGSUxUXTsKLSAgICAgICAgICB0Qy0+Y29uZlRhYi5hY2ZTcGxpdFtMT0ZJTFRdID0gcENmZy0+YWNmU3BsaXRbTE9GSUxUXTsKLQotICAgICAgICAgIHRDLT5jb25mVGFiLmZpbHRlckVuYWJsZWRbSElGSUxUXSA9IHBDZmctPmZpbHRlckVuYWJsZWRbSElGSUxUXTsKLSAgICAgICAgICB0Qy0+Y29uZlRhYi5maWx0ZXJFbmFibGVkW0xPRklMVF0gPSBwQ2ZnLT5maWx0ZXJFbmFibGVkW0xPRklMVF07Ci0gICAgICAgICAgdEMtPmNvbmZUYWIuc2VwZXJhdGVGaWx0ZXJzQWxsb3dlZCA9IHBDZmctPnNlcGVyYXRlRmlsdGVyc0FsbG93ZWQ7Ci0KICAgICAgICAgICBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KHRDLT5hY2ZXaW5kb3dbSElGSUxUXSwgdEMtPm1heE9yZGVyKzEsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIHBDZmctPnRuc1RpbWVSZXNvbHV0aW9uW0hJRklMVF0sIFROU19USU1FUkVTX1NDQUxFKTsKICAgICAgICAgICBGREthYWNFbmNfQ2FsY0dhdXNzV2luZG93KHRDLT5hY2ZXaW5kb3dbTE9GSUxUXSwgdEMtPm1heE9yZGVyKzEsIHNhbXBsZVJhdGUsIGdyYW51bGVMZW5ndGgsIHBDZmctPnRuc1RpbWVSZXNvbHV0aW9uW0xPRklMVF0sIFROU19USU1FUkVTX1NDQUxFKTsKICAgICAgICAgfQpAQCAtNjE0LDYgKzU4NCw3IEBACiAKIHN0YXRpYyB2b2lkIEZES2FhY0VuY19NZXJnZWRBdXRvQ29ycmVsYXRpb24oCiAgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAqc3BlY3RydW0sCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgaXNMb3dEZWxheSwKICAgICAgICAgY29uc3QgRklYUF9EQkwgICAgICAgICAgICBhY2ZXaW5kb3dbTUFYX05VTV9PRl9GSUxURVJTXVtUTlNfTUFYX09SREVSKzMrMV0sCiAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbHBjU3RhcnRMaW5lW01BWF9OVU1fT0ZfRklMVEVSU10sCiAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICAgbHBjU3RvcExpbmUsCkBAIC02MzMsNiArNjA0LDggQEAKICAgICBGREttZW1jbGVhcigmX3J4eDFbMF0sIHNpemVvZihGSVhQX0RCTCkqKG1heE9yZGVyKzEpKTsKICAgICBGREttZW1jbGVhcigmX3J4eDJbMF0sIHNpemVvZihGSVhQX0RCTCkqKG1heE9yZGVyKzEpKTsKIAorICAgIGlkeDAgPSBpZHgxID0gaWR4MiA9IGlkeDMgPSBpZHg0ID0gMDsKKwogICAgIC8qIE1EQ1QgbGluZSBpbmRpY2VzIHNlcGFyYXRpbmcgdGhlIDFzdCwgMm5kLCAzcmQsIGFuZCA0dGggYW5hbHlzaXMgcXVhcnRlcnMgKi8KICAgICBpZiAoIChhY2ZTcGxpdFtMT0ZJTFRdPT0tMSkgfHwgKGFjZlNwbGl0W0hJRklMVF09PS0xKSApIHsKICAgICAgIC8qIGF1dG9jb3JyZWxhdGlvbiBmdW5jdGlvbiBmb3IgMXN0LCAybmQsIDNyZCwgYW5kIDR0aCBxdWFydGVyIG9mIHRoZSBzcGVjdHJ1bSAqLwpAQCAtNjc2LDE3ICs2NDksMjcgQEAKICAgICAvKiBjb21wdXRlIGVuZXJneSBub3JtYWxpemF0aW9uIGZhY3RvcnMsIGkuIGUuIDEvZW5lcmd5IChzYXZlcyBzb21lIGRpdmlzaW9ucykgKi8KICAgICBpZiAocnh4MV8wICE9IEZMMkZYQ09OU1RfREJMKDAuZikpCiAgICAgewotICAgICAgICBJTlQgc2NfZmFjMSA9IC0xOwotICAgICAgICBGSVhQX0RCTCBmYWMxID0gRkRLYWFjRW5jX0F1dG9Db3JyTm9ybUZhYyhyeHgxXzAsICgoLTIqc2MxKStuc2MxKSwgJnNjX2ZhYzEpOwotICAgICAgICBfcnh4MVswXSA9IHNjYWxlVmFsdWUoZk11bHQocnh4MV8wLGZhYzEpLHNjX2ZhYzEpOworICAgICAgSU5UIHNjX2ZhYzEgPSAtMTsKKyAgICAgIEZJWFBfREJMIGZhYzEgPSBGREthYWNFbmNfQXV0b0NvcnJOb3JtRmFjKHJ4eDFfMCwgKCgtMipzYzEpK25zYzEpLCAmc2NfZmFjMSk7CisgICAgICBfcnh4MVswXSA9IHNjYWxlVmFsdWUoZk11bHQocnh4MV8wLGZhYzEpLHNjX2ZhYzEpOwogCisgICAgICBpZiAoaXNMb3dEZWxheSkKKyAgICAgIHsKICAgICAgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7CiAgICAgICAgICAgLyogY29tcHV0ZSBlbmVyZ3ktbm9ybWFsaXplZCBhbmQgd2luZG93ZWQgYXV0b2NvcnJlbGF0aW9uIHZhbHVlcyBhdCB0aGlzIGxhZyAqLworICAgICAgICAgIEZJWFBfREJMIHgxID0gRkRLYWFjRW5jX0NhbGNBdXRvQ29yclZhbHVlKHBTcGVjdHJ1bSwgaWR4MCwgaWR4MSwgbGFnLCBuc2MxKTsKKyAgICAgICAgICBfcnh4MVtsYWddID0gZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSxmYWMxKSxzY19mYWMxKSwgYWNmV2luZG93W0xPRklMVF1bbGFnXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgZm9yIChsYWcgPSAxOyBsYWcgPD0gbWF4T3JkZXI7IGxhZysrKSB7CiAgICAgICAgICAgaWYgKCgzICogbGFnKSA8PSBtYXhPcmRlciArIDMpIHsKICAgICAgICAgICAgICAgRklYUF9EQkwgeDEgPSBGREthYWNFbmNfQ2FsY0F1dG9Db3JyVmFsdWUocFNwZWN0cnVtLCBpZHgwLCBpZHgxLCBsYWcsIG5zYzEpOwogICAgICAgICAgICAgICBfcnh4MVtsYWddID0gZk11bHQoc2NhbGVWYWx1ZShmTXVsdCh4MSxmYWMxKSxzY19mYWMxKSwgYWNmV2luZG93W0xPRklMVF1bMypsYWddKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9CiAKICAgICAvKiBhdXRvIGNvcnIgb3ZlciB1cHBlciAzLzQgb2Ygc3BlY3RydW0gKi8KQEAgLTc2Miw4ICs3NDUsMTIgQEAKICAgICA6ICZ0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvOwogCiAgIHRuc0RhdGEtPmZpbHRlcnNNZXJnZWQgID0gRkFMU0U7Ci0gIHRzYmktPnRuc0FjdGl2ZSAgICAgICAgID0gRkFMU0U7Ci0gIHRzYmktPnByZWRpY3Rpb25HYWluICAgID0gMTAwMDsKKworICB0c2JpLT50bnNBY3RpdmVbSElGSUxUXSAgICAgICAgID0gRkFMU0U7CisgIHRzYmktPnByZWRpY3Rpb25HYWluW0hJRklMVF0gICAgPSAxMDAwOworICB0c2JpLT50bnNBY3RpdmVbTE9GSUxUXSAgICAgICAgID0gRkFMU0U7CisgIHRzYmktPnByZWRpY3Rpb25HYWluW0xPRklMVF0gICAgPSAxMDAwOworCiAgIHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl0gPSAwOwogICB0bnNJbmZvLT5jb2VmUmVzW3N1YkJsb2NrTnVtYmVyXSAgICAgID0gdEMtPmNvZWZSZXM7CiAgIGZvciAoaSA9IDA7IGkgPCB0Qy0+bWF4T3JkZXI7IGkrKykgewpAQCAtNzc5LDYgKzc2Niw3IEBACiAKICAgICBGREthYWNFbmNfTWVyZ2VkQXV0b0NvcnJlbGF0aW9uKAogICAgICAgICAgIHNwZWN0cnVtLAorICAgICAgICAgIHRDLT5pc0xvd0RlbGF5LAogICAgICAgICAgIHRDLT5hY2ZXaW5kb3csCiAgICAgICAgICAgdEMtPmxwY1N0YXJ0TGluZSwKICAgICAgICAgICB0Qy0+bHBjU3RvcExpbmUsCkBAIC03ODgsNyArNzc2LDcgQEAKICAgICAgICAgICByeHgyKTsKIAogICAgIC8qIGNvbXB1dGUgaGlnaGVyIFROUyBmaWx0ZXIgaW4gbGF0dGljZSAoUGFyQ29yKSBmb3JtIHdpdGggTGVSb3V4LUd1ZWd1ZW4gYWxnb3JpdGhtICovCi0gICAgdHNiaS0+cHJlZGljdGlvbkdhaW4gPSBGREthYWNFbmNfQXV0b1RvUGFyY29yKHJ4eDIsIHBhcmNvcl90bXAsIHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbSElGSUxUXSk7CisgICAgdHNiaS0+cHJlZGljdGlvbkdhaW5bSElGSUxUXSA9IEZES2FhY0VuY19BdXRvVG9QYXJjb3Iocnh4MiwgcGFyY29yX3RtcCwgdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltISUZJTFRdKTsKIAogICAgIC8qIG5vbi1saW5lYXIgcXVhbnRpemF0aW9uIG9mIFROUyBsYXR0aWNlIGNvZWZmaWNpZW50cyB3aXRoIGdpdmVuIHJlc29sdXRpb24gKi8KICAgICBGREthYWNFbmNfUGFyY29yMkluZGV4KApAQCAtODE1LDkgKzgwMyw5IEBACiAgICAgdG5zSW5mby0+bGVuZ3RoW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdID0gc2ZiQ250IC0gdEMtPmxwY1N0YXJ0QmFuZFtISUZJTFRdOwogCiAgICAgLyogZGlzYWJsZSBUTlMgaWYgcHJlZGljdGlvbkdhaW4gaXMgbGVzcyB0aGFuIDNkQiBvciBzdW1TcXJDb2VmIGlzIHRvbyBzbWFsbCAqLwotICAgIGlmICgodHNiaS0+cHJlZGljdGlvbkdhaW4gPiB0Qy0+Y29uZlRhYi50aHJlc2hPbltISUZJTFRdKSB8fCAoc3VtU3FyQ29lZiA+ICh0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0vMiArIDIpKSkKKyAgICBpZiAoKHRzYmktPnByZWRpY3Rpb25HYWluW0hJRklMVF0gPiB0Qy0+Y29uZlRhYi50aHJlc2hPbltISUZJTFRdKSB8fCAoc3VtU3FyQ29lZiA+ICh0Qy0+Y29uZlRhYi50bnNMaW1pdE9yZGVyW0hJRklMVF0vMiArIDIpKSkKICAgICB7Ci0gICAgICB0c2JpLT50bnNBY3RpdmUgPSBUUlVFOworICAgICAgdHNiaS0+dG5zQWN0aXZlW0hJRklMVF0gPSBUUlVFOwogICAgICAgdG5zSW5mby0+bnVtT2ZGaWx0ZXJzW3N1YkJsb2NrTnVtYmVyXSsrOwogCiAgICAgICAvKiBjb21wdXRlIHNlY29uZCBmaWx0ZXIgZm9yIGxvd2VyIHF1YXJ0ZXI7IG9ubHkgYWxsb3dlZCBmb3IgbG9uZyB3aW5kb3dzISAqLwpAQCAtODU3LDYgKzg0NSw3IEBACiAgICAgICAgICAgfHwgKCAoc3VtU3FyQ29lZiA+IDkpICAmJiAoc3VtU3FyQ29lZiA8IDIyICogdEMtPmNvbmZUYWIudG5zTGltaXRPcmRlcltMT0ZJTFRdKSApICkKICAgICAgICAgewogICAgICAgICAgIC8qIGNvbXBhcmUgbG93ZXIgdG8gdXBwZXIgZmlsdGVyOyBpZiB0aGV5IGFyZSB2ZXJ5IHNpbWlsYXIsIG1lcmdlIHRoZW0gKi8KKyAgICAgICAgICB0c2JpLT50bnNBY3RpdmVbTE9GSUxUXSA9IFRSVUU7CiAgICAgICAgICAgc3VtU3FyQ29lZiA9IDA7CiAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRDLT5jb25mVGFiLnRuc0xpbWl0T3JkZXJbTE9GSUxUXTsgaSsrKSB7CiAgICAgICAgICAgICBzdW1TcXJDb2VmICs9IEZES2Ficyh0bnNJbmZvLT5jb2VmW3N1YkJsb2NrTnVtYmVyXVtISUZJTFRdW2ldIC0gdG5zSW5mby0+Y29lZltzdWJCbG9ja051bWJlcl1bTE9GSUxUXVtpXSk7CkBAIC04ODQsNiArODczLDggQEAKICAgICAgICAgICAgIHRuc0luZm8tPm51bU9mRmlsdGVyc1tzdWJCbG9ja051bWJlcl0rKzsKICAgICAgICAgICB9CiAgICAgICAgIH0gLyogZmlsdGVyIGxvd2VyIHBhcnQgKi8KKyAgICAgICAgdHNiaS0+cHJlZGljdGlvbkdhaW5bTE9GSUxUXT1wcmVkR2FpbjsKKwogICAgICAgfSAvKiBzZWNvbmQgZmlsdGVyIGFsbG93ZWQgICovCiAgICAgfSAvKiBpZiBwcmVkaWN0aW9uR2FpbiA+IDE0MzcgLi4uICovCiAgIH0gLyogbWF4T3JkZXIgPiAwICYmIHRuc0FjdGl2ZSAqLwpAQCAtOTQ0LDcgKzkzNSw3IEBACiAgICAgICBJTlQgZG9TeW5jID0gMSwgYWJzRGlmZlN1bSA9IDA7CiAKICAgICAgIC8qIGlmIFROUyBpcyBhY3RpdmUgaW4gYXQgbGVhc3Qgb25lIGNoYW5uZWwsIGNoZWNrIGlmIFBhckNvciBjb2VmZmljaWVudHMgb2YgaGlnaGVyIGZpbHRlciBhcmUgc2ltaWxhciAqLwotICAgICAgaWYgKHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlIHx8IHBTYkluZm9TcmNXLT50bnNBY3RpdmUpIHsKKyAgICAgIGlmIChwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZVtISUZJTFRdIHx8IHBTYkluZm9TcmNXLT50bnNBY3RpdmVbSElGSUxUXSkgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdEMtPm1heE9yZGVyOyBpKyspIHsKICAgICAgICAgICBhYnNEaWZmID0gRkRLYWJzKHRuc0luZm9EZXN0LT5jb2VmW3ddW0hJRklMVF1baV0gLSB0bnNJbmZvU3JjLT5jb2VmW3ddW0hJRklMVF1baV0pOwogICAgICAgICAgIGFic0RpZmZTdW0gKz0gYWJzRGlmZjsKQEAgLTk1NywxMiArOTQ4LDEyIEBACiAKICAgICAgICAgaWYgKGRvU3luYykgewogICAgICAgICAgICAgLyogaWYgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSB3YXMgZGV0ZWN0ZWQsIHN5bmNocm9uaXplIGNvZWZmaWNpZW50IHNldHMgKi8KLSAgICAgICAgICAgIGlmIChwU2JJbmZvU3JjVy0+dG5zQWN0aXZlKSB7CisgICAgICAgICAgICBpZiAocFNiSW5mb1NyY1ctPnRuc0FjdGl2ZVtISUZJTFRdKSB7CiAgICAgICAgICAgICAgIC8qIG5vIGRlc3QgZmlsdGVyLCBvciBtb3JlIGRlc3QgdGhhbiBzb3VyY2UgZmlsdGVyczogdXNlIG9uZSBkZXN0IGZpbHRlciAqLwotICAgICAgICAgICAgICBpZiAoKCFwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZSkgfHwKLSAgICAgICAgICAgICAgICAgICgocFNiSW5mb0Rlc3RXLT50bnNBY3RpdmUpICYmICh0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID4gdG5zSW5mb1NyYy0+bnVtT2ZGaWx0ZXJzW3ddKSkpCisgICAgICAgICAgICAgIGlmICgoIXBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0pIHx8CisgICAgICAgICAgICAgICAgICAoKHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0pICYmICh0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID4gdG5zSW5mb1NyYy0+bnVtT2ZGaWx0ZXJzW3ddKSkpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwU2JJbmZvRGVzdFctPnRuc0FjdGl2ZSA9IHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPSAxOworICAgICAgICAgICAgICAgIHBTYkluZm9EZXN0Vy0+dG5zQWN0aXZlW0hJRklMVF0gPSB0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID0gMTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB0bnNEYXRhRGVzdC0+ZmlsdGVyc01lcmdlZCA9IHRuc0RhdGFTcmMtPmZpbHRlcnNNZXJnZWQ7CiAgICAgICAgICAgICAgIHRuc0luZm9EZXN0LT5vcmRlciAgICAgICBbd11bSElGSUxUXSA9IHRuc0luZm9TcmMtPm9yZGVyICAgICAgIFt3XVtISUZJTFRdOwpAQCAtOTc1LDcgKzk2Niw3IEBACiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgcFNiSW5mb0Rlc3RXLT50bnNBY3RpdmUgPSB0bnNJbmZvRGVzdC0+bnVtT2ZGaWx0ZXJzW3ddID0gMDsKKyAgICAgICAgICAgICAgcFNiSW5mb0Rlc3RXLT50bnNBY3RpdmVbSElGSUxUXSA9IHRuc0luZm9EZXN0LT5udW1PZkZpbHRlcnNbd10gPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEwMTIsOCArMTAwMyw4IEBACiB7CiAgICAgSU5UIGksIHN0YXJ0TGluZSwgc3RvcExpbmU7CiAKLSAgICBpZiAoICggKGJsb2NrVHlwZSA9PSBTSE9SVF9XSU5ET1cpICYmICghdG5zRGF0YS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bc3ViQmxvY2tOdW1iZXJdLnRuc0FjdGl2ZSkgKQotICAgICAgfHwgKCAoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykgJiYgKCF0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSkgKSApCisgICAgaWYgKCAoIChibG9ja1R5cGUgPT0gU0hPUlRfV0lORE9XKSAmJiAoIXRuc0RhdGEtPmRhdGFSYXcuU2hvcnQuc3ViQmxvY2tJbmZvW3N1YkJsb2NrTnVtYmVyXS50bnNBY3RpdmVbSElGSUxUXSkgKQorICAgICAgfHwgKCAoYmxvY2tUeXBlICE9IFNIT1JUX1dJTkRPVykgJiYgKCF0bnNEYXRhLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdKSApICkKICAgICB7CiAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC0xMTI5LDggKzExMjAsOSBAQAogICBGSVhQX0RCTCAqUkVTVFJJQ1Qgd29ya0J1ZmZlciA9IHBhcmNvcldvcmtCdWZmZXI7CiAgIGNvbnN0IEZJWFBfREJMICBhdXRvQ29ycl8wID0gaW5wdXRbMF07CiAKKyAgRkRLbWVtY2xlYXIocmVmbENvZWZmLG51bU9mQ29lZmYqc2l6ZW9mKEZJWFBfREJMKSk7CisKICAgaWYoKEZJWFBfREJMKWlucHV0WzBdID09IEZMMkZYQ09OU1RfREJMKDAuMCkpIHsKLSAgICBGREttZW1jbGVhcihyZWZsQ29lZmYsbnVtT2ZDb2VmZipzaXplb2YoRklYUF9EQkwpKTsKICAgICByZXR1cm4ocHJlZGljdGlvbkdhaW4pOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWFjZW5jX3Rucy5oIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmgKaW5kZXggZjJiNzMxZi4uMjgyNGNiYyAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmgKKysrIGIvbGliQUFDZW5jL3NyYy9hYWNlbmNfdG5zLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTExNywyMSArMTE3LDI1IEBACiAKICNkZWZpbmUgTUFYX05VTV9PRl9GSUxURVJTIDIKIAorI2RlZmluZSBISUZJTFQgMCAgICAgICAgICAgLyogaW5kZXggb2YgaGlnaGVyIGZpbHRlciAgICovCisjZGVmaW5lIExPRklMVCAxICAgICAgICAgICAvKiBpbmRleCBvZiBsb3dlciBmaWx0ZXIgICAgKi8KIAotdHlwZWRlZiBzdHJ1Y3R7IC8qc3R1ZmYgdGhhdCBpcyB0YWJ1bGF0ZWQgZGVwZW5kZW50IG9uIGJpdHJhdGUgZXRjLiAqLwotICBJTlQgICAgIGZpbHRlckVuYWJsZWRbTUFYX05VTV9PRl9GSUxURVJTXTsKLSAgSU5UICAgICB0aHJlc2hPbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgICAgICAgICAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMKi8KLSAgSU5UICAgICB0bnNMaW1pdE9yZGVyW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgICAvKiBMaW1pdCBmb3IgVE5TIG9yZGVyIFRBQlVMKi8KLSAgSU5UICAgICB0bnNGaWx0ZXJEaXJlY3Rpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAvKiBGaWx0ZXJpbmcgZGlyZWN0aW9uLCAwPXVwLCAxPWRvd24gVEFCVUwgKi8KLSAgSU5UICAgICBhY2ZTcGxpdFtNQVhfTlVNX09GX0ZJTFRFUlNdOwotICBJTlQgICAgIHNlcGVyYXRlRmlsdGVyc0FsbG93ZWQ7CiAKLX1UTlNfQ09ORklHX1RBQlVMQVRFRDsKLQordHlwZWRlZiBzdHJ1Y3R7IC8qIHN0dWZmIHRoYXQgaXMgdGFidWxhdGVkIGRlcGVuZGVudCBvbiBiaXRyYXRlIGV0Yy4gKi8KKyAgSU5UICAgICAgZmlsdGVyRW5hYmxlZFtNQVhfTlVNX09GX0ZJTFRFUlNdOworICBJTlQgICAgICB0aHJlc2hPbltNQVhfTlVNX09GX0ZJTFRFUlNdOyAgICAgICAgICAgICAgICAvKiBtaW4uIHByZWRpY3Rpb24gZ2FpbiBmb3IgdXNpbmcgdG5zIFRBQlVMKi8KKyAgSU5UICAgICAgZmlsdGVyU3RhcnRGcmVxW01BWF9OVU1fT0ZfRklMVEVSU107ICAgICAgICAgLyogbG93ZXN0IGZyZXEgZm9yIGxwYyBUQUJVTCovCisgIElOVCAgICAgIHRuc0xpbWl0T3JkZXJbTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgICAgIC8qIExpbWl0IGZvciBUTlMgb3JkZXIgVEFCVUwqLworICBJTlQgICAgICB0bnNGaWx0ZXJEaXJlY3Rpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAvKiBGaWx0ZXJpbmcgZGlyZWN0aW9uLCAwPXVwLCAxPWRvd24gVEFCVUwgKi8KKyAgSU5UICAgICAgYWNmU3BsaXRbTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgRklYUF9EQkwgdG5zVGltZVJlc29sdXRpb25bTUFYX05VTV9PRl9GSUxURVJTXTsgICAgICAgLyogVE5TIG1heC4gdGltZSByZXNvbHV0aW9uIFRBQlVMLiBTaG91bGQgYmUgZnJhY3QgYnV0IE1TVkMgd29uJ3QgY29tcGlsZSB0aGVuICovCisgIElOVCAgICAgIHNlcGVyYXRlRmlsdGVyc0FsbG93ZWQ7Cit9IFROU19QQVJBTUVURVJfVEFCVUxBVEVEOwogCiAKIHR5cGVkZWYgc3RydWN0IHsgICAvKmFzc2lnbmVkIGF0IEluaXRUaW1lKi8KLSAgVE5TX0NPTkZJR19UQUJVTEFURUQgY29uZlRhYjsKKyAgVE5TX1BBUkFNRVRFUl9UQUJVTEFURUQgY29uZlRhYjsKKyAgSU5UIGlzTG93RGVsYXk7CiAgIElOVCB0bnNBY3RpdmU7CiAgIElOVCBtYXhPcmRlcjsgICAgICAgICAgICAgICAgLyogbWF4LiBvcmRlciBvZiB0bnMgZmlsdGVyICovCiAgIElOVCBjb2VmUmVzOwpAQCAtMTQ4LDggKzE1Miw4IEBACiAKIAogdHlwZWRlZiBzdHJ1Y3QgewotICBJTlQgICB0bnNBY3RpdmU7Ci0gIElOVCAgIHByZWRpY3Rpb25HYWluOworICBJTlQgICB0bnNBY3RpdmVbTUFYX05VTV9PRl9GSUxURVJTXTsKKyAgSU5UICAgcHJlZGljdGlvbkdhaW5bTUFYX05VTV9PRl9GSUxURVJTXTsKIH0gVE5TX1NVQkJMT0NLX0lORk87CiAKIHR5cGVkZWYgc3RydWN0eyAgIC8qY2hhbmdlZCBhdCBydW5UaW1lKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5jcHAgYi9saWJBQUNlbmMvc3JjL2Fkal90aHIuY3BwCmluZGV4IGMzMTg4NDMuLmE3OWE5YWUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9hZGpfdGhyLmNwcApAQCAtMTUzLDEwICsxNTMsMTAgQEAKICAgeyAyNDAwMCwgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxMywgMHgyM0Q3MEEzRCwgMHgwMjlGMTZCMSwgMHgyMTk5OTk5QSwgMHgwN0RENDQxM30sCiAgIHsgMzIwMDAsIDB4MjQ3QUUxNDgsIDB4MTFCMUQ5MkIsIDB4MjM4NTFFQjgsIDB4MDFGNzUxMDUsIDB4MjQ3QUUxNDgsIDB4MTEwQTEzN0YsIDB4MjM4NTFFQjgsIDB4MDFGNzUxMDV9LAogICB7IDQ4MDAwLCAweDJEMUVCODUyLCAweDY4MzNDNjAwLCAweDI0N0FFMTQ4LCAweDAxNEY4QjU5LCAweDJDQ0NDQ0NELCAweDY4REI4QkFDLCAweDI0N0FFMTQ4LCAweDAxRjc1MTA1fSwKLSAgeyA2NDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTFFQjg1MiwgMHgxNTRDOTg1RiwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTcwQTNENywgMHgxNTRDOTg1Rn0sCi0gIHsgOTYwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MzlFQjg1MUYsIDB4MDg4NTA5QzAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M0EzRDcwQTQsIDB4MDg4NTA5QzB9LAotICB7MTI4MDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQyM0Q3MEE0LCAweDE4QTQzQkI0LCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQyOEY1QzI5LCAweDE4MUUwM0Y3fSwKLSAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHg1MTQ3QUUxNCwgMHgwMDAwMDAwMH0KKyAgeyA2NDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNTFFQjg1MiwgMHgwMTQ4MDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNTcwQTNENywgMHgwMTQ4MDAwMH0sCisgIHsgOTYwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjYwMDAwMDAsIDB4MDEwMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjYwMDAwMDAsIDB4MDEwMDAwMDB9LAorICB7MTI4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI3MGEzZDgwLCAweDAxMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI3MGEzZDgwLCAweDAxMDAwMDAwfSwKKyAgezE0ODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyODAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyODAwMDAwMCwgMHgwMDAwMDAwMH0KIH07CiAKIHN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyMjA1MFtdID0gewpAQCAtMTY2LDggKzE2Niw4IEBACiAgIHsgNDgwMDAsIDB4MjNkNzBhM2QsIDB4MDE0ZjhiNTksIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGEsIDB4MjNkNzBhM2QsIDB4MTRmOGI1OSwgIDB4MjE5OTk5OWEsIDB4MDNlZWEyMGF9LAogICB7IDY0MDAwLCAweDI0N2FlMTQ4LCAweDA4ZDhlYzk2LCAweDIzODUxZWI4LCAweDAwZmJhODgyLCAweDI0N2FlMTQ4LCAweDg4NTA5YzAsICAweDIzODUxZWI4LCAweDAwZmJhODgyfSwKICAgeyA5NjAwMCwgMHgyZDFlYjg1MiwgMHgzNDE5ZTMwMCwgMHgyNDdhZTE0OCwgMHgwMGE3YzVhYywgMHgyY2NjY2NjZCwgMHgzNDZkYzVkNiwgMHgyNDdhZTE0OCwgMHgwMGZiYTg4Mn0sCi0gIHsxMjgwMDAsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjUxZWI4NTIsIDB4MDI5ZjE2YjEsIDB4NjAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDA5ZjE2YjF9LAotICB7MTQ4MDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI2Yjg1MWVjLCAweDAwMDAwMDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI3MGEzZDcxLCAweDAwMDAwMDAwfQorICB7MTI4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI1MWViODUyLCAweDAyOWYxNmIxLCAweDYwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDI1NzBhM2Q3LCAweDAwOWYxNmIxfSwKKyAgezE0ODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNmI4NTFlYywgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgyNzBhM2Q3MSwgMHgwMDAwMDAwMH0KIH07CiAKIHN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIyNDAwMFtdID0gewpAQCAtMTc4LDIxICsxNzgsMjEgQEAKICAgeyA2NDAwMCwgMHgyNGNjY2NjZCwgMHgwNWU1ZjMwZSwgMHgyMmUxNDdhZSwgMHgwMWEzNmUyZiwgMHgyNGNjY2NjZCwgMHgwNWU1ZjMwZSwgMHgyMzMzMzMzMywgMHgwMTRmOGI1OX0sCiAgIHsgOTYwMDAsIDB4MmE4ZjVjMjksIDB4MjRiMzNkYjAsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODIsIDB4MmE4ZjVjMjksIDB4MjZmZTcxOGIsIDB4MjQ3YWUxNDgsIDB4MDBmYmE4ODJ9LAogICB7MTI4MDAwLCAweDRlNjY2NjY2LCAweDFjZDVmOTljLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhLCAweDUwYTNkNzBhLCAweDE5MmE3MzcxLCAweDI1NzBhM2Q3LCAweDAxMGM2ZjdhfSwKLSAgezE0ODAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMCwgMHg2MDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMH0KKyAgezE0ODAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMCwgMHgyNWMyOGY0MCwgMHgwMDAwMDAwMCwgMHgyNjE0N2FlMSwgMHgwMDAwMDAwMH0KIH07CiAKIHN0YXRpYyBjb25zdCBCSVRfUEVfU0ZBQyBTX0JpdHMyUGVUYWIzMjAwMFtdID0gewotICB7IDE2MDAwLCAweDExOTk5OTlhLCAweDIwYzQ5YmE2LCAweDAwMDAwMDAwLCAweDQ1NzdkOTU1LCAweDAwMDAwMDAwLCAweDYwZmU0Nzk5LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwfSwKLSAgeyAyNDAwMCwgMHgxOTk5OTk5YSwgMHgwZmJhODgyNywgMHgxMGY1YzI4ZiwgMHgxYjg2NmU0NCwgMHgxN2FlMTQ3YiwgMHgwZmJhODgyNywgMHgwMDAwMDAwMCwgMHg0ZDU1MWQ2OX0sCisgIHsgMTYwMDAsIDB4MjQ3YWUxNDAsIDB4RkZGRkFDMUUsIDB4MjcwYTNkODAsIDB4RkZGRTlCN0MsIDB4MTRjY2NjYzAsIDB4MDAwMTEwQTEsIDB4MTVjMjhmNjAsIDB4RkZGRUVGNUZ9LAorICB7IDI0MDAwLCAweDIzMzMzMzQwLCAweDBmYmE4ODI3LCAweDIxOTk5OTgwLCAweDFiODY2ZTQ0LCAweDE4ZjVjMjgwLCAweDBmYmE4ODI3LCAweDExOTk5OWEwLCAweDRkNTUxZDY5fSwKICAgeyAzMjAwMCwgMHgxZDcwYTNkNywgMHgwNzM1N2U2NywgMHgxN2FlMTQ3YiwgMHgwOWQ0OTUxOCwgMHgxYjg1MWViOCwgMHgwYTdjNWFjNCwgMHgxMmUxNDdhZSwgMHgxMTBhMTM3Zn0sCiAgIHsgNDgwMDAsIDB4MjBmNWMyOGYsIDB4MDQ5NjY3YjYsIDB4MWM3YWUxNDgsIDB4MDUzZTJkNjIsIDB4MjBhM2Q3MGEsIDB4MDUzZTJkNjIsIDB4MWIzMzMzMzMsIDB4MDVlNWYzMGV9LAogICB7IDY0MDAwLCAweDIzMzMzMzMzLCAweDAyOWYxNmIxLCAweDFmMGEzZDcxLCAweDAyZjJmOTg3LCAweDIzMzMzMzMzLCAweDAyOWYxNmIxLCAweDFlMTQ3YWUxLCAweDAzZWVhMjBhfSwKICAgeyA5NjAwMCwgMHgyNWMyOGY1YywgMHgyYzNjOWVlZCwgMHgyMWViODUxZiwgMHgwMWY3NTEwNSwgMHgyNWMyOGY1YywgMHgwYTdjNWFjNCwgMHgyMWViODUxZiwgMHgwMWEzNmUyZn0sCiAgIHsxMjgwMDAsIDB4NTBmNWMyOGYsIDB4MThhNDNiYjQsIDB4MjNkNzBhM2QsIDB4MDEwYzZmN2EsIDB4MzAwMDAwMDAsIDB4MTY4YjVjYzAsIDB4MjM4NTFlYjgsIDB4MDE5MmE3Mzd9LAotICB7MTQ4MDAwLCAweDYwMDAwMDAwLCAweDAwMDAwMDAwLCAweDI0N2FlMTQ4LCAweDAwZGZiMjNiLCAweDNkYzI4ZjVjLCAweDMwMGY0YWFmLCAweDI0N2FlMTQ4LCAweDAxYmY2NDc2fSwKLSAgezE2MDAwMCwgMHg2MDAwMDAwMCwgMHhiMTViNTc0MCwgMHgyNGNjY2NjZCwgMHgwNTNlMmQ2MiwgMHg0ZjVjMjhmNiwgMHhiZWZkMDA3MiwgMHgyNTFlYjg1MiwgMHgwNGZiMTE4NH0sCi0gIHsyMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MmIzMzMzMzMsIDB4MDgzNmJlOTEsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MmIzMzMzMzMsIDB4MDg5MDM5MGZ9LAotICB7MzIwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDQ5NDdhZTE0LCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDRhOGY1YzI5LCAweDAwMDAwMDAwfQorICB7MTQ4MDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDI0N2FlMTQ4LCAweDAwZGZiMjNiLCAweDNkYzI4ZjVjLCAweDMwMGY0YWFmLCAweDI0N2FlMTQ4LCAweDAxYmY2NDc2fSwKKyAgezE2MDAwMCwgMHgyNWMyOGY0MCwgMHhiMTViNTc0MCwgMHgyNGNjY2NjZCwgMHgwNTNlMmQ2MiwgMHg0ZjVjMjhmNiwgMHhiZWZkMDA3MiwgMHgyNTFlYjg1MiwgMHgwNGZiMTE4NH0sCisgIHsyMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MmIzMzMzMzMsIDB4MDgzNmJlOTEsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MmIzMzMzMzMsIDB4MDg5MDM5MGZ9LAorICB7MzIwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDQ5NDdhZTE0LCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDRhOGY1YzI5LCAweDAwMDAwMDAwfQogfTsKIAogc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjQ0MTAwW10gPSB7CkBAIC0yMDUsOCArMjA1LDggQEAKICAgezEyODAwMCwgMHgyYWUxNDdhZSwgMHgxYjQzNTI2NSwgMHgyMjNkNzBhNCwgMHgwMTkyYTczNywgMHgyYTNkNzBhNCwgMHgxMDQwYmZlNCwgMHgyMWViODUxZiwgMHgwMTkyYTczN30sCiAgIHsxNDgwMDAsIDB4M2I4NTFlYjgsIDB4MjgzMjA2OWMsIDB4MjMzMzMzMzMsIDB4MDBkZmIyM2IsIDB4MzQyOGY1YzMsIDB4MjA1NGMyODgsIDB4MjJlMTQ3YWUsIDB4MDBkZmIyM2J9LAogICB7MTYwMDAwLCAweDRhM2Q3MGE0LCAweGMzMmViZTVhLCAweDIzODUxZWI4LCAweDAxZDVjMzE2LCAweDQwMDAwMDAwLCAweGNiOTIzYTJiLCAweDIzMzMzMzMzLCAweDAxZDVjMzE2fSwKLSAgezIwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNWMyOGY1YywgMHgwNzEzZjA3OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTcwYTNkNywgMHgwNzJhNGYxN30sCi0gIHszMjAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2ZhZTE0N2IsIDB4MDAwMDAwMDB9CisgIHsyMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjVjMjhmNWMsIDB4MDcxM2YwNzgsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjU3MGEzZDcsIDB4MDcyYTRmMTd9LAorICB7MzIwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNmYWUxNDdiLCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNmYWUxNDdiLCAweDAwMDAwMDAwfQogfTsKIAogc3RhdGljIGNvbnN0IEJJVF9QRV9TRkFDIFNfQml0czJQZVRhYjQ4MDAwW10gPSB7CkBAIC0yMTksOCArMjE5LDggQEAKICAgezEyODAwMCwgMHgyOGY1YzI4ZiwgMHgxNDcyN2RjYywgMHgyMTQ3YWUxNCwgMHgwMjE4ZGVmNCwgMHgyODUxZWI4NSwgMHgwZTI3ZTBmMCwgMHgyMGY1YzI4ZiwgMHgwMjE4ZGVmNH0sCiAgIHsxNDgwMDAsIDB4MzU3MGEzZDcsIDB4MWNkNWY5OWMsIDB4MjI4ZjVjMjksIDB4MDFiZjY0NzYsIDB4MzBmNWMyOGYsIDB4MTg3NzdlNzUsIDB4MjIzZDcwYTQsIDB4MDFiZjY0NzZ9LAogICB7MTYwMDAwLCAweDQwMDAwMDAwLCAweGNiOTIzYTJiLCAweDIzMzMzMzMzLCAweDAxOTJhNzM3LCAweDM5ZWI4NTFmLCAweGQwOGQ0YmFlLCAweDIyZTE0N2FlLCAweDAxOTJhNzM3fSwKLSAgezIwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNTFlYjg1MiwgMHgwNjc3NWExYiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgyNGNjY2NjZCwgMHgwNmE0MTc1YX0sCi0gIHszMjAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2NjY2NjY2QsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4M2QxZWI4NTIsIDB4MDAwMDAwMDB9CisgIHsyMDAwMDAsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjUxZWI4NTIsIDB4MDY3NzVhMWIsIDB4MjVjMjhmNDAsIDB4MDAwMDAwMDAsIDB4MjRjY2NjY2QsIDB4MDZhNDE3NWF9LAorICB7MzIwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNjY2NjY2NkLCAweDAwMDAwMDAwLCAweDI1YzI4ZjQwLCAweDAwMDAwMDAwLCAweDNkMWViODUyLCAweDAwMDAwMDAwfQogfTsKIAogc3RhdGljIGNvbnN0IEJJVFMyUEVfQ0ZHX1RBQiBiaXRzMlBlQ29uZmlnVGFiW10gPSB7CkBAIC0yNTgsNiArMjU4LDcgQEAKICAgICAgICAgY29uc3QgSU5UIG5DaGFubmVscywKICAgICAgICAgY29uc3QgSU5UIHNhbXBsZVJhdGUsCiAgICAgICAgIGNvbnN0IElOVCBhZHZhbmNlZEJpdHNUb1BlLAorICAgICAgICBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZSwKICAgICAgICAgY29uc3QgSU5UIGludlF1YW50CiAgICAgICAgICkKIHsKQEAgLTMyOSw3ICszMzAsMzIgQEAKICAgfSAvKiBhZHZhbmNlZEJpdHNUb1BlICovCiAKIAotICAvKiByZXR1cm4gYml0czJwZSBmYWN0b3IgKi8KKyAgaWYgKGRab25lUXVhbnRFbmFibGUpCisgIHsKKyAgICBpZihiaXQyUEVfbSA+PSAoRkwyRlhDT05TVF9EQkwoMC42ZikpPj5iaXQyUEVfZSkKKyAgICB7CisgICAgICAvKiBBZGRpdGlvbmFsIGhlYWRyb29tIGZvciBhZGRpdGlvbiAqLworICAgICAgYml0MlBFX20gPj49IDE7CisgICAgICBiaXQyUEVfZSAgKz0gMTsKKyAgICB9CisKKyAgICAvKiB0aGUgcXVhbnRUZW5kZW5jeUNvbXBlbnNhdG9yIGNvbXBlbnNhdGVzIGEgbG93ZXIgYml0IGNvbnN1bXB0aW9uIGR1ZSB0byBpbmNyZWFzaW5nIHRoZSB0ZW5kZW5jeSB0byBxdWFudGl6ZSBsb3cgc3BlY3RyYWwgdmFsdWVzIHRvIHRoZSBsb3dlciBxdWFudGl6ZXIgYm9yZGVyIGZvciBiaXRyYXRlcyBiZWxvdyBhIGNlcnRhaW4gYml0cmF0ZSB0aHJlc2hvbGQgLS0+IHNlZSBhbHNvIGZ1bmN0aW9uIGNhbGNTZmJEaXN0TEQgaW4gcXVhbnRpemUuYyAqLworICAgIGlmICgoYml0UmF0ZS9uQ2hhbm5lbHMgPiAzMjAwMCkgJiYgKGJpdFJhdGUvbkNoYW5uZWxzIDw9IDQwMDAwKSkgeworICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuNGYpKT4+Yml0MlBFX2U7CisgICAgfQorICAgIGVsc2UgaWYgKGJpdFJhdGUvbkNoYW5uZWxzID4gMjAwMDApIHsKKyAgICAgIGJpdDJQRV9tICs9IChGTDJGWENPTlNUX0RCTCgwLjNmKSk+PmJpdDJQRV9lOworICAgIH0KKyAgICBlbHNlIGlmIChiaXRSYXRlL25DaGFubmVscyA+PSAxNjAwMCkgeworICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuM2YpKT4+Yml0MlBFX2U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgYml0MlBFX20gKz0gKEZMMkZYQ09OU1RfREJMKDAuMGYpKT4+Yml0MlBFX2U7CisgICAgfQorICB9CisKKworICAvKioqKiogMy4pIFJldHVybiBiaXRzMnBlIGZhY3RvciAqKioqKi8KICAgKmJpdHMyUGVGYWN0b3JfbSA9IGJpdDJQRV9tOwogICAqYml0czJQZUZhY3Rvcl9lID0gYml0MlBFX2U7CiB9CkBAIC0xNjQ5LDYgKzE2NzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfRUxFTUVOVCogICBxY0VsZW1lbnRbKDgpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgcHN5T3V0RWxlbWVudFsoOCldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBkZXNpcmVkUGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgIG1heEl0ZXIybmRHdWVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgcHJvY2Vzc0VsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICBlbGVtZW50T2Zmc2V0KQogewpAQCAtMTczMyw3ICsxNzYwLDcgQEAKICAgIC8qIFBhcnQgSUlJOiBJdGVyYXRlIHVudGlsIGJpdCBjb25zdHJhaW50cyBhcmUgbWV0ICovCiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgaXRlciA9IDA7Ci0gICB3aGlsZSAoKGZpeHBfYWJzKHJlZFBlR2xvYmFsIC0gZGVzaXJlZFBlKSA+IGZNdWx0SShGTDJGWENPTlNUX0RCTCgwLjA1ZiksZGVzaXJlZFBlKSkgJiYgKGl0ZXIgPCAxKSkgeworICAgd2hpbGUgKChmaXhwX2FicyhyZWRQZUdsb2JhbCAtIGRlc2lyZWRQZSkgPiBmTXVsdEkoRkwyRlhDT05TVF9EQkwoMC4wNWYpLGRlc2lyZWRQZSkpICYmIChpdGVyIDwgbWF4SXRlcjJuZEd1ZXNzKSkgewogCiAgICAgIElOVCBkZXNpcmVkUGVOb0FIR2xvYmFsOwogICAgICBJTlQgcmVkUGVOb0FIR2xvYmFsID0gMDsKQEAgLTIyMjUsNyArMjI1Miw4IEBACiAgICAgICAgIElOVCAgICAgICAgICAgICBuQ2hhbm5lbHNFZmYsCiAgICAgICAgIElOVCAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICBJTlQgICAgICAgICAgICAgYWR2YW5jZWRCaXRzVG9QZSwKLSAgICAgICAgRklYUF9EQkwgICAgICAgIHZiclF1YWxGYWN0b3IKKyAgICAgICAgRklYUF9EQkwgICAgICAgIHZiclF1YWxGYWN0b3IsCisgICAgICAgIGNvbnN0IElOVCAgICAgICBkWm9uZVF1YW50RW5hYmxlCiAgICAgICAgICkKIHsKICAgSU5UIGk7CkBAIC0yMjMzLDYgKzIyNjEsMTAgQEAKICAgRklYUF9EQkwgUE9JTlQ4ID0gRkwyRlhDT05TVF9EQkwoMC44Zik7CiAgIEZJWFBfREJMIFBPSU5UNiA9IEZMMkZYQ09OU1RfREJMKDAuNmYpOwogCisgIC8qIE1heCBudW1iZXIgb2YgaXRlcmF0aW9ucyBpbiBzZWNvbmQgZ3Vlc3MgaXMgMyBmb3IgbG93ZGVsYXkgYW90IGFuZCBmb3IgY29uZmlndXJhdGlvbnMgd2l0aAorICAgICBtdWx0aXBsZSBhdWRpbyBlbGVtZW50cyBpbiBnZW5lcmFsLCBvdGhlcndpc2UgaXRlcmF0aW9uIHZhbHVlIGlzIGFsd2F5cyAxLiAqLworICBoQWRqVGhyLT5tYXhJdGVyMm5kR3Vlc3MgPSAoYWR2YW5jZWRCaXRzVG9QZSE9MCB8fCBuRWxlbWVudHM+MSkgPyAzIDogMTsKKwogICAvKiBjb21tb24gZm9yIGFsbCBlbGVtZW50czogKi8KICAgLyogcGFyYW1ldGVycyBmb3IgYml0cmVzIGNvbnRyb2wgKi8KICAgaEFkalRoci0+YnJlc1BhcmFtTG9uZy5jbGlwU2F2ZUxvdyAgID0gKEZJWFBfREJMKTB4MTk5OTk5OWE7IC8qIEZMMkZYQ09OU1RfREJMKDAuMmYpOyAqLwpAQCAtMjMxMywxMCArMjM0NSwxMSBAQAogICAgIEZES2FhY0VuY19Jbml0Qml0czJQZUZhY3RvcigKICAgICAgICAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfbSwKICAgICAgICAgICAgICAgJmF0c0VsZW0tPmJpdHMyUGVGYWN0b3JfZSwKLSAgICAgICAgICAgICAgY2hCaXRyYXRlLCAgICAgICAvKiBiaXRyYXRlL2NoYW5uZWwqLworICAgICAgICAgICAgICBjaEJpdHJhdGUqbkNoYW5uZWxzRWZmLCAvKiBvdmVyYWxsIGJpdHJhdGUgKi8KICAgICAgICAgICAgICAgbkNoYW5uZWxzRWZmLCAgICAvKiBudW1iZXIgb2YgY2hhbm5lbHMgKi8KICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgYWR2YW5jZWRCaXRzVG9QZSwKKyAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKICAgICAgICAgICAgICAgaW52UXVhbnQKICAgICAgICAgICAgICAgKTsKIApAQCAtMjU0NSw2ICsyNTc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUKiAgICAgICAgICAgICBxY091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZX09VVF9FTEVNRU5UKiAgICBwc3lPdXRFbGVtZW50Wyg4KV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgQ0JSYml0cmF0ZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWF4SXRlcjJuZEd1ZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMX01BUFBJTkcqICAgIGNtKQogewogICAgIGludCBpOwpAQCAtMjU3MCw2ICsyNjA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY0VsZW1lbnRbaV0tPmdyYW50ZWRQZUNvcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEl0ZXIybmRHdWVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAvKiBQcm9jZXNzIG9ubHkgMSBlbGVtZW50ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOyAgICAgICAgLyogUHJvY2VzcyBleGFjdGx5IFRISVMgZWxlbWVudCAqLwogCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2Fkal90aHIuaCBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5oCmluZGV4IDY5YjFkY2MuLmJlNjhjNmUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Roci5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xMTgsNyArMTE4LDggQEAKICAgICAgICAgICAgICAgICBJTlQgbkNoYW5uZWxzRWZmLAogICAgICAgICAgICAgICAgIElOVCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgIElOVCBhZHZhbmNlZEJpdHNUb1BlLAotICAgICAgICAgICAgICAgIEZJWFBfREJMIHZiclF1YWxGYWN0b3IpOworICAgICAgICAgICAgICAgIEZJWFBfREJMIHZiclF1YWxGYWN0b3IsCisgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUpOwogIAogCiB2b2lkIEZES2FhY0VuY19EaXN0cmlidXRlQml0cyhBREpfVEhSX1NUQVRFICphZGpUaHJTdGF0ZSwKQEAgLTE0MCw2ICsxNDEsNyBAQAogICAgIFFDX09VVCogICAgICAgICAgIHFjT3V0LAogICAgIFBTWV9PVVRfRUxFTUVOVCogIHBzeU91dEVsZW1lbnRbKDgpXSwKICAgICBJTlQgICAgICAgICAgICAgICBDQlJiaXRyYXRlTW9kZSwKKyAgICBJTlQgICAgICAgICAgICAgICBtYXhJdGVyMm5kR3Vlc3MsCiAgICAgQ0hBTk5FTF9NQVBQSU5HKiAgY20pOwogCiB2b2lkIEZES2FhY0VuY19BZGpUaHJDbG9zZShBREpfVEhSX1NUQVRFKiogaEFkalRocik7CmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL2Fkal90aHJfZGF0YS5oIGIvbGliQUFDZW5jL3NyYy9hZGpfdGhyX2RhdGEuaAppbmRleCAzZWI3Njc4Li43YzNhMTkxIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL2Fkal90aHJfZGF0YS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvYWRqX3Rocl9kYXRhLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTE0NSw2ICsxNDUsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgewogICBCUkVTX1BBUkFNIGJyZXNQYXJhbUxvbmcsIGJyZXNQYXJhbVNob3J0OwogICBBVFNfRUxFTUVOVCogYWRqVGhyU3RhdGVFbGVtWyg4KV07CisgIElOVCBtYXhJdGVyMm5kR3Vlc3M7CiB9IEFESl9USFJfU1RBVEU7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguY3BwIGIvbGliQUFDZW5jL3NyYy9iYW5kd2lkdGguY3BwCmluZGV4IDZmYzdkODcuLjY5MzczNjIgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvYmFuZHdpZHRoLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL2JhbmR3aWR0aC5jcHAKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEyNyw3ICsxMjcsNyBAQAogICB7IDgwMDAsICAyMDAwLCAgMjAwMH0sCiAgIHsxMjAwMCwgIDIwMDAsICAyMzAwfSwKICAgezE2MDAwLCAgMjIwMCwgIDI1MDB9LAotICB7MjQwMDAsICA1NjUwLCAgNjQwMH0sCisgIHsyNDAwMCwgIDU2NTAsICA3MjAwfSwKICAgezMyMDAwLCAgMTE2MDAsIDEyMDAwfSwKICAgezQwMDAwLCAgMTIwMDAsIDE2MDAwfSwKICAgezQ4MDAwLCAgMTYwMDAsIDE2MDAwfSwKQEAgLTEzOCwxMCArMTM4LDEwIEBACiBzdGF0aWMgY29uc3QgQkFORFdJRFRIX1RBQiBiYW5kV2lkdGhUYWJsZV9MRF8zMjAwMFtdID0gewogICB7IDgwMDAsICAyMDAwLCAgMjAwMH0sCiAgIHsxMjAwMCwgIDIwMDAsICAyMDAwfSwKLSAgezI0MDAwLCAgNDI1MCwgIDUyMDB9LAorICB7MjQwMDAsICA0MjUwLCAgNzIwMH0sCiAgIHszMjAwMCwgIDg0MDAsICA5MDAwfSwKICAgezQwMDAwLCAgOTQwMCwgIDExMzAwfSwKLSAgezQ4MDAwLCAgMTE5MDAsIDEzNzAwfSwKKyAgezQ4MDAwLCAgMTE5MDAsIDE0NzAwfSwKICAgezY0MDAwLCAgMTQ4MDAsIDE2MDAwfSwKICAgezc2MDAwLCAgMTYwMDAsIDE2MDAwfSwKICAgezM2MDAwMSwgMTYwMDAsIDE2MDAwfQpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9wbnNwYXJhbS5jcHAgYi9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcAppbmRleCBhZmM1YmRkLi45ZDU5ZGRjIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3Buc3BhcmFtLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTA3LDYgKzEwNyw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgIFVMT05HIGJyRnJvbTsKICAgVUxPTkcgYnJUbzsKKyAgVUNIQVIgUzE2MDAwOwogICBVQ0hBUiBTMjIwNTA7CiAgIFVDSEFSIFMyNDAwMDsKICAgVUNIQVIgUzMyMDAwOwpAQCAtMTE1LDI1ICsxMTYsMjYgQEAKIH0gQVVUT19QTlNfVEFCOwogCiBzdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfbW9ub1tdPSB7Ci0gIHswLCAgICAgIDExOTk5LCAxLCAxLCAxLCAxLCAxLH0sCi0gIHsxMjAwMCwgIDE5OTk5LCAxLCAxLCAxLCAxLCAxLH0sCi0gIHsyMDAwMCwgIDI4OTk5LCAyLCAxLCAxLCAxLCAxLH0sCi0gIHsyOTAwMCwgIDQwOTk5LCA0LCA0LCA0LCAyLCAyLH0sCi0gIHs0MTAwMCwgIDU1OTk5LCA5LCA5LCA3LCA3LCA3LH0sCi0gIHs1NjAwMCwgIDc5OTk5LCAwLCAwLCAwLCA5LCA5LH0sCi0gIHs4MDAwMCwgIDk5OTk5LCAwLCAwLCAwLCAwLCAwLH0sCi0gIHsxMDAwMDAsOTk5OTk5LCAwLCAwLCAwLCAwLCAwLH0sCisgIHswLCAgICAgIDExOTk5LCAwLCAxLCAxLCAxLCAxLCAxLH0sCisgIHsxMjAwMCwgIDE5OTk5LCAwLCAxLCAxLCAxLCAxLCAxLH0sCisgIHsyMDAwMCwgIDI4OTk5LCAwLCAyLCAxLCAxLCAxLCAxLH0sCisgIHsyOTAwMCwgIDQwOTk5LCAwLCA0LCA0LCA0LCAyLCAyLH0sCisgIHs0MTAwMCwgIDU1OTk5LCAwLCA5LCA5LCA3LCA3LCA3LH0sCisgIHs1NjAwMCwgIDYxOTk5LCAwLCAwLCAwLCAwLCA5LCA5LH0sCisgIHs2MjAwMCwgIDc1OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCisgIHs3NjAwMCwgIDkyOTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCisgIHs5MzAwMCwgOTk5OTk5LCAwLCAwLCAwLCAwLCAwLCAwLH0sCiB9OwogCiBzdGF0aWMgY29uc3QgQVVUT19QTlNfVEFCIGxldmVsVGFibGVfc3RlcmVvW109IHsKLSAgezAsICAgICAgMTE5OTksIDEsIDEsIDEsIDEsIDEsfSwKLSAgezEyMDAwLCAgMTk5OTksIDMsIDEsIDEsIDEsIDEsfSwKLSAgezIwMDAwLCAgMjg5OTksIDMsIDMsIDMsIDIsIDIsfSwKLSAgezI5MDAwLCAgNDA5OTksIDcsIDYsIDYsIDUsIDUsfSwKLSAgezQxMDAwLCAgNTU5OTksIDksIDksIDcsIDcsIDcsfSwKLSAgezU2MDAwLCAgNzk5OTksIDAsIDAsIDAsIDAsIDAsfSwKLSAgezgwMDAwLCAgOTk5OTksIDAsIDAsIDAsIDAsIDAsfSwKLSAgezEwMDAwMCw5OTk5OTksIDAsIDAsIDAsIDAsIDAsfSwKKyAgezAsICAgICAgMTE5OTksIDAsIDEsIDEsIDEsIDEsIDEsfSwKKyAgezEyMDAwLCAgMTk5OTksIDAsIDMsIDEsIDEsIDEsIDEsfSwKKyAgezIwMDAwLCAgMjg5OTksIDAsIDMsIDMsIDMsIDIsIDIsfSwKKyAgezI5MDAwLCAgNDA5OTksIDAsIDcsIDYsIDYsIDUsIDUsfSwKKyAgezQxMDAwLCAgNTU5OTksIDAsIDksIDksIDcsIDcsIDcsfSwKKyAgezU2MDAwLCAgNzk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKKyAgezgwMDAwLCAgOTk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKKyAgezEwMDAwMCw5OTk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKIH07CiAKIApAQCAtMTYwLDExICsxNjIsMTEgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBBVVRPX1BOU19UQUIgbGV2ZWxUYWJsZV9sb3dDb21wbGV4aXR5W109IHsKLSAgezAsICAgICAgMjc5OTksIDAsIDAsIDAsIDAsIDAsfSwKLSAgezI4MDAwLCAgMzE5OTksIDIsIDIsIDIsIDIsIDIsfSwKLSAgezMyMDAwLCAgNDc5OTksIDMsIDMsIDMsIDMsIDMsfSwKLSAgezQ4MDAwLCAgNDgwMDAsIDQsIDQsIDQsIDQsIDQsfSwKLSAgezQ4MDAxLCA5OTk5OTksIDAsIDAsIDAsIDAsIDAsfSwKKyAgezAsICAgICAgMjc5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKKyAgezI4MDAwLCAgMzE5OTksIDAsIDIsIDIsIDIsIDIsIDIsfSwKKyAgezMyMDAwLCAgNDc5OTksIDAsIDMsIDMsIDMsIDMsIDMsfSwKKyAgezQ4MDAwLCAgNDgwMDAsIDAsIDQsIDQsIDQsIDQsIDQsfSwKKyAgezQ4MDAxLCA5OTk5OTksIDAsIDAsIDAsIDAsIDAsIDAsfSwKIH07CiAKIC8qIGNvbnZlcnNpb24gb2Ygb2xkIExDIHR1bmluZyB0YWJsZXMgdG8gbmV3IChMRCBlbmMpIHN0cnVjdHVyZSAob25seSBlbnRyaWVzIHdoaWNoIGFyZSBhY3R1YWxseSB1c2VkIHdlcmUgY29udmVydGVkKSAqLwpAQCAtMjExLDYgKzIxMyw3IEBACiAgIH0KIAogICBzd2l0Y2ggKHNhbXBsZVJhdGUpIHsKKyAgY2FzZSAxNjAwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzE2MDAwOyBicmVhazsKICAgY2FzZSAyMjA1MDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzIyMDUwOyBicmVhazsKICAgY2FzZSAyNDAwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzI0MDAwOyBicmVhazsKICAgY2FzZSAzMjAwMDogaFVzZVBucyA9IGxldmVsVGFibGVbaV0uUzMyMDAwOyBicmVhazsKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcHN5X21haW4uY3BwIGIvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAKaW5kZXggM2NjOTQzOC4uNDQ2Yzg5NCAxMDA2NDQKLS0tIGEvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9wc3lfbWFpbi5jcHAKQEAgLTM0Miw2ICszNDIsNyBAQAogICAgICAgICB0bnNDaGFubmVscywKICAgICAgICAgTE9OR19XSU5ET1csCiAgICAgICAgIGhQc3ktPmdyYW51bGVMZW5ndGgsCisgICAgICAgIGlzTG93RGVsYXkoYXVkaW9PYmplY3RUeXBlKSwKICAgICAgICAgKHN5bnRheEZsYWdzJkFDX1NCUl9QUkVTRU5UKT8xOjAsCiAgICAgICAgJihoUHN5LT5wc3lDb25mWzBdLnRuc0NvbmYpLAogICAgICAgICZoUHN5LT5wc3lDb25mWzBdLApAQCAtMzYyLDYgKzM2Myw3IEBACiAgICAgICAgICAgICB0bnNDaGFubmVscywKICAgICAgICAgICAgIFNIT1JUX1dJTkRPVywKICAgICAgICAgICAgIGhQc3ktPmdyYW51bGVMZW5ndGgsCisgICAgICAgICAgICBpc0xvd0RlbGF5KGF1ZGlvT2JqZWN0VHlwZSksCiAgICAgICAgICAgICAoc3ludGF4RmxhZ3MmQUNfU0JSX1BSRVNFTlQpPzE6MCwKICAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0udG5zQ29uZiwKICAgICAgICAgICAgJmhQc3ktPnBzeUNvbmZbMV0sCkBAIC03NjMsNyArNzY1LDggQEAKIAogICAgIC8qIEFkdmFuY2UgcHN5Y2hvYWNvdXN0aWNzOiBUb25hbGl0eSBhbmQgVE5TICovCiAgICAgaWYgKHBzeVN0YXRpY1swXS0+aXNMRkUpIHsKLSAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgPSAwOworICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtISUZJTFRdID0gMDsKKyAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbTE9GSUxUXSA9IDA7CiAgICAgfQogICAgIGVsc2UKICAgICB7CkBAIC04MTksMTEgKzgyMiwxNSBAQAogICAgICAgICAgICAgZm9yKHcgPSAwOyB3IDwgbldpbmRvd3NbMF07IHcrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoaXNTaG9ydFdpbmRvd1swXSkKLSAgICAgICAgICAgICAgICAgICAgdG5zQWN0aXZlW3ddID0gdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoY2hhbm5lbHMgPT0gMikgPyB0bnNEYXRhWzFdLT5kYXRhUmF3LlNob3J0LnN1YkJsb2NrSW5mb1t3XS50bnNBY3RpdmUgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgdG5zQWN0aXZlW3ddID0gdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0hJRklMVF0gfHwKKyAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVswXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0xPRklMVF0gfHwKKyAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscy0xXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0hJRklMVF0gfHwKKyAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscy0xXS0+ZGF0YVJhdy5TaG9ydC5zdWJCbG9ja0luZm9bd10udG5zQWN0aXZlW0xPRklMVF07CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0bnNBY3RpdmVbd10gPSB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZSB8fAotICAgICAgICAgICAgICAgICAgICAoKGNoYW5uZWxzID09IDIpID8gdG5zRGF0YVsxXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmUgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgdG5zQWN0aXZlW3ddID0gdG5zRGF0YVswXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSB8fAorICAgICAgICAgICAgICAgICAgICB0bnNEYXRhWzBdLT5kYXRhUmF3Lkxvbmcuc3ViQmxvY2tJbmZvLnRuc0FjdGl2ZVtMT0ZJTFRdIHx8CisgICAgICAgICAgICAgICAgICAgIHRuc0RhdGFbY2hhbm5lbHMtMV0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlW0hJRklMVF0gfHwKKyAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaGFubmVscy0xXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbTE9GSUxUXTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZm9yKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewpAQCAtMTE1MCw4ICsxMTU3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgcHN5RGF0YVtjaF0tPnNmYk1heFNjYWxlU3BlYy5Mb25nLAogICAgICAgICAgICAgICAgICAgICAgICBzZmJUb25hbGl0eVtjaF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHBzeU91dENoYW5uZWxbY2hdLT50bnNJbmZvLm9yZGVyWzBdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgdG5zRGF0YVtjaF0tPmRhdGFSYXcuTG9uZy5zdWJCbG9ja0luZm8udG5zQWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby5wcmVkaWN0aW9uR2FpbltISUZJTFRdLAorICAgICAgICAgICAgICAgICAgICAgICB0bnNEYXRhW2NoXS0+ZGF0YVJhdy5Mb25nLnN1YkJsb2NrSW5mby50bnNBY3RpdmVbSElGSUxUXSwKICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPnNmYkVuZXJneUxkRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0Q2hhbm5lbFtjaF0tPm5vaXNlTnJnICk7CiAgICAgICAgIH0gLyogIWlzTEZFICovCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3FjX2RhdGEuaCBiL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oCmluZGV4IGE5MzA5YzguLjAwZDYwOTAgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oCisrKyBiL2xpYkFBQ2VuYy9zcmMvcWNfZGF0YS5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0yNjksNiArMjY5LDggQEAKICAgQklUQ05UUl9TVEFURSAqaEJpdENvdW50ZXI7CiAgIEFESl9USFJfU1RBVEUgKmhBZGpUaHI7CiAKKyAgSU5UIGRab25lUXVhbnRFbmFibGU7ICAgLyogZW5hYmxlIGRlYWQgem9uZSBxdWFudGl6ZXIgKi8KKwogfSBRQ19TVEFURTsKIAogI2VuZGlmIC8qIF9RQ19EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvcWNfbWFpbi5jcHAgYi9saWJBQUNlbmMvc3JjL3FjX21haW4uY3BwCmluZGV4IDc1MDMzMDkuLjljZDczZjYgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcWNfbWFpbi5jcHAKKysrIGIvbGliQUFDZW5jL3NyYy9xY19tYWluLmNwcApAQCAtMzgwLDcgKzM4MCw3IEBACiAgIGlmICggaXNDb25zdGFudEJpdHJhdGVNb2RlKGhRQy0+Yml0cmF0ZU1vZGUpICkgewogICAgIElOVCBiaXRyZXNQZXJDaGFubmVsID0gKGhRQy0+Yml0UmVzVG90TWF4IC8gaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5DaGFubmVsc0VmZik7CiAgICAgLyogMDogZnVsbCBiaXRyZXNlcnZvaXIsIDE6IHJlZHVjZWQgYml0cmVzZXJ2b2lyLCAyOiBkaXNhYmxlZCBiaXRyZXNlcnZvaXIgKi8KLSAgICBoUUMtPmJpdERpc3RyaWJ1dGlvbk1vZGUgPSAoYml0cmVzUGVyQ2hhbm5lbD4xMDApID8gMCA6IChiaXRyZXNQZXJDaGFubmVsPjApID8gMSA6IDI7CisgICAgaFFDLT5iaXREaXN0cmlidXRpb25Nb2RlID0gKGJpdHJlc1BlckNoYW5uZWw+QklUUkVTX01JTl9MRCkgPyAwIDogKGJpdHJlc1BlckNoYW5uZWw+MCkgPyAxIDogMjsKICAgfQogICBlbHNlIHsKICAgICBoUUMtPmJpdERpc3RyaWJ1dGlvbk1vZGUgPSAwOyAvKiBmdWxsIGJpdHJlc2Vydm9pciAqLwpAQCAtNDA1LDYgKzQwNSwxNiBAQAogICAgIH0KICAgfQogCisgIGlmIChpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmID09IDEgJiYKKyAgICAgKGluaXQtPmJpdHJhdGUgLyBpbml0LT5jaGFubmVsTWFwcGluZy0+bkNoYW5uZWxzRWZmKSA8IDMyMDAwICYmCisgICAgIGluaXQtPmFkdmFuY2VkQml0c1RvUGUgIT0gMAorICAgICApCisgIHsKKyAgICBoUUMtPmRab25lUXVhbnRFbmFibGUgPSAxOworICB9IGVsc2UgeworICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZSA9IDA7CisgIH0KKwogICBGREthYWNFbmNfQWRqVGhySW5pdCgKICAgICAgICAgaFFDLT5oQWRqVGhyLAogICAgICAgICBpbml0LT5tZWFuUGUsCkBAIC00MTQsNyArNDI0LDggQEAKICAgICAgICAgaW5pdC0+Y2hhbm5lbE1hcHBpbmctPm5DaGFubmVsc0VmZiwKICAgICAgICAgaW5pdC0+c2FtcGxlUmF0ZSwgICAgICAgICAgICAgICAgIC8qIG91dHB1dCBzYW1wbGUgcmF0ZSAqLwogICAgICAgICBpbml0LT5hZHZhbmNlZEJpdHNUb1BlLCAgICAgICAgICAgLyogaWYgc2V0LCBjYWxjIGJpdHMyUEUgZmFjdG9yIGRlcGVuZGluZyBvbiBzYW1wbGVyYXRlICovCi0gICAgICAgIGhRQy0+dmJyUXVhbEZhY3RvcgorICAgICAgICBoUUMtPnZiclF1YWxGYWN0b3IsCisgICAgICAgIGhRQy0+ZFpvbmVRdWFudEVuYWJsZQogICAgICAgICApOwogCiAgIHJldHVybiBBQUNfRU5DX09LOwpAQCAtODc3LDYgKzg4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRbY10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5T3V0W2NdLT5wc3lPdXRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29uc3RhbnRCaXRyYXRlTW9kZShoUUMtPmJpdHJhdGVNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmhBZGpUaHItPm1heEl0ZXIybmRHdWVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbSk7CiAKICAgICAgIH0gLyogLWVuZC0gc3ViIGZyYW1lIGNvdW50ZXIgKi8KQEAgLTkwNCw2ICs5MTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIEZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9ycyhwc3lPdXRbY10tPnBzeU91dEVsZW1lbnRbaV0tPnBzeU91dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjRWxlbWVudFtjXVtpXS0+cWNPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmludlF1YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUUMtPmRab25lUXVhbnRFbmFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLT5lbEluZm9baV0ubkNoYW5uZWxzSW5FbCk7CiAKIApAQCAtOTk4LDcgKzEwMTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5nbG9iYWxHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2gtPnNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5xdWFudFNwZWMpIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxY091dENoLT5xdWFudFNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFFDLT5kWm9uZVF1YW50RW5hYmxlKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRkRLYWFjRW5jX2NhbGNNYXhWYWx1ZUluU2ZiKHBzeU91dENoLT5zZmJDbnQsCmRpZmYgLS1naXQgYS9saWJBQUNlbmMvc3JjL3F1YW50aXplLmNwcCBiL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwCmluZGV4IDUzODBlMzUuLmE3NGRhMGUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwCisrKyBiL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuY3BwCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xMDQsMTMgKzEwNCwxOSBAQAogc3RhdGljIHZvaWQgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoSU5UICAgICAgZ2FpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgbm9PZkxpbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgICAgICpxdWFTcGVjdHJ1bSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgICAgKnF1YVNwZWN0cnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICBkWm9uZVF1YW50RW5hYmxlKQogewogICBpbnQgICBsaW5lOwotICBGSVhQX0RCTCBrID0gRkwyRlhDT05TVF9EQkwoLTAuMDk0NmYgKyAwLjVmKT4+MTY7CisgIEZJWFBfREJMIGsgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKICAgRklYUF9RVEQgcXVhbnRpemVyID0gRkRLYWFjRW5jX3F1YW50VGFibGVRWygtZ2FpbikmM107CiAgIElOVCAgICAgIHF1YW50aXplcnNoaWZ0ID0gKCgtZ2Fpbik+PjIpKzE7CisgIGNvbnN0IElOVCBrU2hpZnQ9MTY7CiAKKyAgaWYgKGRab25lUXVhbnRFbmFibGUpCisgICAgayA9IEZMMkZYQ09OU1RfREJMKDAuMjNmKT4+a1NoaWZ0OworICBlbHNlCisgICAgayA9IEZMMkZYQ09OU1RfREJMKC0wLjA5NDZmICsgMC41Zik+PmtTaGlmdDsKIAogICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgbm9PZkxpbmVzOyBsaW5lKyspCiAgIHsKQEAgLTI2Myw3ICsyNjksOCBAQAogICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICptZGN0U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICAgSU5UIGdsb2JhbEdhaW4sCiAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2FsZWZhY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50aXplZFNwZWN0cnVtKQorICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudGl6ZWRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSkKIHsKICAgSU5UIHNmYk9mZnMsc2ZiOwogCkBAIC0yODAsNyArMjg3LDggQEAKICAgICBGREthYWNFbmNfcXVhbnRpemVMaW5lcyhnbG9iYWxHYWluIC0gc2NhbGVmYWN0b3IsIC8qIFFTUyAqLwogICAgICAgICAgICAgICAgICAgc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiKzFdIC0gc2ZiT2Zmc2V0W3NmYk9mZnMrc2ZiXSwKICAgICAgICAgICAgICAgICAgIG1kY3RTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0sCi0gICAgICAgICAgICAgICAgICBxdWFudGl6ZWRTcGVjdHJ1bSArIHNmYk9mZnNldFtzZmJPZmZzK3NmYl0pOworICAgICAgICAgICAgICAgICAgcXVhbnRpemVkU3BlY3RydW0gKyBzZmJPZmZzZXRbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAgIH0KIH0KIApAQCAtMjk2LDcgKzMwNCw4IEBACiBGSVhQX0RCTCBGREthYWNFbmNfY2FsY1NmYkRpc3QoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgSU5UIG5vT2ZMaW5lcywKLSAgICAgICAgICAgICAgICAgICAgIElOVCBnYWluCisgICAgICAgICAgICAgICAgICAgICBJTlQgZ2FpbiwKKyAgICAgICAgICAgICAgICAgICAgIElOVCBkWm9uZVF1YW50RW5hYmxlCiAgICAgICAgICAgICAgICAgICAgICApCiB7CiAgIElOVCBpLHNjYWxlOwpAQCAtMzExLDcgKzMyMCw4IEBACiAgICAgRkRLYWFjRW5jX3F1YW50aXplTGluZXMoZ2FpbiwKICAgICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAgICZtZGN0U3BlY3RydW1baV0sCi0gICAgICAgICAgICAgICAgICZxdWFudFNwZWN0cnVtW2ldKTsKKyAgICAgICAgICAgICAgICAgJnF1YW50U3BlY3RydW1baV0sCisgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKIAogICAgIGlmIChmQWJzKHF1YW50U3BlY3RydW1baV0pPk1BWF9RVUFOVCkgewogICAgICAgcmV0dXJuIEZMMkZYQ09OU1RfREJMKDAuMGYpOwpkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5oIGIvbGliQUFDZW5jL3NyYy9xdWFudGl6ZS5oCmluZGV4IDk3NWI5OGUuLjE2ZDNkNGUgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvcXVhbnRpemUuaAorKysgYi9saWJBQUNlbmMvc3JjL3F1YW50aXplLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEwMiwxMiArMTAyLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNmYlBlckdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2ZiT2Zmc2V0LCBGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgIElOVCBnbG9iYWxHYWluLCBJTlQgKnNjYWxlZmFjdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRpemVkU3BlY3RydW0pOworICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudGl6ZWRTcGVjdHJ1bSwKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSk7CiAKIEZJWFBfREJMIEZES2FhY0VuY19jYWxjU2ZiRGlzdChGSVhQX0RCTCAqbWRjdFNwZWN0cnVtLAogICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlY3RydW0sCiAgICAgICAgICAgICAgICAgICAgICBJTlQgbm9PZkxpbmVzLAotICAgICAgICAgICAgICAgICAgICAgSU5UIGdhaW4pOworICAgICAgICAgICAgICAgICAgICAgSU5UIGdhaW4sCisgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSk7CiAKIHZvaWQgRkRLYWFjRW5jX2NhbGNTZmJRdWFudEVuZXJneUFuZERpc3QoRklYUF9EQkwgKm1kY3RTcGVjdHJ1bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAgICpxdWFudFNwZWN0cnVtLApkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5jcHAgYi9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmNwcAppbmRleCA3MmI3NWE2Li4xY2IyNDNiIDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmNwcAorKysgYi9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMzYzLDcgKzM2Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgSU5UIHNjZiwKICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWluU2NmLAogICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqZGlzdExkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1pblNjZkNhbGN1bGF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICBJTlQgKm1pblNjZkNhbGN1bGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgSU5UIGRab25lUXVhbnRFbmFibGUKICAgICAgICAgICAgICAgICAgICAgICApCiB7CiAgICBGSVhQX0RCTCBzZmJEaXN0TGREYXRhOwpAQCAtMzc1LDcgKzM3Niw4IEBACiAgICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAgICAqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZjsKICAgIC8qIG5tciA+IDEuMjUgLT4gdHJ5IHRvIGltcHJvdmUgbm1yICovCiAgICBpZiAoc2ZiRGlzdExkRGF0YSA+ICh0aHJlc2hMZERhdGEtZGlzdEZhY3RvckxkRGF0YSkpIHsKQEAgLTM5MCw3ICszOTIsOCBAQAogICAgICAgICAgc2ZiRGlzdExkRGF0YSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChzcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmYldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2YpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOwogCiAgICAgICAgICBpZiAoc2ZiRGlzdExkRGF0YSA8IHNmYkRpc3RCZXN0TGREYXRhKSB7CiAgICAgICAgICAgICBzY2ZCZXN0ID0gc2NmOwpAQCAtNDA4LDcgKzQxMSw4IEBACiAgICAgICAgICBzZmJEaXN0TGREYXRhID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAKICAgICAgICAgIGlmIChzZmJEaXN0TGREYXRhIDwgc2ZiRGlzdEJlc3RMZERhdGEpIHsKICAgICAgICAgICAgIHNjZkJlc3QgPSBzY2Y7CkBAIC00MjksNyArNDMzLDggQEAKICAgICAgICAgIHNmYkRpc3RMZERhdGEgPSBGREthYWNFbmNfY2FsY1NmYkRpc3Qoc3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKIAogICAgICAgICAgaWYgKHNmYkRpc3RMZERhdGEgPCBzZmJEaXN0QWxsb3dlZExkRGF0YSkgewogICAgICAgICAgICAqbWluU2NmQ2FsY3VsYXRlZCA9IHNjZkJlc3QrMTsKQEAgLTQ1NCw2ICs0NTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRQ19PVVRfQ0hBTk5FTCAgICpxY091dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIT1JUICpxdWFudFNwZWNUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkWm9uZVF1YW50RW5hYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICptaW5TY2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJEaXN0LApAQCAtNTcwLDcgKzU3Niw4IEBACiAgICAgICAgICAgICBzZmJEaXN0TmV3ID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlY1RtcCtzZmJPZmZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmQWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmQWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlKTsKIAogICAgICAgICAgICAgaWYgKHNmYkRpc3ROZXcgPCBzZmJEaXN0W3NmYkFjdF0pIHsKICAgICAgICAgICAgICAgLyogc3VjY2VzcywgcmVwbGFjZSBzY2YgYnkgbmV3IG9uZSAqLwpAQCAtNjI5LDYgKzYzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwgICpxY091dENoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKnF1YW50U3BlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBkWm9uZVF1YW50RW5hYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqc2NmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpzZmJEaXN0LApAQCAtNzI0LDcgKzczMiw4IEBACiAgICAgICAgICAgICAgICAgc2ZiRGlzdE5ld1tzZmJdID0gRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3NmYk9mZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wK3NmYk9mZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmQWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2ZBY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoc2ZiRGlzdE5ld1tzZmJdID5xY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdKSB7CiAgICAgICAgICAgICAgICAgICAvKiBubyBpbXByb3ZlbWVudCwgc2tpcCBmdXJ0aGVyIGRpc3QuIGNhbGN1bGF0aW9ucyAqLwpAQCAtNzY4LDYgKzc3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMICAqcWNPdXRDaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqcXVhbnRTcGVjVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgZFpvbmVRdWFudEVuYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpzY2YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAqbWluU2NmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqc2ZiRGlzdCwKQEAgLTg4Myw3ICs4OTMsOCBAQAogICAgICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStzZmJPZmZzW3NmYl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRTcGVjVG1wK3NmYk9mZnNbc2ZiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJPZmZzW3NmYisxXS1zZmJPZmZzW3NmYl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmTmV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2ZOZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSk7CiAKICAgICAgICAgICAgICAgICBpZiAoc2ZiRGlzdE5ld1tzZmJdID4gc2ZiRGlzdE1heFtzZmJdKSB7CiAgICAgICAgICAgICAgICAgICAvKiBubyBpbXByb3ZlbWVudCwgc2tpcCBmdXJ0aGVyIGRpc3QuIGNhbGN1bGF0aW9ucyAqLwpAQCAtOTYzLDcgKzk3NCw4IEBACiAgICAgICAgICAgICAgIHNmYkRpc3ROZXdbc2ZiXSA9IEZES2FhY0VuY19jYWxjU2ZiRGlzdChxY091dENoYW5uZWwtPm1kY3RTcGVjdHJ1bStzZmJPZmZzW3NmYl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArc2ZiT2Zmc1tzZmJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiT2Zmc1tzZmIrMV0tc2ZiT2Zmc1tzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NmTmV3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZk5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUpOwogCiAgICAgICAgICAgICAgIGlmIChzZmJEaXN0TmV3W3NmYl0gPiBxY091dENoYW5uZWwtPnNmYlRocmVzaG9sZExkRGF0YVtzZmJdKSB7CiAgICAgICAgICAgICAgICAgLyogbm8gaW1wcm92ZW1lbnQsIHNraXAgZnVydGhlciBkaXN0LiBjYWxjdWxhdGlvbnMgKi8KQEAgLTEwNTgsNyArMTA3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICpSRVNUUklDVCBnbG9iYWxHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBzZmJGb3JtRmFjdG9yTGREYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGNvbnN0IElOVCBpbnZRdWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSE9SVCAqUkVTVFJJQ1QgcXVhbnRTcGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hPUlQgKlJFU1RSSUNUIHF1YW50U3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQgZFpvbmVRdWFudEVuYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKICAgSU5UIGksIGosIHNmYiwgc2ZiT2ZmczsKQEAgLTExNjAsNyArMTE3Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudFNwZWNUbXArcHN5T3V0Q2hhbm5lbC0+c2ZiT2Zmc2V0c1tzZmJPZmZzK3NmYl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdLXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNoTGREYXRhLCBzY2ZJbnQsIG1pblNmTWF4UXVhbnRbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNmYkRpc3RMZERhdGFbc2ZiT2ZmcytzZmJdLCAmbWluU2NmQ2FsY3VsYXRlZFtzZmJPZmZzK3NmYl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZmJEaXN0TGREYXRhW3NmYk9mZnMrc2ZiXSwgJm1pblNjZkNhbGN1bGF0ZWRbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgfQogICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdID0gc2NmSW50OwpAQCAtMTE4NywyMCArMTIwMSwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZmJOUmVsZXZhbnRMaW5lcyk7CiAKIAotICAgIEZES2FhY0VuY19hc3NpbWlsYXRlU2luZ2xlU2NmKHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsIHNjZiwKKyAgICBGREthYWNFbmNfYXNzaW1pbGF0ZVNpbmdsZVNjZihwc3lPdXRDaGFubmVsLCBxY091dENoYW5uZWwsIHF1YW50U3BlYywgcXVhbnRTcGVjVG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgZFpvbmVRdWFudEVuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMsIG1pblNjZkNhbGN1bGF0ZWQsIDEpOwogCisgICAgaWYoaW52UXVhbnQgPiAxKSB7CisgICAgICBGREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmKHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICBkWm9uZVF1YW50RW5hYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NmLAorICAgICAgICAgICAgICAgICAgICAgICAgbWluU2ZNYXhRdWFudCwgc2ZiRGlzdExkRGF0YSwgc2ZiQ29uc3RQZVBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZmJGb3JtRmFjdG9yTGREYXRhLCBzZmJOUmVsZXZhbnRMaW5lcyk7CiAKLSAgICBGREthYWNFbmNfYXNzaW1pbGF0ZU11bHRpcGxlU2NmKHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWluU2ZNYXhRdWFudCwgc2ZiRGlzdExkRGF0YSwgc2ZiQ29uc3RQZVBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzKTsKKyAgICAgIEZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YocHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBxdWFudFNwZWMsIHF1YW50U3BlY1RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzKTsKIAogCi0gICAgRkRLYWFjRW5jX0ZES2FhY0VuY19hc3NpbWlsYXRlTXVsdGlwbGVTY2YyKHBzeU91dENoYW5uZWwsIHFjT3V0Q2hhbm5lbCwgcXVhbnRTcGVjLCBxdWFudFNwZWNUbXAsIHNjZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblNmTWF4UXVhbnQsIHNmYkRpc3RMZERhdGEsIHNmYkNvbnN0UGVQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZiRm9ybUZhY3RvckxkRGF0YSwgc2ZiTlJlbGV2YW50TGluZXMpOwotCisgICAgICBGREthYWNFbmNfRkRLYWFjRW5jX2Fzc2ltaWxhdGVNdWx0aXBsZVNjZjIocHN5T3V0Q2hhbm5lbCwgcWNPdXRDaGFubmVsLCBxdWFudFNwZWMsIHF1YW50U3BlY1RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBzY2YsCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5TZk1heFF1YW50LCBzZmJEaXN0TGREYXRhLCBzZmJDb25zdFBlUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNmYkZvcm1GYWN0b3JMZERhdGEsIHNmYk5SZWxldmFudExpbmVzKTsKKyAgICB9CiAgIH0KIAogCkBAIC0xMjIzLDcgKzEyNDksOCBAQAogICAgICAgICAgICAgICAgRkRLYWFjRW5jX2NhbGNTZmJEaXN0KHFjT3V0Q2hhbm5lbC0+bWRjdFNwZWN0cnVtK3BzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50U3BlYytwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3lPdXRDaGFubmVsLT5zZmJPZmZzZXRzW3NmYk9mZnMrc2ZiKzFdLXBzeU91dENoYW5uZWwtPnNmYk9mZnNldHNbc2ZiT2ZmcytzZmJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZltzZmJPZmZzK3NmYl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2Zbc2ZiT2ZmcytzZmJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICB9CiAgICAgICB9CkBAIC0xMjgxLDYgKzEzMDgsNyBAQAogRkRLYWFjRW5jX0VzdGltYXRlU2NhbGVGYWN0b3JzKFBTWV9PVVRfQ0hBTk5FTCAqcHN5T3V0Q2hhbm5lbFtdLAogICAgICAgICAgICAgICAgICAgICAgUUNfT1VUX0NIQU5ORUwqIHFjT3V0Q2hhbm5lbFtdLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGludlF1YW50LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU5UIGRab25lUXVhbnRFbmFibGUsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbkNoYW5uZWxzKQogewogICBpbnQgY2g7CkBAIC0xMjkzLDcgKzEzMjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxY091dENoYW5uZWxbY2hdLT5nbG9iYWxHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFjT3V0Q2hhbm5lbFtjaF0tPnNmYkZvcm1GYWN0b3JMZERhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsaW52UXVhbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWNPdXRDaGFubmVsW2NoXS0+cXVhbnRTcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRab25lUXVhbnRFbmFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICB9CiAKZGlmZiAtLWdpdCBhL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uaCBiL2xpYkFBQ2VuYy9zcmMvc2ZfZXN0aW0uaAppbmRleCBiNWFjMDAwLi5lZjhkMzY2IDEwMDY0NAotLS0gYS9saWJBQUNlbmMvc3JjL3NmX2VzdGltLmgKKysrIGIvbGliQUFDZW5jL3NyYy9zZl9lc3RpbS5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xMTAsNiArMTEwLDcgQEAKIEZES2FhY0VuY19Fc3RpbWF0ZVNjYWxlRmFjdG9ycyhQU1lfT1VUX0NIQU5ORUwgKnBzeU91dENoYW5uZWxbXSwKICAgICAgICAgICAgICAgICAgICAgIFFDX09VVF9DSEFOTkVMKiBxY091dENoYW5uZWxbXSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbnZRdWFudCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVCBkWm9uZVF1YW50RW5hYmxlLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG5DaGFubmVscyk7CiAKIApkaWZmIC0tZ2l0IGEvbGliQUFDZW5jL3NyYy90bnNfZnVuYy5oIGIvbGliQUFDZW5jL3NyYy90bnNfZnVuYy5oCmluZGV4IDZlZTBlZGIuLjVlNTI2NWQgMTAwNjQ0Ci0tLSBhL2xpYkFBQ2VuYy9zcmMvdG5zX2Z1bmMuaAorKysgYi9saWJBQUNlbmMvc3JjL3Ruc19mdW5jLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEwMCw2ICsxMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgYmxvY2t0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBncmFudWxlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBpc0xvd0RlbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBsZFNiclByZXNlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVE5TX0NPTkZJRyAqdG5zQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBTWV9DT05GSUdVUkFUSU9OICpwc3lDb25maWcsCmRpZmYgLS1naXQgYS9saWJGREsvaW5jbHVkZS9maXhwb2ludF9tYXRoLmggYi9saWJGREsvaW5jbHVkZS9maXhwb2ludF9tYXRoLmgKaW5kZXggODhlMmYwOS4uMGQ1MGYwYSAxMDA2NDQKLS0tIGEvbGliRkRLL2luY2x1ZGUvZml4cG9pbnRfbWF0aC5oCisrKyBiL2xpYkZESy9pbmNsdWRlL2ZpeHBvaW50X21hdGguaApAQCAtOTQsNiArOTQsMzUgQEAKIAogI2luY2x1ZGUgImNvbW1vbl9maXguaCIKIAorI2lmICFkZWZpbmVkKEZVTkNUSU9OX2ZJc0xlc3NUaGFuKQorLyoqCisgKiBcYnJpZWYgQ29tcGFyZXMgdHdvIGZpeHBvaW50IHZhbHVlcyBpbmNsLiBzY2FsaW5nLgorICogXHBhcmFtIGFfbSBtYW50aXNzYSBvZiB0aGUgZmlyc3QgaW5wdXQgdmFsdWUuCisgKiBccGFyYW0gYV9lIGV4cG9uZW50IG9mIHRoZSBmaXJzdCBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSBiX20gbWFudGlzc2Egb2YgdGhlIHNlY29uZCBpbnB1dCB2YWx1ZS4KKyAqIFxwYXJhbSBiX2UgZXhwb25lbnQgb2YgdGhlIHNlY29uZCBpbnB1dCB2YWx1ZS4KKyAqIFxyZXR1cm4gbm9uLXplcm8gaWYgKGFfbSoyXmFfZSkgPCAoYl9tKjJeYl9lKSwgMCBvdGhlcndpc2UKKyAqLworRkRLX0lOTElORSBJTlQgZklzTGVzc1RoYW4oRklYUF9EQkwgYV9tLCBJTlQgYV9lLCBGSVhQX0RCTCBiX20sIElOVCBiX2UpCit7CisgIGlmIChhX2UgPiBiX2UpIHsKKyAgICByZXR1cm4gKGJfbSA+PiBmTWluKGFfZS1iX2UsIERGUkFDVF9CSVRTLTEpID4gYV9tKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGFfbSA+PiBmTWluKGJfZS1hX2UsIERGUkFDVF9CSVRTLTEpIDwgYl9tKTsKKyAgfQorfQorCitGREtfSU5MSU5FIElOVCBmSXNMZXNzVGhhbihGSVhQX1NHTCBhX20sIElOVCBhX2UsIEZJWFBfU0dMIGJfbSwgSU5UIGJfZSkKK3sKKyAgaWYgKGFfZSA+IGJfZSkgeworICAgIHJldHVybiAoYl9tID4+IGZNaW4oYV9lLWJfZSwgRlJBQ1RfQklUUy0xKSA+IGFfbSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChhX20gPj4gZk1pbihiX2UtYV9lLCBGUkFDVF9CSVRTLTEpIDwgYl9tKTsKKyAgfQorfQorI2VuZGlmCisKKwogCiAjZGVmaW5lIExEX0RBVEFfU0NBTElORyAoNjQuMGYpCiAjZGVmaW5lIExEX0RBVEFfU0hJRlQgICA2ICAgLyogcG93KDIsIExEX0RBVEFfU0hJRlQpID0gTERfREFUQV9TQ0FMSU5HICovCmRpZmYgLS1naXQgYS9saWJGREsvc3JjL0ZES19jb3JlLmNwcCBiL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCmluZGV4IDhmYTU1OTYuLjFkOGFjN2IgMTAwNjQ0Ci0tLSBhL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCisrKyBiL2xpYkZESy9zcmMvRkRLX2NvcmUuY3BwCkBAIC05Myw3ICs5Myw3IEBACiAvKiBGREsgdG9vbHMgbGlicmFyeSBpbmZvICovCiAjZGVmaW5lIEZES19UT09MU19MSUJfVkwwIDIKICNkZWZpbmUgRkRLX1RPT0xTX0xJQl9WTDEgMwotI2RlZmluZSBGREtfVE9PTFNfTElCX1ZMMiA0CisjZGVmaW5lIEZES19UT09MU19MSUJfVkwyIDYKICNkZWZpbmUgRkRLX1RPT0xTX0xJQl9USVRMRSAiRkRLIFRvb2xzIgogI2lmZGVmIF9fQU5EUk9JRF9fCiAjZGVmaW5lIEZES19UT09MU19MSUJfQlVJTERfREFURSAiIgpkaWZmIC0tZ2l0IGEvbGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcCBiL2xpYkZESy9zcmMvRkRLX3Rvb2xzX3JvbS5jcHAKaW5kZXggNDlmMGVlMS4uMjllMzdmMiAxMDA2NDQKLS0tIGEvbGliRkRLL3NyYy9GREtfdG9vbHNfcm9tLmNwcAorKysgYi9saWJGREsvc3JjL0ZES190b29sc19yb20uY3BwCkBAIC0yMjM2LDcgKzIyMzYsNyBAQAogICBpY3NfaW5mbywKICAgbXMsCiAgIGx0cF9kYXRhX3ByZXNlbnQsCi0gIGx0cF9kYXRhLAorICAvKiBsdHBfZGF0YSwgKi8KICAgZ2xvYmFsX2dhaW4sCiAgIHNlY3Rpb25fZGF0YSwKICAgc2NhbGVfZmFjdG9yX2RhdGEsCkBAIC0yMjQ3LDcgKzIyNDcsNyBAQAogICBuZXh0X2NoYW5uZWwsCiAKICAgbHRwX2RhdGFfcHJlc2VudCwKLSAgbHRwX2RhdGEsCisgIC8qIGx0cF9kYXRhLCAqLwogICBnbG9iYWxfZ2FpbiwKICAgc2VjdGlvbl9kYXRhLAogICBzY2FsZV9mYWN0b3JfZGF0YSwKQEAgLTIyOTAsNyArMjI5MCwxNzggQEAKICAgeyAmbm9kZV9hYWNfY3BlMF9lcGMxLCAmbm9kZV9hYWNfY3BlMV9lcGMxIH0KIH07CiAKKy8qCisgKiBBT1QgPSAyMAorICogZXBDb25maWcgPSAwCisgKi8KK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX3NjZV9lcGMwW10gPSB7CisgIGljc19pbmZvLCAgICAgICAgICAgIC8qIEVTQyAxICovCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGx0cF9kYXRhX3ByZXNlbnQsCisgIC8qIGx0cF9kYXRhLCAqLworICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgZXNjMV9oY3IsCisgIGVzYzJfcnZsYywgICAgICAgICAgIC8qIEVTQyAyICovCisgIHRuc19kYXRhLCAgICAgICAgICAgIC8qIEVTQyAzICovCisgIHNwZWN0cmFsX2RhdGEsICAgICAgIC8qIEVTQyA0ICovCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX3NjZV9lcGMwID0geworICBlbF9zY2FsX3NjZV9lcGMwLAorICB7IE5VTEwsIE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3NjYWxfY3BlX2VwYzBbXSA9IHsKKyAgaWNzX2luZm8sICAgICAgICAgICAgLyogRVNDIDAgKi8KKyAgbXMsCisgIHRuc19kYXRhX3ByZXNlbnQsICAgIC8qIEVTQyAxIChjaCAwKSAqLworICBsdHBfZGF0YV9wcmVzZW50LAorICAvKiBsdHBfZGF0YSwgKi8KKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIGVzYzFfaGNyLAorICBlc2MyX3J2bGMsICAgICAgICAgICAvKiBFU0MgMiAoY2ggMCkgKi8KKyAgdG5zX2RhdGEsICAgICAgICAgICAgLyogRVNDIDMgKGNoIDApICovCisgIHNwZWN0cmFsX2RhdGEsICAgICAgIC8qIEVTQyA0IChjaCAwKSAqLworICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhX3ByZXNlbnQsICAgIC8qIEVTQyAxIChjaCAxKSAqLworICBsdHBfZGF0YV9wcmVzZW50LAorICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgZXNjMV9oY3IsCisgIGVzYzJfcnZsYywgICAgICAgICAgIC8qIEVTQyAyIChjaCAxKSAqLworICB0bnNfZGF0YSwgICAgICAgICAgICAvKiBFU0MgMyAoY2ggMSkgKi8KKyAgc3BlY3RyYWxfZGF0YSwgICAgICAgLyogRVNDIDQgKGNoIDEpICovCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9zY2FsX2NwZV9lcGMwID0geworICBlbF9zY2FsX2NwZV9lcGMwLAorICB7IE5VTEwsIE5VTEwgfQorfTsKKworLyoKKyAqIEFPVCA9IDIwCisgKiBlcENvbmZpZyA9IDEKKyAqLworc3RhdGljIGNvbnN0IHJiZF9pZF90IGVsX3NjYWxfc2NlX2VwYzFbXSA9IHsKKyAgaWNzX2luZm8sCisgIHRuc19kYXRhX3ByZXNlbnQsCisgIGx0cF9kYXRhX3ByZXNlbnQsCisgIC8qIGx0cF9kYXRhLCAqLworICBnbG9iYWxfZ2FpbiwKKyAgc2VjdGlvbl9kYXRhLAorICBzY2FsZV9mYWN0b3JfZGF0YSwKKyAgZXNjMV9oY3IsCisgIHRuc19kYXRhLAorICBzcGVjdHJhbF9kYXRhLAorICBlbmRfb2Zfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfc2NhbF9zY2VfZXBjMSA9IHsKKyAgZWxfc2NhbF9zY2VfZXBjMSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9zY2FsX2NwZV9lcGMxW10gPSB7CisgIGljc19pbmZvLAorICBtcywKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbHRwX2RhdGFfcHJlc2VudCwKKyAgLyogbHRwX2RhdGEsICovCisgIGdsb2JhbF9nYWluLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBlc2MxX2hjciwKKyAgbmV4dF9jaGFubmVsLAorICB0bnNfZGF0YV9wcmVzZW50LAorICBsdHBfZGF0YV9wcmVzZW50LAorICAvKiBsdHBfZGF0YSwgKi8KKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIGVzYzFfaGNyLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHNwZWN0cmFsX2RhdGEsCisgIG5leHRfY2hhbm5lbCwKKyAgc3BlY3RyYWxfZGF0YSwKKyAgZW5kX29mX3NlcXVlbmNlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVsZW1lbnRfbGlzdCBub2RlX3NjYWxfY3BlX2VwYzEgPSB7CisgIGVsX3NjYWxfY3BlX2VwYzEsCisgIHsgTlVMTCwgTlVMTCB9Cit9OworCisvKgorICogUHNldWRvIEFPVCBmb3IgRFJNL0RSTSsgKHNpbWlsYXIgdG8gQU9UIDIwKQorICogRGVyaXZlZCBmcm9tIGVwQ29uZmlnID0gMQorICovCitzdGF0aWMgY29uc3QgcmJkX2lkX3QgZWxfZHJtX3NjZVtdID0geworICBkcm1jcmNfc3RhcnRfcmVnLAorICBpY3NfaW5mbywKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbHRwX2RhdGFfcHJlc2VudCwKKyAgLyogbHRwX2RhdGEsICovCisgIGdsb2JhbF9nYWluLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBlc2MxX2hjciwKKyAgdG5zX2RhdGEsCisgIGRybWNyY19lbmRfcmVnLAorICBzcGVjdHJhbF9kYXRhLAorICBlbmRfb2Zfc2VxdWVuY2UKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZWxlbWVudF9saXN0IG5vZGVfZHJtX3NjZSA9IHsKKyAgZWxfZHJtX3NjZSwKKyAgeyBOVUxMLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCByYmRfaWRfdCBlbF9kcm1fY3BlW10gPSB7CisgIGRybWNyY19zdGFydF9yZWcsCisgIGljc19pbmZvLAorICBtcywKKyAgdG5zX2RhdGFfcHJlc2VudCwKKyAgbHRwX2RhdGFfcHJlc2VudCwKKyAgLyogbHRwX2RhdGEsICovCisgIGdsb2JhbF9nYWluLAorICBzZWN0aW9uX2RhdGEsCisgIHNjYWxlX2ZhY3Rvcl9kYXRhLAorICBlc2MxX2hjciwKKyAgbmV4dF9jaGFubmVsLAorICB0bnNfZGF0YV9wcmVzZW50LAorICBsdHBfZGF0YV9wcmVzZW50LAorICAvKiBsdHBfZGF0YSwgKi8KKyAgZ2xvYmFsX2dhaW4sCisgIHNlY3Rpb25fZGF0YSwKKyAgc2NhbGVfZmFjdG9yX2RhdGEsCisgIGVzYzFfaGNyLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHRuc19kYXRhLAorICBkcm1jcmNfZW5kX3JlZywKKyAgbmV4dF9jaGFubmVsLAorICBzcGVjdHJhbF9kYXRhLAorICBuZXh0X2NoYW5uZWwsCisgIHNwZWN0cmFsX2RhdGEsCisgIGVuZF9vZl9zZXF1ZW5jZQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBlbGVtZW50X2xpc3Qgbm9kZV9kcm1fY3BlID0geworICBlbF9kcm1fY3BlLAorICB7IE5VTEwsIE5VTEwgfQorfTsKIAogLyoKICAqIEFPVCA9IDM5CkBAIC0yNDA1LDYgKzI1NzYsMTkgQEAKICAgICAgICAgICByZXR1cm4gJm5vZGVfYWFjX2NwZV9lcGMxOwogICAgICAgfQogICAgICAgYnJlYWs7CisgICAgY2FzZSBBT1RfRVJfQUFDX1NDQUw6CisgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgaWYgKGVwQ29uZmlnIDw9IDApCisgICAgICAgICAgcmV0dXJuICZub2RlX3NjYWxfc2NlX2VwYzA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICByZXR1cm4gJm5vZGVfc2NhbF9zY2VfZXBjMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlcENvbmZpZyA8PSAwKQorICAgICAgICAgIHJldHVybiAmbm9kZV9zY2FsX2NwZV9lcGMwOworICAgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuICZub2RlX3NjYWxfY3BlX2VwYzE7CisgICAgICB9CisgICAgICBicmVhazsKICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgaWYgKG5DaGFubmVscyA9PSAxKSB7CiAgICAgICAgIGlmIChlcENvbmZpZyA8PSAwKQpAQCAtMjQxNyw2ICsyNjAxLDE2IEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICByZXR1cm4gJm5vZGVfZWxkX2NwZV9lcGMxOwogICAgICAgfQorICAgIGNhc2UgQU9UX0RSTV9BQUM6CisgICAgY2FzZSBBT1RfRFJNX1NCUjoKKyAgICBjYXNlIEFPVF9EUk1fTVBFR19QUzoKKyAgICAgIEZES19BU1NFUlQoZXBDb25maWcgPT0gMSk7CisgICAgICBpZiAobkNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgcmV0dXJuICZub2RlX2RybV9zY2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJm5vZGVfZHJtX2NwZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hc2MuY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19hc2MuY3BwCmluZGV4IGJhZTI3MWUuLjk2YTFiMzUgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfYXNjLmNwcAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2FzYy5jcHAKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTExMjYsNiArMTEyNiw4IEBACiAgICAgICBpZiAoIDAgIT0gbGRfc2JyX2hlYWRlcihhc2MsIGhCcywgY2IpICkgewogICAgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOwogICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gVFJBTlNQT1JUREVDX1VOU1VQUE9SVEVEX0ZPUk1BVDsKICAgICB9CiAgIH0KICAgZXNjLT5tX3VzZUxkUW1mVGltZUFsaWduID0gMDsKQEAgLTExNDYsNyArMTE0OCw3IEBACiAKICAgICBzd2l0Y2ggKGVsZEV4dFR5cGUpIHsKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZvcihjbnQ9MDsgY250PGxlbjsgY250KyspIHsKKyAgICAgICAgZm9yKGNudD0wOyBjbnQ8ZWxkRXh0TGVuOyBjbnQrKykgewogICAgICAgICAgIEZES3JlYWRCaXRzKGhCcywgOCApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTM3Miw0ICsxMzc0LDEzMyBAQAogICByZXR1cm4gKEVycm9yU3RhdHVzKTsKIH0KIAorVFJBTlNQT1JUREVDX0VSUk9SIERybVJhd1NkY0F1ZGlvQ29uZmlnX1BhcnNlKAorICAgICAgICBDU0F1ZGlvU3BlY2lmaWNDb25maWcgKnNlbGYsCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICAgYnMKKyAgICAgICAgKQoreworICBUUkFOU1BPUlRERUNfRVJST1IgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfT0s7CisKKyAgQXVkaW9TcGVjaWZpY0NvbmZpZ19Jbml0KHNlbGYpOworCisgIGlmICgoSU5UKUZES2dldFZhbGlkQml0cyhicykgPCAyMCkgeworICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgIGdvdG8gYmFpbDsKKyAgfQorICBlbHNlIHsKKyAgICAvKiBEUk0gLSBBdWRpbyBpbmZvcm1hdGlvbiBkYXRhIGVudGl0eSAtIHR5cGUgOQorICAgICAgIC0gU2hvcnQgSWQgICAgICAgICAgICAyIGJpdHMKKyAgICAgICAtIFN0cmVhbSBJZCAgICAgICAgICAgMiBiaXRzCisgICAgICAgLSBhdWRpbyBjb2RpbmcgICAgICAgIDIgYml0cworICAgICAgIC0gU0JSIGZsYWcgICAgICAgICAgICAxIGJpdAorICAgICAgIC0gYXVkaW8gbW9kZSAgICAgICAgICAyIGJpdHMKKyAgICAgICAtIGF1ZGlvIHNhbXBsaW5nIHJhdGUgMyBiaXRzCisgICAgICAgLSB0ZXh0IGZsYWcgICAgICAgICAgIDEgYml0CisgICAgICAgLSBlbmhhbmNlbWVudCBmbGFnICAgIDEgYml0CisgICAgICAgLSBjb2RlciBmaWVsZCAgICAgICAgIDUgYml0cworICAgICAgIC0gcmZhICAgICAgICAgICAgICAgICAxIGJpdCAgKi8KKworICAgIGludCBhdWRpb0NvZGluZywgYXVkaW9Nb2RlLCBjU2FtcGxpbmdGcmVxLCBjb2RlckZpZWxkLCBzZklkeCwgc2JyRmxhZzsKKworICAgIC8qIFJlYWQgdGhlIFNEQyBmaWVsZCAqLworICAgIEZES3JlYWRCaXRzKGJzLDQpOyAgIC8qIFNob3J0IGFuZCBTdHJlYW0gSWQgKi8KKworICAgIGF1ZGlvQ29kaW5nICAgPSBGREtyZWFkQml0cyhicywgMik7CisgICAgc2JyRmxhZyAgICAgICA9IEZES3JlYWRCaXRzKGJzLCAxKTsKKyAgICBhdWRpb01vZGUgICAgID0gRkRLcmVhZEJpdHMoYnMsIDIpOworICAgIGNTYW1wbGluZ0ZyZXEgPSBGREtyZWFkQml0cyhicywgMyk7ICAgIC8qIGF1ZGlvIHNhbXBsaW5nIHJhdGUgKi8KKworICAgIEZES3JlYWRCaXRzKGJzLCAyKTsgIC8qIFRleHQgYW5kIGVuaGFuY2VtZW50IGZsYWcgKi8KKyAgICBjb2RlckZpZWxkICAgPSBGREtyZWFkQml0cyhicywgNSk7CisgICAgRkRLcmVhZEJpdHMoYnMsIDEpOyAgLyogcmZhICovCisKKyAgICAvKiBFdmFsdWF0ZSBjb25maWd1cmF0aW9uIGFuZCBmaWxsIHRoZSBBU0MgKi8KKyAgICBzd2l0Y2ggKGNTYW1wbGluZ0ZyZXEpIHsKKyAgICBjYXNlIDA6IC8qICA4IGtIeiAqLworICAgICAgc2ZJZHggPSAxMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTogLyogMTIga0h6ICovCisgICAgICBzZklkeCA9IDk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8qIDE2IGtIeiAqLworICAgICAgc2ZJZHggPSA4OworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOiAvKiAyNCBrSHogKi8KKyAgICAgIHNmSWR4ID0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNTogLyogNDgga0h6ICovCisgICAgICBzZklkeCA9IDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8qIHJlc2VydmVkICovCisgICAgY2FzZSA2OiAvKiByZXNlcnZlZCAqLworICAgIGNhc2UgNzogLyogcmVzZXJ2ZWQgKi8KKyAgICBkZWZhdWx0OgorICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICBnb3RvIGJhaWw7CisgICAgfQorCisgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gc2ZJZHg7CisgICAgc2VsZi0+bV9zYW1wbGluZ0ZyZXF1ZW5jeSA9IFNhbXBsaW5nUmF0ZVRhYmxlW3NmSWR4XTsKKworICAgIGlmICggc2JyRmxhZyApIHsKKyAgICAgIFVJTlQgaTsKKyAgICAgIGludCB0bXAgPSAtMTsKKyAgICAgIHNlbGYtPm1fc2JyUHJlc2VudEZsYWcgPSAxOworICAgICAgc2VsZi0+bV9leHRlbnNpb25BdWRpb09iamVjdFR5cGUgPSBBT1RfU0JSOworICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSA9IHNlbGYtPm1fc2FtcGxpbmdGcmVxdWVuY3kgPDwgMTsKKyAgICAgIGZvciAoaT0wOyBpPChzaXplb2YoU2FtcGxpbmdSYXRlVGFibGUpL3NpemVvZihTYW1wbGluZ1JhdGVUYWJsZVswXSkpOyBpKyspeworICAgICAgICBpZiAoU2FtcGxpbmdSYXRlVGFibGVbaV0gPT0gc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeSl7CisgICAgICAgICAgdG1wID0gaTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc2VsZi0+bV9leHRlbnNpb25TYW1wbGluZ0ZyZXF1ZW5jeUluZGV4ID0gdG1wOworICAgIH0KKworICAgIHN3aXRjaCAoYXVkaW9Db2RpbmcpIHsKKyAgICAgIGNhc2UgMDogLyogQUFDICovCisgICAgICAgICAgc2VsZi0+bV9hb3QgPSBBT1RfRFJNX0FBQyAgICAgOyAgLyogU2V0IHBzZXVkbyBBT1QgZm9yIERybSBBQUMgKi8KKworICAgICAgICBzd2l0Y2ggKGF1ZGlvTW9kZSkgeworICAgICAgICBjYXNlIDE6IC8qIHBhcmFtZXRyaWMgc3RlcmVvICovCisgICAgICAgICAgc2VsZi0+bV9wc1ByZXNlbnRGbGFnID0gMTsKKyAgICAgICAgY2FzZSAwOiAvKiBtb25vICovCisgICAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLyogc3RlcmVvICovCisgICAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgICAgZ290byBiYWlsOworICAgICAgICB9CisgICAgICAgIHNlbGYtPm1fdmNiMTFGbGFnID0gMTsKKyAgICAgICAgc2VsZi0+bV9oY3JGbGFnID0gMTsKKyAgICAgICAgc2VsZi0+bV9zYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICAgIHNlbGYtPm1fZXBDb25maWcgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTogLyogQ0VMUCAqLworICAgICAgICBzZWxmLT5tX2FvdCA9IEFPVF9FUl9DRUxQOworICAgICAgICBzZWxmLT5tX2NoYW5uZWxDb25maWd1cmF0aW9uID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6IC8qIEhWWEMgKi8KKyAgICAgICAgc2VsZi0+bV9hb3QgPSBBT1RfRVJfSFZYQzsKKyAgICAgICAgc2VsZi0+bV9jaGFubmVsQ29uZmlndXJhdGlvbiA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOiAvKiByZXNlcnZlZCAqLworICAgICAgZGVmYXVsdDoKKyAgICAgICAgRXJyb3JTdGF0dXMgPSBUUkFOU1BPUlRERUNfUEFSU0VfRVJST1I7CisgICAgICAgIHNlbGYtPm1fYW90ID0gQU9UX05PTkU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChzZWxmLT5tX3BzUHJlc2VudEZsYWcgJiYgIXNlbGYtPm1fc2JyUHJlc2VudEZsYWcpIHsKKyAgICAgIEVycm9yU3RhdHVzID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgZ290byBiYWlsOworICAgIH0KKyAgfQorCitiYWlsOgorICByZXR1cm4gKEVycm9yU3RhdHVzKTsKK30KIApkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzE5ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2RybS5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIENocmlzdGlhbiBHcmllYmVsCisgICBEZXNjcmlwdGlvbjogRFJNIHRyYW5zcG9ydCBzdHVmZgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJ0cGRlY19kcm0uaCIKKworCisjaW5jbHVkZSAiRkRLX2JpdHN0cmVhbS5oIgorCisKKwordm9pZCBkcm1SZWFkX0NyY0luaXQoSEFORExFX0RSTSBwRHJtKSAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gY3JjIGluZm8gc3R1Y3R1cmUgKi8KK3sKKyAgRkRLX0FTU0VSVChwRHJtICE9IE5VTEwpOworCisgIEZES2NyY0luaXQoJnBEcm0tPmNyY0luZm8sIDB4MDAxZCwgMHhGRkZGLCA4KTsKK30KKworaW50IGRybVJlYWRfQ3JjU3RhcnRSZWcoCisgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRFJNIHBEcm0sICAgICAgICAgICAgLyohPCBwb2ludGVyIHRvIGRybSBzdHVjdHVyZSAqLworICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgIC8qITwgaGFuZGxlIHRvIGN1cnJlbnQgYml0IGJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgIGludCBtQml0cyAgICAgICAgICAgICAgICAgICAvKiE8IG51bWJlciBvZiBiaXRzIGluIGNyYyByZWdpb24gKi8KKyAgICAgICAgICAgICAgICAgICApCit7CisgIEZES19BU1NFUlQocERybSAhPSBOVUxMKTsKKworICBGREtjcmNSZXNldCgmcERybS0+Y3JjSW5mbyk7CisKKyAgcERybS0+Y3JjUmVhZFZhbHVlID0gRkRLcmVhZEJpdHMoaEJzLCA4KTsKKworICByZXR1cm4gKCBGREtjcmNTdGFydFJlZygmcERybS0+Y3JjSW5mbywgaEJzLCBtQml0cykgKTsKKworfQorCit2b2lkIGRybVJlYWRfQ3JjRW5kUmVnKAorICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRFJNIHBEcm0sICAgICAgICAgICAgIC8qITwgcG9pbnRlciB0byBkcm0gY3JjIGluZm8gc3R1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzLCAgICAvKiE8IGhhbmRsZSB0byBjdXJyZW50IGJpdCBidWZmZXIgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIGludCByZWcgICAgICAgICAgICAgICAgICAgICAgLyohPCBjcmMgcmVnaW9uICovCisgICAgICAgICAgICAgICAgICApCit7CisgIEZES19BU1NFUlQocERybSAhPSBOVUxMKTsKKworICBGREtjcmNFbmRSZWcoJnBEcm0tPmNyY0luZm8sIGhCcywgcmVnKTsKK30KKworVFJBTlNQT1JUREVDX0VSUk9SIGRybVJlYWRfQ3JjQ2hlY2soIEhBTkRMRV9EUk0gcERybSApCit7CisgIFRSQU5TUE9SVERFQ19FUlJPUiBFcnJvclN0YXR1cyA9IFRSQU5TUE9SVERFQ19PSzsKKyAgVVNIT1JUIGNyYzsKKworICBjcmMgPSBGREtjcmNHZXRDUkMoJnBEcm0tPmNyY0luZm8pIF4gMHhGRjsKKyAgaWYgKGNyYyAhPSBwRHJtLT5jcmNSZWFkVmFsdWUpCisgIHsKKyAgICByZXR1cm4gKFRSQU5TUE9SVERFQ19DUkNfRVJST1IpOworICB9CisKKyAgcmV0dXJuIChFcnJvclN0YXR1cyk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19kcm0uaCBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2MWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfZHJtLmgKQEAgLTAsMCArMSwxOTQgQEAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1NvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAorCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KKyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIDEuICAgIElOVFJPRFVDVElPTgorVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwordGhlIE1QRUcgQWR2YW5jZWQgQXVkaW8gQ29kaW5nICgiQUFDIikgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHNjaGVtZSBmb3IgZGlnaXRhbCBhdWRpby4KK1RoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uIGEgd2lkZSB2YXJpZXR5IG9mIEFuZHJvaWQgZGV2aWNlcy4KKworQUFDJ3MgSEUtQUFDIGFuZCBIRS1BQUMgdjIgdmVyc2lvbnMgYXJlIHJlZ2FyZGVkIGFzIHRvZGF5J3MgbW9zdCBlZmZpY2llbnQgZ2VuZXJhbCBwZXJjZXB0dWFsCithdWRpbyBjb2RlY3MuIEFBQy1FTEQgaXMgY29uc2lkZXJlZCB0aGUgYmVzdC1wZXJmb3JtaW5nIGZ1bGwtYmFuZHdpZHRoIGNvbW11bmljYXRpb25zIGNvZGVjIGJ5CitpbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydAorb2YgdGhlIE1QRUcgc3BlY2lmaWNhdGlvbnMuCisKK1BhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKK21heSBiZSBvYnRhaW5lZCB0aHJvdWdoIFZpYSBMaWNlbnNpbmcgKHd3dy52aWFsaWNlbnNpbmcuY29tKSBvciB0aHJvdWdoIHRoZSByZXNwZWN0aXZlIHBhdGVudCBvd25lcnMKK2luZGl2aWR1YWxseSBmb3IgdGhlIHB1cnBvc2Ugb2YgZW5jb2Rpbmcgb3IgZGVjb2RpbmcgYml0IHN0cmVhbXMgaW4gcHJvZHVjdHMgdGhhdCBhcmUgY29tcGxpYW50IHdpdGgKK3RoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCit0aGVzZSBwYXRlbnQgY2xhaW1zIHRocm91Z2ggVmlhIExpY2Vuc2luZyBvciBkaXJlY3RseSBmcm9tIHRoZSBwYXRlbnQgb3duZXJzLCBhbmQgdGhlcmVmb3JlIEZESyBBQUMgQ29kZWMKK3NvZnR3YXJlIG1heSBhbHJlYWR5IGJlIGNvdmVyZWQgdW5kZXIgdGhvc2UgcGF0ZW50IGxpY2Vuc2VzIHdoZW4gaXQgaXMgdXNlZCBmb3IgdGhvc2UgbGljZW5zZWQgcHVycG9zZXMgb25seS4KKworQ29tbWVyY2lhbGx5LWxpY2Vuc2VkIEFBQyBzb2Z0d2FyZSBsaWJyYXJpZXMsIGluY2x1ZGluZyBmbG9hdGluZy1wb2ludCB2ZXJzaW9ucyB3aXRoIGVuaGFuY2VkIHNvdW5kIHF1YWxpdHksCithcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBGcmF1bmhvZmVyLiBVc2VycyBhcmUgZW5jb3VyYWdlZCB0byBjaGVjayB0aGUgRnJhdW5ob2ZlciB3ZWJzaXRlIGZvciBhZGRpdGlvbmFsCithcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCisKKzIuICAgIENPUFlSSUdIVCBMSUNFTlNFCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgd2l0aG91dAorcGF5bWVudCBvZiBjb3B5cmlnaHQgbGljZW5zZSBmZWVzIHByb3ZpZGVkIHRoYXQgeW91IHNhdGlzZnkgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvcgoreW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gc291cmNlIGNvZGUgZm9ybS4KKworWW91IG11c3QgcmV0YWluIHRoZSBjb21wbGV0ZSB0ZXh0IG9mIHRoaXMgc29mdHdhcmUgbGljZW5zZSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCitwcm92aWRlZCB3aXRoIHJlZGlzdHJpYnV0aW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBpbiBiaW5hcnkgZm9ybS4KK1lvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKK21vZGlmaWNhdGlvbnMgdGhlcmV0byB0byByZWNpcGllbnRzIG9mIGNvcGllcyBpbiBiaW5hcnkgZm9ybS4KKworVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dAorcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCitzb2Z0d2FyZSBvciB5b3VyIG1vZGlmaWNhdGlvbnMgdGhlcmV0by4KKworWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKK2FuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBGb3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMsIHRoZSB0ZXJtCisiRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQiIG11c3QgYmUgcmVwbGFjZWQgYnkgdGhlIHRlcm0KKyJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCisKKzMuICAgIE5PIFBBVEVOVCBMSUNFTlNFCisKK05PIEVYUFJFU1MgT1IgSU1QTElFRCBMSUNFTlNFUyBUTyBBTlkgUEFURU5UIENMQUlNUywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcGF0ZW50cyBvZiBGcmF1bmhvZmVyLAorQVJFIEdSQU5URUQgQlkgVEhJUyBTT0ZUV0FSRSBMSUNFTlNFLiBGcmF1bmhvZmVyIHByb3ZpZGVzIG5vIHdhcnJhbnR5IG9mIHBhdGVudCBub24taW5mcmluZ2VtZW50IHdpdGgKK3Jlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KKworWW91IG1heSB1c2UgdGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIG9yIG1vZGlmaWNhdGlvbnMgdGhlcmV0byBvbmx5IGZvciBwdXJwb3NlcyB0aGF0IGFyZSBhdXRob3JpemVkCitieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCisKKzQuICAgIERJU0NMQUlNRVIKKworVGhpcyBGREsgQUFDIENvZGVjIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IEZyYXVuaG9mZXIgb24gYmVoYWxmIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzCisiQVMgSVMiIGFuZCBXSVRIT1VUIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgaW1wbGllZCB3YXJyYW50aWVzCitvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0cywKK29yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKK2xpYWJpbGl0eSwgb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZgorYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKzUuICAgIENPTlRBQ1QgSU5GT1JNQVRJT04KKworRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCitBdHRlbnRpb246IEF1ZGlvIGFuZCBNdWx0aW1lZGlhIERlcGFydG1lbnRzIC0gRkRLIEFBQyBMTAorQW0gV29sZnNtYW50ZWwgMzMKKzkxMDU4IEVybGFuZ2VuLCBHZXJtYW55CisKK3d3dy5paXMuZnJhdW5ob2Zlci5kZS9hbW0KK2FtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUctNCBBQUMgRGVjb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgQXV0aG9yKHMpOiAgIEpvc2VmIEhvZXBmbAorICAgRGVzY3JpcHRpb246IERSTSBpbnRlcmZhY2UKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIFRQREVDX0RSTV9ICisjZGVmaW5lIFRQREVDX0RSTV9ICisKKyNpbmNsdWRlICJ0cGRlY19saWIuaCIKKworCisjaW5jbHVkZSAiRkRLX2NyYy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgRkRLX0NSQ0lORk8gY3JjSW5mbzsgICAgICAgICAgICAgLyogQ1JDIHN0YXRlIGluZm8gKi8KKyAgVVNIT1JUICAgICAgY3JjUmVhZFZhbHVlOyAgICAgICAgLyogQ1JDIHZhbHVlIHJlYWQgZnJvbSBiaXRzdHJlYW0gZGF0YSAqLworCit9IFNUUlVDVF9EUk07CisKK3R5cGVkZWYgU1RSVUNUX0RSTSAqSEFORExFX0RSTTsKKworLyohCisgIFxicmllZiBJbml0aWFsaXplIERSTSBDUkMKKworICBUaGUgZnVuY3Rpb24gaW5pdGlhbHplcyB0aGUgY3JjIGJ1ZmZlciBhbmQgdGhlIGNyYyBsb29rdXAgdGFibGUuCisKKyAgXHJldHVybiAgbm9uZQorKi8KK3ZvaWQgZHJtUmVhZF9DcmNJbml0KCBIQU5ETEVfRFJNIHBEcm0gKTsKKworLyoqCisgKiBcYnJpZWYgU3RhcnRzIENSQyByZWdpb24gd2l0aCBhIG1heGltdW0gbnVtYmVyIG9mIGJpdHMKKyAqICAgICAgICBJZiBtQml0cyBpcyBwb3NpdGl2ZSB6ZXJvIHBhZGRpbmcgd2lsbCBiZSB1c2VkIGZvciBDUkMgY2FsY3VsYXRpb24sIGlmIHRoZXJlCisgKiAgICAgICAgYXJlIGxlc3MgdGhhbiBtQml0cyBiaXRzIGF2YWlsYWJsZS4KKyAqICAgICAgICBJZiBtQml0cyBpcyBuZWdhdGl2ZSBubyB6ZXJvIHBhZGRpbmcgaXMgZG9uZS4KKyAqICAgICAgICBJZiBtQml0cyBpcyB6ZXJvIHRoZSBtZW1vcnkgZm9yIHRoZSBidWZmZXIgaXMgYWxsb2NhdGVkIGR5bmFtaWNhbGx5LCB0aGUKKyAqICAgICAgICBudW1iZXIgb2YgYml0cyBpcyBub3QgbGltaXRlZC4KKyAqCisgKiBccGFyYW0gcERybSBEUk0gZGF0YSBoYW5kbGUKKyAqIFxwYXJhbSBoQnMgYml0c3RyZWFtIGhhbmRsZSwgb24gd2hpY2ggdGhlIENSQyByZWdpb24gcmVmZXJlcyB0bworICogXHBhcmFtIG1CaXRzIG1heCBudW1iZXIgb2YgYml0cyBpbiBjcmMgcmVnaW9uIHRvIGJlIGNvbnNpZGVyZWQKKyAqCisgKiBccmV0dXJuICBJRCBmb3IgdGhlIGNyZWF0ZWQgcmVnaW9uLCAtMSBpbiBjYXNlIG9mIGFuIGVycm9yCisgKi8KK2ludCBkcm1SZWFkX0NyY1N0YXJ0UmVnKAorICAgICAgICBIQU5ETEVfRFJNIHBEcm0sCisgICAgICAgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcywKKyAgICAgICAgaW50IG1CaXRzCisgICAgICAgICk7CisKKy8qKgorICogXGJyaWVmIEVuZHMgQ1JDIHJlZ2lvbiBpZGVudGlmaWVkIGJ5IHJlZworICoKKyAqIFxwYXJhbSBwRHJtIERSTSBkYXRhIGhhbmRsZQorICogXHBhcmFtIGhCcyBiaXRzdHJlYW0gaGFuZGxlLCBvbiB3aGljaCB0aGUgQ1JDIHJlZ2lvbiByZWZlcmVzIHRvCisgKiBccGFyYW0gcmVnIENSQyByZWdpb25zIElEIHJldHVybmVkIGJ5IGRybVJlYWRfQ3JjU3RhcnRSZWcoKQorICoKKyAqIFxyZXR1cm4gIG5vbmUKKyAqLwordm9pZCBkcm1SZWFkX0NyY0VuZFJlZygKKyAgICAgICAgSEFORExFX0RSTSBwRHJtLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMsCisgICAgICAgIGludCByZWcKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgQ2hlY2sgQ1JDCisgKgorICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50bHkgY2FsY3VsYXRlZCBDUkMgbWF0Y2hlcyB0aGUgQ1JDIGZpZWxkIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtCisgKiBEZWxldGVzIGFsbCBDUkMgcmVnaW9ucy4KKyAqCisgKiBccGFyYW0gcERybSBEUk0gZGF0YSBoYW5kbGUKKyAqCisgKiBccmV0dXJuIFJldHVybnMgMCBpZiB0aGV5IGFyZSBpZGVudGljYWwgb3RoZXJ3aXNlIDEKKyAqLworVFJBTlNQT1JUREVDX0VSUk9SIGRybVJlYWRfQ3JjQ2hlY2soIEhBTkRMRV9EUk0gcERybSApOworCisvKioKKyAqIFxicmllZiBDaGVjayBpZiB3ZSBoYXZlIGEgdmFsaWQgRFJNIGZyYW1lIGF0IHRoZSBjdXJyZW50IGJpdGJ1ZmZlciBwb3NpdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyBlbm91Z2ggYml0cyBpbiBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgorICogSXQgcmVhZHMgb3V0IHRoZSBoZWFkZXIgYml0cyB0byBwcmVwYXJlIHRoZSBiaXRidWZmZXIgZm9yIHRoZSBkZWNvZGUgbG9vcC4KKyAqIEluIGNhc2UgdGhlIGhlYWRlciBiaXRzIHNob3cgYW4gaW52YWxpZCBiaXRzdHJlYW0vZnJhbWUsIHRoZSB3aG9sZSBmcmFtZSBpcyBza2lwcGVkLgorICoKKyAqIFxwYXJhbSBwRHJtIERSTSBkYXRhIGhhbmRsZSB3aGljaCBpcyBmaWxsZWQgd2l0aCBwYXJzZWQgRFJNIGhlYWRlciBkYXRhCisgKiBccGFyYW0gYnMgaGFuZGxlIG9mIGJpdHN0cmVhbSBmcm9tIHdob20gdGhlIERSTSBoZWFkZXIgaXMgcmVhZAorICoKKyAqIFxyZXR1cm4gIGVycm9yIHN0YXR1cworICovCitUUkFOU1BPUlRERUNfRVJST1IgZHJtUmVhZF9EZWNvZGVIZWFkZXIoCisgICAgICAgIEhBTkRMRV9EUk0gICAgICAgICAgICBwRHJtLAorICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgYnMKKyAgICAgICAgKTsKKworLyoqCisgKiBcYnJpZWYgICBQYXJzZSBhIERybSBzcGVjaWZpYyBTREMgYXVkaW8gY29uZmlnIGZyb20gYSBnaXZlbiBiaXRzdHJlYW0gaGFuZGxlLgorICoKKyAqIFxwYXJhbSBwQXNjICAgICAgICAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byBhbiBhbGxvY2F0ZWQgQ1NBdWRpb1NwZWNpZmljQ29uZmlnIHN0cnVjdC4KKyAqIFxwYXJhbSBoQnMgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHN0cmVhbSBoYW5kbGUuCisgKgorICogXHJldHVybiAgVG90YWwgZWxlbWVudCBjb3VudCBpbmNsdWRpbmcgYWxsIFNDRSwgQ1BFIGFuZCBMRkUuCisgKi8KK1RSQU5TUE9SVERFQ19FUlJPUiBEcm1SYXdTZGNBdWRpb0NvbmZpZ19QYXJzZSggQ1NBdWRpb1NwZWNpZmljQ29uZmlnICpwQXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQnMgKTsKKworCisKKyNlbmRpZiAvKiBUUERFQ19EUk1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwIGIvbGliTXBlZ1RQRGVjL3NyYy90cGRlY19saWIuY3BwCmluZGV4IDk1MGFmNjQuLjI0Zjc1NWIgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdHBkZWNfbGliLmNwcAorKysgYi9saWJNcGVnVFBEZWMvc3JjL3RwZGVjX2xpYi5jcHAKQEAgLTEwMiw2ICsxMDIsNyBAQAogCiAjaW5jbHVkZSAidHBkZWNfbGF0bS5oIgogCisjaW5jbHVkZSAidHBkZWNfZHJtLmgiCiAKIAogI2RlZmluZSBNT0RVTEVfTkFNRSAidHJhbnNwb3J0RGVjIgpAQCAtMTEzLDYgKzExNCw3IEBACiAKICAgQ0xhdG1EZW11eCBsYXRtOwogCisgIFNUUlVDVF9EUk0gZHJtOwogCiB9IHRyYW5zcG9ydGRlY19wYXJzZXJfdDsKIApAQCAtMTgyLDYgKzE4NCw5IEBACiAgICAgaElucHV0LT5udW1iZXJPZlJhd0RhdGFCbG9ja3MgPSAwOwogICAgIGJyZWFrOwogCisgIGNhc2UgVFRfRFJNOgorICAgIGRybVJlYWRfQ3JjSW5pdCgmaElucHV0LT5wYXJzZXIuZHJtKTsKKyAgICBicmVhazsKIAogICBjYXNlIFRUX01QNF9MQVRNX01DUDA6CiAgIGNhc2UgVFRfTVA0X0xBVE1fTUNQMToKQEAgLTI1Myw2ICsyNTgsMTggQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgYnJlYWs7CisgICAgY2FzZSBUVF9EUk06CisgICAgICBmQ29uZmlnRm91bmQgPSAxOworICAgICAgZXJyID0gRHJtUmF3U2RjQXVkaW9Db25maWdfUGFyc2UoJmhUcC0+YXNjW2xheWVyXSwgaEJzKTsKKyAgICAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LKSB7CisgICAgICAgIGludCBlcnJDOworCisgICAgICAgIGVyckMgPSBoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZyhoVHAtPmNhbGxiYWNrcy5jYlVwZGF0ZUNvbmZpZ0RhdGEsICZoVHAtPmFzY1tsYXllcl0pOworICAgICAgICBpZiAoZXJyQyAhPSAwKSB7CisgICAgICAgICAgZXJyID0gVFJBTlNQT1JUREVDX1BBUlNFX0VSUk9SOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKICAgfQogCiAgIGlmIChlcnIgPT0gVFJBTlNQT1JUREVDX09LICYmIGZDb25maWdGb3VuZCkgewpAQCAtMTA4Myw2ICsxMTAwLDcgQEAKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBUVF9NUDRfUkFXOgorICAgIGNhc2UgVFRfRFJNOgogICAgICAgLyogT25lIEFjY2VzcyBVbml0IHdhcyBmaWxsZWQgaW50byBidWZmZXIuCiAgICAgICAgICBTbyBnZXQgdGhlIGxlbmd0aCBvdXQgb2YgdGhlIGJ1ZmZlci4gKi8KICAgICAgIGhUcC0+YXVMZW5ndGhbbGF5ZXJdID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CkBAIC0xMjgzLDYgKzEzMDEsNyBAQAogICAgIHwgQ0FQRl9MQVRNCiAgICAgfCBDQVBGX0xPQVMKICAgICB8IENBUEZfUkFXUEFDS0VUUworICAgIHwgQ0FQRl9EUk0KICAgICA7CiAKICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsgLyogRkRLRVJSX05PRVJST1I7ICovCkBAIC0xMjk0LDYgKzEzMTMsOCBAQAogICBzd2l0Y2ggKHBUcC0+dHJhbnNwb3J0Rm10KSB7CiAgIGNhc2UgVFRfTVA0X0FEVFM6CiAgICAgcmV0dXJuIGFkdHNSZWFkX0NyY1N0YXJ0UmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIG1CaXRzKTsKKyAgY2FzZSBUVF9EUk06CisgICAgcmV0dXJuIGRybVJlYWRfQ3JjU3RhcnRSZWcoJnBUcC0+cGFyc2VyLmRybSwgJnBUcC0+Yml0U3RyZWFtWzBdLCBtQml0cyk7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTEzMDUsNiArMTMyNiw5IEBACiAgIGNhc2UgVFRfTVA0X0FEVFM6CiAgICAgYWR0c1JlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5hZHRzLCAmcFRwLT5iaXRTdHJlYW1bMF0sIHJlZyk7CiAgICAgYnJlYWs7CisgIGNhc2UgVFRfRFJNOgorICAgIGRybVJlYWRfQ3JjRW5kUmVnKCZwVHAtPnBhcnNlci5kcm0sICZwVHAtPmJpdFN0cmVhbVswXSwgcmVnKTsKKyAgICBicmVhazsKICAgZGVmYXVsdDoKICAgICBicmVhazsKICAgfQpAQCAtMTMyMSw2ICsxMzQ1LDkgQEAKICAgICAgIHRyYW5zcG9ydERlY19BZGp1c3RFbmRPZkFjY2Vzc1VuaXQocFRwKTsKICAgICB9CiAgICAgcmV0dXJuIGFkdHNSZWFkX0NyY0NoZWNrKCZwVHAtPnBhcnNlci5hZHRzKTsKKyAgY2FzZSBUVF9EUk06CisgICAgcmV0dXJuIGRybVJlYWRfQ3JjQ2hlY2soJnBUcC0+cGFyc2VyLmRybSk7CisgICAgYnJlYWs7CiAgIGRlZmF1bHQ6CiAgICAgcmV0dXJuIFRSQU5TUE9SVERFQ19PSzsKICAgfQpkaWZmIC0tZ2l0IGEvbGliTXBlZ1RQRGVjL3NyYy92ZXJzaW9uIGIvbGliTXBlZ1RQRGVjL3NyYy92ZXJzaW9uCmluZGV4IDE4ZmM5YmEuLjc1ZTIyYzkgMTAwNjQ0Ci0tLSBhL2xpYk1wZWdUUERlYy9zcmMvdmVyc2lvbgorKysgYi9saWJNcGVnVFBEZWMvc3JjL3ZlcnNpb24KQEAgLTIsNyArMiw3IEBACiAvKiBsaWJyYXJ5IGluZm8gKi8KICNkZWZpbmUgVFBfTElCX1ZMMCAyCiAjZGVmaW5lIFRQX0xJQl9WTDEgMwotI2RlZmluZSBUUF9MSUJfVkwyIDUKKyNkZWZpbmUgVFBfTElCX1ZMMiA3CiAjZGVmaW5lIFRQX0xJQl9USVRMRSAiTVBFRyBUcmFuc3BvcnQiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgVFBfTElCX0JVSUxEX0RBVEUgIiIKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaCBiL2xpYlNCUmRlYy9pbmNsdWRlL3NicmRlY29kZXIuaAppbmRleCAxNzRmYjVjLi4zYmI5YmEzIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvaW5jbHVkZS9zYnJkZWNvZGVyLmgKKysrIGIvbGliU0JSZGVjL2luY2x1ZGUvc2JyZGVjb2Rlci5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0yNjIsNiArMjYyLDcgQEAKICAqICAgICAgICAgaW50byAqY291bnQgaWYgYSBwYXlsb2FkIGxlbmd0aCBpcyBnaXZlbiAoYnlQYXlMZW4gPiAwKS4gSWYgbm8gU0JSIHBheWxvYWQgbGVuZ3RoIGlzCiAgKiAgICAgICAgIGdpdmVuIChic1BheUxlbiA8IDApIHRoZW4gdGhlIGJpdCBzdHJlYW0gcG9zaXRpb24gb24gcmV0dXJuIHdpbGwgYmUgcmFuZG9tIGFmdGVyIHRoaXMKICAqICAgICAgICAgZnVuY3Rpb24gY2FsbCBpbiBjYXNlIG9mIGVycm9ycywgYW5kIGFueSBmdXJ0aGVyIGRlY29kaW5nIHdpbGwgYmUgY29tcGxldGVseSBwb2ludGxlc3MuCisgKiAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBlaXRoZXIgbm9ybWFsIG9yZGVyZWQgU0JSIGRhdGEgb3IgcmV2ZXJzZSBvcmRlcmVkIERSTSBTQlIgZGF0YS4KICAqCiAgKiBccGFyYW0gc2VsZiAgICAgICAgICAgU0JSIGRlY29kZXIgaGFuZGxlLgogICogXHBhcmFtIGhCcyAgICAgICAgICAgIEJpdCBzdHJlYW0gaGFuZGxlIGFzIGRhdGEgc291cmNlLgpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfY2FsYy5jcHAgYi9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcAppbmRleCBhZGU1N2ZjLi5mYTUzMzBhIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9jYWxjLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTUxLDEzICsxNTEsMTMgQEAKIH0KIEVOVl9DQUxDX05SR1M7CiAKLS8qc3RhdGljKi8gdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsCitzdGF0aWMgdm9pZCBlcXVhbGl6ZUZpbHRCdWZmZXJFeHAoRklYUF9EQkwgKmZpbHRCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAqZmlsdEJ1ZmZlcl9lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpOcmdHYWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgKk5yZ0dhaW5fZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgc3ViYmFuZHMpOwogCi0vKnN0YXRpYyovIHZvaWQgY2FsY05yZ1BlclN1YmJhbmQoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKK3N0YXRpYyB2b2lkIGNhbGNOcmdQZXJTdWJiYW5kKEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlclJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsIGludCBoaWdoU3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzdGFydF9wb3MsICBpbnQgbmV4dF9wb3MsCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpucmdFc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqbnJnRXN0X2UgKTsKIAotLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKK3N0YXRpYyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICoqYW5hbHlzQnVmZmVySW1hZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLApAQCAtMTc0LDEzICsxNzQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ19lc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICpucmdfZXN0X2UgKTsKIAotLypzdGF0aWMqLyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCBTQ0hBUiBucmdSZWZfZSwgRU5WX0NBTENfTlJHUyogbnJncywgaW50IGMsCitzdGF0aWMgdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgIG5yZ1JlZiwgU0NIQVIgbnJnUmVmX2UsIEVOVl9DQUxDX05SR1MqIG5yZ3MsIGludCBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICB0bXBOb2lzZSwgU0NIQVIgdG1wTm9pc2VfZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAgc2luZVByZXNlbnRGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICBzaW5lTWFwcGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZyk7CiAKLS8qc3RhdGljKi8gdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAorc3RhdGljIHZvaWQgY2FsY0F2Z0dhaW4oRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbG93U3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgaGlnaFN1YmJhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnN1bVJlZl9tLApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAgKnB0ckF2Z0dhaW5fbSwKICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICAqcHRyQXZnR2Fpbl9lKTsKIAotLypzdGF0aWMqLyB2b2lkIGFkanVzdFRpbWVTbG90TEMoRklYUF9EQkwgICpwdHJSZWFsLAorc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZChGSVhQX0RCTCAgKnB0clJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBsb3dTdWJiYW5kcywKQEAgLTE5Niw4ICsxOTYsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBzY2FsZV9jaGFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAqcHRyUGhhc2VJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBmQ2xkZmIpOwotLypzdGF0aWMqLyB2b2lkIGFkanVzdFRpbWVTbG90SFEoRklYUF9EQkwgICpwdHJSZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2RpZmZfbG93KTsKKworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAgKnB0clJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVUNIQVIgKnB0ckhhcm1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBsb3dTdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub1N1YmJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBub05vaXNlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICpwdHJQaGFzZUluZGV4KTsKK3N0YXRpYyB2b2lkIGFkanVzdFRpbWVTbG90SFEoRklYUF9EQkwgICpwdHJSZWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJJbWFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVl9DQUxDX05SR1MqIG5yZ3MsCkBAIC0yMjQsNyArMjMzLDcgQEAKICAgQWRkaXRpb25hbGx5LCB0aGUgZmxhZ3MgaW4gaGFybUZsYWdzUHJldiBhcmUgYmVpbmcgdXBkYXRlZCBieSB0aGlzIGZ1bmN0aW9uCiAgIGZvciB0aGUgbmV4dCBmcmFtZS4KICovCi0vKnN0YXRpYyovIHZvaWQgbWFwU2luZUZsYWdzKFVDSEFSICpmcmVxQmFuZFRhYmxlLCAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIgYmFuZCkgKi8KK3N0YXRpYyB2b2lkIG1hcFNpbmVGbGFncyhVQ0hBUiAqZnJlcUJhbmRUYWJsZSwgICAgICAgICAvKiE8IEJhbmQgYm9yZGVycyAodGhlcmUncyBvbmx5IDEgZmxhZyBwZXIgYmFuZCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNmYiwgICAgICAgICAgICAgICAgICAgICAvKiE8IE51bWJlciBvZiBiYW5kcyBpbiB0aGUgdGFibGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAqYWRkSGFybW9uaWNzLCAgICAgICAgICAgLyohPCB2ZWN0b3Igd2l0aCAxIGZsYWcgcGVyIHNmYiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaGFybUZsYWdzUHJldiwgICAgICAgICAgIC8qITwgUGFja2VkICdhZGRIYXJtb25pY3MnICovCkBAIC05OTAsNyArOTk5LDYgQEAKICAgICAgICAgICAvKiBQcmV2ZW50IHRoZSBzbW9vdGhpbmcgZmlsdGVyIGZyb20gcnVubmluZyBvbiBjb25zdGFudCBsZXZlbHMgKi8KICAgICAgICAgICBpZiAoai1zdGFydF9wb3MgPCBzbW9vdGhfbGVuZ3RoKQogICAgICAgICAgICAgc21vb3RoX3JhdGlvID0gRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcltqLXN0YXJ0X3Bvc107Ci0KICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBzbW9vdGhfcmF0aW8gPSBGTDJGWENPTlNUX1NHTCgwLjBmKTsKIApAQCAtMTAwNyw3ICsxMDE1LDggQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICBhZGp1c3RUaW1lU2xvdExDKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgIGlmIChmbGFncyAmIFNCUkRFQ19FTERfR1JJRCkgeworICAgICAgICAgICAgYWRqdXN0VGltZVNsb3RfRWxkR3JpZCgmYW5hbHlzQnVmZmVyUmVhbFtqXVtsb3dTdWJiYW5kXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOcmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+aGFybUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93U3ViYmFuZCwKQEAgLTEwMTUsNyArMTAyNCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY2hhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Ob2lzZUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5waGFzZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAyU0NBTEUoYWRqX2UpIC0gc2JyU2NhbGVGYWN0b3ItPmxiX3NjYWxlKTsKKyAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICB7CisgICAgICAgICAgICBhZGp1c3RUaW1lU2xvdExDKCZhbmFseXNCdWZmZXJSZWFsW2pdW2xvd1N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5yZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoX3Nicl9jYWxfZW52LT5oYXJtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dTdWJiYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9TdWJiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2NoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTm9pc2VGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaF9zYnJfY2FsX2Vudi0+cGhhc2VJbmRleCk7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IC8vIGZvcgogCkBAIC0xMTc2LDcgKzExOTYsNyBAQAogICBjYW4gYmUgcGVyZm9ybWVkLgogICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGVudmVsb3BlIGJlZm9yZSBhZGp1c3RpbmcuCiAqLwotLypzdGF0aWMqLyB2b2lkIGVxdWFsaXplRmlsdEJ1ZmZlckV4cChGSVhQX0RCTCAqZmlsdEJ1ZmZlciwgICAgIC8qITwgYnVmZmVyZCBnYWlucyAqLworc3RhdGljIHZvaWQgZXF1YWxpemVGaWx0QnVmZmVyRXhwKEZJWFBfREJMICpmaWx0QnVmZmVyLCAgICAgLyohPCBidWZmZXJkIGdhaW5zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKmZpbHRCdWZmZXJfZSwgICAvKiE8IGV4cG9uZW50cyBvZiBidWZmZXJkIGdhaW5zICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgKm5yZ0dhaW4sICAgICAgICAvKiE8IGdhaW5zIGZvciBjdXJyZW50IGVudmVsb3BlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIQVIgICAgKm5yZ0dhaW5fZSwgICAgICAvKiE8IGV4cG9uZW50cyBvZiBnYWlucyBmb3IgY3VycmVudCBlbnZlbG9wZSAqLwpAQCAtMTMzMSw3ICsxMzUxLDcgQEAKIAogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgdHJ1ZS4KICovCi0vKnN0YXRpYyovIHZvaWQgY2FsY05yZ1BlclN1YmJhbmQoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCitzdGF0aWMgdm9pZCBjYWxjTnJnUGVyU3ViYmFuZChGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLCAvKiE8IFJlYWwgcGFydCBvZiBzdWJiYW5kIHNhbXBsZXMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsIC8qITwgSW1hZ2luYXJ5IHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgICAgICAgIC8qITwgQmVnaW4gb2YgdGhlIFNCUiBmcmVxdWVuY3kgcmFuZ2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBoaWdoU3ViYmFuZCwgICAgICAgICAgLyohPCBIaWdoIGVuZCBvZiB0aGUgU0JSIGZyZXF1ZW5jeSByYW5nZSAqLwpAQCAtMTQ1Miw3ICsxNDcyLDcgQEAKIAogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbnRlcnBvbEZyZXEgaXMgZmFsc2UuCiAqLwotLypzdGF0aWMqLyB2b2lkIGNhbGNOcmdQZXJTZmIoRklYUF9EQkwgICoqYW5hbHlzQnVmZmVyUmVhbCwgIC8qITwgUmVhbCBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLworc3RhdGljIHZvaWQgY2FsY05yZ1BlclNmYihGSVhQX0RCTCAgKiphbmFseXNCdWZmZXJSZWFsLCAgLyohPCBSZWFsIHBhcnQgb2Ygc3ViYmFuZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICAqKmFuYWx5c0J1ZmZlckltYWcsICAvKiE8IEltYWdpbmFyeSBwYXJ0IG9mIHN1YmJhbmQgc2FtcGxlcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgblNmYiwgICAgICAgICAgICAgICAgLyohPCBOdW1iZXIgb2Ygc2NhbGUgZmFjdG9yIGJhbmRzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpmcmVxQmFuZFRhYmxlLCAgICAgICAvKiE8IEZpcnN0IFN1YmJhbmQgZm9yIGVhY2ggU2ZiICovCkBAIC0xNTg1LDcgKzE2MDUsNyBAQAogCiAgIFRoZSByZXN1bHRpbmcgZW5lcmd5IGdhaW4gaXMgZ2l2ZW4gYnkgbWFudGlzc2EgYW5kIGV4cG9uZW50LgogKi8KLS8qc3RhdGljKi8gdm9pZCBjYWxjU3ViYmFuZEdhaW4oRklYUF9EQkwgIG5yZ1JlZiwgICAgICAgICAgICAvKiE8IFJlZmVyZW5jZSBFbmVyZ3kgYWNjb3JkaW5nIHRvIGVudmVsb3BlIGRhdGEgKi8KK3N0YXRpYyB2b2lkIGNhbGNTdWJiYW5kR2FpbihGSVhQX0RCTCAgbnJnUmVmLCAgICAgICAgICAgIC8qITwgUmVmZXJlbmNlIEVuZXJneSBhY2NvcmRpbmcgdG8gZW52ZWxvcGUgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSICAgICBucmdSZWZfZSwgICAgICAgICAgLyohPCBSZWZlcmVuY2UgRW5lcmd5IGFjY29yZGluZyB0byBlbnZlbG9wZSBkYXRhIChleHBvbmVudCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBpLApAQCAtMTY4OSw3ICsxNzA5LDcgQEAKICAgVGhlIHJlc3VsdCBpcyB1c2VkIGFzIGEgcmVsYXRpdmUgbGltaXQgZm9yIGFsbCBnYWlucyB3aXRoaW4gdGhlCiAgIGN1cnJlbnQgImxpbWl0ZXIgYmFuZCIgKGEgY2VydGFpbiBmcmVxdWVuY3kgcmFuZ2UpLgogKi8KLS8qc3RhdGljKi8gdm9pZCBjYWxjQXZnR2FpbihFTlZfQ0FMQ19OUkdTKiBucmdzLAorc3RhdGljIHZvaWQgY2FsY0F2Z0dhaW4oRU5WX0NBTENfTlJHUyogbnJncywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgbG93U3ViYmFuZCwgICAgLyohPCBCZWdpbiBvZiB0aGUgbGltaXRlciBiYW5kICovCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgIGhpZ2hTdWJiYW5kLCAgIC8qITwgSGlnaCBlbmQgb2YgdGhlIGxpbWl0ZXIgYmFuZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICpwdHJTdW1SZWYsCkBAIC0xNzI4LDIxICsxNzQ4LDEwMSBAQAogICAqcHRyU3VtUmVmX2UgPSBzdW1SZWZfZTsKIH0KIAorc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RfRWxkR3JpZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpwdHJSZWFsLCAgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5WX0NBTENfTlJHUyogbnJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICpwdHJIYXJtSW5kZXgsICAgLyohPCBIYXJtb25pYyBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGxvd1N1YmJhbmQsICAgICAvKiE8IExvd2VzdCBRTUYtY2hhbm5lbCBpbiB0aGUgY3VycmVudGx5IHVzZWQgU0JSIHJhbmdlLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMsICAgICAvKiE8IE51bWJlciBvZiBRTUYgc3ViYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9jaGFuZ2UsICAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbm9Ob2lzZUZsYWcsICAgIC8qITwgRmxhZyB0byBzdXBwcmVzcyBub2lzZSBhZGRpdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgKnB0clBoYXNlSW5kZXgsICAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBzY2FsZV9kaWZmX2xvdykgLyohPCAgKi8KK3sKKyAgaW50IGs7CisgIEZJWFBfREJMICBzaWduYWxSZWFsLCBzYk5vaXNlOworICBpbnQgdG9uZV9jb3VudCA9IDA7CisKKyAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqcE5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLworICBGSVhQX0RCTCAqcFNpbmVMZXZlbCAgPSBucmdzLT5ucmdTaW5lOyAgICAgLyohPCBTaW5lIGxldmVscyAqLworCisgIGludCAgICBwaGFzZUluZGV4ID0gKnB0clBoYXNlSW5kZXg7CisgIFVDSEFSICBoYXJtSW5kZXggID0gKnB0ckhhcm1JbmRleDsKKworICBzdGF0aWMgY29uc3QgSU5UIGhhcm1vbmljUGhhc2UgWzJdWzRdID0geworICAgIHsgMSwgMCwgLTEsICAwfSwKKyAgICB7IDAsIDEsICAwLCAtMX0KKyAgfTsKKworICBzdGF0aWMgY29uc3QgRklYUF9EQkwgaGFybW9uaWNQaGFzZVggWzJdWzRdID0geworICAgIHsgRkwyRlhDT05TVF9EQkwoMi4wKjEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLCAgRkwyRlhDT05TVF9EQkwoMi4wKi0xLjEyMzc2Nzg1OTMyNTAyOGUtMDAxKSwgIEZMMkZYQ09OU1RfREJMKDIuMCotMS4yNDUxODMxNTQ1MzkxMzllLTAwMSksIEZMMkZYQ09OU1RfREJMKDIuMCogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSkgfSwKKyAgICB7IEZMMkZYQ09OU1RfREJMKDIuMCoxLjI0NTE4MzE1NDUzOTEzOWUtMDAxKSwgIEZMMkZYQ09OU1RfREJMKDIuMCogMS4xMjM3Njc4NTkzMjUwMjhlLTAwMSksICBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMjQ1MTgzMTU0NTM5MTM5ZS0wMDEpLCBGTDJGWENPTlNUX0RCTCgyLjAqLTEuMTIzNzY3ODU5MzI1MDI4ZS0wMDEpIH0KKyAgfTsKKworICBmb3IgKGs9MDsgayA8IG5vU3ViYmFuZHM7IGsrKykgeworCisgICAgcGhhc2VJbmRleCA9IChwaGFzZUluZGV4ICsgMSkgJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKKworICAgIGlmKCAocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSkgfHwgKG5vTm9pc2VGbGFnID09IDEpICl7CisgICAgICBzYk5vaXNlID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiTm9pc2UgPSBwTm9pc2VMZXZlbFswXTsKKyAgICB9CisKKyAgICBzaWduYWxSZWFsID0gZk11bHREaXYyKCpwdHJSZWFsLCpwR2FpbikgPDwgKChpbnQpc2NhbGVfY2hhbmdlKTsKKworICAgIHNpZ25hbFJlYWwgKz0gKGZNdWx0RGl2MihGREtfc2JyRGVjb2Rlcl9zYnJfcmFuZG9tUGhhc2VbcGhhc2VJbmRleF1bMF0sIHNiTm9pc2UpPDw0KTsKKworICAgIHNpZ25hbFJlYWwgKz0gcFNpbmVMZXZlbFswXSAqIGhhcm1vbmljUGhhc2VbMF1baGFybUluZGV4XTsKKworICAgICpwdHJSZWFsID0gc2lnbmFsUmVhbDsKKworICAgIGlmIChrID09IDApIHsKKyAgICAgICoocHRyUmVhbC0xKSArPSBzY2FsZVZhbHVlKGZNdWx0RGl2MihoYXJtb25pY1BoYXNlWFtsb3dTdWJiYW5kJjFdW2hhcm1JbmRleF0sIHBTaW5lTGV2ZWxbMF0pLCAtc2NhbGVfZGlmZl9sb3cpICA7CisgICAgICBpZiAoayA8IG5vU3ViYmFuZHMgLSAxKSB7CisgICAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFsxXSwgaGFybW9uaWNQaGFzZVhbKGxvd1N1YmJhbmQrMSkmMV1baGFybUluZGV4XSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChrID4gMCAmJiBrIDwgbm9TdWJiYW5kcyAtIDEgJiYgdG9uZV9jb3VudCA8IDE2KSB7CisgICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbLSAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2spJjFdICBbaGFybUluZGV4XSk7CisgICAgICAqKHB0clJlYWwpICAgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbKyAxXSwgaGFybW9uaWNQaGFzZVggWyhsb3dTdWJiYW5kK2srMSkmMV1baGFybUluZGV4XSk7CisgICAgfQorICAgIGlmIChrID09IG5vU3ViYmFuZHMgLSAxICYmIHRvbmVfY291bnQgPCAxNikgeworICAgICAgaWYgKGsgPiAwKSB7CisgICAgICAgICoocHRyUmVhbCkgICArPSBmTXVsdERpdjIocFNpbmVMZXZlbFstIDFdLCBoYXJtb25pY1BoYXNlWCBbKGxvd1N1YmJhbmQraykmMV1baGFybUluZGV4XSk7CisgICAgICB9CisgICAgICBpZiAoayArIGxvd1N1YmJhbmQgKyAxPCA2MykgeworICAgICAgICAqKHB0clJlYWwrMSkgKz0gZk11bHREaXYyKHBTaW5lTGV2ZWxbMF0sIGhhcm1vbmljUGhhc2VYWyhsb3dTdWJiYW5kK2srMSkmMV1baGFybUluZGV4XSk7CisgICAgICB9CisgICAgfQorCisgICAgaWYocFNpbmVMZXZlbFswXSAhPSBGTDJGWENPTlNUX0RCTCgwLjBmKSl7CisgICAgICB0b25lX2NvdW50Kys7CisgICAgfQorICAgIHB0clJlYWwrKzsKKyAgICBwTm9pc2VMZXZlbCsrOworICAgIHBHYWluKys7CisgICAgcFNpbmVMZXZlbCsrOworICB9CisKKyAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CisgICpwdHJQaGFzZUluZGV4ID0gcGhhc2VJbmRleCAmIChTQlJfTkZfTk9fUkFORE9NX1ZBTCAtIDEpOworfQogCiAvKiEKICAgXGJyaWVmICAgQW1wbGlmeSBvbmUgdGltZXNsb3Qgb2YgdGhlIHNpZ25hbCB3aXRoIHRoZSBjYWxjdWxhdGVkIGdhaW5zCiAgICAgICAgICAgIGFuZCBhZGQgdGhlIG5vaXNlZmxvb3IuCiAqLwogCi0vKnN0YXRpYyovIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAqcHRyUmVhbCwgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLworc3RhdGljIHZvaWQgYWRqdXN0VGltZVNsb3RMQyhGSVhQX0RCTCAqcHRyUmVhbCwgICAgICAgLyohPCBTdWJiYW5kIHNhbXBsZXMgdG8gYmUgYWRqdXN0ZWQsIHJlYWwgcGFydCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQ0hBUiAgICAqcHRySGFybUluZGV4LCAgLyohPCBIYXJtb25pYyBpbmRleCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbG93U3ViYmFuZCwgICAgLyohPCBMb3dlc3QgUU1GLWNoYW5uZWwgaW4gdGhlIGN1cnJlbnRseSB1c2VkIFNCUiByYW5nZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIG5vU3ViYmFuZHMsICAgIC8qITwgTnVtYmVyIG9mIFFNRiBzdWJiYW5kcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgc2NhbGVfY2hhbmdlLCAgLyohPCBOdW1iZXIgb2YgYml0cyB0byBzaGlmdCBhZGp1c3RlZCBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBub05vaXNlRmxhZywgICAvKiE8IEZsYWcgdG8gc3VwcHJlc3Mgbm9pc2UgYWRkaXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgKnB0clBoYXNlSW5kZXgsIC8qITwgU3RhcnQgaW5kZXggdG8gcmFuZG9tIG51bWJlciBhcnJheSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgZkNsZGZiKSAgICAgICAgLyohPCBDTERGQiA4MCBmbGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICpwdHJQaGFzZUluZGV4KSAvKiE8IFN0YXJ0IGluZGV4IHRvIHJhbmRvbSBudW1iZXIgYXJyYXkgKi8KIHsKICAgRklYUF9EQkwgKnBHYWluICAgICAgID0gbnJncy0+bnJnR2FpbjsgICAgIC8qITwgR2FpbnMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwogICBGSVhQX0RCTCAqcE5vaXNlTGV2ZWwgPSBucmdzLT5ub2lzZUxldmVsOyAgLyohPCBOb2lzZSBsZXZlbHMgb2YgY3VycmVudCBlbnZlbG9wZSAqLwpAQCAtMTc3NSw0MSArMTg3NSwxMCBAQAogICBzaW5lTGV2ZWxOZXh0ID0gKG5vU3ViYmFuZHMgPiAxKSA/IHBTaW5lTGV2ZWxbMF0gOiBGTDJGWENPTlNUX0RCTCgwLjBmKTsKIAogICBpZiAoc2luZUxldmVsIT1GTDJGWENPTlNUX0RCTCgwLjBmKSkgdG9uZV9jb3VudCsrOwotCiAgIGVsc2UgaWYgKCFub05vaXNlRmxhZykKICAgICAgICAgLyogQWRkIG5vaXNlZmxvb3IgdG8gdGhlIGFtcGxpZmllZCBzaWduYWwgKi8KICAgICAgICAgc2lnbmFsUmVhbCArPSAoZk11bHREaXYyKEZES19zYnJEZWNvZGVyX3Nicl9yYW5kb21QaGFzZVtpbmRleF1bMF0sIHBOb2lzZUxldmVsWzBdKTw8NCk7CiAKLSAgaWYgKGZDbGRmYikgewotCi0gICAgaWYgKCEoaGFybUluZGV4JjB4MSkpIHsKLSAgICAgIC8qIGhhcm1JbmRleCAwLDIgKi8KLSAgICAgIHNpZ25hbFJlYWwgKz0gKGhhcm1JbmRleCYweDIpID8gLXNpbmVMZXZlbCA6IHNpbmVMZXZlbDsKLSAgICAgICpwdHJSZWFsKysgPSBzaWduYWxSZWFsOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIC8qIGhhcm1JbmRleCAxLDMgaW4gY29tYmluYXRpb24gd2l0aCBmcmVxSW52RmxhZyAqLwotICAgICAgaW50IHNoaWZ0ID0gKGludCkgKHNjYWxlX2NoYW5nZSsxKTsKLSAgICAgIHNoaWZ0ID0gKHNoaWZ0Pj0wKSA/IGZpeE1pbihERlJBQ1RfQklUUy0xLHNoaWZ0KSA6IGZpeE1heCgtKERGUkFDVF9CSVRTLTEpLHNoaWZ0KTsKLQotICAgICAgRklYUF9EQkwgdG1wMSA9IHNjYWxlVmFsdWUoIGZNdWx0RGl2MihDMV9DTERGQiwgc2luZUxldmVsKSwgLXNoaWZ0ICk7Ci0KLSAgICAgIEZJWFBfREJMIHRtcDIgPSBmTXVsdERpdjIoQzFfQ0xERkIsIHNpbmVMZXZlbE5leHQpOwotCi0KLSAgICAgIC8qIHNhdmUgc3dpdGNoIGFuZCBjb21wYXJlIG9wZXJhdGlvbnMgYW5kIHJlZHVjZSB0byBYT1Igc3RhdGVtZW50ICovCi0gICAgICBpZiAoICgoaGFybUluZGV4Pj4xKSYweDEpXmZyZXFJbnZGbGFnKSB7Ci0gICAgICAgICAgKihwdHJSZWFsLTEpICs9IHRtcDE7Ci0gICAgICAgICAgc2lnbmFsUmVhbCAgIC09IHRtcDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAgICoocHRyUmVhbC0xKSAtPSB0bXAxOwotICAgICAgICAgIHNpZ25hbFJlYWwgICArPSB0bXAyOwotICAgICAgfQotICAgICAgKnB0clJlYWwrKyA9IHNpZ25hbFJlYWw7Ci0gICAgICBmcmVxSW52RmxhZyA9ICFmcmVxSW52RmxhZzsKLSAgICB9Ci0KLSAgfSBlbHNlCiAgIHsKICAgICBpZiAoIShoYXJtSW5kZXgmMHgxKSkgewogICAgICAgLyogaGFybUluZGV4IDAsMiAqLwpAQCAtMTkzMyw4ICsyMDAyLDkgQEAKICAgKnB0ckhhcm1JbmRleCA9IChoYXJtSW5kZXggKyAxKSAmIDM7CiAgICpwdHJQaGFzZUluZGV4ID0gaW5kZXggJiAoU0JSX05GX05PX1JBTkRPTV9WQUwgLSAxKTsKIH0KLXZvaWQgYWRqdXN0VGltZVNsb3RIUShGSVhQX0RCTCAqUkVTVFJJQ1QgcHRyUmVhbCwgICAgICAgICAgIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRySW1hZywgICAgICAgICAgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgaW1hZyBwYXJ0ICovCitzdGF0aWMgdm9pZCBhZGp1c3RUaW1lU2xvdEhRKAorICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICpSRVNUUklDVCBwdHJSZWFsLCAgICAgIC8qITwgU3ViYmFuZCBzYW1wbGVzIHRvIGJlIGFkanVzdGVkLCByZWFsIHBhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICBGSVhQX0RCTCAqUkVTVFJJQ1QgcHRySW1hZywgICAgICAvKiE8IFN1YmJhbmQgc2FtcGxlcyB0byBiZSBhZGp1c3RlZCwgaW1hZyBwYXJ0ICovCiAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9DQUxDVUxBVEVfRU5WRUxPUEUgaF9zYnJfY2FsX2VudiwKICAgICAgICAgICAgICAgICAgICAgICBFTlZfQ0FMQ19OUkdTKiBucmdzLAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBsb3dTdWJiYW5kLCAgICAgICAgICAgIC8qITwgTG93ZXN0IFFNRi1jaGFubmVsIGluIHRoZSBjdXJyZW50bHkgdXNlZCBTQlIgcmFuZ2UuICovCkBAIC0yMTM3LDcgKzIyMDcsNiBAQAogICBVQ0hBUiB3b3JrTGltaXRlckJhbmRUYWJsZVtNQVhfRlJFUV9DT0VGRlMgLyAyICsgTUFYX05VTV9QQVRDSEVTICsgMV07CiAgIGludCBwYXRjaEJvcmRlcnNbTUFYX05VTV9QQVRDSEVTICsgMV07CiAgIGludCBreCwgazI7Ci0gIEZJWFBfREJMIHRlbXA7CiAKICAgaW50IGxvd1N1YmJhbmQgPSBmcmVxQmFuZFRhYmxlWzBdOwogICBpbnQgaGlnaFN1YmJhbmQgPSBmcmVxQmFuZFRhYmxlW25vRnJlcUJhbmRzXTsKQEAgLTIxNjksMTMgKzIyMzgsMzIgQEAKIAogCiAgICAgd2hpbGUgKGhpTGltSW5kZXggPD0gdGVtcE5vTGltKSB7CisgICAgICBGSVhQX0RCTCBkaXZfbSwgb2N0X20sIHRlbXA7CisgICAgICBJTlQgZGl2X2UgID0gMCwgb2N0X2UgID0gMCwgdGVtcF9lID0gMDsKKwogICAgICAgazIgPSB3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSArIGxvd1N1YmJhbmQ7CiAgICAgICBreCA9IHdvcmtMaW1pdGVyQmFuZFRhYmxlW2xvTGltSW5kZXhdICsgbG93U3ViYmFuZDsKIAotICAgICAgdGVtcCA9IEZYX1NHTDJGWF9EQkwoRkRLX2dldE51bU9jdGF2ZXNEaXY4KGt4LGsyKSk7IC8qIE51bWJlciBvZiBvY3RhdmVzICovCi0gICAgICB0ZW1wID0gZk11bHQodGVtcCwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbbGltaXRlckJhbmRzXSk7CisgICAgICBkaXZfbSAgPSBmRGl2Tm9ybShrMiwga3gsICZkaXZfZSk7CiAKLSAgICAgIGlmICh0ZW1wIDwgRkwyRlhDT05TVF9EQkwgKDAuNDlmKT4+NSkgeworICAgICAgLyogY2FsY3VsYXRlIG51bWJlciBvZiBvY3RhdmVzICovCisgICAgICBvY3RfbSAgPSBmTG9nMihkaXZfbSwgZGl2X2UsICZvY3RfZSk7CisKKyAgICAgIC8qIG11bHRpcGx5IHdpdGggbGltaXRlcmJhbmRzIHBlciBvY3RhdmUgICAgKi8KKyAgICAgIC8qIHZhbHVlcyAxLCAxLjIsIDIsIDMgLT4gc2NhbGUgZmFjdG9yIG9mIDIgKi8KKyAgICAgIHRlbXAgPSBmTXVsdE5vcm0ob2N0X20sIEZES19zYnJEZWNvZGVyX3Nicl9saW1pdGVyQmFuZHNQZXJPY3RhdmVEaXY0X0RCTFtsaW1pdGVyQmFuZHNdLCAmdGVtcF9lKTsKKworICAgICAgLyogb3ZlcmFsbCBzY2FsZSBmYWN0b3Igb2YgdGVtcCBpc3QgYWRkaXRpb24gb2Ygc2NhbGVmYWN0b3JzIGZyb20gbG9nMiBjYWxjdWxhdGlvbiwKKyAgICAgICAgIGxpbWl0ZXIgYmFuZHMgc2NhbGVmYWN0b3IgKDIpIGFuZCBsaW1pdGVyIGJhbmRzIG11bHRpcGxpY2F0aW9uICovCisgICAgICB0ZW1wX2UgKz0gb2N0X2UgKyAyOworCisgICAgICAvKiAgICBkaXYgY2FuIGJlIGEgbWF4aW11bSBvZiA2NCAoazIgPSA2NCBhbmQga3ggPSAxKQorICAgICAgICAgLT4gb2N0IGNhbiBiZSBhIG1heGltdW0gb2YgNgorICAgICAgICAgLT4gdGVtcCBjYW4gYmUgYSBtYXhpbXVtIG9mIDE4IChhcyBsaW1pdGVyQmFuZHNQZXJPY3RvYXZlIGlzIGEgbWF4aW11bSBmYWN0b3Igb2YgMykKKyAgICAgICAgIC0+IHdlIG5lZWQgYSBzY2FsZSBmYWN0b3Igb2YgNSBmb3IgY29tcGFyaXNzb24KKyAgICAgICovCisgICAgICBpZiAodGVtcCA+PiAoNSAtIHRlbXBfZSkgPCBGTDJGWENPTlNUX0RCTCAoMC40OWYpID4+IDUpIHsKKwogICAgICAgICBpZiAod29ya0xpbWl0ZXJCYW5kVGFibGVbaGlMaW1JbmRleF0gPT0gd29ya0xpbWl0ZXJCYW5kVGFibGVbbG9MaW1JbmRleF0pIHsKICAgICAgICAgICB3b3JrTGltaXRlckJhbmRUYWJsZVtoaUxpbUluZGV4XSA9IGhpZ2hTdWJiYW5kOwogICAgICAgICAgIG5CYW5kcy0tOwpkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmNwcCBiL2xpYlNCUmRlYy9zcmMvZW52X2RlYy5jcHAKaW5kZXggMjRiMmQzYi4uYzY1YzE2OSAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9lbnZfZGVjLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9kZWMuY3BwCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0zNjksNyArMzY5LDcgQEAKICAgRklYUF9TR0wgc3RlcDsgICAgLyogc3BlZWQgb2YgZmFkZSAqLwogICBpbnQgaTsKIAotICBpbnQgY3VycmVudFN0YXJ0UG9zID0gaF9wcmV2X2RhdGEtPnN0b3BQb3MgLSBoSGVhZGVyRGF0YS0+bnVtYmVyVGltZVNsb3RzOworICBpbnQgY3VycmVudFN0YXJ0UG9zID0gRkRLbWF4KDAsIGhfcHJldl9kYXRhLT5zdG9wUG9zIC0gaEhlYWRlckRhdGEtPm51bWJlclRpbWVTbG90cyk7CiAgIGludCBjdXJyZW50U3RvcFBvcyA9IGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHM7CiAKIApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5jcHAgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcAppbmRleCA2Y2IwYjk5Li5kYWNkOTUxIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMzI3LDcgKzMyNyw3IEBACiAgIH0KIAogICAvKiBMb29rIGZvciBuZXcgc2V0dGluZ3MuIElFQyAxNDQ5Ni0zLCA0LjYuMTguMy4xICovCi0gIGlmKGhIZWFkZXJEYXRhLT5zeW5jU3RhdGUgIT0gU0JSX0FDVElWRSB8fAorICBpZihoSGVhZGVyRGF0YS0+c3luY1N0YXRlIDwgU0JSX0hFQURFUiB8fAogICAgICBsYXN0SGVhZGVyLnN0YXJ0RnJlcSAgICE9IHBCc0RhdGEtPnN0YXJ0RnJlcSAgIHx8CiAgICAgIGxhc3RIZWFkZXIuc3RvcEZyZXEgICAgIT0gcEJzRGF0YS0+c3RvcEZyZXEgICAgfHwKICAgICAgbGFzdEhlYWRlci5mcmVxU2NhbGUgICAhPSBwQnNEYXRhLT5mcmVxU2NhbGUgICB8fApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oIGIvbGliU0JSZGVjL3NyYy9lbnZfZXh0ci5oCmluZGV4IGFiNmI3MDQuLjA1MThlYTkgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvZW52X2V4dHIuaAorKysgYi9saWJTQlJkZWMvc3JjL2Vudl9leHRyLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEyNSw2ICsxMjUsNyBAQAogdHlwZWRlZiBlbnVtCiB7CiAgIEhFQURFUl9OT1RfUFJFU0VOVCwKKyAgSEVBREVSX0VSUk9SLAogICBIRUFERVJfT0ssCiAgIEhFQURFUl9SRVNFVAogfQpAQCAtMTMyLDEwICsxMzMsMTAgQEAKIAogdHlwZWRlZiBlbnVtCiB7Ci0gIFNCUl9OT1RfSU5JVElBTElaRUQsCi0gIFVQU0FNUExJTkcsCi0gIFNCUl9IRUFERVIsCi0gIFNCUl9BQ1RJVkUKKyAgU0JSX05PVF9JTklUSUFMSVpFRCA9IDAsCisgIFVQU0FNUExJTkcgPSAxLAorICBTQlJfSEVBREVSID0gMiwKKyAgU0JSX0FDVElWRSA9IDMKIH0KIFNCUl9TWU5DX1NUQVRFOwogCkBAIC0xNzksNiArMTgwLDcgQEAKICNkZWZpbmUgU0JSREVDX0xPV19QT1dFUiAgICAgIDE2ICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBMb3cgUG93ZXIgUU1GIG1vZGUgc2hhbGwgYmUgdXNlZC4gKi8KICNkZWZpbmUgU0JSREVDX1BTX0RFQ09ERUQgICAgIDMyICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBQUyB3YXMgZGVjb2RlZCBhbmQgcmVuZGVyZWQuICovCiAjZGVmaW5lIFNCUkRFQ19MRF9NUFNfUU1GICAgIDUxMiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIExELU1QUyBRTUYgc2hhbGwgYmUgdXNlZC4gKi8KKyNkZWZpbmUgU0JSREVDX1NZTlRBWF9EUk0gICAyMDQ4ICAvKiBGbGFnIGluZGljYXRpbmcgdGhhdCBEUk0zMC9EUk0rIHJldmVyc2Ugc3ludGF4IGlzIGJlaW5nIHVzZWQuICovCiAjZGVmaW5lIFNCUkRFQ19ET1dOU0FNUExFICAgODE5MiAgLyogRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGRvd25zYW1wbGluZyBtb2RlIGlzIHVzZWQuICovCiAjZGVmaW5lIFNCUkRFQ19GTFVTSCAgICAgICAxNjM4NCAgLyogRmxhZyBpcyB1c2VkIHRvIGZsdXNoIGFsbCBlbGVtZW50cyBpbiB1c2UuICovCiAjZGVmaW5lIFNCUkRFQ19GT1JDRV9SRVNFVCAzMjc2OCAgLyogRmxhZyBpcyB1c2VkIHRvIGZvcmNlIGEgcmVzZXQgb2YgYWxsIGVsZW1lbnRzIGluIHVzZS4gKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAgYi9saWJTQlJkZWMvc3JjL3Nicl9kZWMuY3BwCmluZGV4IDEyODIzMzguLjA4NjQzNDggMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfZGVjLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMjI1LDcgKzIyNSwxNCBAQAogICB9CiAKICAgaWYgKHJlc2V0QW5hUW1mKSB7Ci0gICAgaW50IHFtZkVyciA9IHFtZkluaXRBbmFseXNpc0ZpbHRlckJhbmsgKAorICAgIFFNRl9GSUxURVJfQkFOSyBwcnZBbmFRbWY7CisgICAgaW50ICBxbWZFcnI7CisKKyAgICAvKiBTdG9yZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBGREttZW1jcHkoJnBydkFuYVFtZiwgJmhTYnJEZWMtPkFuYWx5c2lzY1FNRiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOworCisgICAgLyogUmVzZXQgYW5hbHlzaXMgUU1GICovCisgICAgcW1mRXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayAoCiAgICAgICAgICAgICZoU2JyRGVjLT5BbmFseXNpc2NRTUYsCiAgICAgICAgICAgICBoU2JyRGVjLT5hbmFRbWZTdGF0ZXMsCiAgICAgICAgICAgICBoU2JyRGVjLT5BbmFseXNpc2NRTUYubm9fY29sLApAQCAtMjM0LDEzICsyNDEsMjIgQEAKICAgICAgICAgICAgIGhTYnJEZWMtPkFuYWx5c2lzY1FNRi5ub19jaGFubmVscywKICAgICAgICAgICAgIGFuYVFtZkZsYWdzIHwgUU1GX0ZMQUdfS0VFUF9TVEFURVMKICAgICAgICAgICAgICk7CisKICAgICBpZiAocW1mRXJyICE9IDApIHsKLSAgICAgIEZES19BU1NFUlQoMCk7CisgICAgICAvKiBSZXN0b3JlIG9sZCBjb25maWd1cmF0aW9uIG9mIGFuYWx5c2lzIFFNRiAqLworICAgICAgRkRLbWVtY3B5KCZoU2JyRGVjLT5BbmFseXNpc2NRTUYsICZwcnZBbmFRbWYsIHNpemVvZihRTUZfRklMVEVSX0JBTkspKTsKICAgICB9CiAgIH0KIAogICBpZiAocmVzZXRTeW5RbWYpIHsKLSAgICBpbnQgcW1mRXJyID0gcW1mSW5pdFN5bnRoZXNpc0ZpbHRlckJhbmsgKAorICAgIFFNRl9GSUxURVJfQkFOSyBwcnZTeW5RbWY7CisgICAgaW50ICBxbWZFcnI7CisKKyAgICAvKiBTdG9yZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gKi8KKyAgICBGREttZW1jcHkoJnBydlN5blFtZiwgJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOworCisgICAgLyogUmVzZXQgc3ludGhlc2lzIFFNRiAqLworICAgIHFtZkVyciA9IHFtZkluaXRTeW50aGVzaXNGaWx0ZXJCYW5rICgKICAgICAgICAgICAgJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwKICAgICAgICAgICAgIGhTYnJEZWMtPnBTeW5RbWZTdGF0ZXMsCiAgICAgICAgICAgICBoU2JyRGVjLT5TeW50aGVzaXNRTUYubm9fY29sLApAQCAtMjUxLDcgKzI2Nyw4IEBACiAgICAgICAgICAgICApOwogCiAgICAgaWYgKHFtZkVyciAhPSAwKSB7Ci0gICAgICBGREtfQVNTRVJUKDApOworICAgICAgLyogUmVzdG9yZSBvbGQgY29uZmlndXJhdGlvbiBvZiBzeW50aGVzaXMgUU1GICovCisgICAgICBGREttZW1jcHkoJmhTYnJEZWMtPlN5bnRoZXNpc1FNRiwgJnBydlN5blFtZiwgc2l6ZW9mKFFNRl9GSUxURVJfQkFOSykpOwogICAgIH0KICAgfQogfQpAQCAtMzIxLDcgKzMzOCw4IEBACiAgICAgICAgICAgSEFORExFX1NCUl9QUkVWX0ZSQU1FX0RBVEEgaFByZXZGcmFtZURhdGEsICAvKiE8IFNvbWUgY29udHJvbCBkYXRhIG9mIGxhc3QgZnJhbWUgKi8KICAgICAgICAgICBjb25zdCBpbnQgYXBwbHlQcm9jZXNzaW5nLCAgICAgICAgIC8qITwgRmxhZyBmb3IgU0JSIG9wZXJhdGlvbiAqLwogICAgICAgICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLAotICAgICAgICAgIGNvbnN0IFVJTlQgZmxhZ3MKKyAgICAgICAgICBjb25zdCBVSU5UIGZsYWdzLAorICAgICAgICAgIGNvbnN0IGludCBjb2RlY0ZyYW1lU2l6ZQogICAgICAgICAgKQogewogICBpbnQgaSwgc2xvdCwgcmVzZXJ2ZTsKQEAgLTM0OCw2ICszNjYsMzMgQEAKICAgaWYgKGZsYWdzICYgU0JSREVDX0VMRF9HUklEKSB7CiAgICAgLyogQ2hvb3NlIHRoZSByaWdodCBsb3cgZGVsYXkgZmlsdGVyIGJhbmsgKi8KICAgICBjaGFuZ2VRbWZUeXBlKCBoU2JyRGVjLCAoZmxhZ3MgJiBTQlJERUNfTERfTVBTX1FNRikgPyAxIDogMCApOworCisgICAgLyogSWYgdGhlIExELU1QUyBRTUYgaXMgbm90IGF2YWlsYWJsZSBkZWxheSB0aGUgc2lnbmFsIGJ5ICg5Ni00OCpsZFNiclNhbXBsaW5nUmF0ZSkKKyAgICAgKiBzYW1wbGVzIGFjY29yZGluZyB0byBJU08vSUVDIDE0NDk2LTM6MjAwOS9GREFNIDI6MjAxMChFKSBjaGFwdGVyIDQuNS4yLjEzLiAqLworICAgIGlmICggKGZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpCisgICAgICAmJiAoaFNickRlYy0+QW5hbHlzaXNjUU1GLmZsYWdzICYgUU1GX0ZMQUdfQ0xERkIpICkKKyAgICB7CisgICAgICBJTlRfUENNICpwRGx5QnVmID0gaFNickRlYy0+Y29yZURlbGF5QnVmOyAgLyogRExZQlVGICovCisgICAgICBpbnQgc21wbCwgZGVsYXkgPSA5NiA+PiAoIShmbGFncyAmIFNCUkRFQ19ET1dOU0FNUExFKSA/IDEgOiAwKTsKKyAgICAgIC8qIENyZWF0ZSBUTVBCVUYgKi8KKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfU1RBUlQocGNtVGVtcCwgSU5UX1BDTSwgKDk2KSk7CisgICAgICAvKiBDb3B5IGRlbGF5IHNhbXBsZXMgZnJvbSBJTkJVRiB0byBUTVBCVUYgKi8KKyAgICAgIGZvciAoc21wbCA9IDA7IHNtcGwgPCBkZWxheTsgc21wbCArPSAxKSB7CisgICAgICAgIHBjbVRlbXBbc21wbF0gPSB0aW1lSW5bKGNvZGVjRnJhbWVTaXplLWRlbGF5K3NtcGwpKnN0cmlkZUluXTsKKyAgICAgIH0KKyAgICAgIC8qIE1vdmUgaW5wdXQgc2lnbmFsIHJlbWFpbmRlciB0byB0aGUgdmVyeSBlbmQgb2YgSU5CVUYgKi8KKyAgICAgIGZvciAoc21wbCA9IChjb2RlY0ZyYW1lU2l6ZS1kZWxheS0xKSpzdHJpZGVJbjsgc21wbCA+PSAwOyBzbXBsIC09IHN0cmlkZUluKSB7CisgICAgICAgIHRpbWVJbltzbXBsK2RlbGF5XSA9IHRpbWVJbltzbXBsXTsKKyAgICAgIH0KKyAgICAgIC8qIENvcHkgZGVsYXllZCBzYW1wbGVzIGZyb20gbGFzdCBmcmFtZSBmcm9tIERMWUJVRiB0byB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgSU5CVUYgKi8KKyAgICAgIGZvciAoc21wbCA9IDA7IHNtcGwgPCBkZWxheTsgc21wbCArPSAxKSB7CisgICAgICAgIHRpbWVJbltzbXBsKnN0cmlkZUluXSA9IHBEbHlCdWZbc21wbF07CisgICAgICB9CisgICAgICAvKiBDb3B5IFRNUEJVRiB0byBETFlCVUYgKi8KKyAgICAgIEZES21lbWNweShwRGx5QnVmLCBwY21UZW1wLCBkZWxheSpzaXplb2YoSU5UX1BDTSkpOworICAgICAgLyogRGVzdG9yeSBUTVBCVUYgKi8KKyAgICAgIENfQUFMTE9DX1NDUkFUQ0hfRU5EKHBjbVRlbXAsIElOVF9QQ00sICg5NikpOworICAgIH0KICAgfQogCiAgIC8qCkBAIC03NjEsNyArODA2LDcgQEAKICAgewogICAgIGludCBxbWZFcnI7CiAgICAgLyogQWRhcHRlZCBRTUYgYW5hbHlzaXMgcG9zdC10d2lkZGxlcyBmb3IgZG93bi1zYW1wbGVkIEhRIFNCUiAqLwotICAgIGNvbnN0IFVJTlQgZG93blNhbXBsZWRGbGFnID0gKGRvd25zYW1wbGVGYWM9PTIpID8gUU1GX0ZMQUdfRE9XTlNBTVBMRUQgOiAwOworICAgIGNvbnN0IFVJTlQgZG93blNhbXBsZWRGbGFnID0gKGZsYWdzICYgU0JSREVDX0RPV05TQU1QTEUpID8gUU1GX0ZMQUdfRE9XTlNBTVBMRUQgOiAwOwogCiAgICAgcW1mRXJyID0gcW1mSW5pdEFuYWx5c2lzRmlsdGVyQmFuayAoCiAgICAgICAgICAgICAgICAgICAgICZocy0+QW5hbHlzaXNjUU1GLApAQCAtODM2LDYgKzg4MSw5IEBACiAgICAgfQogICB9CiAKKyAgLyogQ2xlYXIgaW5wdXQgZGVsYXkgbGluZSAqLworICBGREttZW1jbGVhcihocy0+Y29yZURlbGF5QnVmLCAoOTYpKnNpemVvZihJTlRfUENNKSk7CisKICAgLyogYXNzaWduIHFtZiB0aW1lIHNsb3RzICovCiAgIGFzc2lnblRpbWVTbG90cyggJmhTYnJDaGFubmVsLT5TYnJEZWMsIGhIZWFkZXJEYXRhLT5udW1iZXJUaW1lU2xvdHMgKiBoSGVhZGVyRGF0YS0+dGltZVN0ZXAsIHFtZkZsYWdzICYgUU1GX0ZMQUdfTFApOwogCmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3Nicl9kZWMuaCBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCmluZGV4IDE3NWU3YjIuLmVkZGU2MzcgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyX2RlYy5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xMTgsNiArMTE4LDkgQEAKICAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMTsKICAgRklYUF9EQkwgKiBXb3JrQnVmZmVyMjsKIAorICAvKiBEZWxheWVkIHRpbWUgaW5wdXQgc2lnbmFsIG5lZWRlZCB0byBhbGlnbiBDTERGRCB3aXRoIExELU1QUyBRTUYuICovCisgIElOVF9QQ00gICAgY29yZURlbGF5QnVmWyg5NildOworCiAgIC8qIFFNRiBmaWx0ZXIgc3RhdGVzICovCiAgIEZJWFBfUUFTICAgYW5hUW1mU3RhdGVzWygzMjApXTsKICAgRklYUF9RU1MgKiBwU3luUW1mU3RhdGVzOwpAQCAtMTgyLDcgKzE4NSw4IEBACiAgICAgICAgICBIQU5ETEVfU0JSX1BSRVZfRlJBTUVfREFUQSBoUHJldkZyYW1lRGF0YSwgIC8qITwgU29tZSBjb250cm9sIGRhdGEgb2YgbGFzdCBmcmFtZSAqLwogICAgICAgICAgY29uc3QgaW50IGFwcGx5UHJvY2Vzc2luZywgICAgICAgICAvKiE8IEZsYWcgZm9yIFNCUiBvcGVyYXRpb24gKi8KICAgICAgICAgIEhBTkRMRV9QU19ERUMgaF9wc19kLAotICAgICAgICAgY29uc3QgVUlOVCBmbGFncworICAgICAgICAgY29uc3QgVUlOVCBmbGFncywKKyAgICAgICAgIGNvbnN0IGludCBjb2RlY0ZyYW1lU2l6ZQogICAgICAgICApOwogCiAKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX3JhbS5oIGIvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmgKaW5kZXggZjEyNjMxZC4uN2FiNTA0NCAxMDA2NDQKLS0tIGEvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmgKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfcmFtLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEzNSw2ICsxMzUsNyBAQAogICBVU0hPUlQgY29kZWNGcmFtZVNpemU7CiAgIFVDSEFSIHN5bkRvd25zYW1wbGVGYWM7CiAgIFVDSEFSIG51bURlbGF5RnJhbWVzOyAgICAgICAgLyogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZGVsYXkgZnJhbWVzIHVzZWQgZm9yIHByb2Nlc3NpbmcuICovCisgIFVDSEFSIG51bUZsdXNoZWRGcmFtZXM7ICAgICAgLyogVGhlIHZhcmlhYmxlIGNvdW50cyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB3aGljaCBhcmUgZmx1c2hlZCBjb25zZWN1dGl2ZWx5LiAqLwogCiAgIFVJTlQgZmxhZ3M7CiAKZGlmZiAtLWdpdCBhL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5jcHAgYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uY3BwCmluZGV4IGU4NGMzY2QuLmM0OGNlMzUgMTAwNjQ0Ci0tLSBhL2xpYlNCUmRlYy9zcmMvc2JyX3JvbS5jcHAKKysrIGIvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTg5LDYgKzE4OSwxNSBAQAogICBGTDJGWENPTlNUX1NHTCgzLjBmIC8gNC4wZikKIH07CiAKKy8qISBDb25zdGFudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgbGltaXRlciBiYW5kcyAqLworY29uc3QgRklYUF9EQkwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRfREJMWzRdID0KK3sKKyAgRkwyRlhDT05TVF9EQkwoMS4wZiAvIDQuMGYpLAorICBGTDJGWENPTlNUX0RCTCgxLjJmIC8gNC4wZiksCisgIEZMMkZYQ09OU1RfREJMKDIuMGYgLyA0LjBmKSwKKyAgRkwyRlhDT05TVF9EQkwoMy4wZiAvIDQuMGYpCit9OworCiAvKiEgUmF0aW8gb2Ygb2xkIGdhaW5zIGFuZCBub2lzZSBsZXZlbHMgZm9yIHRoZSBmaXJzdCA0IHRpbWVzbG90cyBvZiBhbiBlbnZlbG9wZSAqLwogY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3Ntb290aEZpbHRlcls0XSA9IHsKICAgRkwyRlhDT05TVF9TR0woMC42NjY2NjY2NjY2NjY2NmYpLApkaWZmIC0tZ2l0IGEvbGliU0JSZGVjL3NyYy9zYnJfcm9tLmggYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uaAppbmRleCBjMzE4ODcwLi4xZjgwMGJjIDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3Nicl9yb20uaAorKysgYi9saWJTQlJkZWMvc3JjL3Nicl9yb20uaApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTI0LDYgKzEyNCw3IEBACiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX21bNF07CiBleHRlcm4gY29uc3QgVUNIQVIgICAgRkRLX3NickRlY29kZXJfc2JyX2xpbUdhaW5zX2VbNF07CiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRbNF07CitleHRlcm4gY29uc3QgRklYUF9EQkwgRkRLX3NickRlY29kZXJfc2JyX2xpbWl0ZXJCYW5kc1Blck9jdGF2ZURpdjRfREJMWzRdOwogZXh0ZXJuIGNvbnN0IEZJWFBfU0dMIEZES19zYnJEZWNvZGVyX3Nicl9zbW9vdGhGaWx0ZXJbNF07CiBleHRlcm4gY29uc3QgRklYUF9TR0wgRkRLX3NickRlY29kZXJfc2JyX3JhbmRvbVBoYXNlW1NCUl9ORl9OT19SQU5ET01fVkFMXVsyXTsKIGV4dGVybiBjb25zdCBGSVhQX1NHTCBoYXJtb25pY1BoYXNlWCBbMl1bNF07CmRpZmYgLS1naXQgYS9saWJTQlJkZWMvc3JjL3NicmRlY29kZXIuY3BwIGIvbGliU0JSZGVjL3NyYy9zYnJkZWNvZGVyLmNwcAppbmRleCBlMTUxNDVhLi5mOWRlZDU0IDEwMDY0NAotLS0gYS9saWJTQlJkZWMvc3JjL3NicmRlY29kZXIuY3BwCisrKyBiL2xpYlNCUmRlYy9zcmMvc2JyZGVjb2Rlci5jcHAKQEAgLTEyOCw2ICsxMjgsNyBAQAogI2luY2x1ZGUgImxwcF90cmFuLmgiCiAjaW5jbHVkZSAidHJhbnNjZW5kZW50LmgiCiAKKyNpbmNsdWRlICJGREtfY3JjLmgiCiAKICNpbmNsdWRlICJzYnJkZWNfZHJjLmgiCiAKQEAgLTEzNyw3ICsxMzgsNyBAQAogLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KICNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwwIDIKICNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwxIDIKLSNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwyIDcKKyNkZWZpbmUgU0JSREVDT0RFUl9MSUJfVkwyIDEyCiAjZGVmaW5lIFNCUkRFQ09ERVJfTElCX1RJVExFICJTQlIgRGVjb2RlciIKICNpZmRlZiBfX0FORFJPSURfXwogI2RlZmluZSBTQlJERUNPREVSX0xJQl9CVUlMRF9EQVRFICIiCkBAIC0xOTQsNiArMTk1LDMzIEBACiAgIGhEc3QtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlWzFdID0gaERzdC0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaTsKIH0KIAorc3RhdGljIGludCBjb21wYXJlU2JySGVhZGVyKCBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIxLCBjb25zdCBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhIZHIyICkKK3sKKyAgaW50IHJlc3VsdCA9IDA7CisKKyAgLyogY29tcGFyZSBiYXNpYyBkYXRhICovCisgIHJlc3VsdCB8PSAoaEhkcjEtPnN5bmNTdGF0ZSAhPSBoSGRyMi0+c3luY1N0YXRlKSA/IDEgOiAwOworICByZXN1bHQgfD0gKGhIZHIxLT5zdGF0dXMgIT0gaEhkcjItPnN0YXR1cykgPyAxIDogMDsKKyAgcmVzdWx0IHw9IChoSGRyMS0+ZnJhbWVFcnJvckZsYWcgIT0gaEhkcjItPmZyYW1lRXJyb3JGbGFnKSA/IDEgOiAwOworICByZXN1bHQgfD0gKGhIZHIxLT5udW1iZXJUaW1lU2xvdHMgIT0gaEhkcjItPm51bWJlclRpbWVTbG90cykgPyAxIDogMDsKKyAgcmVzdWx0IHw9IChoSGRyMS0+bnVtYmVyT2ZBbmFseXNpc0JhbmRzICE9IGhIZHIyLT5udW1iZXJPZkFuYWx5c2lzQmFuZHMpID8gMSA6IDA7CisgIHJlc3VsdCB8PSAoaEhkcjEtPnRpbWVTdGVwICE9IGhIZHIyLT50aW1lU3RlcCkgPyAxIDogMDsKKyAgcmVzdWx0IHw9IChoSGRyMS0+c2JyUHJvY1NtcGxSYXRlICE9IGhIZHIyLT5zYnJQcm9jU21wbFJhdGUpID8gMSA6IDA7CisKKyAgLyogY29tcGFyZSBiaXRzdHJlYW0gZGF0YSAqLworICByZXN1bHQgfD0gRkRLbWVtY21wKCAmaEhkcjEtPmJzX2RhdGEsICZoSGRyMi0+YnNfZGF0YSwgc2l6ZW9mKFNCUl9IRUFERVJfREFUQV9CUykgKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcCggJmhIZHIxLT5ic19pbmZvLCAmaEhkcjItPmJzX2luZm8sIHNpemVvZihTQlJfSEVBREVSX0RBVEFfQlNfSU5GTykgKTsKKworICAvKiBjb21wYXJlIGZyZXF1ZW5jeSBiYW5kIGRhdGEgKi8KKyAgcmVzdWx0IHw9IEZES21lbWNtcCggJmhIZHIxLT5mcmVxQmFuZERhdGEsICZoSGRyMi0+ZnJlcUJhbmREYXRhLCAoOCtNQVhfTlVNX0xJTUlURVJTKzEpKnNpemVvZihVQ0hBUikgKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcCggaEhkcjEtPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTG8sIGhIZHIyLT5mcmVxQmFuZERhdGEuZnJlcUJhbmRUYWJsZUxvLCAoTUFYX0ZSRVFfQ09FRkZTLzIrMSkqc2l6ZW9mKFVDSEFSKSApOworICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVIaSwgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlSGksIChNQVhfRlJFUV9DT0VGRlMrMSkqc2l6ZW9mKFVDSEFSKSApOworICByZXN1bHQgfD0gRkRLbWVtY21wKCBoSGRyMS0+ZnJlcUJhbmREYXRhLmZyZXFCYW5kVGFibGVOb2lzZSwgaEhkcjItPmZyZXFCYW5kRGF0YS5mcmVxQmFuZFRhYmxlTm9pc2UsIChNQVhfTk9JU0VfQ09FRkZTKzEpKnNpemVvZihVQ0hBUikgKTsKKyAgcmVzdWx0IHw9IEZES21lbWNtcCggaEhkcjEtPmZyZXFCYW5kRGF0YS52X2tfbWFzdGVyLCBoSGRyMi0+ZnJlcUJhbmREYXRhLnZfa19tYXN0ZXIsIChNQVhfRlJFUV9DT0VGRlMrMSkqc2l6ZW9mKFVDSEFSKSApOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKIAogLyohCiAgIFxicmllZiBSZXNldCBTQlIgZGVjb2Rlci4KQEAgLTM5MSw2ICs0MTksNyBAQAogICAgIGNhc2UgQU9UX1BTOgogICAgIGNhc2UgQU9UX0VSX0FBQ19TQ0FMOgogICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgY2FzZSBBT1RfRFJNX0FBQzoKICAgICAgIHJldHVybiAxOwogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gMDsKQEAgLTQ2Myw2ICs0OTIsOCBAQAogCiAgIHNlbGYtPmZsYWdzID0gMDsKICAgc2VsZi0+ZmxhZ3MgfD0gKGNvcmVDb2RlYyA9PSBBT1RfRVJfQUFDX0VMRCkgPyBTQlJERUNfRUxEX0dSSUQgOiAwOworICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9FUl9BQUNfU0NBTCkgPyBTQlJERUNfU1lOVEFYX1NDQUwgOiAwOworICBzZWxmLT5mbGFncyB8PSAoY29yZUNvZGVjID09IEFPVF9EUk1fQUFDKSAgICAgPyBTQlJERUNfU1lOVEFYX1NDQUx8U0JSREVDX1NZTlRBWF9EUk0gOiAwOwogCiAgIC8qIEluaXQgU0JSIGVsZW1lbnRzICovCiAgIHsKQEAgLTkyOCwyNCArOTU5LDczIEBACiAgICAgICAgICkKIHsKICAgU0JSX0RFQ09ERVJfRUxFTUVOVCAgICpoU2JyRWxlbWVudDsKLSAgSEFORExFX1NCUl9IRUFERVJfREFUQSBoU2JySGVhZGVyOworICBIQU5ETEVfU0JSX0hFQURFUl9EQVRBIGhTYnJIZWFkZXIgPSBOVUxMOwogICBIQU5ETEVfU0JSX0NIQU5ORUwgICAgKnBTYnJDaGFubmVsOwogCiAgIFNCUl9GUkFNRV9EQVRBICpoRnJhbWVEYXRhTGVmdDsKICAgU0JSX0ZSQU1FX0RBVEEgKmhGcmFtZURhdGFSaWdodDsKIAogICBTQlJfRVJST1IgZXJyb3JTdGF0dXMgPSBTQlJERUNfT0s7Ci0gIFNCUl9TWU5DX1NUQVRFIGluaXRpYWxTeW5jU3RhdGU7CiAgIFNCUl9IRUFERVJfU1RBVFVTIGhlYWRlclN0YXR1cyA9IEhFQURFUl9OT1RfUFJFU0VOVDsKIAogICBJTlQgIHN0YXJ0UG9zOwogICBJTlQgIENSQ0xlbiA9IDA7CisgIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCc09yaWdpbmFsID0gaEJzOworICBGREtfQ1JDSU5GTyAgY3JjSW5mbzsgICAgICAgICAvKiBzaGFsbCBiZSB1c2VkIGZvciBhbGwgb3RoZXIgQ1JDcyBpbiB0aGUgZnV0dXJlIChUQkQpICovCisgIElOVCAgICAgICAgICBjcmNSZWcgPSAwOworICBVU0hPUlQgICAgICAgZHJtU2JyQ3JjID0gMDsKIAogICBpbnQgIHN0ZXJlbzsKICAgaW50ICBmRG9EZWNvZGVTYnJEYXRhID0gMTsKIAogICBpbnQgbGFzdFNsb3QsIGxhc3RIZHJTbG90ID0gMCwgdGhpc0hkclNsb3Q7CiAKKyAgLyogUmV2ZXJzZSBiaXRzIG9mIERSTSBTQlIgcGF5bG9hZCAqLworICBpZiAoIChzZWxmLT5mbGFncyAmIFNCUkRFQ19TWU5UQVhfRFJNKSAmJiAqY291bnQgPiAwICkKKyAgeworICAgIFVDSEFSICpic0J1ZmZlckRybSA9IChVQ0hBUiopc2VsZi0+d29ya0J1ZmZlcjE7CisgICAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzQndkID0gKEhBTkRMRV9GREtfQklUU1RSRUFNKSAoYnNCdWZmZXJEcm0gKyAoNTEyKSk7CisgICAgaW50IGRhdGFCeXRlcywgZGF0YUJpdHM7CisKKyAgICBkYXRhQml0cyA9ICpjb3VudDsKKworICAgIGlmIChkYXRhQml0cyA+ICgoNTEyKSo4KSkgeworICAgICAgLyogZG8gbm90IGZsaXAgbW9yZSBkYXRhIHRoYW4gbmVlZGVkICovCisgICAgICBkYXRhQml0cyA9ICg1MTIpKjg7CisgICAgfQorCisgICAgZGF0YUJ5dGVzID0gKGRhdGFCaXRzKzcpPj4zOworCisgICAgaW50IGo7CisKKyAgICBpZiAoKGogPSAoaW50KUZES2dldFZhbGlkQml0cyhoQnMpKSAhPSA4KSB7CisgICAgICBGREtwdXNoQmlEaXJlY3Rpb25hbChoQnMsIChqLTgpKTsKKyAgICB9CisKKyAgICBqID0gMDsKKyAgICBmb3IgKCA7IGRhdGFCeXRlcyA+IDA7IGRhdGFCeXRlcy0tKQorICAgIHsKKyAgICAgIGludCBpOworICAgICAgVUNIQVIgdG1wQnl0ZTsKKyAgICAgIFVDSEFSIGJ1ZmZlciA9IDB4MDA7CisKKyAgICAgIHRtcEJ5dGUgPSAoVUNIQVIpIEZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGludCBzaGlmdCA9IDIgKiBpICsgMTsKKyAgICAgICAgYnVmZmVyIHw9ICh0bXBCeXRlICYgKDB4MDg+PmkpKSA8PCBzaGlmdDsKKyAgICAgICAgYnVmZmVyIHw9ICh0bXBCeXRlICYgKDB4MTA8PGkpKSA+PiBzaGlmdDsKKyAgICAgIH0KKyAgICAgIGJzQnVmZmVyRHJtW2orK10gPSBidWZmZXI7CisgICAgICBGREtwdXNoQmFjayhoQnMsIDE2KTsKKyAgICB9CisKKyAgICBGREtpbml0Qml0U3RyZWFtKGhCc0J3ZCwgYnNCdWZmZXJEcm0sICg1MTIpLCBkYXRhQml0cywgQlNfUkVBREVSKTsKKworICAgIC8qIFVzZSByZXZlcnNlZCBkYXRhICovCisgICAgaEJzID0gaEJzQndkOworICAgIGJzUGF5TGVuID0gKmNvdW50OworICB9CisKICAgLyogUmVtZW1iZXIgc3RhcnQgcG9zaXRpb24gb2YgIFNCUiBlbGVtZW50ICovCiAgIHN0YXJ0UG9zID0gRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAKQEAgLTk3MCw3ICsxMDUwLDYgQEAKICAgaEZyYW1lRGF0YUxlZnQgID0gJnNlbGYtPnBTYnJFbGVtZW50W2VsZW1lbnRJbmRleF0tPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CiAgIGhGcmFtZURhdGFSaWdodCA9ICZzZWxmLT5wU2JyRWxlbWVudFtlbGVtZW50SW5kZXhdLT5wU2JyQ2hhbm5lbFsxXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwogCi0gIGluaXRpYWxTeW5jU3RhdGUgPSBoU2JySGVhZGVyLT5zeW5jU3RhdGU7CiAKICAgLyogcmVzZXQgUFMgZmxhZzsgd2lsbCBiZSBzZXQgYWZ0ZXIgUFMgd2FzIGZvdW5kICovCiAgIHNlbGYtPmZsYWdzICY9IH5TQlJERUNfUFNfREVDT0RFRDsKQEAgLTEwMDYsMTIgKzEwODUsMTkgQEAKICAgKi8KICAgaWYgKGZEb0RlY29kZVNickRhdGEpCiAgIHsKLSAgICBpZiAoY3JjRmxhZyA9PSAxKSB7CisgICAgaWYgKGNyY0ZsYWcpIHsKICAgICAgIHN3aXRjaCAoc2VsZi0+Y29yZUNvZGVjKSB7CiAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgICBGREtwdXNoRm9yIChoQnMsIDEwKTsKICAgICAgICAgLyogY2hlY2sgc2JyY3JjIGxhdGVyOiB3ZSBkb24ndCBrbm93IHRoZSBwYXlsb2FkIGxlbmd0aCBub3cgKi8KICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgICAgICBkcm1TYnJDcmMgPSAoVVNIT1JUKUZES3JlYWRCaXRzKGhCcywgOCk7CisgICAgICAgIC8qIFNldHVwIENSQyBkZWNvZGVyICovCisgICAgICAgIEZES2NyY0luaXQoJmNyY0luZm8sIDB4MDAxZCwgMHhGRkZGLCA4KTsKKyAgICAgICAgLyogU3RhcnQgQ1JDIHJlZ2lvbiAqLworICAgICAgICBjcmNSZWcgPSBGREtjcmNTdGFydFJlZygmY3JjSW5mbywgaEJzLCAwKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICBDUkNMZW4gPSBic1BheUxlbiAtIDEwOyAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5nZTogMCA9PiBpICovCiAgICAgICAgIGlmIChDUkNMZW4gPCAwKSB7CkBAIC0xMDU2LDYgKzExNDIsNyBAQAogICAgICAgICBoU2JySGVhZGVyLT5zeW5jU3RhdGUgPSBTQlJfSEVBREVSOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgaFNickhlYWRlci0+c3luY1N0YXRlID0gU0JSX05PVF9JTklUSUFMSVpFRDsKKyAgICAgICAgaGVhZGVyU3RhdHVzID0gSEVBREVSX0VSUk9SOwogICAgICAgfQogICAgIH0KIApAQCAtMTEwNSw3ICsxMTkyLDcgQEAKICAgICAgICAgdmFsQml0cyA9IChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcyk7CiAgICAgICB9CiAKLSAgICAgIGlmICggY3JjRmxhZyA9PSAxICkgeworICAgICAgaWYgKCBjcmNGbGFnICkgewogICAgICAgICBzd2l0Y2ggKHNlbGYtPmNvcmVDb2RlYykgewogICAgICAgICBjYXNlIEFPVF9FUl9BQUNfRUxEOgogICAgICAgICAgIHsKQEAgLTExMTcsNiArMTIwNCwxNCBAQAogICAgICAgICAgICAgRkRLcHVzaEZvcihoQnMsIGNyY0xlbik7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFPVF9EUk1fQUFDOgorICAgICAgICAgIC8qIEVuZCBDUkMgcmVnaW9uICovCisgICAgICAgICAgRkRLY3JjRW5kUmVnKCZjcmNJbmZvLCBoQnMsIGNyY1JlZyk7CisgICAgICAgICAgLyogQ2hlY2sgQ1JDICovCisgICAgICAgICAgaWYgKChGREtjcmNHZXRDUkMoJmNyY0luZm8pXjB4RkYpICE9IGRybVNickNyYykgeworICAgICAgICAgICAgZkRvRGVjb2RlU2JyRGF0YSA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMTY3LDggKzEyNjIsMjUgQEAKICAgfQogCiBiYWlsOgotICBpZiAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX09LKSB7Ci0gICAgaWYgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfTk9UX1BSRVNFTlQpIHsKKworICBpZiAoIHNlbGYtPmZsYWdzICYgU0JSREVDX1NZTlRBWF9EUk0gKQorICB7CisgICAgaEJzID0gaEJzT3JpZ2luYWw7CisgIH0KKworICBpZiAoIChlcnJvclN0YXR1cyA9PSBTQlJERUNfT0spCisgICAgfHwgKCAoZXJyb3JTdGF0dXMgPT0gU0JSREVDX1BBUlNFX0VSUk9SKQorICAgICAgJiYgKGhlYWRlclN0YXR1cyAhPSBIRUFERVJfRVJST1IpICkgKQorICB7CisgICAgaW50IHVzZU9sZEhkciA9ICggKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfTk9UX1BSRVNFTlQpCisgICAgICAgICAgICAgICAgICAgfHwgKGhlYWRlclN0YXR1cyA9PSBIRUFERVJfRVJST1IpICkgPyAxIDogMDsKKworICAgIGlmICghdXNlT2xkSGRyICYmICh0aGlzSGRyU2xvdCAhPSBsYXN0SGRyU2xvdCkpIHsKKyAgICAgIHVzZU9sZEhkciB8PSAoIGNvbXBhcmVTYnJIZWFkZXIoIGhTYnJIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtsYXN0SGRyU2xvdF0gKSA9PSAwICkgPyAxIDogMDsKKyAgICB9CisKKyAgICBpZiAodXNlT2xkSGRyICE9IDApIHsKICAgICAgIC8qIFVzZSB0aGUgb2xkIGhlYWRlciBmb3IgdGhpcyBmcmFtZSAqLwogICAgICAgaFNickVsZW1lbnQtPnVzZUhlYWRlclNsb3RbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF0gPSBsYXN0SGRyU2xvdDsKICAgICB9IGVsc2UgewpAQCAtMTIyOSwxMiArMTM0MSwyMSBAQAogICBpbnQgIG51bUVsZW1lbnRDaGFubmVscyA9IGhTYnJFbGVtZW50LT5uQ2hhbm5lbHM7IC8qIE51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgY3VycmVudCBTQlIgZWxlbWVudCAqLwogCiAgIGlmIChzZWxmLT5mbGFncyAmIFNCUkRFQ19GTFVTSCkgewotICAgIC8qIE1vdmUgZnJhbWUgcG9pbnRlciB0byB0aGUgbmV4dCBzbG90IHdoaWNoIGlzIHVwIHRvIGJlIGRlY29kZWQvYXBwbGllZCBuZXh0ICovCi0gICAgaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdCA9IChoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90KzEpICUgKHNlbGYtPm51bURlbGF5RnJhbWVzKzEpOwotICAgIC8qIFVwZGF0ZSBoZWFkZXIgYW5kIGZyYW1lIGRhdGEgcG9pbnRlciBiZWNhdXNlIHRoZXkgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0ICovCi0gICAgaFNickhlYWRlciA9ICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XV07Ci0gICAgaEZyYW1lRGF0YUxlZnQgID0gJmhTYnJFbGVtZW50LT5wU2JyQ2hhbm5lbFswXS0+ZnJhbWVEYXRhW2hTYnJFbGVtZW50LT51c2VGcmFtZVNsb3RdOwotICAgIGhGcmFtZURhdGFSaWdodCA9ICZoU2JyRWxlbWVudC0+cFNickNoYW5uZWxbMV0tPmZyYW1lRGF0YVtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XTsKKyAgICBpZiAoIHNlbGYtPm51bUZsdXNoZWRGcmFtZXMgPiBzZWxmLT5udW1EZWxheUZyYW1lcyApIHsKKyAgICAgIGludCBoZHJJZHg7CisgICAgICAvKiBObyB2YWxpZCBTQlIgcGF5bG9hZCBhdmFpbGFibGUsIGhlbmNlIHN3aXRjaCB0byB1cHNhbXBsaW5nIChpbiBhbGwgaGVhZGVycykgKi8KKyAgICAgIGZvciAoaGRySWR4ID0gMDsgaGRySWR4IDwgKCgxKSsxKTsgaGRySWR4ICs9IDEpIHsKKyAgICAgICAgc2VsZi0+c2JySGVhZGVyW2VsZW1lbnRJbmRleF1baGRySWR4XS5zeW5jU3RhdGUgPSBVUFNBTVBMSU5HOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIE1vdmUgZnJhbWUgcG9pbnRlciB0byB0aGUgbmV4dCBzbG90IHdoaWNoIGlzIHVwIHRvIGJlIGRlY29kZWQvYXBwbGllZCBuZXh0ICovCisgICAgICBoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90ID0gKGhTYnJFbGVtZW50LT51c2VGcmFtZVNsb3QrMSkgJSAoc2VsZi0+bnVtRGVsYXlGcmFtZXMrMSk7CisgICAgICAvKiBVcGRhdGUgaGVhZGVyIGFuZCBmcmFtZSBkYXRhIHBvaW50ZXIgYmVjYXVzZSB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHNldCAqLworICAgICAgaFNickhlYWRlciA9ICZzZWxmLT5zYnJIZWFkZXJbZWxlbWVudEluZGV4XVtoU2JyRWxlbWVudC0+dXNlSGVhZGVyU2xvdFtoU2JyRWxlbWVudC0+dXNlRnJhbWVTbG90XV07CisgICAgICBoRnJhbWVEYXRhTGVmdCAgPSAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzBdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgICAgICBoRnJhbWVEYXRhUmlnaHQgPSAmaFNickVsZW1lbnQtPnBTYnJDaGFubmVsWzFdLT5mcmFtZURhdGFbaFNickVsZW1lbnQtPnVzZUZyYW1lU2xvdF07CisgICAgfQogICB9CiAKICAgLyogVXBkYXRlIHRoZSBoZWFkZXIgZXJyb3IgZmxhZyAqLwpAQCAtMTM1NCw3ICsxNDc1LDggQEAKICAgICAgICAgICAgJnBTYnJDaGFubmVsWzBdLT5wcmV2RnJhbWVEYXRhLAogICAgICAgICAgICAgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSwKICAgICAgICAgICAgIGhfcHNfZCwKLSAgICAgICAgICAgIHNlbGYtPmZsYWdzCisgICAgICAgICAgICBzZWxmLT5mbGFncywKKyAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplCiAgICAgICAgICAgKTsKIAogICBpZiAoc3RlcmVvKSB7CkBAIC0xMzcxLDcgKzE0OTMsOCBAQAogICAgICAgICAgICAgICZwU2JyQ2hhbm5lbFsxXS0+cHJldkZyYW1lRGF0YSwKICAgICAgICAgICAgICAgKGhTYnJIZWFkZXItPnN5bmNTdGF0ZSA9PSBTQlJfQUNUSVZFKSwKICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MKKyAgICAgICAgICAgICAgc2VsZi0+ZmxhZ3MsCisgICAgICAgICAgICAgIGNvZGVjRnJhbWVTaXplCiAgICAgICAgICAgICApOwogICB9CiAKQEAgLTEzODcsMjAgKzE1MTAsMjEgQEAKICAgICBpZiAoICEoc2VsZi0+ZmxhZ3MgJiBTQlJERUNfUFNfREVDT0RFRCkgKSB7CiAgICAgICAvKiBBIGRlY29kZXIgd2hpY2ggaXMgYWJsZSB0byBkZWNvZGUgUFMgaGFzIHRvIHByb2R1Y2UgYSBzdGVyZW8gb3V0cHV0IGV2ZW4gaWYgbm8gUFMgZGF0YSBpcyBhdmFpbGJsZS4gKi8KICAgICAgIC8qIFNvIGNvcHkgbGVmdCBjaGFubmVsIHRvIHJpZ2h0IGNoYW5uZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgaW50IGNvcHlGcmFtZVNpemUgPSBjb2RlY0ZyYW1lU2l6ZSAqIDIgLyBzZWxmLT5zeW5Eb3duc2FtcGxlRmFjOwogICAgICAgaWYgKGludGVybGVhdmVkKSB7CiAgICAgICAgIElOVF9QQ00gKnB0cjsKICAgICAgICAgSU5UIGk7CiAgICAgICAgIEZES19BU1NFUlQoc3RyaWRlT3V0ID09IDIpOwogCiAgICAgICAgIHB0ciA9IHRpbWVEYXRhOwotICAgICAgICBmb3IgKGkgPSBjb2RlY0ZyYW1lU2l6ZTsgaS0tOyApIAorICAgICAgICBmb3IgKGkgPSBjb3B5RnJhbWVTaXplPj4xOyBpLS07ICkKICAgICAgICAgewogICAgICAgICAgIElOVF9QQ00gdG1wOyAvKiBUaGlzIHRlbXBvcmFsIHZhcmlhYmxlIGlzIHJlcXVpcmVkIGJlY2F1c2Ugc29tZSBjb21waWxlcnMgY2FuJ3QgZG8gKnB0cisrID0gKnB0cisrIGNvcnJlY3RseS4gKi8KICAgICAgICAgICB0bXAgPSAqcHRyKys7ICpwdHIrKyA9IHRtcDsKICAgICAgICAgICB0bXAgPSAqcHRyKys7ICpwdHIrKyA9IHRtcDsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgRkRLbWVtY3B5KCB0aW1lRGF0YSsyKmNvZGVjRnJhbWVTaXplLCB0aW1lRGF0YSwgMipjb2RlY0ZyYW1lU2l6ZSpzaXplb2YoSU5UX1BDTSkgKTsKKyAgICAgICAgRkRLbWVtY3B5KCB0aW1lRGF0YStjb3B5RnJhbWVTaXplLCB0aW1lRGF0YSwgY29weUZyYW1lU2l6ZSpzaXplb2YoSU5UX1BDTSkgKTsKICAgICAgIH0KICAgICB9CiAgICAgKm51bU91dENoYW5uZWxzID0gMjsgIC8qIE91dHB1dCBtaW5pbXVtIHR3byBjaGFubmVscyB3aGVuIFBTIGlzIGVuYWJsZWQuICovCkBAIC0xNDY0LDE0ICsxNTg4LDIzIEBACiAgICAgc2VsZi0+ZmxhZ3MgJj0gflNCUkRFQ19QU19ERUNPREVEOwogICB9CiAKKyAgaWYgKCBzZWxmLT5mbGFncyAmIFNCUkRFQ19GTFVTSCApIHsKKyAgICAvKiBmbHVzaGluZyBpcyBzaWduYWxpemVkLCBoZW5jZSBpbmNyZW1lbnQgdGhlIGZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KKyAgICBzZWxmLT5udW1GbHVzaGVkRnJhbWVzKys7CisgIH0KKyAgZWxzZSB7CisgICAgLyogbm8gZmx1c2hpbmcgaXMgc2lnbmFsaXplZCwgaGVuY2UgcmVzZXQgdGhlIGZsdXNoIGZyYW1lIGNvdW50ZXIgKi8KKyAgICBzZWxmLT5udW1GbHVzaGVkRnJhbWVzID0gMDsKKyAgfQorCiAgIC8qIExvb3Agb3ZlciBTQlIgZWxlbWVudHMgKi8KICAgZm9yIChzYnJFbGVtZW50TnVtID0gMDsgc2JyRWxlbWVudE51bTxzZWxmLT5udW1TYnJFbGVtZW50czsgc2JyRWxlbWVudE51bSsrKQogICB7CiAgICAgaW50IG51bUVsZW1lbnRDaGFuOwogCiAgICAgaWYgKHBzUG9zc2libGUgJiYgc2VsZi0+cFNickVsZW1lbnRbc2JyRWxlbWVudE51bV0tPnBTYnJDaGFubmVsWzFdID09IE5VTEwpIHsKLSAgICAgIGVycm9yU3RhdHVzID0gU0JSREVDX1VOU1VQUE9SVEVEX0NPTkZJRzsKLSAgICAgIGdvdG8gYmFpbDsKKyAgICAgIC8qIERpc2FibGUgUFMgYW5kIHRyeSBkZWNvZGluZyBTQlIgbW9uby4gKi8KKyAgICAgIHBzUG9zc2libGUgPSAwOwogICAgIH0KIAogICAgIG51bUVsZW1lbnRDaGFuID0gKHNlbGYtPnBTYnJFbGVtZW50W3NickVsZW1lbnROdW1dLT5lbGVtZW50SUQgPT0gSURfQ1BFKSA/IDIgOiAxOwpAQCAtMTU3OSw2ICsxNzEyLDcgQEAKICAgICB8IENBUEZfU0JSX0hRCiAgICAgfCBDQVBGX1NCUl9MUAogICAgIHwgQ0FQRl9TQlJfUFNfTVBFRworICAgIHwgQ0FQRl9TQlJfRFJNX0JTCiAgICAgfCBDQVBGX1NCUl9DT05DRUFMTUVOVAogICAgIHwgQ0FQRl9TQlJfRFJDCiAgICAgICA7CkBAIC0xNjA3LDYgKzE3NDEsOSBAQAogICAgICAgICAvKiBMb3cgZGVsYXkgU0JSOiAqLwogICAgICAgICB7CiAgICAgICAgICAgb3V0cHV0RGVsYXkgKz0gKGZsYWdzICYgU0JSREVDX0RPV05TQU1QTEUpID8gMzIgOiA2NDsgICAvKiBRTUYgc3ludGhlc2lzICovCisgICAgICAgICAgaWYgKGZsYWdzICYgU0JSREVDX0xEX01QU19RTUYpIHsKKyAgICAgICAgICAgIG91dHB1dERlbGF5ICs9IDMyOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgZWxzZSBpZiAoIUlTX1VTQUMoc2VsZi0+Y29yZUNvZGVjKSkgewpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL2luY2x1ZGUvc2JyX2VuY29kZXIuaCBiL2xpYlNCUmVuYy9pbmNsdWRlL3Nicl9lbmNvZGVyLmgKaW5kZXggOTNkYzQ2ZC4uYWVjMDM5OCAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL2luY2x1ZGUvc2JyX2VuY29kZXIuaAorKysgYi9saWJTQlJlbmMvaW5jbHVkZS9zYnJfZW5jb2Rlci5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xMzUsNiArMTM1LDEyIEBACiAgIFNCUl9TWU5UQVhfRFJNX0NSQyAgID0gMHgwMDA4CiB9OwogCit0eXBlZGVmIGVudW0KK3sKKyAgRlJFUV9SRVNfTE9XID0gMCwKKyAgRlJFUV9SRVNfSElHSAorfSBGUkVRX1JFUzsKKwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgQ09ERUNfVFlQRSAgICAgICBjb3JlQ29kZXI7ICAgICAgICAvKiE8IExDIG9yIEVMRCAqLwpAQCAtMTY4LDggKzE3NCw5IEBACiAgIElOVCBkeW5Cd1N1cHBvcnRlZDsgICAgICAgICAvKiE8IEZsYWc6IHN1cHBvcnQgZm9yIGR5bmFtaWMgYmFuZHdpZHRoIGluIHRoaXMgY29tYmluYXRpb24uICovCiAgIElOVCBwYXJhbWV0cmljQ29kaW5nOyAgICAgICAvKiE8IEZsYWc6IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIHRvb2wuICovCiAgIElOVCBkb3duU2FtcGxlRmFjdG9yOyAgICAgICAvKiE8IFNhbXBsaW5nIHJhdGUgcmVsYXRpb24gYmV0d2VlbiB0aGUgU0JSIGFuZCB0aGUgY29yZSBlbmNvZGVyLiAqLwotICBpbnQgZnJlcV9yZXNfZml4Zml4WzNdOyAgICAgLyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZXMgaW4gZnJhbWUgY2xhc3MgRklYRklYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPTEgRW52OyAxPTIgRW52OyAyPTQgRW52OyAqLworICBGUkVRX1JFUyBmcmVxX3Jlc19maXhmaXhbMl07LyohPCBGcmVxdWVuY3kgcmVzb2x1dGlvbiBvZiBlbnZlbG9wZXMgaW4gZnJhbWUgY2xhc3MgRklYRklYLCBmb3Igbm9uLXNwbGl0IGNhc2UgYW5kIHNwbGl0IGNhc2UgKi8KKyAgVUNIQVIgZlJlc1RyYW5zSXNMb3c7ICAgICAgIC8qITwgRnJlcXVlbmN5IHJlc29sdXRpb24gb2YgZW52ZWxvcGVzIGluIHRyYW5zaWVudCBmcmFtZXM6IGxvdyAoMCkgb3IgdmFyaWFibGUgKDEpICovCisKICAgLyoKICAgICAgY29yZSBjb2RlciBkZXBlbmRlbnQgdHVuaW5nIHBhcmFtZXRlcnMKICAgKi8KQEAgLTIyMSw2ICsyMjgsOCBAQAogICBJTlQgc2JyX2ludGVycG9sX2ZyZXE7ICAgICAgLyohPCBGbGFnOiB1c2UgaW50ZXJwb2xhdGlvbiBpbiBmcmVxLiBkaXJlY3Rpb24uICovCiAgIElOVCBzYnJfc21vb3RoaW5nX2xlbmd0aDsgICAvKiE8IEZsYWc6IGNob29zZSBsZW5ndGggNCBvciAwICg9b24sIG9mZikuICovCiAgIFVDSEFSIGluaXRfYW1wX3Jlc19GRjsKKyAgRklYUF9EQkwgdGhyZXNob2xkX0FtcFJlc19GRl9tOworICBTQ0hBUiB0aHJlc2hvbGRfQW1wUmVzX0ZGX2U7CiB9IHNickNvbmZpZ3VyYXRpb24sICpzYnJDb25maWd1cmF0aW9uUHRyIDsKIAogdHlwZWRlZiBzdHJ1Y3QgU0JSX0NPTkZJR19EQVRBCkBAIC0yMzcsNyArMjQ2LDcgQEAKICAgSU5UIG5vUW1mQmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBRTUYgZnJlcXVlbmN5IGJhbmRzLiAqLwogICBJTlQgbm9RbWZTbG90czsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIFFNRiBzbG90cy4gKi8KIAotICBVQ0hBUiAqZnJlcUJhbmRUYWJsZVsyXTsgICAgICAgICAgICAgIC8qKjwgRnJlcXVlbmN5IHRhYmxlIGZvciBsb3cgYW5kIGhpcmVzLCBvbmx5IE1BWF9GUkVRX0NPRUZGUy8yICsxIGNvZWVmcyBhY3R1YWxseSBuZWVkZWQgZm9yIGxvd3Jlcy4gKi8KKyAgVUNIQVIgKmZyZXFCYW5kVGFibGVbMl07ICAgICAgICAgICAgICAvKio8IEZyZXF1ZW5jeSB0YWJsZSBmb3IgbG93IGFuZCBoaXJlcywgb25seSBNQVhfRlJFUV9DT0VGRlMvMiArMSBjb2VmZnMgYWN0dWFsbHkgbmVlZGVkIGZvciBsb3dyZXMuICovCiAgIFVDSEFSICp2X2tfbWFzdGVyOyAgICAgICAgICAgICAgICAgICAgLyoqPCBNYXN0ZXIgQmFuZFRhYmxlIHdoZXJlIGZyZXFCYW5kVGFibGUgaXMgZGVyaXZlZCBmcm9tLiAqLwogCiAKQEAgLTI0OSw2ICsyNTgsOCBAQAogICBJTlQgeHBvc0N0cmxTd2l0Y2g7ICAgICAgICAgICAgICAgICAgIC8qKjwgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciB0byBzd2l0Y2ggeHBvcyBjdHJsIG9uIHRoZSBmbHkuICovCiAgIElOVCBzd2l0Y2hUcmFuc3Bvc2VyczsgICAgICAgICAgICAgICAgLyoqPCBGbGFnIGluZGljYXRlcyB3aGV0aGVyIHRvIHN3aXRjaCB4cG9zIG9uIHRoZSBmbHkgLiAgICAgKi8KICAgVUNIQVIgaW5pdEFtcFJlc0ZGOworICBGSVhQX0RCTCB0aHJlc2hvbGRBbXBSZXNGRl9tOworICBTQ0hBUiB0aHJlc2hvbGRBbXBSZXNGRl9lOwogfSBTQlJfQ09ORklHX0RBVEEsICpIQU5ETEVfU0JSX0NPTkZJR19EQVRBOwogCiB0eXBlZGVmIHN0cnVjdCB7CmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2JpdF9zYnIuaCBiL2xpYlNCUmVuYy9zcmMvYml0X3Nici5oCmluZGV4IDFjZTJjMWUuLmRlNGFjODkgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvYml0X3Nici5oCisrKyBiL2xpYlNCUmVuYy9zcmMvYml0X3Nici5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xNDEsOCArMTQxLDggQEAKIHsKIAogICBJTlQgc2JyX3hwb3NfY3RybDsKLSAgSU5UIGZyZXFfcmVzX2ZpeGZpeDsKLQorICBGUkVRX1JFUyBmcmVxX3Jlc19maXhmaXhbMl07CisgIFVDSEFSIGZSZXNUcmFuc0lzTG93OwogCiAgIElOVkZfTU9ERSBzYnJfaW52Zl9tb2RlOwogICBJTlZGX01PREUgc2JyX2ludmZfbW9kZV92ZWNbTUFYX05VTV9OT0lTRV9WQUxVRVNdOwpAQCAtMjA1LDYgKzIwNSw4IEBACiAgIElOVCBiYWxhbmNlOwogICBBTVBfUkVTIGluaXRfc2JyX2FtcF9yZXM7CiAgIEFNUF9SRVMgY3VycmVudEFtcFJlc0ZGOworICBGSVhQX0RCTCB0b25fSEZbU0JSX0dMT0JBTF9UT05BTElUWV9WQUxVRVNdOyAvKiB0b25hbGl0eSBpcyBzY2FsZWQgYnkgMl4xOS8wLjUyNDI4OGYgKGZyYWN0IHBhcnQgb2YgUkVMQVhBVElPTikgKi8KKyAgRklYUF9EQkwgZ2xvYmFsX3RvbmFsaXR5OwogCiAgIC8qIGV4dGVuZGVkIGRhdGEgKi8KICAgSU5UIGV4dGVuZGVkX2RhdGE7CmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL2Vudl9lc3QuY3BwIGIvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmNwcAppbmRleCA5MjlmMjI5Li40ZmNkYTUxIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2Vudl9lc3QuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvZW52X2VzdC5jcHAKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEwMyw2ICsxMDMsMTE0IEBACiBzdGF0aWMgY29uc3QgVUNIQVIgbWF4SW5kZXhbMl0gPSB7OSwgNX07CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEZ1bmN0aW9ubmFtZTogIEZES3NickVuY19HZXRUb25hbGl0eQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIQorCisgIFxicmllZiAgICAgIENhbGN1bGF0ZXMgY29tcGxldGUgZW5lcmd5IHBlciBiYW5kIGZyb20gdGhlIGVuZXJneSB2YWx1ZXMKKyAgICAgICAgICAgICAgb2YgdGhlIFFNRiBzdWJzYW1wbGVzLgorCisgIFxicmllZiAgICAgIHF1b3RhTWF0cml4IC0gY2FsY3VsYXRlZCBpbiBGREtzYnJFbmNfQ2FsY3VsYXRlVG9uYWxpdHlRdW90YXMoKQorICBcYnJpZWYgICAgICBub0VzdFBlckZyYW1lIC0gbnVtYmVyIG9mIGVzdGltYXRpb25zIHBlciBmcmFtZQorICBcYnJpZWYgICAgICBzdGFydEluZGV4IC0gc3RhcnQgaW5kZXggZm9yIHRoZSBxdW90YSBtYXRyaXgKKyAgXGJyaWVmICAgICAgRW5lcmdpZXMgLSBlbmVyZ3kgbWF0cml4CisgIFxicmllZiAgICAgIHN0YXJ0QmFuZCAtIHN0YXJ0IGJhbmQKKyAgXGJyaWVmICAgICAgc3RvcEJhbmQgLSBudW1iZXIgb2YgUU1GIGJhbmRzCisgIFxicmllZiAgICAgIG51bWJlckNvbHMgLSBudW1iZXIgb2YgUU1GIHN1YnNhbXBsZXMKKworICBccmV0dXJuICAgICBtZWFuIHRvbmFsaXR5IG9mIHRoZSA1IGJhbmRzIHdpdGggdGhlIGhpZ2hlc3QgZW5lcmd5CisgICAgICAgICAgICAgIHNjYWxlZCBieSAyXihSRUxBWEFUSU9OX1NISUZUKzIpKlJFTEFYQVRJT05fRlJBQ1QKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGSVhQX0RCTCBGREtzYnJFbmNfR2V0VG9uYWxpdHkoCisgICAgICAgIGNvbnN0IEZJWFBfREJMICpjb25zdCAqcXVvdGFNYXRyaXgsCisgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgbm9Fc3RQZXJGcmFtZSwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICBzdGFydEluZGV4LAorICAgICAgICBjb25zdCBGSVhQX0RCTCAqY29uc3QgKkVuZXJnaWVzLAorICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgIHN0YXJ0QmFuZCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICBzdG9wQmFuZCwKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICBudW1iZXJDb2xzCisgICAgICAgICkKK3sKKyAgVUNIQVIgYiwgZSwgazsKKyAgSU5UICAgICAgbm9fZW5NYXhCYW5kW1NCUl9NQVhfRU5FUkdZX1ZBTFVFU10gPSB7IC0xLCAtMSwgLTEsIC0xLCAtMSB9OworICBGSVhQX0RCTCBlbmVyZ3lNYXhbU0JSX01BWF9FTkVSR1lfVkFMVUVTXSA9IHsgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpIH07CisgIEZJWFBfREJMIGVuZXJneU1heE1pbiA9IE1BWFZBTF9EQkw7IC8qIG1pbi4gZW5lcmd5IGluIGVuZXJneU1heCBhcnJheSAqLworICBVQ0hBUiAgICBwb3NFbmVyZ3lNYXhNaW4gPSAwOyAgICAgICAvKiBtaW4uIGVuZXJneSBpbiBlbmVyZ3lNYXggYXJyYXkgcG9zaXRpb24gKi8KKyAgRklYUF9EQkwgdG9uYWxpdHlCYW5kW1NCUl9NQVhfRU5FUkdZX1ZBTFVFU10gPSB7IEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSwgRkwyRlhDT05TVF9EQkwoMC4wZiksIEZMMkZYQ09OU1RfREJMKDAuMGYpLCBGTDJGWENPTlNUX0RCTCgwLjBmKSB9OworICBGSVhQX0RCTCBnbG9iYWxUb25hbGl0eSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBGSVhQX0RCTCBlbmVyZ3lCYW5kW1FNRl9DSEFOTkVMU107CisgIElOVCAgICAgIG1heE5FbmVyZ3lWYWx1ZXM7IC8qIG1heC4gbnVtYmVyIG9mIG1heC4gZW5lcmd5IHZhbHVlcyAqLworCisgIC8qKiogU3VtIHVwIGVuZXJnaWVzIGZvciBlYWNoIGJhbmQgKioqLworICBGREtfQVNTRVJUKG51bWJlckNvbHM9PTE1fHxudW1iZXJDb2xzPT0xNik7CisgIC8qIG51bWJlckNvbHMgaXMgYWx3YXlzIDE1IG9yIDE2IGZvciBFTEQuIEluIGNhc2Ugb2YgMTYgYmFuZHMsIHRoZQorICAgICAgZW5lcmd5QmFuZHMgYXJlIGluaXRpYWxpemVkIHdpdGggdGhlIFsxNV10aCBjb2x1bW4uCisgICAgICBUaGUgcmVzdCBvZiB0aGUgY29sdW1uIGVuZXJnaWVzIGFyZSBhZGRlZCBpbiB0aGUgbmV4dCBzdGVwLiAgICovCisgIGlmIChudW1iZXJDb2xzPT0xNSkgeworICAgIGZvciAoYj1zdGFydEJhbmQ7IGI8c3RvcEJhbmQ7IGIrKykgeworICAgICAgZW5lcmd5QmFuZFtiXT1GTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChiPXN0YXJ0QmFuZDsgYjxzdG9wQmFuZDsgYisrKSB7CisgICAgICBlbmVyZ3lCYW5kW2JdPUVuZXJnaWVzWzE1XVtiXT4+NDsKKyAgICB9CisgIH0KKworICBmb3IgKGs9MDsgazwxNTsgaysrKSB7CisgICAgZm9yIChiPXN0YXJ0QmFuZDsgYjxzdG9wQmFuZDsgYisrKSB7CisgICAgICBlbmVyZ3lCYW5kW2JdICs9IEVuZXJnaWVzW2tdW2JdPj40OworICAgIH0KKyAgfQorCisgIC8qKiogRGV0ZXJtaW5lIDUgaGlnaGVzdCBiYW5kLWVuZXJnaWVzICoqKi8KKyAgbWF4TkVuZXJneVZhbHVlcyA9IGZNaW4oU0JSX01BWF9FTkVSR1lfVkFMVUVTLCBzdG9wQmFuZC1zdGFydEJhbmQpOworCisgIC8qIEdldCBtaW4uIHZhbHVlIGluIGVuZXJneU1heCBhcnJheSAqLworICBlbmVyZ3lNYXhNaW4gPSBlbmVyZ3lNYXhbMF0gPSBlbmVyZ3lCYW5kW3N0YXJ0QmFuZF07CisgIG5vX2VuTWF4QmFuZFswXSA9IHN0YXJ0QmFuZDsKKyAgcG9zRW5lcmd5TWF4TWluID0gMDsKKyAgZm9yIChrPTE7IGs8bWF4TkVuZXJneVZhbHVlczsgaysrKSB7CisgICAgZW5lcmd5TWF4W2tdID0gZW5lcmd5QmFuZFtzdGFydEJhbmQra107CisgICAgbm9fZW5NYXhCYW5kW2tdID0gc3RhcnRCYW5kK2s7CisgICAgaWYgKGVuZXJneU1heE1pbiA+IGVuZXJneU1heFtrXSkgeworICAgICAgZW5lcmd5TWF4TWluID0gZW5lcmd5TWF4W2tdOworICAgICAgcG9zRW5lcmd5TWF4TWluID0gazsKKyAgICB9CisgIH0KKworICBmb3IgKGI9c3RhcnRCYW5kK21heE5FbmVyZ3lWYWx1ZXM7IGI8c3RvcEJhbmQ7IGIrKykgeworICAgIGlmIChlbmVyZ3lCYW5kW2JdID4gZW5lcmd5TWF4TWluKSB7CisgICAgICBlbmVyZ3lNYXhbcG9zRW5lcmd5TWF4TWluXSA9IGVuZXJneUJhbmRbYl07CisgICAgICBub19lbk1heEJhbmRbcG9zRW5lcmd5TWF4TWluXSA9IGI7CisKKyAgICAgIC8qIEFnYWluLCBnZXQgbWluLiB2YWx1ZSBpbiBlbmVyZ3lNYXggYXJyYXkgKi8KKyAgICAgIGVuZXJneU1heE1pbiA9IGVuZXJneU1heFswXTsKKyAgICAgIHBvc0VuZXJneU1heE1pbiA9IDA7CisgICAgICBmb3IgKGs9MTsgazxtYXhORW5lcmd5VmFsdWVzOyBrKyspIHsKKyAgICAgICAgaWYgKGVuZXJneU1heE1pbiA+IGVuZXJneU1heFtrXSkgeworICAgICAgICAgIGVuZXJneU1heE1pbiA9IGVuZXJneU1heFtrXTsKKyAgICAgICAgICBwb3NFbmVyZ3lNYXhNaW4gPSBrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIC8qKiogRW5kIGRldGVybWluZSA1IGhpZ2hlc3QgYmFuZC1lbmVyZ2llcyAqKiovCisKKyAgLyogR2V0IHRvbmFsaXR5IHZhbHVlcyBmb3IgNSBoaWdoZXN0IGVuZXJnaWVzICovCisgIGZvciAoZT0wOyBlPG1heE5FbmVyZ3lWYWx1ZXM7IGUrKykgeworICAgIHRvbmFsaXR5QmFuZFtlXT1GTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgICBmb3IgKGs9MDsgazxub0VzdFBlckZyYW1lOyBrKyspIHsKKyAgICAgIHRvbmFsaXR5QmFuZFtlXSArPSBxdW90YU1hdHJpeFtzdGFydEluZGV4ICsga11bbm9fZW5NYXhCYW5kW2VdXSA+PiAxOworICAgIH0KKyAgICBnbG9iYWxUb25hbGl0eSArPSB0b25hbGl0eUJhbmRbZV0gPj4gMjsgLyogaGVhZHJvb20gb2YgMisxIChtYXguIDUgYWRkaXRpb25zKSAqLworICB9CisKKyAgcmV0dXJuIGdsb2JhbFRvbmFsaXR5OworfQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyohCiAKQEAgLTkxOSwxMCArMTAyNyw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnZDaGFuLT5xbWZTY2FsZSk7CiAKIAorICBpZihoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkgeworICAgIEZJWFBfREJMIHRvbmFsaXR5ID0gRkRLc2JyRW5jX0dldFRvbmFsaXR5ICgKKyAgICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5xdW90YU1hdHJpeCwKKyAgICAgICAgICBoRW52Q2hhbi0+VG9uQ29yci5udW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLAorICAgICAgICAgIGhFbnZDaGFuLT5Ub25Db3JyLnN0YXJ0SW5kZXhNYXRyaXgsCisgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciArIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICBoX2Nvbi0+ZnJlcUJhbmRUYWJsZVtISV1bMF0rMSwKKyAgICAgICAgICBoX2Nvbi0+bm9RbWZCYW5kcywKKyAgICAgICAgICBzYnJFeHRyRW52LT5ub19jb2xzCisgICAgICAgICk7CisKKyAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMV0gPSBoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMF07CisgICAgaEVudkNoYW4tPmVuY0VudkRhdGEudG9uX0hGWzBdID0gdG9uYWxpdHk7CisKKyAgICAvKiB0b25hbGl0eSBpcyBzY2FsZWQgYnkgMl4xOS8wLjUyNDI4OGYgKGZyYWN0IHBhcnQgb2YgUkVMQVhBVElPTikgKi8KKyAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5nbG9iYWxfdG9uYWxpdHkgPSAoaEVudkNoYW4tPmVuY0VudkRhdGEudG9uX0hGWzBdPj4xKSArIChoRW52Q2hhbi0+ZW5jRW52RGF0YS50b25fSEZbMV0+PjEpOworICB9CisKKwogCiAgIC8qCiAgICAgVHJhbnNpZW50IGRldGVjdGlvbiBDT0VGRiBUcmFuc2Zvcm0gT0sKICAgKi8KKyAgaWYoaF9jb24tPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpCisgIHsKKyAgICBGREtzYnJFbmNfZmFzdFRyYW5zaWVudERldGVjdCgKKyAgICAgICAgICAgICZoRW52Q2hhbi0+c2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAorICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXIsCisgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLAorICAgICAgICAgICAgIHNickV4dHJFbnYtPllCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICBlRGF0YS0+dHJhbnNpZW50X2luZm8KKyAgICAgICAgICAgICApOworCisgIH0KKyAgZWxzZQorICB7CiAgIEZES3NickVuY190cmFuc2llbnREZXRlY3QoJmhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+WUJ1ZmZlclNjYWxlLApAQCAtOTMxLDYgKzEwNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+dGltZV9zdGVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52Q2hhbi0+U2JyRW52RnJhbWUuZnJhbWVNaWRkbGVTbG90KTsKKyAgfQogCiAKIApAQCAtOTUxLDcgKzEwOTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJFeHRyRW52LT5ZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9jb24tPm5TZmJbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPnRpbWVfc3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyRXh0ckVudi0+bm9fY29scyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNickV4dHJFbnYtPm5vX2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eSk7CiAKIAogfQpAQCAtMTEyOCwxMiArMTI3MCwyNiBAQAogICAgICAgICAmJiAoIGVkLT5uRW52ZWxvcGVzID09IDEgKSApCiAgICB7CiAKLSAgICAgaWYgKGhFbnZDaGFuLT5lbmNFbnZEYXRhLmxkR3JpZCkKLSAgICAgICBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgPSAoQU1QX1JFUyloX2Nvbi0+aW5pdEFtcFJlc0ZGOwotICAgICBlbHNlCisgICAgIGlmIChoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKKyAgICAgeworICAgICAgIC8qIE5vdGU6IGdsb2JhbF90b25hbGl5X2Zsb2F0X3ZhbHVlID09ICgoZmxvYXQpaEVudkNoYW4tPmVuY0VudkRhdGEuZ2xvYmFsX3RvbmFsaXR5LygoSU5UNjQpKDEpPDwoMzEtKDE5KzIpKSkvMC41MjQyODgqKDIuMC8zLjApKSk7CisgICAgICAgICAgICAgICAgdGhyZXNob2xkX2Zsb2F0X3ZhbHVlID09ICgoZmxvYXQpaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX20vKChJTlQ2NCkoMSk8PCgzMS0oaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX2UpKSkvMC41MjQyODgqKDIuMC8zLjApKSk7ICovCisgICAgICAgLyogZGVjaXNpb24gb2YgU0JSX0FNUF9SRVMgKi8KKyAgICAgICBpZiAoZklzTGVzc1RoYW4oIC8qIGdsb2JhbF90b25hbGl0eSA+IHRocmVzaG9sZCA/ICovCisgICAgICAgICAgICAgaF9jb24tPnRocmVzaG9sZEFtcFJlc0ZGX20sIGhfY29uLT50aHJlc2hvbGRBbXBSZXNGRl9lLAorICAgICAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmdsb2JhbF90b25hbGl0eSwgUkVMQVhBVElPTl9TSElGVCsyICkKKyAgICAgICAgICApCisgICAgICAgeworICAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGID0gU0JSX0FNUF9SRVNfMV81OworICAgICAgIH0KKyAgICAgICBlbHNlIHsKKyAgICAgICAgIGhFbnZDaGFuLT5lbmNFbnZEYXRhLmN1cnJlbnRBbXBSZXNGRiA9IFNCUl9BTVBfUkVTXzNfMDsKKyAgICAgICB9CisgICAgIH0gZWxzZSB7CiAgICAgICAgaEVudkNoYW4tPmVuY0VudkRhdGEuY3VycmVudEFtcFJlc0ZGID0gU0JSX0FNUF9SRVNfMV81OworICAgICB9CiAKLSAgICAgaWYgKCBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgIT0gaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcykgeworICAgICAgaWYgKCBoRW52Q2hhbi0+ZW5jRW52RGF0YS5jdXJyZW50QW1wUmVzRkYgIT0gaEVudkNoYW4tPmVuY0VudkRhdGEuaW5pdF9zYnJfYW1wX3JlcykgewogCiAgICAgICAgIEZES3NickVuY19Jbml0U2JySHVmZm1hblRhYmxlcygmaEVudkNoYW4tPmVuY0VudkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaEVudkNoYW4tPnNickNvZGVFbnZlbG9wZSwKQEAgLTExNzIsNyArMTMyOCwxMiBAQAogICAgIH0KIAogICAgIC8qIExvdyBlbmVyZ3kgaW4gbG93IGJhbmQgZml4ICovCi0gICAgaWYgKCBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkxvd0JhbmRFbmVyZ3kgPCBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkhpZ2hCYW5kRW5lcmd5ICYmIGhFbnZDaGFuLT5zYnJUcmFuc2llbnREZXRlY3Rvci5wcmV2SGlnaEJhbmRFbmVyZ3kgPiBGTDJGWF9EQkwoMC4wMykpCisgICAgaWYgKCBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkxvd0JhbmRFbmVyZ3kgPCBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkhpZ2hCYW5kRW5lcmd5CisgICAgICAmJiBoRW52Q2hhbi0+c2JyVHJhbnNpZW50RGV0ZWN0b3IucHJldkhpZ2hCYW5kRW5lcmd5ID4gRkwyRlhfREJMKDAuMDMpCisgICAgICAvKiBUaGUgZml4IG5lZWRzIHRoZSBub24tZmFzdCB0cmFuc2llbnQgZGV0ZWN0b3IgcnVubmluZy4KKyAgICAgICAgIEl0IHNldHMgcHJldkxvd0JhbmRFbmVyZ3kgYW5kIHByZXZIaWdoQmFuZEVuZXJneS4gICAgICAqLworICAgICAgJiYgIShoX2Nvbi0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKKyAgICAgICkKICAgICB7CiAgICAgICBpbnQgaTsKIApkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9lbnZfZXN0LmggYi9saWJTQlJlbmMvc3JjL2Vudl9lc3QuaAppbmRleCA1ZTYzMmE0Li5lMTdhOTc0IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2Vudl9lc3QuaAorKysgYi9saWJTQlJlbmMvc3JjL2Vudl9lc3QuaApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMTI3LDYgKzEyNyw3IEBACiAKIHN0cnVjdCBFTlZfQ0hBTk5FTAogeworICBGQVNUX1RSQU5fREVURUNUT1Igc2JyRmFzdFRyYW5zaWVudERldGVjdG9yOwogICBTQlJfVFJBTlNJRU5UX0RFVEVDVE9SIHNiclRyYW5zaWVudERldGVjdG9yOwogICBTQlJfQ09ERV9FTlZFTE9QRSBzYnJDb2RlRW52ZWxvcGU7CiAgIFNCUl9DT0RFX0VOVkVMT1BFIHNickNvZGVOb2lzZUZsb29yOwpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5jcHAgYi9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcAppbmRleCA4NmMzYzgxLi45YTM1MTExIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtMjY2LDcgKzI2Niw3IEBACiAKIHN0YXRpYyB2b2lkIGN0cmxTaWduYWwyRnJhbWVJbmZvIChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPIGhGcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyZXFfcmVzX2ZpeGZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFUV9SRVMgKmZyZXFfcmVzX2ZpeGZpeCk7CiAKIAogLyogdGFibGUgZm9yIDggdGltZSBzbG90IGluZGV4ICovCkBAIC0zNDEsOCArMzQxLDkgQEAKIHN0YXRpYyB2b2lkIGdlbmVyYXRlRml4Rml4T25seSAoIEhBTkRMRV9TQlJfRlJBTUVfSU5GTyBoU2JyRnJhbWVJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9HUklEIGhTYnJHcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5Qb3NJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJUaW1lU2xvdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGZSZXNUcmFuc0lzTG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogCiAKIC8qIQpAQCAtNDAyLDExICs0MDMsMTAgQEAKICAgY29uc3QgaW50ICp2X3R1bmluZ0ZyZXEgPSB2X3R1bmluZyArIDM7CiAKICAgaFNickVudkZyYW1lLT52X3R1bmluZ1NlZ20gPSB2X3R1bmluZ1NlZ207Ci0gIElOVCBmcmVxX3Jlc19maXhmaXggPSBoU2JyRW52RnJhbWUtPmZyZXFfcmVzX2ZpeGZpeDsKIAogICBpZiAobGRHcmlkKSB7CiAgICAgLyogaW4gY2FzZSB0aGVyZSB3YXMgYSB0cmFuc2llbnQgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBwcmV2aW91cyBmcmFtZSwgc3RhcnQgd2l0aCBhIHRyYW5zaWVudCBlbnZlbG9wZSAqLwotICAgIGlmKHZfdHJhbnNpZW50X2luZm9fcHJlWzFdICYmIChudW1iZXJUaW1lU2xvdHMgLSB2X3RyYW5zaWVudF9pbmZvX3ByZVswXSA8IG1pbkZyYW1lVHJhbkRpc3RhbmNlKSl7CisgICAgaWYgKCAhdHJhbkZsYWcgJiYgdl90cmFuc2llbnRfaW5mb19wcmVbMV0gJiYgKG51bWJlclRpbWVTbG90cyAtIHZfdHJhbnNpZW50X2luZm9fcHJlWzBdIDwgbWluRnJhbWVUcmFuRGlzdGFuY2UpICl7CiAgICAgICB0cmFuRmxhZyA9IDE7CiAgICAgICB0cmFuUG9zICA9IDA7CiAgICAgfQpAQCAtNTI5LDcgKzUyOSw4IEBACiAgICAgICBnZW5lcmF0ZUZpeEZpeE9ubHkgKCAmKGhTYnJFbnZGcmFtZS0+U2JyRnJhbWVJbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoaFNickVudkZyYW1lLT5TYnJHcmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5Qb3NJbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlclRpbWVTbG90cworICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyVGltZVNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaFNickVudkZyYW1lLT5mUmVzVHJhbnNJc0xvdwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgICAgcmV0dXJuICYoaFNickVudkZyYW1lLT5TYnJGcmFtZUluZm8pOwpAQCAtNjc3LDcgKzY3OCw3IEBACiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGN0cmxTaWduYWwyRnJhbWVJbmZvICgmaFNickVudkZyYW1lLT5TYnJHcmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgJmhTYnJFbnZGcmFtZS0+U2JyRnJhbWVJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgZnJlcV9yZXNfZml4Zml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBoU2JyRW52RnJhbWUtPmZyZXFfcmVzX2ZpeGZpeCk7CiAKICAgcmV0dXJuICZoU2JyRW52RnJhbWUtPlNickZyYW1lSW5mbzsKIH0KQEAgLTY5Miw3ICs2OTMsOCBAQAogc3RhdGljIHZvaWQgZ2VuZXJhdGVGaXhGaXhPbmx5ICggSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhblBvc0ludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlclRpbWVTbG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSIGZSZXNUcmFuc0lzTG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICBpbnQgbkVudiwgaSwgaz0wLCB0cmFuSWR4OwpAQCAtNzI3LDggKzcyOSwxMiBAQAogICAvKiBhZGp1c3Qgc2VnbWVudC1mcmVxdWVuY3ktcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNlZ21lbnQtbGVuZ3RoICovCiAgIGZvciAoaT0wOyBpPG5FbnY7IGkrKyl7CiAgICAgayA9IGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaSsxXSAtIGhTYnJGcmFtZUluZm8tPmJvcmRlcnNbaV07Ci0gICAgaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXSA9IGZyZXFSZXNUYWJsZVtrXTsKLSAgICBoU2JyR3JpZC0+dl9mW2ldID0gZnJlcVJlc1RhYmxlW2tdOworICAgIGlmICghZlJlc1RyYW5zSXNMb3cpCisgICAgICBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzW2ldID0gZnJlcVJlc1RhYmxlW2tdOworICAgIGVsc2UKKyAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSBGUkVRX1JFU19MT1c7CisKKyAgICBoU2JyR3JpZC0+dl9mW2ldID0gaFNickZyYW1lSW5mby0+ZnJlcVJlc1tpXTsKICAgfQogCiAgIGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXMgPSBuRW52OwpAQCAtNzY1LDE1ICs3NzEsMTYgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQKLUZES3NickVuY19pbml0RnJhbWVJbmZvR2VuZXJhdG9yIChIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FICBoU2JyRW52RnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBhbGxvd1NwcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG51bUVudlN0YXRpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXRpY0ZyYW1pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCB0aW1lU2xvdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBmcmVxX3Jlc19maXhmaXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLGludCBsZEdyaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKQotCitGREtzYnJFbmNfaW5pdEZyYW1lSW5mb0dlbmVyYXRvciAoCisgICAgICAgICAgICAgIEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgaFNickVudkZyYW1lLAorICAgICAgICAgICAgICBJTlQgICAgICAgYWxsb3dTcHJlYWQsCisgICAgICAgICAgICAgIElOVCAgICAgICBudW1FbnZTdGF0aWMsCisgICAgICAgICAgICAgIElOVCAgICAgICBzdGF0aWNGcmFtaW5nLAorICAgICAgICAgICAgICBJTlQgICAgICAgdGltZVNsb3RzLAorICAgICAgICBjb25zdCBGUkVRX1JFUyogZnJlcV9yZXNfZml4Zml4CisgICAgICAgICAgICAgLFVDSEFSICAgICBmUmVzVHJhbnNJc0xvdywKKyAgICAgICAgICAgICAgSU5UICAgICAgIGxkR3JpZAorICAgICAgICApCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZIIDAwLTA2LTI2ICovCiAKICAgRkRLbWVtY2xlYXIoaFNickVudkZyYW1lLHNpemVvZihTQlJfRU5WRUxPUEVfRlJBTUUgKSk7CkBAIC03ODYsNyArNzkzLDkgQEAKICAgaFNickVudkZyYW1lLT5hbGxvd1NwcmVhZCA9IGFsbG93U3ByZWFkOwogICBoU2JyRW52RnJhbWUtPm51bUVudlN0YXRpYyA9IG51bUVudlN0YXRpYzsKICAgaFNickVudkZyYW1lLT5zdGF0aWNGcmFtaW5nID0gc3RhdGljRnJhbWluZzsKLSAgaFNickVudkZyYW1lLT5mcmVxX3Jlc19maXhmaXggPSBmcmVxX3Jlc19maXhmaXg7CisgIGhTYnJFbnZGcmFtZS0+ZnJlcV9yZXNfZml4Zml4WzBdID0gZnJlcV9yZXNfZml4Zml4WzBdOworICBoU2JyRW52RnJhbWUtPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IGZyZXFfcmVzX2ZpeGZpeFsxXTsKKyAgaFNickVudkZyYW1lLT5mUmVzVHJhbnNJc0xvdyAgICAgPSBmUmVzVHJhbnNJc0xvdzsKIAogICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmQgPSAwOwogICBoU2JyRW52RnJhbWUtPmxlbmd0aF92X2JvcmRGb2xsb3cgPSAwOwpAQCAtODA0LDYgKzgxMyw3IEBACiAgICAgICBoU2JyRW52RnJhbWUtPmRtaW4gPSAyOwogICAgICAgaFNickVudkZyYW1lLT5kbWF4ID0gMTY7CiAgICAgICBoU2JyRW52RnJhbWUtPmZyYW1lTWlkZGxlU2xvdCA9IEZSQU1FX01JRERMRV9TTE9UXzUxMkxEOworICAgICAgaFNickVudkZyYW1lLT5TYnJHcmlkLmJ1ZmZlckZyYW1lU3RhcnQgPSAwOwogICB9IGVsc2UKICAgc3dpdGNoKHRpbWVTbG90cyl7CiAgICAgY2FzZSBOVU1CRVJfVElNRV9TTE9UU18xOTIwOgpAQCAtMTg2MiwxOSArMTg3MiwyOCBAQAogIEZ1bmN0aW9ubmFtZTogIGN0cmxTaWduYWwyRnJhbWVJbmZvCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCi0gRGVzY3JpcHRpb246IENhbGN1bGF0ZXMgZnJhbWVfaW5mbyBzdHJ1Y3QgZnJvbSBjb250cm9sIHNpZ25hbC4KKyBEZXNjcmlwdGlvbjogQ29udmVydCAiY2xlYXItdGV4dCIgc2JyX2dyaWQoKSB0byAiZnJhbWUgaW5mbyIgdXNlZCBieSB0aGUKKyAgICAgICAgICAgICAgZW52ZWxvcGUgYW5kIG5vaXNlIGZsb29yIGVzdGltYXRvcnMuCisgICAgICAgICAgICAgIFRoaXMgaXMgYmFzaWNhbGx5IChleGNlcHQgZm9yICJsb3cgbGV2ZWwiIGNhbGN1bGF0aW9ucykgdGhlCisgICAgICAgICAgICAgIGJpdHN0cmVhbSBkZWNvZGVyIGRlZmluZWQgaW4gdGhlIE1QRUctNCBzdGFuZGFyZCwgc3ViIGNsYXVzZQorICAgICAgICAgICAgICA0LjYuMTguMy4zLCBUaW1lIC8gRnJlcXVlbmN5IEdyaWQuICBTZWUgaW5saW5lIGNvbW1lbnRzIGZvcgorICAgICAgICAgICAgICBleHBsYW5hdGlvbiBvZiB0aGUgc2hvcnRlbiBhbmQgbm9pc2UgYm9yZGVyIGFsZ29yaXRobXMuCiAKICBBcmd1bWVudHM6ICAgaFNickdyaWQgLSBzb3VyY2UKICAgICAgICAgICAgICAgaFNickZyYW1lSW5mbyAtIGRlc3RpbmF0aW9uCisgICAgICAgICAgICAgIGZyZXFfcmVzX2ZpeGZpeCAtIGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBGSVhGSVggZnJhbWVzCiAKICBSZXR1cm46ICAgICAgdm9pZDsgaFNickZyYW1lSW5mbyBjb250YWlucyB0aGUgdXBkYXRlZCBGUkFNRV9JTkZPIHN0cnVjdAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQKLWN0cmxTaWduYWwyRnJhbWVJbmZvIChIQU5ETEVfU0JSX0dSSUQgaFNickdyaWQsCi0gICAgICAgICAgICAgICAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPIGhTYnJGcmFtZUluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgSU5UIGZyZXFfcmVzX2ZpeGZpeCkKK2N0cmxTaWduYWwyRnJhbWVJbmZvICgKKyAgICAgICAgSEFORExFX1NCUl9HUklEICAgICAgICBoU2JyR3JpZCwgICAgICAgLyogaW5wdXQgOiB0aGUgZ3JpZCBoYW5kbGUgICAgICAgKi8KKyAgICAgICAgSEFORExFX1NCUl9GUkFNRV9JTkZPICBoU2JyRnJhbWVJbmZvLCAgLyogb3V0cHV0OiB0aGUgZnJhbWUgaW5mbyBoYW5kbGUgKi8KKyAgICAgICAgRlJFUV9SRVMgICAgICAgICAgICAgICpmcmVxX3Jlc19maXhmaXggLyogaW4vb3V0OiBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3IgRklYRklYIGZyYW1lcyAqLworICAgICAgICApCiB7CisgIElOVCBmcmFtZVNwbGl0ID0gMDsKICAgSU5UIG5FbnYgPSAwLCBib3JkZXIgPSAwLCBpLCBrLCBwIC8qPyovOwogICBJTlQgKnZfciA9IGhTYnJHcmlkLT5ic19yZWxfYm9yZDsKICAgSU5UICp2X2YgPSBoU2JyR3JpZC0+dl9mOwpAQCAtMTg4NywxNyArMTkwNiwxMCBAQAogICBjYXNlIEZJWEZJWDoKICAgICBjcmVhdGVEZWZGcmFtZUluZm8oaFNickZyYW1lSW5mbywgaFNickdyaWQtPmJzX251bV9lbnYsIG51bWJlclRpbWVTbG90cyk7CiAKLSAgICAvKiBBdCB0aGlzIHBvaW50IGFsbCBmcmVxdWVuY3kgcmVzb2x1dGlvbnMgYXJlIHNldCB0byBGUkVRX1JFU19ISUdILCBzbwotICAgICAqIG9ubHkgaWYgZnJlcV9yZXNfZml4Zml4IGlzIHNldCB0byBGUkVRX1JFU19MT1csIHRoZXkgYWxsIGhhdmUgdG8gYmUKLSAgICAgKiBjaGFuZ2VkLgotICAgICAqIHNuZCAqLwotICAgIGlmIChmcmVxX3Jlc19maXhmaXggPT0gRlJFUV9SRVNfTE9XKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaFNickZyYW1lSW5mby0+bkVudmVsb3BlczsgaSsrKSB7Ci0gICAgICAgIGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSBGUkVRX1JFU19MT1c7Ci0gICAgICB9CisgICAgZnJhbWVTcGxpdCA9IChoU2JyRnJhbWVJbmZvLT5uRW52ZWxvcGVzID4gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IGhTYnJGcmFtZUluZm8tPm5FbnZlbG9wZXM7IGkrKykgeworICAgICAgaFNickdyaWQtPnZfZltpXSA9IGhTYnJGcmFtZUluZm8tPmZyZXFSZXNbaV0gPSBmcmVxX3Jlc19maXhmaXhbZnJhbWVTcGxpdF07CiAgICAgfQotICAgIC8qIEVMRDogc3RvcmUgY3VycmVudCBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLwotICAgIGhTYnJHcmlkLT52X2ZbMF0gPSBoU2JyRnJhbWVJbmZvLT5mcmVxUmVzWzBdOwogICAgIGJyZWFrOwogCiAgIGNhc2UgRklYVkFSOgpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5oIGIvbGliU0JSZW5jL3NyYy9mcmFtX2dlbi5oCmluZGV4IDM3NjkyNjYuLjAwNDczZDQgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvZnJhbV9nZW4uaAorKysgYi9saWJTQlJlbmMvc3JjL2ZyYW1fZ2VuLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTg5LDYgKzg5LDcgQEAKICNkZWZpbmUgX0ZSQU1fR0VOX0gKIAogI2luY2x1ZGUgInNicl9kZWYuaCIgLyogZm9yIE1BWF9FTlZFTE9QRVMgYW5kIE1BWF9OT0lTRV9FTlZFTE9QRVMgaW4gc3RydWN0IEZSQU1FX0lORk8gYW5kIENPREVDX1RZUEUgKi8KKyNpbmNsdWRlICJzYnJfZW5jb2Rlci5oIiAvKiBmb3IgRlJFUV9SRVMgKi8KIAogI2RlZmluZSBNQVhfRU5WRUxPUEVTX1ZBUlZBUiBNQVhfRU5WRUxPUEVTIC8qITwgd29yc3QgY2FzZSBudW1iZXIgb2YgZW52ZWxvcGVzIGluIGEgVkFSVkFSIGZyYW1lICovCiAjZGVmaW5lIE1BWF9FTlZFTE9QRVNfRklYVkFSX1ZBUkZJWCA0IC8qITwgd29yc3QgY2FzZSBudW1iZXIgb2YgZW52ZWxvcGVzIGluIFZBUkZJWCBhbmQgRklYVkFSIGZyYW1lcyAqLwpAQCAtMTE0LDcgKzExNSw3IEBACiAjZGVmaW5lIE5VTUJFUl9USU1FX1NMT1RTXzE5MjAgIDE1CiAKICNkZWZpbmUgTERfUFJFVFJBTl9PRkYgICAgICAgICAgIDMKLSNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQgIDAKKyNkZWZpbmUgRlJBTUVfTUlERExFX1NMT1RfNTEyTEQgIDQKICNkZWZpbmUgTlVNQkVSX1RJTUVfU0xPVFNfNTEyTEQgIDgKICNkZWZpbmUgVFJBTlNJRU5UX09GRlNFVF9MRCAgICAgIDAKIApAQCAtMjQ4LDkgKzI0OSwxMCBAQAogICBJTlQgZnJhbWVNaWRkbGVTbG90OyAgICAgIC8qITwgdHJhbnNpZW50IGRldGVjdG9yIG9mZnNldCBpbiBTQlIgdGltZXNsb3RzICovCiAKICAgLyogYmFzaWMgdHVuaW5nIHBhcmFtZXRlcnMgKi8KLSAgSU5UIHN0YXRpY0ZyYW1pbmc7ICAgICAgICAvKiE8IDE6IHJ1biBzdGF0aWMgZnJhbWluZyBpbiB0aW1lLCBpLmUuIGV4Y2x1c2l2ZSB1c2Ugb2YgYnNfZnJhbWVfY2xhc3MgPSBGSVhGSVggKi8KLSAgSU5UIG51bUVudlN0YXRpYzsgICAgICAgICAvKiE8IG51bWJlciBvZiBlbnZlbG9wZXMgcGVyIGZyYW1lIGZvciBzdGF0aWMgZnJhbWluZyAqLwotICBJTlQgZnJlcV9yZXNfZml4Zml4OyAgICAgIC8qITwgZW52ZWxvcGUgZnJlcXVlbmN5IHJlc29sdXRpb24gdG8gdXNlIGZvciBic19mcmFtZV9jbGFzcyA9IEZJWEZJWCAqLworICBJTlQgc3RhdGljRnJhbWluZzsgICAgICAgICAgIC8qITwgMTogcnVuIHN0YXRpYyBmcmFtaW5nIGluIHRpbWUsIGkuZS4gZXhjbHVzaXZlIHVzZSBvZiBic19mcmFtZV9jbGFzcyA9IEZJWEZJWCAqLworICBJTlQgbnVtRW52U3RhdGljOyAgICAgICAgICAgIC8qITwgbnVtYmVyIG9mIGVudmVsb3BlcyBwZXIgZnJhbWUgZm9yIHN0YXRpYyBmcmFtaW5nICovCisgIEZSRVFfUkVTIGZyZXFfcmVzX2ZpeGZpeFsyXTsgLyohPCBlbnZlbG9wZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiB0byB1c2UgZm9yIGJzX2ZyYW1lX2NsYXNzID0gRklYRklYOyBzaW5nbGUgZW52IGFuZCBzcGxpdCAqLworICBVQ0hBUiBmUmVzVHJhbnNJc0xvdzsgICAgICAgIC8qITwgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIHRyYW5zaWVudCBmcmFtZXMgLSBhbHdheXMgbG93ICgwKSBvciBhY2NvcmRpbmcgdG8gdGFibGUgKDEpICovCiAKICAgLyogZXhwZXJ0IHR1bmluZyBwYXJhbWV0ZXJzICovCiAgIGNvbnN0IGludCAqdl90dW5pbmdTZWdtOyAgLyohPCBzZWdtZW50IGxlbmd0aHMgdG8gdXNlIGFyb3VuZCB0cmFuc2llbnQgKi8KQEAgLTI4NiwxNCArMjg4LDE2IEBACiAKIAogdm9pZAotRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKEhBTkRMRV9TQlJfRU5WRUxPUEVfRlJBTUUgIGhTYnJFbnZGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGFsbG93U3ByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbnVtRW52U3RhdGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RhdGljRnJhbWluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHRpbWVTbG90cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGZyZXFfcmVzX2ZpeGZpeAotICAgICAgICAgICAgICAgICAgICAgICAgICAsaW50IGxkR3JpZAotICAgICAgICAgICAgICAgICAgICAgICAgICApOworRkRLc2JyRW5jX2luaXRGcmFtZUluZm9HZW5lcmF0b3IgKAorICAgICAgICAgICAgICBIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKKyAgICAgICAgICAgICAgSU5UICAgICAgIGFsbG93U3ByZWFkLAorICAgICAgICAgICAgICBJTlQgICAgICAgbnVtRW52U3RhdGljLAorICAgICAgICAgICAgICBJTlQgICAgICAgc3RhdGljRnJhbWluZywKKyAgICAgICAgICAgICAgSU5UICAgICAgIHRpbWVTbG90cywKKyAgICAgICAgY29uc3QgRlJFUV9SRVMqIGZyZXFfcmVzX2ZpeGZpeAorICAgICAgICAgICAgICxVQ0hBUiAgICAgZlJlc1RyYW5zSXNMb3csCisgICAgICAgICAgICAgIElOVCAgICAgICBsZEdyaWQKKyAgICAgICAgKTsKIAogSEFORExFX1NCUl9GUkFNRV9JTkZPCiBGREtzYnJFbmNfZnJhbWVJbmZvR2VuZXJhdG9yIChIQU5ETEVfU0JSX0VOVkVMT1BFX0ZSQU1FIGhTYnJFbnZGcmFtZSwKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmNwcCBiL2xpYlNCUmVuYy9zcmMvbWhfZGV0LmNwcAppbmRleCA3M2QxYjhiLi5iYzgwYTE1IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL21oX2RldC5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9taF9kZXQuY3BwCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC02NjMsMTAgKzY2MywyNyBAQAogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIQotICBcYnJpZWYgICAgIERvIGRldGVjdGlvbiBmb3Igb25lIHRvbmFsaXR5IGVzdGltYXRlLgorICBcYnJpZWYgICAgIERldGVjdGlvbiBmb3Igb25lIHRvbmFsaXR5IGVzdGltYXRlLgogCisgIFRoaXMgaXMgdGhlIGFjdHVhbCBtaXNzaW5nIGhhcm1vbmljcyBkZXRlY3Rpb24sIHVzaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlCisgIHByZXZpb3VzIGRldGVjdGlvbi4KKworICBJZiBhIG1pc3NpbmcgaGFybW9uaWMgd2FzIGRldGVjdGVkIChpbiBhIHByZXZpb3VzIGZyYW1lKSBkdWUgdG8gdG9vIGhpZ2gKKyAgdG9uYWxpdHkgZGlmZmVyZW5jZXMsIGJ1dCB0aGVyZSB3YXMgbm90IGVub3VnaCB0b25hbGl0eSBkaWZmZXJlbmNlIGluIHRoZQorICBjdXJyZW50IGZyYW1lLCB0aGUgZGV0ZWN0aW9uIGFsZ29yaXRobSBzdGlsbCBjb250aW51ZXMgdG8gdHJhY2UgdGhlIHN0cm9uZ2VzdAorICB0b25lIGluIHRoZSBzY2FsZWZhY3RvciBiYW5kIChhc3N1bWluZyB0aGF0IHRoaXMgaXMgdGhlIHRvbmUgdGhhdCBpcyBnb2luZyB0bworICBiZSByZXBsYWNlZCBpbiB0aGUgZGVjb2RlcikuIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBhYnJ1cHQgZW5kaW5ncyBvZiBzaW5lcworICBmYWRpbmcgb3V0IChlLmcuIGluIHRoZSBnbG9ja2Vuc3BpZWwpLgorCisgIFRoZSBmdW5jdGlvbiBhbHNvIHRyaWVzIHRvIGVzdGltYXRlIHdoZXJlIG9uZSBzaW5lIGlzIGdvaW5nIHRvIGJlIHJlcGxhY2VkCisgIHdpdGggbXVsdGlwbGUgc2luZXMgKGR1ZSB0byB0aGUgcGF0Y2hpbmcpLiBUaGlzIGlzIGRvbmUgYnkgY29tcGFyaW5nIHRoZQorICB0b25hbGl0eSBmbGF0bmVzcyBtZWFzdXJlIG9mIHRoZSBvcmlnaW5hbCBhbmQgdGhlIFNCUiBzaWduYWwuCisKKyAgVGhlIGZ1bmN0aW9uIGFsc28gdHJpZXMgdG8gZXN0aW1hdGUgKGZvciB0aGUgc2NhbGVmYWN0b3IgYmFuZHMgb25seQorICBjb250YWluaW5nIG9uZSBxbWYgc3ViYmFuZCkgd2hlbiBhIHN0cm9uZyB0b25lIGluIHRoZSBvcmlnaW5hbCB3aWxsIGJlCisgIHJlcGxhY2VkIGJ5IGEgc3Ryb25nIHRvbmUgaW4gdGhlIGFkamFjZW50IFFNRiBzdWJiYW5kLgogCiAgIFxyZXR1cm4gICAgbm9uZS4KIApAQCAtNjk0LDEwICs3MTEsMTAgQEAKICAgZm9yKGk9MDtpPG5TZmI7aSsrKXsKIAogICAgIHRocmVzVGVtcCA9IChndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldICE9IEZMMkZYQ09OU1RfREJMKDAuMGYpKQotICAgICAgICAgICAgICAgICAgPyBmaXhNYXgoZk11bHQobWhUaHJlc2guZGVjYXlHdWlkZURpZmYsZ3VpZGVWZWN0b3JzLmd1aWRlVmVjdG9yRGlmZltpXSksIG1oVGhyZXNoLnRocmVzSG9sZERpZmZHdWlkZSkKKyAgICAgICAgICAgICAgICAgID8gZk1heChmTXVsdChtaFRocmVzaC5kZWNheUd1aWRlRGlmZixndWlkZVZlY3RvcnMuZ3VpZGVWZWN0b3JEaWZmW2ldKSwgbWhUaHJlc2gudGhyZXNIb2xkRGlmZkd1aWRlKQogICAgICAgICAgICAgICAgICAgOiBtaFRocmVzaC50aHJlc0hvbGREaWZmOwogCi0gICAgdGhyZXNUZW1wID0gZml4TWluKHRocmVzVGVtcCwgbWhUaHJlc2gudGhyZXNIb2xkRGlmZik7CisgICAgdGhyZXNUZW1wID0gZk1pbih0aHJlc1RlbXAsIG1oVGhyZXNoLnRocmVzSG9sZERpZmYpOwogCiAgICAgaWYocERpZmZWZWNTY2ZiW2ldID4gdGhyZXNUZW1wKXsKICAgICAgIHBIYXJtVmVjW2ldID0gMTsKQEAgLTgxMyw4ICs4MzAsMTEgQEAKIAogICBpZihuZXdEZXRlY3Rpb25BbGxvd2VkKXsKIAorICAgIC8qIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSB0cmFuc2llbnQgcmVnaW9uIGZvciBkZXRlY3Rpb24gKHNpbmNlIHRoZSB0b25hbGl0eSB2YWx1ZXMKKyAgICAgICB0ZW5kIHRvIGJlIGEgYml0IHVucmVsaWFibGUgZm9yIHRoaXMgcmVnaW9uKSB0aGUgZ3VpZGUtdmFsdWVzIGFyZSBjb3BpZWQgdG8gdGhlIGN1cnJlbnQKKyAgICAgICBzdGFydGluZyBwb2ludC4gKi8KICAgICBpZih0b3ROb0VzdCA+IDEpewotICAgICAgc3RhcnQgPSBkZXRlY3Rpb25TdGFydDsKKyAgICAgIHN0YXJ0ID0gZGV0ZWN0aW9uU3RhcnQrMTsKIAogICAgICAgaWYgKHN0YXJ0ICE9IDApIHsKICAgICAgICAgRkRLbWVtY3B5KGd1aWRlVmVjdG9yc1tzdGFydF0uZ3VpZGVWZWN0b3JEaWZmLGd1aWRlVmVjdG9yc1swXS5ndWlkZVZlY3RvckRpZmYsblNmYipzaXplb2YoRklYUF9EQkwpKTsKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmNwcCBiL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmNwcAppbmRleCAzODVhMDQzLi5hNGM1NTc0IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL25mX2VzdC5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy9uZl9lc3QuY3BwCkBAIC0yOTgsNyArMjk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0hBUiAgICAqaW5kZXhWZWN0b3IsICAgICAgICAgICAgICAvKiE8IEluZGV4IHZlY3RvciB0byBvYnRhaW4gdGhlIHBhdGNoZWQgZGF0YS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgbWlzc2luZ0hhcm1vbmljc0ZsYWcsICAgICAgICAgICAvKiE8IEZsYWcgaW5kaWNhdGluZyBpZiBhIHN0cm9uZyB0b25hbCBjb21wb25lbnQgd2lsbCBiZSBtaXNzaW5nLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBzdGFydEluZGV4LCAgICAgICAgICAgICAgICAgICAgIC8qITwgU3RhcnQgaW5kZXguICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsICAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHRvbmFsaXR5IGVzdGltYXRlcyBwZXIgZnJhbWUuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCBudW1iZXJPZkVzdGltYXRlc1BlckZyYW1lLCAgICAgLyohPCBUaGUgbnVtYmVyIG9mIHRvbmFsaXR5IGVzdGltYXRlcyBwZXIgZnJhbWUuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zaWVudEZyYW1lLCAgICAgICAgICAgICAgICAgLyohPCBBIGZsYWcgaW5kaWNhdGluZyBpZiBhIHRyYW5zaWVudCBpcyBwcmVzZW50LiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIElOVkZfTU9ERSogcEludkZpbHRMZXZlbHMsICAgICAgICAgIC8qITwgUG9pbnRlciB0byB0aGUgdmVjdG9yIGhvbGRpbmcgdGhlIGludmVyc2UgZmlsdGVyaW5nIGxldmVscy4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIHNiclN5bnRheEZsYWdzCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL25mX2VzdC5oIGIvbGliU0JSZW5jL3NyYy9uZl9lc3QuaAppbmRleCBkNDA3Mjc0Li5mMjZmNzRmIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL25mX2VzdC5oCisrKyBiL2xpYlNCUmVuYy9zcmMvbmZfZXN0LmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIFNDSEFSKiBpbmRleFZlY3RvciwgICAgICAgICAgICAgICAgIC8qITwgSW5kZXggdmVjdG9yIHRvIG9idGFpbiB0aGUgcGF0Y2hlZCBkYXRhLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBtaXNzaW5nSGFybW9uaWNzRmxhZywgICAgICAgICAgIC8qITwgRmxhZyBpbmRpY2F0aW5nIGlmIGEgc3Ryb25nIHRvbmFsIGNvbXBvbmVudCB3aWxsIGJlIG1pc3NpbmcuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgLyohPCBTdGFydCBpbmRleC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSwgICAgICAvKiE8IFRoZSBudW1iZXIgb2YgdG9uYWxpdHkgZXN0aW1hdGVzIHBlciBmcmFtZS4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UIG51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWUsICAgICAvKiE8IFRoZSBudW1iZXIgb2YgdG9uYWxpdHkgZXN0aW1hdGVzIHBlciBmcmFtZS4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgdHJhbnNpZW50RnJhbWUsICAgICAgICAgICAgICAgICAvKiE8IEEgZmxhZyBpbmRpY2F0aW5nIGlmIGEgdHJhbnNpZW50IGlzIHByZXNlbnQuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WRl9NT0RFKiBwSW52RmlsdExldmVscywgICAgICAgICAgLyohPCBQb2ludGVyIHRvIHRoZSB2ZWN0b3IgaG9sZGluZyB0aGUgaW52ZXJzZSBmaWx0ZXJpbmcgbGV2ZWxzLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgc2JyU3ludGF4RmxhZ3MKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvc2JyX2RlZi5oIGIvbGliU0JSZW5jL3NyYy9zYnJfZGVmLmgKaW5kZXggOGI3Y2ZjNi4uODVhYzU4NyAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy9zYnJfZGVmLmgKKysrIGIvbGliU0JSZW5jL3NyYy9zYnJfZGVmLmgKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTEyMiw2ICsxMjIsOCBAQAogLyoqKioqKioqKioqKiAgRGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqLwogI2RlZmluZSBTQlJfQ09NUF9NT0RFX0RFTFRBICAgICAgICAgICAgICAgICAgICAgMAogI2RlZmluZSBTQlJfQ09NUF9NT0RFX0NUUyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTQlJfTUFYX0VORVJHWV9WQUxVRVMgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBTQlJfR0xPQkFMX1RPTkFMSVRZX1ZBTFVFUyAgICAgICAgICAgICAgMgogCiAjZGVmaW5lIE1BWF9OVU1fQ0hBTk5FTFMgICAgICAgICAgICAgICAgICAgICAgICAyCiAKQEAgLTIzMiw2ICsyMzQsOCBAQAogI2RlZmluZSBGUkVRICAgICAgICAgICAgICAgICAgICAgIDAKICNkZWZpbmUgVElNRSAgICAgICAgICAgICAgICAgICAgICAxCiAKKy8qIHFtZiBkYXRhIHNjYWxpbmcgKi8KKyNkZWZpbmUgUU1GX1NDQUxFX09GRlNFVCAgICAgICAgICA3CiAKIC8qIGh1ZmZtYW4gdGFibGVzICovCiAjZGVmaW5lIENPREVfQk9PS19TQ0ZfTEFWMDAgICAgICAgICA2MApAQCAtMjY4LDEyICsyNzIsNCBAQAogfQogSU5WRl9NT0RFOwogCi10eXBlZGVmIGVudW0KLXsKLSAgRlJFUV9SRVNfTE9XID0gMCwKLSAgRlJFUV9SRVNfSElHSAotfQotRlJFUV9SRVM7Ci0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9lbmNvZGVyLmNwcCBiL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwCmluZGV4IDliYjk4YzguLjkwYjE5Y2YgMTAwNjQ0Ci0tLSBhL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyX2VuY29kZXIuY3BwCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDAgMwogI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDEgMwotI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDIgOAorI2RlZmluZSBTQlJFTkNPREVSX0xJQl9WTDIgMTIKIAogCiAKQEAgLTQxMiw2ICs0MTIsMjMgQEAKICAgY29uZmlnLT5jb2RlY1NldHRpbmdzLnRyYW5zRmFjICAgICAgICA9IHRyYW5zRmFjOwogICBjb25maWctPmNvZGVjU2V0dGluZ3Muc3RhbmRhcmRCaXRyYXRlID0gc3RhbmRhcmRCaXRyYXRlOwogCisgIGlmIChiaXRSYXRlIDwgMjgwMDApIHsKKyAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfbSA9IChGSVhQX0RCTClNQVhWQUxfREJMOworICAgIGNvbmZpZy0+dGhyZXNob2xkX0FtcFJlc19GRl9lID0gNzsKKyAgfQorICBlbHNlIGlmIChiaXRSYXRlID49IDI4MDAwICYmIGJpdFJhdGUgPD0gNDgwMDApIHsKKyAgICAvKiBUaGUgZmxvYXQgdGhyZXNob2xkIGlzIDc1CisgICAgICAgMC41MjQyODhmIGlzIGZyYWN0aW9uYWwgcGFydCBvZiBSRUxBWEFUSU9OLCB0aGUgcXVvdGFNYXRyaXggYW5kIHRoZXJlZm9yZSB0b25hbGl0eSBhcmUgc2NhbGVkIGJ5IHRoaXMKKyAgICAgICAyLzMgaXMgYmVjYXVzZSB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZGl2aWRlcyB0aGUgdG9uYWxpdHkgdmFsdWVzIGJ5IDMsIGhlcmUgaXQncyBkaXZpZGVkIGJ5IDIKKyAgICAgICAxMjggY29tcGVuc2F0ZXMgdGhlIG5lY2Vzc2FyeSBzaGlmdGZhY3RvciBvZiA3ICovCisgICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX20gPSBGTDJGWENPTlNUX0RCTCg3NS4wZiowLjUyNDI4OGYvKDIuMGYvMy4wZikvMTI4LjBmKTsKKyAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfZSA9IDc7CisgIH0KKyAgZWxzZSBpZiAoYml0UmF0ZSA+IDQ4MDAwKSB7CisgICAgY29uZmlnLT50aHJlc2hvbGRfQW1wUmVzX0ZGX20gPSBGTDJGWENPTlNUX0RCTCgwKTsKKyAgICBjb25maWctPnRocmVzaG9sZF9BbXBSZXNfRkZfZSA9IDA7CisgIH0KKwogICBpZiAoYml0UmF0ZT09MCkgewogICAgIC8qIG1hcCB2YnIgcXVhbGl0eSB0byBiaXRyYXRlICovCiAgICAgaWYgKHZick1vZGUgPCAzMCkKQEAgLTQ2Nyw2ICs0ODQsNTcgQEAKICAgICBjb25maWctPnN0ZXJlb01vZGUgICAgICA9IHNiclR1bmluZ1RhYmxlW2lkeF0uc3RlcmVvTW9kZSA7CiAgICAgY29uZmlnLT5mcmVxU2NhbGUgICAgICAgPSBzYnJUdW5pbmdUYWJsZVtpZHhdLmZyZXFTY2FsZSA7CiAKKyAgICBpZiAobnVtQ2hhbm5lbHMgPT0gMSkgeworICAgICAgLyogc3RlcmVvIGNhc2UgKi8KKyAgICAgIHN3aXRjaCAoY29yZSkgeworICAgICAgICBjYXNlIEFPVF9BQUNfTEM6CisgICAgICAgICAgaWYgKGJpdFJhdGUgPD0gKHVzZVNwZWVjaENvbmZpZz8yNDAwMFU6MjAwMDBVKSkgeworICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMF0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIG5vbi1zcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBzcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU9UX0VSX0FBQ19FTEQ6CisgICAgICAgICAgaWYgKGJpdFJhdGUgPCAzNjAwMCkKKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzFdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBzcGxpdCBmcmFtZXMgKi8KKyAgICAgICAgICBpZiAoYml0UmF0ZSA8IDI2MDAwKSB7CisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igbm9uLXNwbGl0IGZyYW1lcyAqLworICAgICAgICAgICAgY29uZmlnLT5mUmVzVHJhbnNJc0xvdyA9IDE7ICAgICAgICAgICAgICAgIC8qIGZvciB0cmFuc2llbnQgZnJhbWVzLCBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIC8qIHN0ZXJlbyBjYXNlICovCisgICAgICBzd2l0Y2ggKGNvcmUpIHsKKyAgICAgICAgY2FzZSBBT1RfQUFDX0xDOgorICAgICAgICAgIGlmIChiaXRSYXRlIDw9IDI4MDAwKSB7CisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igbm9uLXNwbGl0IGZyYW1lcyAqLworICAgICAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19MT1c7IC8qIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gZm9yIHNwbGl0IGZyYW1lcyAqLworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKKyAgICAgICAgICBpZiAoYml0UmF0ZSA8IDcyMDAwKSB7CisgICAgICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSA9IEZSRVFfUkVTX0xPVzsgLyogc2V0IGxvdyBmcmVxdWVuY3kgcmVzb2x1dGlvbiBmb3Igc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgfQorICAgICAgICAgIGlmIChiaXRSYXRlIDwgNTIwMDApIHsKKyAgICAgICAgICAgIGNvbmZpZy0+ZnJlcV9yZXNfZml4Zml4WzBdID0gRlJFUV9SRVNfTE9XOyAvKiBzZXQgbG93IGZyZXF1ZW5jeSByZXNvbHV0aW9uIGZvciBub24tc3BsaXQgZnJhbWVzICovCisgICAgICAgICAgICBjb25maWctPmZSZXNUcmFuc0lzTG93ID0gMTsgICAgICAgICAgICAgICAgLyogZm9yIHRyYW5zaWVudCBmcmFtZXMsIHNldCBsb3cgZnJlcXVlbmN5IHJlc29sdXRpb24gKi8KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYml0UmF0ZSA8PSAyODAwMCkgeworICAgICAgICAvKgorICAgICAgICAgIGFkZGl0aW9uYWxseSByZXN0cmljdCBmcmVxdWVuY3kgcmVzb2x1dGlvbiBpbiBGSVhGSVggZnJhbWVzCisgICAgICAgICAgdG8gZnVydGhlciByZWR1Y2UgU0JSIHBheWxvYWQgc2l6ZSAqLworICAgICAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSA9IEZSRVFfUkVTX0xPVzsKKyAgICAgICAgY29uZmlnLT5mcmVxX3Jlc19maXhmaXhbMV0gPSBGUkVRX1JFU19MT1c7CisgICAgICB9CisgICAgfQorCiAgICAgLyogYWRqdXN0IHVzYWdlIG9mIHBhcmFtZXRyaWMgY29kaW5nIGRlcGVuZGVudCBvbiBiaXRyYXRlIGFuZCBzcGVlY2ggY29uZmlnIGZsYWcgKi8KICAgICBpZiAodXNlU3BlZWNoQ29uZmlnKQogICAgICAgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nICA9IDA7CkBAIC01MTUsNiArNTgzLDcgQEAKIEZES3NickVuY19Jbml0aWFsaXplU2JyRGVmYXVsdHMgKHNickNvbmZpZ3VyYXRpb25QdHIgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgICAgICBkb3duU2FtcGxlRmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCAgICAgICAgICAgICAgICBjb2RlY0dyYW51bGVMZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGNvbnN0IElOVCAgICAgICAgICAgaXNMb3dEZWxheQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgIGlmICggKGRvd25TYW1wbGVGYWN0b3IgPCAxIHx8IGRvd25TYW1wbGVGYWN0b3IgPiAyKSB8fApAQCAtNTI1LDcgKzU5NCwxMSBAQAogICAgIGNvbmZpZy0+dXNlV2F2ZUNvZGluZyAgICAgICAgICA9IDA7CiAgICAgY29uZmlnLT5jcmNTYnIgICAgICAgICAgICAgICAgID0gMDsKICAgICBjb25maWctPmR5bkJ3U3VwcG9ydGVkICAgICAgICAgPSAxOwotICAgIGNvbmZpZy0+dHJhbl90aHIgICAgICAgICAgICAgICA9IDEzMDAwOworICAgIGlmIChpc0xvd0RlbGF5KQorICAgICAgY29uZmlnLT50cmFuX3RociAgICAgICAgICAgICA9IDYwMDA7CisgICAgZWxzZQorICAgICAgY29uZmlnLT50cmFuX3RociAgICAgICAgICAgICA9IDEzMDAwOworCiAgICAgY29uZmlnLT5wYXJhbWV0cmljQ29kaW5nICAgICAgID0gMTsKIAogICAgIGNvbmZpZy0+c2JyRnJhbWVTaXplICAgICAgICAgICA9IGNvZGVjR3JhbnVsZUxlbiAqIGRvd25TYW1wbGVGYWN0b3I7CkBAIC01NTgsNyArNjMxLDkgQEAKICAgICBjb25maWctPm5vaXNlRmxvb3JPZmZzZXQgICAgICAgPSAwOwogICAgIGNvbmZpZy0+c3RhcnRGcmVxICAgICAgICAgICAgICA9IDU7IC8qICA1LjkgcmVzcGVjdGl2ZWx5ICA2LjAga0h6IGF0IGZzID0gNDQuMS80OCBrSHogKi8KICAgICBjb25maWctPnN0b3BGcmVxICAgICAgICAgICAgICAgPSA5OyAvKiAxNi4yIHJlc3BlY3RpdmVseSAxNi44IGtIeiBhdCBmcyA9IDQ0LjEvNDgga0h6ICovCi0KKyAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFswXSAgICAgPSBGUkVRX1JFU19ISUdIOyAgLyogbm9uLXNwbGl0IGNhc2UgKi8KKyAgICBjb25maWctPmZyZXFfcmVzX2ZpeGZpeFsxXSAgICAgPSBGUkVRX1JFU19ISUdIOyAgLyogc3BsaXQgY2FzZSAqLworICAgIGNvbmZpZy0+ZlJlc1RyYW5zSXNMb3cgPSAwOyAgLyogZm9yIHRyYW5zaWVudCBmcmFtZXMsIHNldCB2YXJpYWJsZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiBhY2NvcmRpbmcgdG8gZnJlcVJlc1RhYmxlICovCiAKICAgICAvKiBoZWFkZXJfZXh0cmFfMSAqLwogICAgIGNvbmZpZy0+ZnJlcVNjYWxlICAgICAgID0gU0JSX0ZSRVFfU0NBTEVfREVGQVVMVDsKQEAgLTEyMDYsNyArMTI4MSwxMCBAQAogCiAgIEZES19BU1NFUlQocGFyYW1zLT5lID49IDApOwogCi0gIGhFbnYtPmVuY0VudkRhdGEuZnJlcV9yZXNfZml4Zml4ID0gMTsKKyAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXhbMF0gPSBwYXJhbXMtPmZyZXFfcmVzX2ZpeGZpeFswXTsKKyAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXhbMV0gPSBwYXJhbXMtPmZyZXFfcmVzX2ZpeGZpeFsxXTsKKyAgaEVudi0+ZW5jRW52RGF0YS5mUmVzVHJhbnNJc0xvdyAgICAgPSBwYXJhbXMtPmZSZXNUcmFuc0lzTG93OworCiAgIGhFbnYtPmZMZXZlbFByb3RlY3QgPSAwOwogCiAgIGhFbnYtPmVuY0VudkRhdGEubGRHcmlkID0gKHNickNvbmZpZ0RhdGEtPnNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpID8gMSA6IDA7CkBAIC0xMzQ4LDExICsxNDI2LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnN0YXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVNsb3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhFbnYtPmVuY0VudkRhdGEuZnJlcV9yZXNfZml4Zml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLGhFbnYtPmVuY0VudkRhdGEubGRHcmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+ZW5jRW52RGF0YS5mcmVxX3Jlc19maXhmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEVudi0+ZW5jRW52RGF0YS5mUmVzVHJhbnNJc0xvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoRW52LT5lbmNFbnZEYXRhLmxkR3JpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKKyAgaWYoc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MgJiBTQlJfU1lOVEFYX0xPV19ERUxBWSkKKyAgeworICAgIElOVCBiYW5kd2lkdGhfcW1mX3Nsb3QgPSAoc2JyQ29uZmlnRGF0YS0+c2FtcGxlRnJlcT4+MSkgLyAoc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcyk7CisgICAgaWYoRkRLc2JyRW5jX0luaXRTYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IoCisgICAgICAgICAgICAgICZoRW52LT5zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCisgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5ub1FtZlNsb3RzLAorICAgICAgICAgICAgICAgYmFuZHdpZHRoX3FtZl9zbG90LAorICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+bm9RbWZCYW5kcywKKyAgICAgICAgICAgICAgIHNickNvbmZpZ0RhdGEtPmZyZXFCYW5kVGFibGVbMF1bMF0KKyAgICAgICAgICAgICAgICkpCisgICAgICByZXR1cm4oMSk7CisgIH0KKworICAvKiBUaGUgdHJhbnNpZW50IGRldGVjdG9yIGhhcyB0byBiZSBpbml0aWFsaXplZCBhbHNvIGlmIHRoZSBmYXN0IHRyYW5zaWVudAorICAgICBkZXRlY3RvciB3YXMgYWN0aXZlLCBiZWNhdXNlIHRoZSB2YWx1ZXMgZnJvbSB0aGUgdHJhbnNpZW50IGRldGVjdG9yCisgICAgIHN0cnVjdHVyZSBhcmUgdXNlZC4gKi8KICAgaWYoRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvciAoJmhFbnYtPnNiclRyYW5zaWVudERldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlnRGF0YS0+c2JyU3ludGF4RmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5mcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJDb25maWdEYXRhLT5zYW1wbGVGcmVxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLApAQCAtMTY1OCw2ICsxNzU0LDggQEAKICAgIC8qIG90aGVyIHN3aXRjaGVzICovCiAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnVzZVdhdmVDb2RpbmcgICAgICAgICAgICAgPSBwYXJhbXMtPnVzZVdhdmVDb2Rpbmc7CiAgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnVzZVBhcmFtZXRyaWNDb2RpbmcgICAgICAgPSBwYXJhbXMtPnBhcmFtZXRyaWNDb2Rpbmc7CisgIGhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLnRocmVzaG9sZEFtcFJlc0ZGX20gICAgICAgPSBwYXJhbXMtPnRocmVzaG9sZF9BbXBSZXNfRkZfbTsKKyAgaFNickVsZW1lbnQtPnNickNvbmZpZ0RhdGEudGhyZXNob2xkQW1wUmVzRkZfZSAgICAgICA9IHBhcmFtcy0+dGhyZXNob2xkX0FtcFJlc19GRl9lOwogCiAgIC8qIGluaXQgZnJlcSBiYW5kIHRhYmxlICovCiAgIGlmKHVwZGF0ZUZyZXFCYW5kVGFibGUoJmhTYnJFbGVtZW50LT5zYnJDb25maWdEYXRhLApAQCAtMTk5OSw3ICsyMDk3LDggQEAKICAgICAgICAgICovCiAgICAgICAgIGlmICggISBGREtzYnJFbmNfSW5pdGlhbGl6ZVNickRlZmF1bHRzICggJnNickNvbmZpZ1tlbF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRvd25TYW1wbGVGYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVGcmFtZUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JlRnJhbWVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0xPV0RFTEFZKGFvdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSApCiAgICAgICAgIHsKICAgICAgICAgICBlcnJvciA9IDE7CmRpZmYgLS1naXQgYS9saWJTQlJlbmMvc3JjL3Nicl9yb20uY3BwIGIvbGliU0JSZW5jL3NyYy9zYnJfcm9tLmNwcAppbmRleCBhMmI2NTI3Li43YTUxNjY4IDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Nicl9yb20uY3BwCisrKyBiL2xpYlNCUmVuYy9zcmMvc2JyX3JvbS5jcHAKQEAgLTIsNyArMiw3IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU29mdHdhcmUgTGljZW5zZSBmb3IgVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkCiAKLakgQ29weXJpZ2h0ICAxOTk1IC0gMjAxMyBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgorqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKICAxLiAgICBJTlRST0RVQ1RJT04KQEAgLTY4NCw2ICs2ODQsOSBAQAogCiAgIC8qKiBBQUMgTE9XIERFTEFZIFNFQ1RJT04gKiovCiAKKyAgLyogMjQga0h6IGR1YWwgcmF0ZSAtIDEya0h6IHNpbmdsZXJhdGUgaXMgbm90IGFsbG93ZWQgKGRlYWN0aXZhdGVkIGluIEZES3NickVuY19Jc1NiclNldHRpbmdBdmFpbCgpKSAqLworICB7IENPREVDX0FBQ0xELCAgIDgwMDAsIDMyMDAwLCAgMTIwMDAsIDEsICAxLCAxLCAwLCAwLCAgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogIDgga2JpdC9zICovCisKICAgLyoqKiBtb25vICoqKi8KICAgLyogMTYvMzIga0h6IGR1YWwgcmF0ZSBub3QgeWV0IHR1bmVkIC0+YWxiIGNvcGllZCBmcm9tIG5vbiBMRCB0YWJsZXMqLwogICB7IENPREVDX0FBQ0xELCAgMTYwMDAsIDE4MDAwLCAgMTYwMDAsIDEsICA0LCA1LCA5LCA3LCAgMSwgMCwgNiwgU0JSX01PTk8sIDMgfSwgLyogbm9taW5hbDogMTYga2JpdC9zIHdycjogdHVuZWQgKi8KQEAgLTcwMiwxMCArNzA1LDEwIEBACiAgIHsgQ09ERUNfQUFDTEQsICA1MjAwMCwgNjQwMDEsICAyMjA1MCwgMSwgMTMsMTEsMTEsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA1NiBrYml0L3MgKi8KIAogICAvKiAyNC80OCBrSHogZHVhbCByYXRlICovCi0gIHsgQ09ERUNfQUFDTEQsICAyMDAwMCwgMjIwMDAsICAyNDAwMCwgMSwgIDQsIDEsIDgsIDQsICAyLCAzLCA2LCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAyMCBrYml0L3MgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDIwMDAwLCAyMjAwMCwgIDI0MDAwLCAxLCAgMywgNCwgOCwgOCwgIDIsIDAsIDYsIFNCUl9NT05PLCAyIH0sIC8qIG5vbWluYWw6IDIwIGtiaXQvcyAqLwogICB7IENPREVDX0FBQ0xELCAgMjIwMDAsIDI4MDAwLCAgMjQwMDAsIDEsICAzLCA4LCA4LCA3LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogMjQga2JpdC9zICovCiAgIHsgQ09ERUNfQUFDTEQsICAyODAwMCwgMzYwMDAsICAyNDAwMCwgMSwgIDQsIDgsIDgsIDcsICAyLCAwLCAzLCBTQlJfTU9OTywgMiB9LCAvKiBub21pbmFsOiAzMiBrYml0L3MgKi8KLSAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA1NjAwMCwgIDI0MDAwLCAxLCAgOCwgOSwgOSwgOSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDQwIGtiaXQvcyAqLworICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDU2MDAwLCAgMjQwMDAsIDEsICA4LCA5LCA5LCA4LCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogNDAga2JpdC9zICovCiAgIHsgQ09ERUNfQUFDTEQsICA1NjAwMCwgNjQwMDEsICAyNDAwMCwgMSwgMTMsMTEsMTEsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA2NCBrYml0L3MgKi8KIAogICAvKiAzMi82NCBrSHogZHVhbCByYXRlICovICAvKiBwbGFjZWJvIHNldHRpbmdzICovICAvKmpncjogbmV3LCBjb3B5IGZyb20gQ09ERUNfQUFDICovCkBAIC03MjIsNyArNzI1LDcgQEAKICAgeyBDT0RFQ19BQUNMRCwgMTAwMDAwLDE2MDAwMSwgIDQ0MTAwLCAxLCAxMywxMywxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDEyOCAqLwogCiAgIC8qIDQ4Lzk2IGtIeiBkdWFsIHJhdGUgKi8gIC8qIDMyIGFuZCA0MGticHMgbGluZSB0dW5lZCBmb3IgZHVhbC1yYXRlIFNCUiAqLwotICB7IENPREVDX0FBQ0xELCAgMzYwMDAsIDYwMDAwLCAgNDgwMDAsIDEsICA4LCA3LCA2LCA5LCAgMiwgMCwgMywgU0JSX01PTk8sIDIgfSwgLyogbm9taW5hbDogNDAgKi8KKyAgeyBDT0RFQ19BQUNMRCwgIDM2MDAwLCA2MDAwMCwgIDQ4MDAwLCAxLCAgNCwgNywgNCwgNCwgIDIsIDAsIDMsIFNCUl9NT05PLCAzIH0sIC8qIG5vbWluYWw6IDQwICovCiAgIHsgQ09ERUNfQUFDTEQsICA2MDAwMCwgNzIwMDAsICA0ODAwMCwgMSwgIDksIDksMTAsMTAsICAyLCAwLCAzLCBTQlJfTU9OTywgMSB9LCAvKiBub21pbmFsOiA2NCAqLwogICB7IENPREVDX0FBQ0xELCAgNzIwMDAsMTAwMDAwLCAgNDgwMDAsIDEsIDExLDExLDExLDExLCAgMiwgMCwgMywgU0JSX01PTk8sIDEgfSwgLyogbm9taW5hbDogODAgKi8KICAgeyBDT0RFQ19BQUNMRCwgMTAwMDAwLDE2MDAwMSwgIDQ4MDAwLCAxLCAxMywxMywxMSwxMSwgIDIsIDAsIDMsIFNCUl9NT05PLCAxIH0sIC8qIG5vbWluYWw6IDEyOCAqLwpkaWZmIC0tZ2l0IGEvbGliU0JSZW5jL3NyYy90b25fY29yci5jcHAgYi9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcAppbmRleCAyMjRkYTExLi5hZjVhZmJhIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcAorKysgYi9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmNwcApAQCAtMiw3ICsyLDcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBTb2Z0d2FyZSBMaWNlbnNlIGZvciBUaGUgRnJhdW5ob2ZlciBGREsgQUFDIENvZGVjIExpYnJhcnkgZm9yIEFuZHJvaWQKIAotqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiupIENvcHlyaWdodCAgMTk5NSAtIDIwMTUgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIAogIDEuICAgIElOVFJPRFVDVElPTgpAQCAtNjgyLDcgKzY4Miw3IEBACiAKICAgLyoKICAgUmVzZXQgdGhlIHBhdGNoaW5nIGFuZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBxdW90YSBtYXRyaXguCi0gIEFzc2luZyBwYXJhbWV0ZXJzIGZvciB0aGUgTFBDIGFuYWx5c2lzLgorICBBc3N1bWluZyBwYXJhbWV0ZXJzIGZvciB0aGUgTFBDIGFuYWx5c2lzLgogICAqLwogICBpZiAoc2JyQ2ZnLT5zYnJTeW50YXhGbGFncyAmIFNCUl9TWU5UQVhfTE9XX0RFTEFZKSB7CiAgICAgc3dpdGNoICh0aW1lU2xvdHMpIHsKQEAgLTY5MCw3ICs2OTAsNyBAQAogICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOwogICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSAgICAgICAgICAgICAgPSA3IC0gTFBDX09SREVSOwogICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzICAgICAgICAgPSBOT19PRl9FU1RJTUFURVNfTEQ7Ci0gICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IHNickNmZy0+bm9RbWZTbG90cyAvIDc7CisgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IDI7IC8qIHNickNmZy0+bm9RbWZTbG90cyAvIDcgKi8KICAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0ICAgID0gMDsKICAgICAgIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgICAgICAgID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7CiAgICAgICBicmVhazsKQEAgLTY5OCw3ICs2OTgsNyBAQAogICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFswXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOwogICAgICAgaFRvbkNvcnItPmxwY0xlbmd0aFsxXSAgICAgICAgICAgICAgPSA4IC0gTFBDX09SREVSOwogICAgICAgaFRvbkNvcnItPm51bWJlck9mRXN0aW1hdGVzICAgICAgICAgPSBOT19PRl9FU1RJTUFURVNfTEQ7Ci0gICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IHNickNmZy0+bm9RbWZTbG90cyAvIDg7CisgICAgICBoVG9uQ29yci0+bnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZSA9IDI7IC8qIHNickNmZy0+bm9RbWZTbG90cyAvIDggKi8KICAgICAgIGhUb25Db3JyLT5mcmFtZVN0YXJ0SW5kZXhJbnZmRXN0ICAgID0gMDsKICAgICAgIGhUb25Db3JyLT50cmFuc2llbnRQb3NPZmZzZXQgICAgICAgID0gRlJBTUVfTUlERExFX1NMT1RfNTEyTEQ7CiAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuaCBiL2xpYlNCUmVuYy9zcmMvdG9uX2NvcnIuaAppbmRleCA4Yzg0MjVjLi41MDRhYjAzIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3Rvbl9jb3JyLmgKKysrIGIvbGliU0JSZW5jL3NyYy90b25fY29yci5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC0xMTgsNyArMTE4LDcgQEAKICAgSU5UIGJ1ZmZlckxlbmd0aDsgICAgICAgICAgICAgICAvKiE8IExlbmd0aCBvZiB0aGUgciBhbmQgaSBidWZmZXJzLiAqLwogICBJTlQgc3RlcFNpemU7ICAgICAgICAgICAgICAgICAgIC8qITwgU3RyaWRlIGZvciB0aGUgbHBjIGVzdGltYXRlLiAqLwogICBJTlQgbnVtYmVyT2ZFc3RpbWF0ZXM7ICAgICAgICAgIC8qITwgVGhlIHRvdGFsIG51bWJlciBvZiBlc3RpYW10ZXMsIGF2YWlsYWJsZSBpbiB0aGUgcXVvdGFNYXRyaXguKi8KLSAgSU5UIG51bWJlck9mRXN0aW1hdGVzUGVyRnJhbWU7ICAvKiE8IFRoZSBudW1iZXIgb2YgZXN0aW1hdGVzIHBlciBmcmFtZSBhdmFpbGFibGUgaW4gdGhlIHF1b3RhTWF0cml4LiovCisgIFVJTlQgbnVtYmVyT2ZFc3RpbWF0ZXNQZXJGcmFtZTsgLyohPCBUaGUgbnVtYmVyIG9mIGVzdGltYXRlcyBwZXIgZnJhbWUgYXZhaWxhYmxlIGluIHRoZSBxdW90YU1hdHJpeC4qLwogICBJTlQgbHBjTGVuZ3RoWzJdOyAgICAgICAgICAgICAgIC8qITwgU2VnbWVudCBsZW5ndGggdXNlZCBmb3Igc2Vjb25kIG9yZGVyIExQQyBhbmFseXNpcy4qLwogICBJTlQgbmV4dFNhbXBsZTsgICAgICAgICAgICAgICAgIC8qITwgV2hlcmUgdG8gc3RhcnQgdGhlIExQQyBhbmFseXNpcyBvZiB0aGUgY3VycmVudCBmcmFtZS4qLwogICBJTlQgbW92ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qITwgSG93IG1hbnkgZXN0aW1hdGVzIHRvIG1vdmUgaW4gdGhlIHF1b3RhTWF0cml4LCB3aGVuIGJ1ZmZlcmluZy4gKi8KZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuY3BwIGIvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAKaW5kZXggNmM2MmI0Yy4uMzNlYTYwZSAxMDA2NDQKLS0tIGEvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAKKysrIGIvbGliU0JSZW5jL3NyYy90cmFuX2RldC5jcHAKQEAgLTg5LDcgKzg5LDcgQEAKIAogI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiAKLSNkZWZpbmUgTk9STV9RTUZfRU5FUkdZIDUuNjg0MzQxODg2MDgwODAxNDg2OTY4OTk0MTQwNjI1ZS0xNCAvKiAyXi00NCAqLworI2RlZmluZSBOT1JNX1FNRl9FTkVSR1kgOS4zMTMyMjU3NDYxNTQ3OUUtMTAgLyogMl4tMzAgKi8KIAogLyogc3RhdGljIEZJWFBfREJMIEFCU19USFJFUyA9IGZpeE1heCggRkwyRlhDT05TVF9EQkwoMS4yOGU1ICogIE5PUk1fUU1GX0VORVJHWSksIChGSVhQX0RCTCkxKSAgTWluaW11bSB0aHJlc2hvbGQgZm9yIGRldGVjdGluZyBjaGFuZ2VzICovCiAjZGVmaW5lIEFCU19USFJFUyAoKEZJWFBfREJMKTE2KQpAQCAtMTA2LDIyICsxMDYsMzAgQEAKIAogIFxyZXR1cm4gIGNhbGN1bGF0ZWQgdmFsdWUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5SR19TSElGVCAgMyAvKiBmb3IgZW5lcmd5IHN1bW1hdGlvbiAqLworCiBzdGF0aWMgRklYUF9EQkwgc3BlY3RyYWxDaGFuZ2UoRklYUF9EQkwgRW5lcmdpZXNbTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF1bTUFYX0ZSRVFfQ09FRkZTXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnNjYWxlRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgRW5lcmd5VG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIG5TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIHN0b3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIFlCdWZmZXJXcml0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgKnJlc3VsdF9lKQogewogICBJTlQgaSxqOwogICBJTlQgbGVuMSxsZW4yOwotICBGSVhQX0RCTCBkZWx0YSx0bXAwLHRtcDEsdG1wMjsKLSAgRklYUF9EQkwgYWNjdTEsYWNjdTIsZGVsdGFfc3VtLHJlc3VsdDsKKyAgU0NIQVIgZW5lcmdpZXNfZV9kaWZmW05VTUJFUl9USU1FX1NMT1RTXzIzMDRdLCBlbmVyZ2llc19lLCBlbmVyZ3lUb3RhbF9lPTE5LCBlbmVyZ2llc19lX2FkZDsKKyAgU0NIQVIgcHJldkVuZXJnaWVzX2VfZGlmZiwgbmV3RW5lcmdpZXNfZV9kaWZmOworICBGSVhQX0RCTCB0bXAwLHRtcDE7CisgIEZJWFBfREJMIGFjY3UxLGFjY3UyLGFjY3UxX2luaXQsYWNjdTJfaW5pdDsKKyAgRklYUF9EQkwgZGVsdGEsIGRlbHRhX3N1bTsKKyAgSU5UIGFjY3VfZSwgdG1wX2U7CiAKLSAgRkRLX0FTU0VSVChzY2FsZUVuZXJnaWVzWzBdID49IDApOworICBkZWx0YV9zdW0gPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKKyAgKnJlc3VsdF9lID0gMDsKIAotICAvKiBlcXVhbCBmb3IgYWFjICh3b3VsZCBiZSBub3QgZXF1YWwgZm9yIG1wMykgKi8KICAgbGVuMSA9IGJvcmRlci1zdGFydDsKICAgbGVuMiA9IHN0b3AtYm9yZGVyOwogCkBAIC0xMzAsNDMgKzEzOCw5MSBAQAogICBwb3Nfd2VpZ2h0ID0gRkwyRlhDT05TVF9EQkwoMC41ZikgLSAobGVuMSpHZXRJbnZJbnQobGVuMStsZW4yKSk7CiAgIHBvc193ZWlnaHQgPSAvKkZMMkZYQ09OU1RfREJMKDEuMCkqLyAoRklYUF9EQkwpTUFYVkFMX0RCTCAtIChmTXVsdChwb3Nfd2VpZ2h0LCBwb3Nfd2VpZ2h0KTw8Mik7CiAKLSAgZGVsdGFfc3VtID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgIC8qKiogQ2FsYyBzY2FsaW5nIGZvciBlbmVyZ2llcyAqKiovCisgIEZES19BU1NFUlQoc2NhbGVFbmVyZ2llc1swXSA+PSAwKTsKKyAgRkRLX0FTU0VSVChzY2FsZUVuZXJnaWVzWzFdID49IDApOworCisgIGVuZXJnaWVzX2UgPSAxOSAtIEZES21pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKTsKKworICAvKiBsaW1pdCBzaGlmdCBmb3IgZW5lcmd5IGFjY3VtdWxhdGlvbiwgZW5lcmdpZXNfZSBjYW4gYmUgLTEwIG1pbi4gKi8KKyAgaWYgKGVuZXJnaWVzX2UgPCAtMTApIHsKKyAgICAgZW5lcmdpZXNfZV9hZGQgPSAtMTAgLSBlbmVyZ2llc19lOworICAgICBlbmVyZ2llc19lID0gLTEwOworICB9IGVsc2UgaWYgKGVuZXJnaWVzX2UgPiAxNykgeworICAgICBlbmVyZ2llc19lX2FkZCA9IGVuZXJnaWVzX2UgLSAxNzsKKyAgICAgZW5lcmdpZXNfZSA9IDE3OworICB9IGVsc2UgeworICAgICBlbmVyZ2llc19lX2FkZCA9IDA7CisgIH0KKworICAvKiBjb21wZW5zYXRlIHNjYWxpbmcgZGlmZmVyZW5jZXMgYmV0d2VlbiBzY2FsZUVuZXJnaWVzWzBdIGFuZCBzY2FsZUVuZXJnaWVzWzFdICAqLworICBwcmV2RW5lcmdpZXNfZV9kaWZmID0gc2NhbGVFbmVyZ2llc1swXSAtIEZES21pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKSArIGVuZXJnaWVzX2VfYWRkICsgTlJHX1NISUZUOworICBuZXdFbmVyZ2llc19lX2RpZmYgID0gc2NhbGVFbmVyZ2llc1sxXSAtIEZES21pbihzY2FsZUVuZXJnaWVzWzBdLCBzY2FsZUVuZXJnaWVzWzFdKSArIGVuZXJnaWVzX2VfYWRkICsgTlJHX1NISUZUOworCisgIHByZXZFbmVyZ2llc19lX2RpZmYgPSBmTWluKHByZXZFbmVyZ2llc19lX2RpZmYsIERGUkFDVF9CSVRTLTEpOworICBuZXdFbmVyZ2llc19lX2RpZmYgID0gZk1pbihuZXdFbmVyZ2llc19lX2RpZmYsICBERlJBQ1RfQklUUy0xKTsKKworICBmb3IgKGk9c3RhcnQ7IGk8WUJ1ZmZlcldyaXRlT2Zmc2V0OyBpKyspIHsKKyAgICBlbmVyZ2llc19lX2RpZmZbaV0gPSBwcmV2RW5lcmdpZXNfZV9kaWZmOworICB9CisgIGZvciAoaT1ZQnVmZmVyV3JpdGVPZmZzZXQ7IGk8c3RvcDsgaSsrKSB7CisgICAgZW5lcmdpZXNfZV9kaWZmW2ldID0gbmV3RW5lcmdpZXNfZV9kaWZmOworICB9CiAKICAgLyogU3VtIHVwIGVuZXJnaWVzIG9mIGFsbCBRTUYtdGltZXNsb3RzIGZvciBib3RoIGhhbGZzICovCisgIEZES19BU1NFUlQobGVuMTw9OCk7IC8qIG90aGVyd2lzZSBhbiBvdmVyZmxvdyBpcyBwb3NzaWJsZSAqLworICBGREtfQVNTRVJUKGxlbjI8PTgpOyAvKiBvdGhlcndpc2UgYW4gb3ZlcmZsb3cgaXMgcG9zc2libGUgKi8KKyAgLyogaW5pdCB3aXRoIHNvbWUgZW5lcmd5IHRvIHByZXZlbnQgZGl2aXNpb24gYnkgemVybworICAgICAgYW5kIHRvIHByZXZlbnQgc3BsaXR0aW5nIGZvciB2ZXJ5IGxvdyBsZXZlbHMgKi8KKyAgYWNjdTFfaW5pdCA9IHNjYWxlVmFsdWUoKEZMMkZYQ09OU1RfREJMKCgxLjBlNipOT1JNX1FNRl9FTkVSR1kpKSksLWVuZXJnaWVzX2UpOworICBhY2N1Ml9pbml0ID0gc2NhbGVWYWx1ZSgoRkwyRlhDT05TVF9EQkwoKDEuMGU2Kk5PUk1fUU1GX0VORVJHWSkpKSwtZW5lcmdpZXNfZSk7CisgIGFjY3UxX2luaXQgPSBmTXVsdChhY2N1MV9pbml0LCAoRklYUF9EQkwpbGVuMTw8KChERlJBQ1RfQklUUy0xKS1OUkdfU0hJRlQtMSkpPDwxOworICBhY2N1Ml9pbml0ID0gZk11bHQoYWNjdTJfaW5pdCwgKEZJWFBfREJMKWxlbjI8PCgoREZSQUNUX0JJVFMtMSktTlJHX1NISUZULTEpKTw8MTsKKwogICBmb3IgKGo9MDsgajxuU2ZiOyBqKyspIHsKLSAgICAjZGVmaW5lIE5SR19TQ0FMRSAgMwotICAgIC8qIGluaXQgd2l0aCBzb21lIGVuZXJneSB0byBwcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8KLSAgICAgICBhbmQgdG8gcHJldmVudCBzcGxpdHRpbmcgZm9yIHZlcnkgbG93IGxldmVscyAqLwotICAgIGFjY3UxID0gKChGTDJGWENPTlNUX0RCTCgoMS4wZTYqTk9STV9RTUZfRU5FUkdZKjguMC8zMikpKSA8PCBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSwyNSkpPj5OUkdfU0NBTEU7ICAvKiBjb21wbGV4IGluaXQgZm9yIGNvbXBhcmUgd2l0aCBvcmlnaW5hbCB2ZXJzaW9uICovCi0gICAgYWNjdTIgPSAoKEZMMkZYQ09OU1RfREJMKCgxLjBlNipOT1JNX1FNRl9FTkVSR1kqOC4wLzMyKSkpIDw8IGZpeE1pbihzY2FsZUVuZXJnaWVzWzBdLDI1KSk+Pk5SR19TQ0FMRTsgIC8qIGNhbiBiZSBzaW1wbGlmaWVkIGluIGRzcCBpbXBsZW1lbnRhdGlvbiAqLworCisgICAgYWNjdTEgPSBhY2N1MV9pbml0OworICAgIGFjY3UyID0gYWNjdTJfaW5pdDsKKyAgICBhY2N1X2UgPSBlbmVyZ2llc19lKzM7CiAKICAgICAvKiBTdW0gdXAgZW5lcmdpZXMgaW4gZmlyc3QgaGFsZiAqLwogICAgIGZvciAoaT1zdGFydDsgaTxib3JkZXI7IGkrKykgewotICAgICAgYWNjdTEgKz0gKEVuZXJnaWVzW2ldW2pdPj5OUkdfU0NBTEUpOworICAgICAgYWNjdTEgKz0gc2NhbGVWYWx1ZShFbmVyZ2llc1tpXVtqXSwgLWVuZXJnaWVzX2VfZGlmZltpXSk7CiAgICAgfQogCiAgICAgLyogU3VtIHVwIGVuZXJnaWVzIGluIHNlY29uZCBoYWxmICovCiAgICAgZm9yIChpPWJvcmRlcjsgaTxzdG9wOyBpKyspIHsKLSAgICAgIGFjY3UyICs9IChFbmVyZ2llc1tpXVtqXT4+TlJHX1NDQUxFKTsKKyAgICAgIGFjY3UyICs9IHNjYWxlVmFsdWUoRW5lcmdpZXNbaV1bal0sIC1lbmVyZ2llc19lX2RpZmZbaV0pOwogICAgIH0KIAogICAgIC8qIEVuZXJneSBjaGFuZ2UgaW4gY3VycmVudCBiYW5kICovCi0gICAgdG1wMCA9IENhbGNMZERhdGEoYWNjdTIpOwotICAgIHRtcDEgPSBDYWxjTGREYXRhKGFjY3UxKTsKLSAgICB0bXAyID0gKHRtcDAgLSB0bXAxICsgQ2FsY0xkRGF0YShsZW4xKS1DYWxjTGREYXRhKGxlbjIpKTsKLSAgICBkZWx0YSA9IGZpeHBfYWJzKGZNdWx0KHRtcDIsIEZMMkZYQ09OU1RfREJMKDAuNjkzMTQ3MTgwNmYpKSk7CisgICAgI2RlZmluZSBMTjIgRkwyRlhDT05TVF9EQkwoMC42OTMxNDcxODA2ZikgLyogbG4oMikgKi8KKyAgICB0bXAwID0gZkxvZzIoYWNjdTIsIGFjY3VfZSkgLSBmTG9nMihhY2N1MSwgYWNjdV9lKTsKKyAgICB0bXAxID0gZkxvZzIoKEZJWFBfREJMKWxlbjEsIDMxKSAtIGZMb2cyKChGSVhQX0RCTClsZW4yLCAzMSk7CisgICAgZGVsdGEgPSBmTXVsdChMTjIsICh0bXAwICsgdG1wMSkpOworICAgIGRlbHRhID0gKEZJWFBfREJMKUZES2FicyggZGVsdGEgKTsKIAogICAgIC8qIFdlaWdodGluZyB3aXRoIGFtcGxpdHVkZSByYXRpbyBvZiB0aGlzIGJhbmQgKi8KLSAgICByZXN1bHQgPSAoRW5lcmd5VG90YWwgPT0gRkwyRlhDT05TVF9EQkwoMC4wZikpCi0gICAgICAgICAgICA/IEZMMkZYQ09OU1RfREJMKDAuZikKLSAgICAgICAgICAgIDogRkRLc2JyRW5jX0xTSV9kaXZpZGVfc2NhbGVfZnJhY3QoIChhY2N1MSthY2N1MiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbmVyZ3lUb3RhbD4+TlJHX1NDQUxFKSsoRklYUF9EQkwpMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKU1BWFZBTF9EQkwgPj4gZml4TWluKHNjYWxlRW5lcmdpZXNbMF0sKERGUkFDVF9CSVRTLTEpKSApOworICAgIGFjY3VfZSsrOworICAgIGFjY3UxPj49MTsKKyAgICBhY2N1Mj4+PTE7CisgICAgaWYgKGFjY3VfZSAmIDEpIHsKKyAgICAgIGFjY3VfZSsrOworICAgICAgYWNjdTE+Pj0xOworICAgICAgYWNjdTI+Pj0xOworICAgIH0KIAotICAgIGRlbHRhX3N1bSArPSAoRklYUF9EQkwpKGZNdWx0KHNxcnRGaXhwKHJlc3VsdCksIGRlbHRhKSk7CisgICAgZGVsdGFfc3VtICs9IGZNdWx0KHNxcnRGaXhwKGFjY3UxK2FjY3UyKSwgZGVsdGEpOworICAgICpyZXN1bHRfZSA9ICgoYWNjdV9lPj4xKSArIExEX0RBVEFfU0hJRlQpOwogICB9CiAKKyAgZW5lcmd5VG90YWxfZSs9MTsgLyogZm9yIGEgZGVmaW5lZCBzcXVhcmUgcmVzdWx0IGV4cG9uZW50LCB0aGUgZXhwb25lbnQgaGFzIHRvIGJlIGV2ZW4gKi8KKyAgRW5lcmd5VG90YWw8PD0xOworICBkZWx0YV9zdW0gPSBmTXVsdChkZWx0YV9zdW0sIGludlNxcnROb3JtMihFbmVyZ3lUb3RhbCwgJnRtcF9lKSk7CisgICpyZXN1bHRfZSA9ICpyZXN1bHRfZSArICh0bXBfZS0oZW5lcmd5VG90YWxfZT4+MSkpOworCiAgIHJldHVybiBmTXVsdChkZWx0YV9zdW0sIHBvc193ZWlnaHQpOworCiB9CiAKIApAQCAtMTc1LDkgKzIzMSwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBcYnJpZWYgICBDYWxjdWxhdGVzIHRvdGFsIGxvd2JhbmQgZW5lcmd5CiAKLSBUaGUgcmV0dXJuIHZhbHVlIG5yZ1RvdGFsIGlzIHNjYWxlZCBieSB0aGUgZmFjdG9yICgxLzMyLjApCisgVGhlIGlucHV0IHZhbHVlcyBFbmVyZ2llc1swXSAobG93LWJhbmQpIGFyZSBzY2FsZWQgYnkgdGhlIGZhY3RvcgorIDJeKDE0LSpzY2FsZUVuZXJnaWVzWzBdKQorIFRoZSBpbnB1dCB2YWx1ZXMgRW5lcmdpZXNbMV0gKGhpZ2gtYmFuZCkgYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yCisgMl4oMTQtKnNjYWxlRW5lcmdpZXNbMV0pCiAKLSBccmV0dXJuICB0b3RhbCBlbmVyZ3kgaW4gdGhlIGxvd2JhbmQKKyBccmV0dXJuICB0b3RhbCBlbmVyZ3kgaW4gdGhlIGxvd2JhbmQsIHNjYWxlZCBieSB0aGUgZmFjdG9yIDJeMTkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgRklYUF9EQkwgYWRkTG93YmFuZEVuZXJnaWVzKEZJWFBfREJMICoqRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAqc2NhbGVFbmVyZ2llcywKQEAgLTE5NCw2ICsyNTMsNyBAQAogICBpbnQgdHMsazsKIAogICAvKiBTdW0gdXAgbG93YmFuZCBlbmVyZ3kgZnJvbSBvbmUgZnJhbWUgYXQgb2Zmc2V0IHRyYW5fb2ZmICovCisgIC8qIGZyZXFCYW5kVGFibGVbTE9SRVNdIGhhcyBNQVhfRlJFUV9DT0VGRlMvMiArMSBjb2VlZnMgbWF4LiAqLwogICBmb3IgKHRzPXRyYW5fb2ZmZGl2MjsgdHM8WUJ1ZmZlcldyaXRlT2Zmc2V0OyB0cysrKSB7CiAgICAgZm9yIChrID0gMDsgayA8IGZyZXFCYW5kVGFibGVbMF07IGsrKykgewogICAgICAgYWNjdTEgKz0gRW5lcmdpZXNbdHNdW2tdID4+IDY7CkBAIC0yMDEsMTIgKzI2MSwxMiBAQAogICB9CiAgIGZvciAoOyB0czx0cmFuX29mZmRpdjIrKHNsb3RzPj5ucmdTelNoaWZ0KTsgdHMrKykgewogICAgIGZvciAoayA9IDA7IGsgPCBmcmVxQmFuZFRhYmxlWzBdOyBrKyspIHsKLSAgICAgIGFjY3UyICs9IEVuZXJnaWVzW3RzXVtrXSA+PiA2OworICAgICAgYWNjdTIgKz0gRW5lcmdpZXNbdHNdW2tdID4+IDk7CiAgICAgfQogICB9CiAKLSAgbnJnVG90YWwgPSAoIChhY2N1MSA+PiBmaXhNaW4oc2NhbGVFbmVyZ2llc1swXSwoREZSQUNUX0JJVFMtMSkpKQotICAgICAgICAgICArICAgKGFjY3UyID4+IGZpeE1pbihzY2FsZUVuZXJnaWVzWzFdLChERlJBQ1RfQklUUy0xKSkpICkgPDwgKDIpOworICBucmdUb3RhbCA9ICggc2NhbGVWYWx1ZVNhdHVyYXRlKGFjY3UxLCAxLXNjYWxlRW5lcmdpZXNbMF0pICkKKyAgICAgICAgICAgKyAoIHNjYWxlVmFsdWVTYXR1cmF0ZShhY2N1MiwgNC1zY2FsZUVuZXJnaWVzWzFdKSApOwogCiAgIHJldHVybihucmdUb3RhbCk7CiB9CkBAIC0yMjIsMjEgKzI4MiwyMyBAQAogIGlzIDEgU0JSLWJhbmQuIFRoZXJlZm9yZSB0aGUgZGF0YSB0byBiZSBmZWQgaW50byB0aGUgc3BlY3RyYWxDaGFuZ2UKICBmdW5jdGlvbiBpcyByZWR1Y2VkLgogCi0gVGhlIHZhbHVlcyBFbmVyZ2llc00gYXJlIHNjYWxlZCBieSB0aGUgZmFjdG9yICgxLzMyLjApIGFuZCBzY2FsZUVuZXJnaWVzWzBdCi0gVGhlIHJldHVybiB2YWx1ZSBucmdUb3RhbCBpcyBzY2FsZWQgYnkgdGhlIGZhY3RvciAoMS8zMi4wKQorIFRoZSB2YWx1ZXMgRW5lcmdpZXNNIGFyZSBzY2FsZWQgYnkgdGhlIGZhY3RvciAoMl4xOS1zY2FsZUVuZXJnaWVzWzBdKSBmb3IKKyBzbG90czxZQnVmZmVyV3JpdGVPZmZzZXQgYW5kIGJ5IHRoZSBmYWN0b3IgKDJeMTktc2NhbGVFbmVyZ2llc1sxXSkgZm9yCisgc2xvdHM+PVlCdWZmZXJXcml0ZU9mZnNldC4KIAotIFxyZXR1cm4gIHRvdGFsIGVuZXJneSBpbiB0aGUgaGlnaGJhbmQKKyBccmV0dXJuICB0b3RhbCBlbmVyZ3kgaW4gdGhlIGhpZ2hiYW5kLCBzY2FsZWQgYnkgZmFjdG9yIDJeMTkKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBGSVhQX0RCTCBhZGRIaWdoYmFuZEVuZXJnaWVzKEZJWFBfREJMICoqUkVTVFJJQ1QgRW5lcmdpZXMsIC8qITwgaW5wdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAqc2NhbGVFbmVyZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklYUF9EQkwgICBFbmVyZ2llc01bTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF1bTUFYX0ZSRVFfQ09FRkZTXSwgLyohPCBDb21iaW5lZCBvdXRwdXQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVDSEFSICAgICAqUkVTVFJJQ1QgZnJlcUJhbmRUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgblNmYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgc2JyU2xvdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICAgICAgIHRpbWVTdGVwKQogewotICBJTlQgaSxqLGssc2xvdEluLHNsb3RPdXQsc2NhbGU7CisgIElOVCBpLGosayxzbG90SW4sc2xvdE91dCxzY2FsZVsyXTsKICAgSU5UIGxpLHVpOwogICBGSVhQX0RCTCBucmdUb3RhbDsKICAgRklYUF9EQkwgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwpAQCAtMjQ1LDcgKzMwNyw3IEBACiAgICAgIGNvbWJpbmUgUU1GLWJhbmRzIHRvIFNCUi1iYW5kcywKICAgICAgY29tYmluZSBMZWZ0IGFuZCBSaWdodCBjaGFubmVsICovCiAgIGZvciAoc2xvdE91dD0wOyBzbG90T3V0PHNiclNsb3RzOyBzbG90T3V0KyspIHsKLSAgICBzbG90SW4gPSAyKnNsb3RPdXQ7CisgICAgc2xvdEluID0gdGltZVN0ZXAqc2xvdE91dDsKIAogICAgIGZvciAoaj0wOyBqPG5TZmI7IGorKykgewogICAgICAgYWNjdSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwpAQCAtMjYyLDE5ICszMjQsMjkgQEAKICAgICB9CiAgIH0KIAotICBzY2FsZSA9IGZpeE1pbig4LHNjYWxlRW5lcmdpZXNbMF0pOyAgICAgIC8qIHNjYWxlIGVuZXJnaWVzIGRvd24gYmVmb3JlIGFkZCB1cCAqLworICAvKiBzY2FsZSBlbmVyZ2llcyBkb3duIGJlZm9yZSBhZGQgdXAgKi8KKyAgc2NhbGVbMF0gPSBmaXhNaW4oOCxzY2FsZUVuZXJnaWVzWzBdKTsKKyAgc2NhbGVbMV0gPSBmaXhNaW4oOCxzY2FsZUVuZXJnaWVzWzFdKTsKIAotICBpZiAoKHNjYWxlRW5lcmdpZXNbMF0tMSkgPiAoREZSQUNUX0JJVFMtMSkgKQorICBpZiAoKHNjYWxlRW5lcmdpZXNbMF0tc2NhbGVbMF0pID4gKERGUkFDVF9CSVRTLTEpIHx8IChzY2FsZUVuZXJnaWVzWzFdLXNjYWxlWzBdKSA+IChERlJBQ1RfQklUUy0xKSkKICAgICBucmdUb3RhbCA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOwogICBlbHNlIHsKICAgICAvKiBOb3cgYWRkIGFsbCBlbmVyZ2llcyAqLwogICAgIGFjY3UgPSBGTDJGWENPTlNUX0RCTCgwLjBmKTsKLSAgICBmb3IgKHNsb3RPdXQ9MDsgc2xvdE91dDxzYnJTbG90czsgc2xvdE91dCsrKSB7CisKKyAgICBmb3IgKHNsb3RPdXQ9MDsgc2xvdE91dDxZQnVmZmVyV3JpdGVPZmZzZXQ7IHNsb3RPdXQrKykgewogICAgICAgZm9yIChqPTA7IGo8blNmYjsgaisrKSB7Ci0gICAgICAgIGFjY3UgKz0gKEVuZXJnaWVzTVtzbG90T3V0XVtqXSA+PiBzY2FsZSk7CisgICAgICAgIGFjY3UgKz0gKEVuZXJnaWVzTVtzbG90T3V0XVtqXSA+PiBzY2FsZVswXSk7CiAgICAgICB9CiAgICAgfQotICAgIG5yZ1RvdGFsID0gYWNjdSA+PiAoc2NhbGVFbmVyZ2llc1swXS1zY2FsZSk7CisgICAgbnJnVG90YWwgPSBhY2N1ID4+IChzY2FsZUVuZXJnaWVzWzBdLXNjYWxlWzBdKTsKKworICAgIGZvciAoc2xvdE91dD1ZQnVmZmVyV3JpdGVPZmZzZXQ7IHNsb3RPdXQ8c2JyU2xvdHM7IHNsb3RPdXQrKykgeworICAgICAgZm9yIChqPTA7IGo8blNmYjsgaisrKSB7CisgICAgICAgIGFjY3UgKz0gKEVuZXJnaWVzTVtzbG90T3V0XVtqXSA+PiBzY2FsZVswXSk7CisgICAgICB9CisgICAgfQorICAgIG5yZ1RvdGFsID0gYWNjdSA+PiAoc2NhbGVFbmVyZ2llc1sxXS1zY2FsZVsxXSk7CiAgIH0KIAogICByZXR1cm4obnJnVG90YWwpOwpAQCAtMjk5LDE4ICszNzEsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMpCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiB0b25hbGl0eSkKIHsKICAgaWYgKHRyYW5fdmVjdG9yWzFdPT0wKSAvKiBubyB0cmFuc2llbnQgd2FzIGRldGVjdGVkICovCiAgIHsKICAgICBGSVhQX0RCTCBkZWx0YTsKLSAgICBGSVhQX0RCTCBFbmVyZ2llc01bTlVNQkVSX1RJTUVfU0xPVFNfMjMwNF1bTUFYX0ZSRVFfQ09FRkZTXTsKKyAgICBJTlQgZGVsdGFfZTsKKyAgICBGSVhQX0RCTCAoKkVuZXJnaWVzTSlbTUFYX0ZSRVFfQ09FRkZTXTsKICAgICBGSVhQX0RCTCBFbmVyZ3lUb3RhbCxuZXdMb3diYW5kRW5lcmd5LG5ld0hpZ2hiYW5kRW5lcmd5OwogICAgIElOVCBib3JkZXI7CiAgICAgSU5UIHNiclNsb3RzID0gZk11bHRJKEdldEludkludCh0aW1lU3RlcCksbm9fY29scyk7CisgICAgQ19BTExPQ19TQ1JBVENIX1NUQVJUKF9FbmVyZ2llc00sIEZJWFBfREJMLCBOVU1CRVJfVElNRV9TTE9UU18yMzA0Kk1BWF9GUkVRX0NPRUZGUykKIAogICAgIEZES19BU1NFUlQoIHNiclNsb3RzICogdGltZVN0ZXAgPT0gbm9fY29scyApOwogCisgICAgRW5lcmdpZXNNID0gKEZJWFBfREJMKCopW01BWF9GUkVRX0NPRUZGU10pX0VuZXJnaWVzTTsKKwogICAgIC8qCiAgICAgICBHZXQgTG93YmFuZC1lbmVyZ3kgb3ZlciBhIHJhbmdlIG9mIDIgZnJhbWVzIChMb29rIGhhbGYgYSBmcmFtZSBiYWNrIGFuZCBhaGVhZCkuCiAgICAgKi8KQEAgLTMyNCwxNiArNDAxLDEzIEBACiAKICAgICBuZXdIaWdoYmFuZEVuZXJneSA9IGFkZEhpZ2hiYW5kRW5lcmdpZXMoRW5lcmdpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlRW5lcmdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlCdWZmZXJXcml0ZU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcmdpZXNNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxQmFuZFRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJTbG90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVN0ZXApOwogCi0gICAgaWYgKCBoX3NiclRyYW5zaWVudERldGVjdG9yLT5mcmFtZVNoaWZ0ICE9IDAgKSB7Ci0gICAgICBpZiAodHJhbl92ZWN0b3JbMV09PTApCi0gICAgICAgIHRyYW5fdmVjdG9yWzBdID0gMDsKLSAgICB9IGVsc2UKICAgICB7CiAgICAgICAvKiBwcmV2TG93QmFuZEVuZXJneTogQ29ycmVzcG9uZHMgdG8gMSBmcmFtZSwgc3RhcnRpbmcgd2l0aCBoYWxmIGEgZnJhbWUgbG9vay1iZWhpbmQKICAgICAgICAgIG5ld0xvd2JhbmRFbmVyZ3k6ICBDb3JyZXNwb25kcyB0byAxIGZyYW1lLCBzdGFydGluZyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCkBAIC0zNDMsMjMgKzQxNywzOSBAQAogICAgICAgICAgb2YgYSBGSVhGSVgtZnJhbWUgd2l0aCAyIGVudmVsb3Blcy4gKi8KICAgICAgIGJvcmRlciA9IChzYnJTbG90cysxKSA+PiAxOwogCisgICAgICBpZiAoIChJTlQpRW5lcmd5VG90YWwmMHhmZmZmZmZlMCAmJiAoc2NhbGVFbmVyZ2llc1swXTwzMiB8fCBzY2FsZUVuZXJnaWVzWzFdPDMyKSApIC8qIGkuZS4gPiAzMSAqLyB7CiAgICAgICBkZWx0YSA9IHNwZWN0cmFsQ2hhbmdlKEVuZXJnaWVzTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVFbmVyZ2llcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5lcmd5VG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZmIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyU2xvdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiclNsb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWx0YV9lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkZWx0YSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgICAgICBkZWx0YV9lID0gMDsKIAotICAgICAgaWYgKGRlbHRhID4gKGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3RociA+PiBMRF9EQVRBX1NISUZUKSkgLyogZGVsdGEgc2NhbGVkIGJ5IDEvNjQgKi8KKyAgICAgICAgLyogc2V0IHRvbmFsaXR5IHRvIDAgd2hlbiBlbmVyZ3kgaXMgdmVyeSBsb3csIHNpbmNlIHRoZSBhbXBsaXR1ZGUKKyAgICAgICAgICAgcmVzb2x1dGlvbiBzaG91bGQgdGhlbiBiZSBsb3cgYXMgd2VsbCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgKnRvbmFsaXR5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgICB9CisKKworICAgICAgaWYgKCBmSXNMZXNzVGhhbihoX3NiclRyYW5zaWVudERldGVjdG9yLT5zcGxpdF90aHJfbSwgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+c3BsaXRfdGhyX2UsIGRlbHRhLCBkZWx0YV9lKSApIHsKICAgICAgICAgdHJhbl92ZWN0b3JbMF0gPSAxOyAvKiBTZXQgZmxhZyBmb3Igc3BsaXR0aW5nICovCi0gICAgICBlbHNlCisgICAgICB9IGVsc2UgewogICAgICAgICB0cmFuX3ZlY3RvclswXSA9IDA7CisgICAgICB9CisKICAgICB9CiAKICAgICAvKiBVcGRhdGUgcHJldkxvd0JhbmRFbmVyZ3kgKi8KICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5wcmV2TG93QmFuZEVuZXJneSA9IG5ld0xvd2JhbmRFbmVyZ3k7CiAgICAgaF9zYnJUcmFuc2llbnREZXRlY3Rvci0+cHJldkhpZ2hCYW5kRW5lcmd5ID0gbmV3SGlnaGJhbmRFbmVyZ3k7CisgICAgQ19BTExPQ19TQ1JBVENIX0VORChfRW5lcmdpZXNNLCBGSVhQX0RCTCwgTlVNQkVSX1RJTUVfU0xPVFNfMjMwNCpNQVhfRlJFUV9DT0VGRlMpCiAgIH0KIH0KIApAQCAtNjM2LDYgKzcyNiw3IEBACiAKIGludAogRkRLc2JyRW5jX0luaXRTYnJUcmFuc2llbnREZXRlY3RvcihIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UICBzYnJTeW50YXhGbGFncywgLyogU0JSIHN5bnRheCBmbGFncyBkZXJpdmVkIGZyb20gQU9ULiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgICBmcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNhbXBsZUZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNickNvbmZpZ3VyYXRpb25QdHIgcGFyYW1zLApAQCAtNjQ5LDggKzc0MCw4IEBACiB7CiAgICAgSU5UIHRvdGFsQml0cmF0ZSA9IHBhcmFtcy0+Y29kZWNTZXR0aW5ncy5zdGFuZGFyZEJpdHJhdGUgKiBwYXJhbXMtPmNvZGVjU2V0dGluZ3MubkNoYW5uZWxzOwogICAgIElOVCBjb2RlY0JpdHJhdGUgPSBwYXJhbXMtPmNvZGVjU2V0dGluZ3MuYml0UmF0ZTsKLSAgICBGSVhQX0RCTCBiaXRyYXRlRmFjdG9yX2ZpeCwgZnJhbWVkdXJfZml4OwotICAgIElOVCBzY2FsZV8wLCBzY2FsZV8xOworICAgIEZJWFBfREJMIGJpdHJhdGVGYWN0b3JfbSwgZnJhbWVkdXJfZml4OworICAgIElOVCBiaXRyYXRlRmFjdG9yX2UsIHRtcF9lOwogCiAgICAgRkRLbWVtY2xlYXIoaF9zYnJUcmFuc2llbnREZXRlY3RvcixzaXplb2YoU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUikpOwogCkBAIC02NTgsMTEgKzc0OSwxMiBAQAogICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fb2ZmID0gdHJhbl9vZmY7CiAKICAgICBpZihjb2RlY0JpdHJhdGUpIHsKLSAgICAgIGJpdHJhdGVGYWN0b3JfZml4ID0gZkRpdk5vcm0oKEZJWFBfREJMKXRvdGFsQml0cmF0ZSwgKEZJWFBfREJMKShjb2RlY0JpdHJhdGU8PDIpLCZzY2FsZV8wKTsKKyAgICAgIGJpdHJhdGVGYWN0b3JfbSA9IGZEaXZOb3JtKChGSVhQX0RCTCl0b3RhbEJpdHJhdGUsIChGSVhQX0RCTCkoY29kZWNCaXRyYXRlPDwyKSwmYml0cmF0ZUZhY3Rvcl9lKTsKKyAgICAgIGJpdHJhdGVGYWN0b3JfZSArPSAyOwogICAgIH0KICAgICBlbHNlIHsKLSAgICAgIGJpdHJhdGVGYWN0b3JfZml4ID0gRkwyRlhDT05TVF9EQkwoMS4wLzQuMCk7Ci0gICAgICBzY2FsZV8wID0gMDsKKyAgICAgIGJpdHJhdGVGYWN0b3JfbSA9IEZMMkZYQ09OU1RfREJMKDEuMC80LjApOworICAgICAgYml0cmF0ZUZhY3Rvcl9lID0gMjsKICAgICB9CiAKICAgICBmcmFtZWR1cl9maXggPSBmRGl2Tm9ybShmcmFtZVNpemUsIHNhbXBsZUZyZXEpOwpAQCAtNjc0LDkgKzc2NiwxMyBAQAogICAgIEZJWFBfREJMIHRtcCA9IGZyYW1lZHVyX2ZpeCAtIEZMMkZYQ09OU1RfREJMKDAuMDEwKTsKIAogICAgIHRtcCA9IGZpeE1heCh0bXAsIEZMMkZYQ09OU1RfREJMKDAuMDAwMSkpOwotICAgIHRtcCA9IGZEaXZOb3JtKEZMMkZYQ09OU1RfREJMKDAuMDAwMDc1KSwgZlBvdzIodG1wKSwgJnNjYWxlXzEpOworICAgIHRtcCA9IGZEaXZOb3JtKEZMMkZYQ09OU1RfREJMKDAuMDAwMDc1KSwgZlBvdzIodG1wKSwgJnRtcF9lKTsKIAotICAgIHNjYWxlXzEgPSAoc2NhbGVfMSArIHNjYWxlXzAgKyAyKTsKKyAgICBiaXRyYXRlRmFjdG9yX2UgPSAodG1wX2UgKyBiaXRyYXRlRmFjdG9yX2UpOworCisgIGlmKHNiclN5bnRheEZsYWdzICYgU0JSX1NZTlRBWF9MT1dfREVMQVkpIHsKKyAgICBiaXRyYXRlRmFjdG9yX2UtLTsgLyogZGl2aWRlIGJ5IDIgKi8KKyAgfQogCiAgICAgRkRLX0FTU0VSVChub19jb2xzIDw9IFFNRl9NQVhfVElNRV9TTE9UUyk7CiAgICAgRkRLX0FTU0VSVChub19yb3dzIDw9IFFNRl9DSEFOTkVMUyk7CkBAIC02ODQsNyArNzgwLDggQEAKICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5ub19jb2xzID0gbm9fY29sczsKICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT50cmFuX3RociA9IChGSVhQX0RCTCkoKHBhcmFtcy0+dHJhbl90aHIgPDwgKDMyLTI0LTEpKSAvIG5vX3Jvd3MpOwogICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5fZmMgPSB0cmFuX2ZjOwotICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnNwbGl0X3RociA9IHNjYWxlVmFsdWVTYXR1cmF0ZShmTXVsdCh0bXAsIGJpdHJhdGVGYWN0b3JfZml4KSwgc2NhbGVfMSk7ICAgICAKKyAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5zcGxpdF90aHJfbSA9IGZNdWx0KHRtcCwgYml0cmF0ZUZhY3Rvcl9tKTsKKyAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5zcGxpdF90aHJfZSA9IGJpdHJhdGVGYWN0b3JfZTsKICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5ub19yb3dzID0gbm9fcm93czsKICAgICBoX3NiclRyYW5zaWVudERldGVjdG9yLT5tb2RlID0gcGFyYW1zLT50cmFuX2RldF9tb2RlOwogICAgIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3ItPnByZXZMb3dCYW5kRW5lcmd5ID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CkBAIC02OTIsMyArNzg5LDI4MSBAQAogICAgIHJldHVybiAoMCk7CiB9CiAKKworI2RlZmluZSBFTkVSR1lfU0NBTElOR19TSVpFIDMyCisKK0lOVCBGREtzYnJFbmNfSW5pdFNickZhc3RUcmFuc2llbnREZXRlY3RvcigKKyAgICAgICAgSEFORExFX0ZBU1RfVFJBTl9ERVQgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCisgICAgICAgIGNvbnN0IElOVCB0aW1lX3Nsb3RzX3Blcl9mcmFtZSwKKyAgICAgICAgY29uc3QgSU5UIGJhbmR3aWR0aF9xbWZfc2xvdCwKKyAgICAgICAgY29uc3QgSU5UIG5vX3FtZl9jaGFubmVscywKKyAgICAgICAgY29uc3QgSU5UIHNicl9xbWZfMXN0X2JhbmQKKyAgICAgICAgKQoreworCisgIGludCBpLCBlOworICBpbnQgYnVmZl9zaXplOworICBGSVhQX0RCTCBteUV4cDsKKyAgRklYUF9EQkwgbXlFeHBTbG90OworCisgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5sb29rYWhlYWQgPSBUUkFOX0RFVF9MT09LQUhFQUQ7CisgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5uVGltZVNsb3RzID0gdGltZV9zbG90c19wZXJfZnJhbWU7CisKKyAgYnVmZl9zaXplID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPm5UaW1lU2xvdHMgKyBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG9va2FoZWFkOworCisgIGZvcihpPTA7IGk8IGJ1ZmZfc2l6ZTsgaSsrKSB7CisgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRlbHRhX2VuZXJneVtpXSA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5lbmVyZ3lfdGltZVNsb3RzW2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmxvd3Bhc3NfZW5lcmd5W2ldID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5zaWVudENhbmRpZGF0ZXNbaV0gPSAwOworICB9CisKKyAgRkRLX0FTU0VSVChiYW5kd2lkdGhfcW1mX3Nsb3QgPiAwLmYpOworICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgID0gZk1pbihUUkFOX0RFVF9TVE9QX0ZSRVEvYmFuZHdpZHRoX3FtZl9zbG90LCBub19xbWZfY2hhbm5lbHMpOworICBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RhcnRCYW5kID0gZk1pbihzYnJfcW1mXzFzdF9iYW5kLCBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+c3RvcEJhbmQgLSBUUkFOX0RFVF9NSU5fUU1GQkFORFMpOworCisgIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA8IG5vX3FtZl9jaGFubmVscyk7CisgIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA8IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCk7CisgIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA+IDEpOworICBGREtfQVNTRVJUKGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZCA+IDEpOworCisgIC8qIHRoZSBlbmVyZ3kgd2VpZ2h0aW5nIGFuZCBhZGRpbmcgdXAgaGFzIGEgaGVhZHJvb20gb2YgNiBCaXRzLAorICAgICBzbyB1cCB0byA2NCBiYW5kcyBjYW4gYmUgYWRkZWQgd2l0aG91dCBwb3RlbnRpYWwgb3ZlcmZsb3cuICovCisgIEZES19BU1NFUlQoaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0b3BCYW5kIC0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZCA8PSA2NCk7CisKKyAgLyogUU1GX0hQX2RCX1NMT1BFX0ZJWCBzYXlzIHRoYXQgd2Ugd2FudCBhIDIwIGRCIHBlciAxNiBrSHogSFAgZmlsdGVyLgorICAgICBUaGUgZm9sbG93aW5nIGxpbmVzIG1hcCB0aGlzIHRvIHRoZSBRTUYgYmFuZHdpZHRoLiAqLworICAjZGVmaW5lIEVYUF9FIDcgLyogUU1GX0NIQU5ORUxTICg9NjQpIG11bHRpcGxpY2F0aW9ucyBtYXgsIG1heC4gYWxsb3dlZCBzdW0gaXMgMC41ICovCisgIG15RXhwID0gZk11bHROb3JtKFFNRl9IUF9kQmRfU0xPUEVfRklYLCAoRklYUF9EQkwpYmFuZHdpZHRoX3FtZl9zbG90LCAmZSk7CisgIG15RXhwID0gc2NhbGVWYWx1ZVNhdHVyYXRlKG15RXhwLCBlKzArREZSQUNUX0JJVFMtMS1FWFBfRSk7CisgIG15RXhwU2xvdCA9IG15RXhwOworCisgIGZvcihpPTA7IGk8UU1GX0NIQU5ORUxTOyBpKyspeworICAgIC8qIENhbGN1bGF0ZSBkQmYgb3ZlciBhbGwgcW1mIGJhbmRzOgorICAgICAgIGRCZiA9ICgxMF4oMC4wMDIyNjZmLzEwKmJ3KHNsb3QpKSleKGJhbmQpID0KKyAgICAgICAgICAgPSAyXihsb2cyKDEwKSowLjAwMjI2NmYvMTAqYncoc2xvdCkqYmFuZCkgPQorICAgICAgICAgICA9IDJeKDAuMDAwNzUyNzVmKmJ3KHNsb3QpKmJhbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgRklYUF9EQkwgZEJmX207ICAgICAgICAvKiBkQmYgbWFudGlzc2EgICAgICAgICovCisgICAgSU5UIGRCZl9lOyAgICAgICAgICAgICAvKiBkQmYgZXhwb25lbnQgICAgICAgICovCisgICAgSU5UIHRtcDsKKworICAgIElOVCBkQmZfaW50OyAgICAgICAgICAgLyogZEJmIGludGVnZXIgcGFydCAgICAqLworICAgIEZJWFBfREJMIGRCZl9mcmFjdDsgICAgLyogZEJmIGZyYWN0aW9uYWwgcGFydCAqLworCisgICAgLyogbXlFeHAqKGkrMSkgPSBteUV4cF9pbnQgLSBteUV4cF9mcmFjdAorICAgICAgIG15RXhwKihpKzEpIGlzIHNwbGl0IHVwIGhlcmUgZm9yIGJldHRlciBhY2N1cmFjeSBvZiBDYWxjSW52TGREYXRhKCksCisgICAgICAgZm9yIGl0cyByZXN1bHQgY2FuIGJlIHNwbGl0IHVwIGludG8gYW4gaW50ZWdlciBhbmQgYSBmcmFjdGlvbmFsIHBhcnQgKi8KKworICAgIC8qIFJvdW5kIHVwIHRvIG5leHQgaW50ZWdlciAqLworICAgIEZJWFBfREJMIG15RXhwX2ludCAgID0gKG15RXhwU2xvdCAmIChGSVhQX0RCTCkweGZlMDAwMDAwKSArIChGSVhQX0RCTCkweDAyMDAwMDAwOworCisgICAgLyogVGhpcyBpcyB0aGUgZnJhY3Rpb25hbCBwYXJ0IHRoYXQgbmVlZHMgdG8gYmUgc3Vic3RyYWN0ZWQgKi8KKyAgICBGSVhQX0RCTCBteUV4cF9mcmFjdCA9IG15RXhwX2ludCAtIG15RXhwU2xvdDsKKworICAgIC8qIENhbGMgaW50ZWdlciBwYXJ0ICovCisgICAgZEJmX2ludCAgID0gQ2FsY0ludkxkRGF0YShteUV4cF9pbnQpOworICAgIC8qIFRoZSByZXN1bHQgbmVlZHMgdG8gYmUgcmUtc2NhbGVkLiBUaGUgbGQobXlFeHBfaW50KSBoYWQgYmVlbiBzY2FsZWQgYnkgRVhQX0UsCisgICAgICAgdGhlIENhbGNJbnZMZERhdGEgZXhwZWN0cyB0aGUgb3BlcmFuZCB0byBiZSBzY2FsZWQgYnkgTERfREFUQV9TSElGVC4KKyAgICAgICBUaGVyZWZvcmUsIHRoZSBjb3JyZWN0bHkgc2NhbGVkIHJlc3VsdCBpcyBkQmZfaW50XigyXihFWFBfRS1MRF9EQVRBX1NISUZUKSksCisgICAgICAgd2hpY2ggaXMgZEJmX2ludF4yICovCisgICAgZEJmX2ludCAgKj0gZEJmX2ludDsKKworICAgIC8qIENhbGMgZnJhY3Rpb25hbCBwYXJ0ICovCisgICAgZEJmX2ZyYWN0ID0gQ2FsY0ludkxkRGF0YSgtbXlFeHBfZnJhY3QpOworICAgIC8qIFRoZSByZXN1bHQgbmVlZHMgdG8gYmUgcmUtc2NhbGVkLiBUaGUgbGQobXlFeHBfZnJhY3QpIGhhZCBiZWVuIHNjYWxlZCBieSBFWFBfRSwKKyAgICAgICB0aGUgQ2FsY0ludkxkRGF0YSBleHBlY3RzIHRoZSBvcGVyYW5kIHRvIGJlIHNjYWxlZCBieSBMRF9EQVRBX1NISUZULgorICAgICAgIFRoZXJlZm9yZSwgdGhlIGNvcnJlY3RseSBzY2FsZWQgcmVzdWx0IGlzIGRCZl9mcmFjdF4oMl4oRVhQX0UtTERfREFUQV9TSElGVCkpLAorICAgICAgIHdoaWNoIGlzIGRCZl9mcmFjdF4yICovCisgICAgZEJmX2ZyYWN0ID0gZk11bHROb3JtKGRCZl9mcmFjdCwgZEJmX2ZyYWN0LCAmdG1wKTsKKworICAgIC8qIEdldCB3b3JzdCBjYXNlIHNjYWxpbmcgb2YgbXVsdGlwbGljYXRpb24gcmVzdWx0ICovCisgICAgZEJmX2UgPSAoREZSQUNUX0JJVFMtMSAtIHRtcCkgLSBDb3VudExlYWRpbmdCaXRzKGRCZl9pbnQpOworCisgICAgLyogTm93IG11bHRpcGx5IGludGVnZXIgd2l0aCBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIHJlc3VsdCwgdGh1cyByZXN1bHRpbmcKKyAgICAgICBpbiB0aGUgb3ZlcmFsbCBhY2N1cmF0ZSBmcmFjdGlvbmFsIHJlc3VsdCAqLworICAgIGRCZl9tID0gZk11bHROb3JtKGRCZl9pbnQsIGRCZl9mcmFjdCwgJmUpOworICAgIGRCZl9tID0gc2NhbGVWYWx1ZVNhdHVyYXRlKGRCZl9tLCBlK0RGUkFDVF9CSVRTLTErdG1wLWRCZl9lKTsKKyAgICBteUV4cFNsb3QgKz0gbXlFeHA7CisKKyAgICAvKiBLZWVwIHRoZSByZXN1bHRzICovCisgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9tW2ldID0gZEJmX207CisgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9lW2ldID0gZEJmX2U7CisKKyAgfQorCisgIC8qIE1ha2Ugc3VyZSB0aGF0IGRCZiBpcyBncmVhdGVyIHRoYW4gMS4wIChiZWNhdXNlIGl0IHNob3VsZCBiZSBhIGhpZ2hwYXNzKSAqLworICAvKiAuLi4gKi8KKworICByZXR1cm4gMDsKK30KKwordm9pZCBGREtzYnJFbmNfZmFzdFRyYW5zaWVudERldGVjdCgKKyAgICAgICAgY29uc3QgSEFORExFX0ZBU1RfVFJBTl9ERVQgICAgICAgICAgaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IsCisgICAgICAgIGNvbnN0IEZJWFBfREJMICAgICAgICAgICAgICAqY29uc3QgKkVuZXJnaWVzLAorICAgICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICAgKmNvbnN0ICBzY2FsZUVuZXJnaWVzLAorICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICBZQnVmZmVyV3JpdGVPZmZzZXQsCisgICAgICAgICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAqY29uc3QgIHRyYW5fdmVjdG9yCisgICAgICAgICkKK3sKKyAgaW50IHRpbWVTbG90LCBiYW5kOworCisgIEZJWFBfREJMIG1heF9kZWx0YV9lbmVyZ3k7ICAgLyogaGVscGVyIHRvIHN0b3JlIG1heGltdW0gZW5lcmd5IHJhdGlvICAgICAgICAgICovCisgIGludCBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlOyAgLyogaGVscGVyIHRvIHN0b3JlIHNjYWxlIG9mIG1heGltdW0gZW5lcmd5IHJhdGlvICovCisgIGludCBpbmRfbWF4ICAgICAgICAgICAgID0gMDsgLyogaGVscGVyIHRvIHN0b3JlIGluZGV4IG9mIG1heGltdW0gZW5lcmd5IHJhdGlvICovCisgIGludCBpc1RyYW5zaWVudEluRnJhbWUgID0gMDsKKworICBjb25zdCBpbnQgblRpbWVTbG90cyAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPm5UaW1lU2xvdHM7CisgIGNvbnN0IGludCBsb29rYWhlYWQgICAgICAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+bG9va2FoZWFkOworICBjb25zdCBpbnQgc3RhcnRCYW5kICAgICAgICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnN0YXJ0QmFuZDsKKyAgY29uc3QgaW50IHN0b3BCYW5kICAgICAgICAgICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5zdG9wQmFuZDsKKworICBpbnQgKiB0cmFuc2llbnRDYW5kaWRhdGVzICAgID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPnRyYW5zaWVudENhbmRpZGF0ZXM7CisKKyAgRklYUF9EQkwgKiBlbmVyZ3lfdGltZVNsb3RzICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5lbmVyZ3lfdGltZVNsb3RzOworICBpbnQgKiBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlID0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmVuZXJneV90aW1lU2xvdHNfc2NhbGU7CisKKyAgRklYUF9EQkwgKiBkZWx0YV9lbmVyZ3kgICAgICA9IGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLT5kZWx0YV9lbmVyZ3k7CisgIGludCAqIGRlbHRhX2VuZXJneV9zY2FsZSAgICAgPSBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZGVsdGFfZW5lcmd5X3NjYWxlOworCisgIGNvbnN0IEZJWFBfREJMIHRociAgICAgICAgICAgPSBUUkFOX0RFVF9USFJTSExEOworICBjb25zdCBJTlQgICAgICB0aHJfc2NhbGUgICAgID0gVFJBTl9ERVRfVEhSU0hMRF9TQ0FMRTsKKworICAvKnJlc2V0IHRyYW5zaWVudCBpbmZvKi8KKyAgdHJhbl92ZWN0b3JbMl0gPSAwOworCisgIC8qIHJlc2V0IHRyYW5zaWVudCBjYW5kaWRhdGVzICovCisgIEZES21lbWNsZWFyKHRyYW5zaWVudENhbmRpZGF0ZXMrbG9va2FoZWFkLCBuVGltZVNsb3RzKnNpemVvZihpbnQpKTsKKworICBmb3IodGltZVNsb3QgPSBsb29rYWhlYWQ7IHRpbWVTbG90IDwgblRpbWVTbG90cyArIGxvb2thaGVhZDsgdGltZVNsb3QrKykgeworICAgIGludCBpLCBub3JtOworICAgIEZJWFBfREJMIHRtcEUgICAgICAgICAgID0gRkwyRlhDT05TVF9EQkwoMC4wZik7CisgICAgaW50IGhlYWRyb29tRW5TbG90ICAgICAgPSBERlJBQ1RfQklUUy0xOworCisgICAgRklYUF9EQkwgc21hbGxOUkcgPSBGTDJGWENPTlNUX0RCTCgxZS0yZik7CisgICAgRklYUF9EQkwgZGVub21pbmF0b3I7CisgICAgSU5UIGRlbm9taW5hdG9yX3NjYWxlOworCisgICAgLyogZGV0ZXJtaW5lIG1pbmltdW0gaGVhZHJvb20gb2YgZW5lcmd5IHZhbHVlcyBmb3IgdGhpcyB0aW1lc2xvdCAqLworICAgIGZvcihiYW5kID0gc3RhcnRCYW5kOyBiYW5kIDwgc3RvcEJhbmQ7IGJhbmQrKykgeworICAgICAgaW50IHRtcF9oZWFkcm9vbSA9IGZOb3JteihFbmVyZ2llc1t0aW1lU2xvdF1bYmFuZF0pLTE7CisgICAgICBpZih0bXBfaGVhZHJvb20gPCBoZWFkcm9vbUVuU2xvdCl7CisgICAgICAgIGhlYWRyb29tRW5TbG90ID0gdG1wX2hlYWRyb29tOworICAgICAgfQorICAgIH0KKworICAgIGZvcihpID0gMCwgYmFuZCA9IHN0YXJ0QmFuZDsgYmFuZCA8IHN0b3BCYW5kOyBiYW5kKyssIGkrKykgeworICAgICAgLyogZW5lcmd5IGlzIHdlaWdodGVkIGJ5IHdlaWdodGluZ2ZhY3RvciBzdG9yZWQgaW4gZEJmX20gYXJyYXkgKi8KKyAgICAgIC8qIGRCZl9tIGluZGV4IHJ1bnMgZnJvbSAwIHRvIHN0b3BCYW5kLXN0YXJ0YmFuZCAgICAgICAgICAgICAgICovCisgICAgICAvKiBlbmVyZ3kgc2hpZnRlZCBieSBjYWxjdWxhdGVkIGhlYWRyb29tIGZvciBtYXhpbXVtIHByZWNpc2lvbiAqLworICAgICAgRklYUF9EQkwgd2VpZ2h0ZWRFbmVyZ3kgPSBmTXVsdChFbmVyZ2llc1t0aW1lU2xvdF1bYmFuZF08PGhlYWRyb29tRW5TbG90LCBoX3NickZhc3RUcmFuc2llbnREZXRlY3Rvci0+ZEJmX21baV0pOworCisgICAgICAvKiBlbmVyZ3kgaXMgYWRkZWQgdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgLyogc2hpZnQgYnkgNiB0byBoYXZlIGEgaGVhZHJvb20gZm9yIG1heGltdW0gNjQgYWRkaXRpb25zICAgICAgICAgICAgKi8KKyAgICAgIC8qIHNoaWZ0IGJ5IGRCZl9lIHRvIGhhbmRsZSB3ZWlnaHRpbmcgZmFjdG9yIGRlcGVuZGVudCBzY2FsZSBmYWN0b3JzICovCisgICAgICB0bXBFICs9IHdlaWdodGVkRW5lcmd5ID4+ICg2ICsgKDEwIC0gaF9zYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3ItPmRCZl9lW2ldKSk7CisgICAgfQorCisgICAgLyogc3RvcmUgY2FsY3VsYXRlZCBlbmVyZ3kgZm9yIHRpbWVzbG90ICovCisgICAgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdF0gPSB0bXBFOworCisgICAgLyogY2FsY3VsYXRlIG92ZXJhbGwgc2NhbGUgZmFjdG9yIGZvciBlbmVyZ3kgb2YgdGhpcyB0aW1lc2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qID0gICBvcmlnaW5hbCBzY2FsZSBmYWN0b3Igb2YgZW5lcmdpZXMgKC1zY2FsZUVuZXJnaWVzWzBdKzIqUU1GX1NDQUxFX09GRlNFVCBvciAtc2NhbGVFbmVyZ2llc1sxXSsyKlFNRl9TQ0FMRV9PRkZTRVQgICAgKi8KKyAgICAvKiAgICAgZGVwZW5kaW5nIG9uIFlCdWZmZXJXcml0ZU9mZnNldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogICArIHdlaWdodGluZyBmYWN0b3Igc2NhbGUgICAgICAgICAgICAoMTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICAgKyBhZGRpbmcgdXAgc2NhbGUgZmFjdG9yICAgICAgICAgICAgKCA2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAgIC0gaGVhZHJvb20gb2YgZW5lcmd5IHZhbHVlICAgICAgICAgIChoZWFkcm9vbUVuU2xvdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaWYodGltZVNsb3QgPCBZQnVmZmVyV3JpdGVPZmZzZXQpeworICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdF0gPSAoLXNjYWxlRW5lcmdpZXNbMF0rMipRTUZfU0NBTEVfT0ZGU0VUKSArICgxMCs2KSAtIGhlYWRyb29tRW5TbG90OworICAgIH0gZWxzZSB7CisgICAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSA9ICgtc2NhbGVFbmVyZ2llc1sxXSsyKlFNRl9TQ0FMRV9PRkZTRVQpICsgKDEwKzYpIC0gaGVhZHJvb21FblNsb3Q7CisgICAgfQorCisgICAgLyogQWRkIGEgc21hbGwgZW5lcmd5IHRvIHRoZSBkZW5vbWluYXRvciwgdGh1cyBtYWtpbmcgdGhlIHRyYW5zaWVudAorICAgICAgIGRldGVjdGlvbiBlbmVyZ3ktZGVwZW5kZW50LiBMb3VkIHRyYW5zaWVudHMgYXJlIGJlaW5nIGRldGVjdGVkLAorICAgICAgIHNpbGVudCBvbmVzIG5vdC4gKi8KKworICAgIC8qIG1ha2Ugc3VyZSB0aGF0IHNtYWxsTlJHIGRvZXMgbm90IG92ZXJmbG93ICovCisgICAgaWYgKCAtZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0xXSArIDEgPiA1ICkKKyAgICB7CisgICAgICBkZW5vbWluYXRvciA9IHNtYWxsTlJHOworICAgICAgZGVub21pbmF0b3Jfc2NhbGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAvKiBMZWF2ZSBhbiBhZGRpdGlvbmFsIGhlYWRyb29tIG9mIDEgYml0IGZvciB0aGlzIGFkZGl0aW9uLiAqLworICAgICAgc21hbGxOUkcgPSBzY2FsZVZhbHVlKHNtYWxsTlJHLCAtKGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3QtMV0gKyAxKSk7CisgICAgICBkZW5vbWluYXRvciA9IChlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90LTFdPj4xKSArIHNtYWxsTlJHOworICAgICAgZGVub21pbmF0b3Jfc2NhbGUgPSBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90LTFdKzE7CisgICAgfQorCisgICAgZGVsdGFfZW5lcmd5W3RpbWVTbG90XSA9IGZEaXZOb3JtKGVuZXJneV90aW1lU2xvdHNbdGltZVNsb3RdLCBkZW5vbWluYXRvciwgJm5vcm0pOworICAgIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0gPSBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSAtIGRlbm9taW5hdG9yX3NjYWxlICsgbm9ybTsKKyAgfQorCisgIC8qZ2V0IHRyYW5zaWVudCBjYW5kaWRhdGVzKi8KKyAgLyogRm9yIGV2ZXJ5IHRpbWVzbG90LCBjaGVjayBpZiBkZWx0YShFKSBleGNlZWRzIHRoZSB0aHJlc2hvbGQuIElmIGl0IGRpZCwKKyAgICAgaXQgY291bGQgcG90ZW50aWFsbHkgYmUgbWFya2VkIGFzIGEgdHJhbnNpZW50IGNhbmRpZGF0ZS4gSG93ZXZlciwgdGhlIDIKKyAgICAgc2xvdHMgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSBtdXN0IG5vdCBiZSB0cmFuc2llbnRzIHdpdGggYW4gZW5lcmd5IGhpZ2hlcgorICAgICB0aGFuIDEuNCpFKGN1cnJlbnQpLiBJZiBib3RoIGFyZW4ndCB0cmFuc2llbnRzIG9yIGlmIHRoZSBlbmVyZ3kgb2YgdGhlCisgICAgIGN1cnJlbnQgdGltZXNvbG90IGlzIG1vcmUgdGhhbiAxLjQgdGltZXMgaGlnaGVyIHRoYW4gdGhlIGVuZXJneSBpbiB0aGUKKyAgICAgbGFzdCBvciB0aGUgb25lIGJlZm9yZSB0aGUgbGFzdCBzbG90LCBpdCBpcyBtYXJrZWQgYXMgYSB0cmFuc2llbnQuKi8KKworICBGREtfQVNTRVJUKGxvb2thaGVhZCA+PSAyKTsKKyAgZm9yKHRpbWVTbG90ID0gbG9va2FoZWFkOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKKyAgICBGSVhQX0RCTCBlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQgPSBmTXVsdChlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSxGTDJGWENPTlNUX0RCTCgxLjBmLzEuNGYpKTsKKyAgICBpZiggIWZJc0xlc3NUaGFuKGRlbHRhX2VuZXJneVt0aW1lU2xvdF0sIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0sIHRociwgdGhyX3NjYWxlKSAmJgorICAgICAgICAoICgodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdC0yXT09MCkgJiYgKHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3QtMV09PTApKSB8fAorICAgICAgICAgICFmSXNMZXNzVGhhbihlbmVyZ3lfY3VyX3Nsb3Rfd2VpZ2h0ZWQsIGVuZXJneV90aW1lU2xvdHNfc2NhbGVbdGltZVNsb3RdLCBlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90LTFdLCBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90LTFdICkgfHwKKyAgICAgICAgICAhZklzTGVzc1RoYW4oZW5lcmd5X2N1cl9zbG90X3dlaWdodGVkLCBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSwgZW5lcmd5X3RpbWVTbG90c1t0aW1lU2xvdC0yXSwgZW5lcmd5X3RpbWVTbG90c19zY2FsZVt0aW1lU2xvdC0yXSApCisgICAgICAgICkKKyAgICAgICkKK3sKKyAgICAgIC8qIGluIGNhc2Ugb2Ygc3Ryb25nIHRyYW5zaWVudHMsIHN1YnNlcXVlbnQKKyAgICAgICAqIHFtZiBzbG90cyBtaWdodCBiZSByZWNvZ25pemVkIGFzIHRyYW5zaWVudHMuICovCisgICAgICB0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSA9IDE7CisgICAgfQorICB9CisKKyAgLypnZXQgdHJhbnNpZW50IHdpdGggbWF4IGVuZXJneSovCisgIG1heF9kZWx0YV9lbmVyZ3kgICA9IEZMMkZYQ09OU1RfREJMKDAuMGYpOworICBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlID0gMDsKKyAgaW5kX21heCA9IDA7CisgIGlzVHJhbnNpZW50SW5GcmFtZSA9IDA7CisgIGZvcih0aW1lU2xvdCA9IDA7IHRpbWVTbG90IDwgblRpbWVTbG90czsgdGltZVNsb3QrKykgeworICAgIGludCBzY2FsZSA9IGZNYXgoZGVsdGFfZW5lcmd5X3NjYWxlW3RpbWVTbG90XSwgbWF4X2RlbHRhX2VuZXJneV9zY2FsZSk7CisgICAgaWYodHJhbnNpZW50Q2FuZGlkYXRlc1t0aW1lU2xvdF0gJiYgKCAoZGVsdGFfZW5lcmd5W3RpbWVTbG90XSA+PiAoc2NhbGUgLSBkZWx0YV9lbmVyZ3lfc2NhbGVbdGltZVNsb3RdKSkgPiAobWF4X2RlbHRhX2VuZXJneSA+PiAoc2NhbGUgLSBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlKSkgKSApIHsKKyAgICAgIG1heF9kZWx0YV9lbmVyZ3kgICA9IGRlbHRhX2VuZXJneVt0aW1lU2xvdF07CisgICAgICBtYXhfZGVsdGFfZW5lcmd5X3NjYWxlID0gc2NhbGU7CisgICAgICBpbmRfbWF4ICAgICAgICAgICAgPSB0aW1lU2xvdDsKKyAgICAgIGlzVHJhbnNpZW50SW5GcmFtZSA9IDE7CisgICAgfQorICB9CisKKyAgLypmcm9tIGFsbCB0cmFuc2llbnQgY2FuZGlkYXRlcyB0YWtlIHRoZSBvbmUgd2l0aCB0aGUgYmlnZ2VzdCBlbmVyZ3kqLworICBpZihpc1RyYW5zaWVudEluRnJhbWUpIHsKKyAgICB0cmFuX3ZlY3RvclswXSA9IGluZF9tYXg7CisgICAgdHJhbl92ZWN0b3JbMV0gPSAxOworICB9IGVsc2UgeworICAgIC8qcmVzZXQgdHJhbnNpZW50IGluZm8qLworICAgIHRyYW5fdmVjdG9yWzBdID0gdHJhbl92ZWN0b3JbMV0gPSAwOworICB9CisKKyAgLypjaGVjayBmb3IgdHJhbnNpZW50cyBpbiBsb29rYWhlYWQqLworICBmb3IodGltZVNsb3QgPSBuVGltZVNsb3RzOyB0aW1lU2xvdCA8IG5UaW1lU2xvdHMgKyBsb29rYWhlYWQ7IHRpbWVTbG90KyspIHsKKyAgICBpZih0cmFuc2llbnRDYW5kaWRhdGVzW3RpbWVTbG90XSkgeworICAgICAgdHJhbl92ZWN0b3JbMl0gPSAxOworICAgIH0KKyAgfQorCisgIC8qdXBkYXRlIGJ1ZmZlcnMqLworICBmb3IodGltZVNsb3QgPSAwOyB0aW1lU2xvdCA8IGxvb2thaGVhZDsgdGltZVNsb3QrKykgeworICAgIHRyYW5zaWVudENhbmRpZGF0ZXNbdGltZVNsb3RdID0gdHJhbnNpZW50Q2FuZGlkYXRlc1tuVGltZVNsb3RzICsgdGltZVNsb3RdOworCisgICAgLyogZml4cG9pbnQgc3R1ZmYgKi8KKyAgICBlbmVyZ3lfdGltZVNsb3RzW3RpbWVTbG90XSAgICA9IGVuZXJneV90aW1lU2xvdHNbblRpbWVTbG90cyArIHRpbWVTbG90XTsKKyAgICBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW3RpbWVTbG90XSAgPSBlbmVyZ3lfdGltZVNsb3RzX3NjYWxlW25UaW1lU2xvdHMgKyB0aW1lU2xvdF07CisKKyAgICBkZWx0YV9lbmVyZ3lbdGltZVNsb3RdICAgICA9IGRlbHRhX2VuZXJneVtuVGltZVNsb3RzICsgdGltZVNsb3RdOworICAgIGRlbHRhX2VuZXJneV9zY2FsZVt0aW1lU2xvdF0gICA9IGRlbHRhX2VuZXJneV9zY2FsZVtuVGltZVNsb3RzICsgdGltZVNsb3RdOworICB9Cit9CisKZGlmZiAtLWdpdCBhL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuaCBiL2xpYlNCUmVuYy9zcmMvdHJhbl9kZXQuaAppbmRleCA5NWI1ZDJlLi42ZmUxMDIzIDEwMDY0NAotLS0gYS9saWJTQlJlbmMvc3JjL3RyYW5fZGV0LmgKKysrIGIvbGliU0JSZW5jL3NyYy90cmFuX2RldC5oCkBAIC0yLDcgKzIsNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIFNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAogCi2pIENvcHlyaWdodCAgMTk5NSAtIDIwMTMgRnJhdW5ob2Zlci1HZXNlbGxzY2hhZnQgenVyIEb2cmRlcnVuZyBkZXIgYW5nZXdhbmR0ZW4gRm9yc2NodW5nIGUuVi4KK6kgQ29weXJpZ2h0ICAxOTk1IC0gMjAxNSBGcmF1bmhvZmVyLUdlc2VsbHNjaGFmdCB6dXIgRvZyZGVydW5nIGRlciBhbmdld2FuZHRlbiBGb3JzY2h1bmcgZS5WLgogICBBbGwgcmlnaHRzIHJlc2VydmVkLgogCiAgMS4gICAgSU5UUk9EVUNUSU9OCkBAIC05Niw3ICs5Niw4IEBACiAgIEZJWFBfREJMICB0cmFuc2llbnRzW1FNRl9NQVhfVElNRV9TTE9UUysoUU1GX01BWF9USU1FX1NMT1RTLzIpXTsKICAgRklYUF9EQkwgIHRocmVzaG9sZHNbUU1GX0NIQU5ORUxTXTsKICAgRklYUF9EQkwgIHRyYW5fdGhyOyAgICAgICAgICAgICAgLyogTWFzdGVyIHRocmVzaG9sZCBmb3IgdHJhbnNpZW50IHNpZ25hbHMgKi8KLSAgRklYUF9EQkwgIHNwbGl0X3RocjsgICAgICAgICAgICAgLyogVGhyZXNob2xkIGZvciBzcGxpdHRpbmcgRklYRklYLWZyYW1lcyBpbnRvIDIgZW52ICovCisgIEZJWFBfREJMICBzcGxpdF90aHJfbTsgICAgICAgICAgIC8qIFRocmVzaG9sZCBmb3Igc3BsaXR0aW5nIEZJWEZJWC1mcmFtZXMgaW50byAyIGVudiAqLworICBJTlQgICAgICAgc3BsaXRfdGhyX2U7ICAgICAgICAgICAvKiBTY2FsZSBmb3Igc3BsaXR0aW5nIHRocmVzaG9sZCAqLwogICBGSVhQX0RCTCAgcHJldkxvd0JhbmRFbmVyZ3k7ICAgICAvKiBFbmVyZ3kgb2YgbG93IGJhbmQgKi8KICAgRklYUF9EQkwgIHByZXZIaWdoQmFuZEVuZXJneTsgICAgLyogRW5lcmd5IG9mIGhpZ2ggYmFuZCAqLwogICBJTlQgICAgdHJhbl9mYzsgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbG93YmFuZCBzdWJiYW5kcyB0byBkaXNjYXJkICAqLwpAQCAtMTEyLDYgKzExMyw1NyBAQAogCiB0eXBlZGVmIFNCUl9UUkFOU0lFTlRfREVURUNUT1IgKkhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SOwogCisjZGVmaW5lIFRSQU5fREVUX0xPT0tBSEVBRCAyCisjZGVmaW5lIFRSQU5fREVUX1NUQVJUX0ZSRVEgNDUwMCAgLypzdGFydCBmcmVxdWVuY3kgZm9yIHRyYW5zaWVudCBkZXRlY3Rpb24qLworI2RlZmluZSBUUkFOX0RFVF9TVE9QX0ZSRVEgIDEzNTAwIC8qc3RvcCBmcmVxdWVuY3kgZm9yIHRyYW5zaWVudCBkZXRlY3Rpb24qLworI2RlZmluZSBUUkFOX0RFVF9NSU5fUU1GQkFORFMgNCAvKiBtaW5pbXVtIHFtZiBiYW5kcyBmb3IgdHJhbnNpZW50IGRldGVjdGlvbiAqLworI2RlZmluZSBRTUZfSFBfZEJkX1NMT1BFX0ZJWCBGTDJGWENPTlNUX0RCTCgwLjAwMDc1Mjc1ZikgLyogMC4wMDIyNjZmLzEwICogbG9nMigxMCkgKi8KKyNkZWZpbmUgVFJBTl9ERVRfVEhSU0hMRCBGTDJGWENPTlNUX0RCTCgzLjJmLzQuZikKKyNkZWZpbmUgVFJBTl9ERVRfVEhSU0hMRF9TQ0FMRSAoMikKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgSU5UIHRyYW5zaWVudENhbmRpZGF0ZXNbUU1GX01BWF9USU1FX1NMT1RTICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKKyAgSU5UIG5UaW1lU2xvdHM7CisgIElOVCBsb29rYWhlYWQ7CisgIElOVCBzdGFydEJhbmQ7CisgIElOVCBzdG9wQmFuZDsKKworICBGSVhQX0RCTCBkQmZfbVtRTUZfQ0hBTk5FTFNdOworICBJTlQgICAgICBkQmZfZVtRTUZfQ0hBTk5FTFNdOworCisgIEZJWFBfREJMIGVuZXJneV90aW1lU2xvdHNbUU1GX01BWF9USU1FX1NMT1RTICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKKyAgSU5UICAgICAgZW5lcmd5X3RpbWVTbG90c19zY2FsZVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOworCisgIEZJWFBfREJMIGRlbHRhX2VuZXJneVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOworICBJTlQgICAgICBkZWx0YV9lbmVyZ3lfc2NhbGVbUU1GX01BWF9USU1FX1NMT1RTICsgVFJBTl9ERVRfTE9PS0FIRUFEXTsKKworICBGSVhQX0RCTCBsb3dwYXNzX2VuZXJneVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOworICBJTlQgICAgICBsb3dwYXNzX2VuZXJneV9zY2FsZVtRTUZfTUFYX1RJTUVfU0xPVFMgKyBUUkFOX0RFVF9MT09LQUhFQURdOworI2lmIGRlZmluZWQgKEZURF9MT0cpCisgIEZES0ZJTEUgKmZ0ZF9sb2c7CisjZW5kaWYKK30KK0ZBU1RfVFJBTl9ERVRFQ1RPUjsKK3R5cGVkZWYgRkFTVF9UUkFOX0RFVEVDVE9SICpIQU5ETEVfRkFTVF9UUkFOX0RFVDsKKworCitJTlQgRkRLc2JyRW5jX0luaXRTYnJGYXN0VHJhbnNpZW50RGV0ZWN0b3IoCisgICAgICAgIEhBTkRMRV9GQVNUX1RSQU5fREVUIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAorICAgICAgICBjb25zdCBJTlQgdGltZV9zbG90c19wZXJfZnJhbWUsCisgICAgICAgIGNvbnN0IElOVCBiYW5kd2lkdGhfcW1mX3Nsb3QsCisgICAgICAgIGNvbnN0IElOVCBub19xbWZfY2hhbm5lbHMsCisgICAgICAgIGNvbnN0IElOVCBzYnJfcW1mXzFzdF9iYW5kCisgICAgICAgICk7CisKK3ZvaWQgRkRLc2JyRW5jX2Zhc3RUcmFuc2llbnREZXRlY3QoCisgICAgICAgIGNvbnN0IEhBTkRMRV9GQVNUX1RSQU5fREVUICAgICAgICAgIGhfc2JyRmFzdFRyYW5zaWVudERldGVjdG9yLAorICAgICAgICBjb25zdCBGSVhQX0RCTCAgICAgICAgICAgICAgKmNvbnN0ICpFbmVyZ2llcywKKyAgICAgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAgICpjb25zdCAgc2NhbGVFbmVyZ2llcywKKyAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgWUJ1ZmZlcldyaXRlT2Zmc2V0LAorICAgICAgICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgKmNvbnN0ICB0cmFuX3ZlY3RvcgorICAgICAgICApOworCiB2b2lkCiBGREtzYnJFbmNfdHJhbnNpZW50RGV0ZWN0KEhBTkRMRV9TQlJfVFJBTlNJRU5UX0RFVEVDVE9SIGhfc2JyVHJhbnNpZW50RGV0ZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMICoqRW5lcmdpZXMsCkBAIC0xMjQsNiArMTc2LDcgQEAKIAogaW50CiBGREtzYnJFbmNfSW5pdFNiclRyYW5zaWVudERldGVjdG9yIChIQU5ETEVfU0JSX1RSQU5TSUVOVF9ERVRFQ1RPUiBoX3NiclRyYW5zaWVudERldGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQgIHNiclN5bnRheEZsYWdzLCAvKiBTQlIgc3ludGF4IGZsYWdzIGRlcml2ZWQgZnJvbSBBT1QuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UICAgZnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgIHNhbXBsZUZyZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyQ29uZmlndXJhdGlvblB0ciBwYXJhbXMsCkBAIC0xNDUsNiArMTk4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBZQnVmZmVyU3pTaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2ZiLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vX2NvbHMpOwotCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9fY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZJWFBfREJMKiB0b25hbGl0eSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYlNZUy9zcmMvZ2VuZXJpY1N0ZHMuY3BwIGIvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAKaW5kZXggNTNhYmUwNi4uODljNDIyYyAxMDA2NDQKLS0tIGEvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAKKysrIGIvbGliU1lTL3NyYy9nZW5lcmljU3Rkcy5jcHAKQEAgLTkyLDE0ICs5MiwxNCBAQAogCiAjZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCiAKLSNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgotCiAjaW5jbHVkZSA8bWF0aC5oPgogCisjaW5jbHVkZSAiZ2VuZXJpY1N0ZHMuaCIKKwogLyogbGlicmFyeSBpbmZvICovCiAjZGVmaW5lIFNZU19MSUJfVkwwIDEKICNkZWZpbmUgU1lTX0xJQl9WTDEgMwotI2RlZmluZSBTWVNfTElCX1ZMMiA3CisjZGVmaW5lIFNZU19MSUJfVkwyIDgKICNkZWZpbmUgU1lTX0xJQl9USVRMRSAiU3lzdGVtIEludGVncmF0aW9uIExpYnJhcnkiCiAjaWZkZWYgX19BTkRST0lEX18KICNkZWZpbmUgU1lTX0xJQl9CVUlMRF9EQVRFICIiCg==