ZGlmZiAtLWdpdCBhL2J1aWxkL3RhYmxldC03aW4taGRwaS0xMDI0LWRhbHZpay1oZWFwLm1rIGIvYnVpbGQvdGFibGV0LTdpbi1oZHBpLTEwMjQtZGFsdmlrLWhlYXAubWsKaW5kZXggNWJiZDJiMC4uN2ZkMzRiNSAxMDA2NDQKLS0tIGEvYnVpbGQvdGFibGV0LTdpbi1oZHBpLTEwMjQtZGFsdmlrLWhlYXAubWsKKysrIGIvYnVpbGQvdGFibGV0LTdpbi1oZHBpLTEwMjQtZGFsdmlrLWhlYXAubWsKQEAgLTE4LDcgKzE4LDcgQEAKIAogUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMgKz0gXAogICAgIGRhbHZpay52bS5oZWFwc3RhcnRzaXplPThtIFwKLSAgICBkYWx2aWsudm0uaGVhcGdyb3d0aGxpbWl0PTY0bSBcCisgICAgZGFsdmlrLnZtLmhlYXBncm93dGhsaW1pdD04MG0gXAogICAgIGRhbHZpay52bS5oZWFwc2l6ZT0zODRtIFwKICAgICBkYWx2aWsudm0uaGVhcHRhcmdldHV0aWxpemF0aW9uPTAuNzUgXAogICAgIGRhbHZpay52bS5oZWFwbWluZnJlZT01MTJrIFwKZGlmZiAtLWdpdCBhL2NtZHMvYXRyYWNlL2F0cmFjZS5jcHAgYi9jbWRzL2F0cmFjZS9hdHJhY2UuY3BwCmluZGV4IDAxMGQ5Y2UuLjhmZDgwY2MgMTAwNjQ0Ci0tLSBhL2NtZHMvYXRyYWNlL2F0cmFjZS5jcHAKKysrIGIvY21kcy9hdHJhY2UvYXRyYWNlLmNwcApAQCAtNzgsNyArNzgsNyBAQAogICAgIHsgIndlYnZpZXciLCAgICAiV2ViVmlldyIsICAgICAgICAgIEFUUkFDRV9UQUdfV0VCVklFVywgeyB9IH0sCiAgICAgeyAid20iLCAgICAgICAgICJXaW5kb3cgTWFuYWdlciIsICAgQVRSQUNFX1RBR19XSU5ET1dfTUFOQUdFUiwgeyB9IH0sCiAgICAgeyAiYW0iLCAgICAgICAgICJBY3Rpdml0eSBNYW5hZ2VyIiwgQVRSQUNFX1RBR19BQ1RJVklUWV9NQU5BR0VSLCB7IH0gfSwKLSAgICB7ICJzeW5jIiwgICAgICAgIlN5bmMgTWFuYWdlciIsICAgICBBVFJBQ0VfVEFHX1NZTkNfTUFOQUdFUiwgeyB9IH0sCisgICAgeyAic20iLCAgICAgICAgICJTeW5jIE1hbmFnZXIiLCAgICAgQVRSQUNFX1RBR19TWU5DX01BTkFHRVIsIHsgfSB9LAogICAgIHsgImF1ZGlvIiwgICAgICAiQXVkaW8iLCAgICAgICAgICAgIEFUUkFDRV9UQUdfQVVESU8sIHsgfSB9LAogICAgIHsgInZpZGVvIiwgICAgICAiVmlkZW8iLCAgICAgICAgICAgIEFUUkFDRV9UQUdfVklERU8sIHsgfSB9LAogICAgIHsgImNhbWVyYSIsICAgICAiQ2FtZXJhIiwgICAgICAgICAgIEFUUkFDRV9UQUdfQ0FNRVJBLCB7IH0gfSwKQEAgLTEwNywxNCArMTA3LDE0IEBACiAgICAgICAgIHsgUkVRLCAgICAgICIvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9wb3dlci9jcHVfaWRsZS9lbmFibGUiIH0sCiAgICAgfSB9LAogICAgIHsgImRpc2siLCAgICAgICAiRGlzayBJL08iLCAgICAgICAgIDAsIHsKLSAgICAgICAgeyBSRVEsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2YyZnMvZjJmc19zeW5jX2ZpbGVfZW50ZXIvZW5hYmxlIiB9LAotICAgICAgICB7IFJFUSwgICAgICAiL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9ldmVudHMvZjJmcy9mMmZzX3N5bmNfZmlsZV9leGl0L2VuYWJsZSIgfSwKLSAgICAgICAgeyBSRVEsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2YyZnMvZjJmc193cml0ZV9iZWdpbi9lbmFibGUiIH0sCi0gICAgICAgIHsgUkVRLCAgICAgICIvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9mMmZzL2YyZnNfd3JpdGVfZW5kL2VuYWJsZSIgfSwKLSAgICAgICAgeyBSRVEsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2V4dDQvZXh0NF9kYV93cml0ZV9iZWdpbi9lbmFibGUiIH0sCi0gICAgICAgIHsgUkVRLCAgICAgICIvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9leHQ0L2V4dDRfZGFfd3JpdGVfZW5kL2VuYWJsZSIgfSwKLSAgICAgICAgeyBSRVEsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2V4dDQvZXh0NF9zeW5jX2ZpbGVfZW50ZXIvZW5hYmxlIiB9LAotICAgICAgICB7IFJFUSwgICAgICAiL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9ldmVudHMvZXh0NC9leHQ0X3N5bmNfZmlsZV9leGl0L2VuYWJsZSIgfSwKKyAgICAgICAgeyBPUFQsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2YyZnMvZjJmc19zeW5jX2ZpbGVfZW50ZXIvZW5hYmxlIiB9LAorICAgICAgICB7IE9QVCwgICAgICAiL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9ldmVudHMvZjJmcy9mMmZzX3N5bmNfZmlsZV9leGl0L2VuYWJsZSIgfSwKKyAgICAgICAgeyBPUFQsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2YyZnMvZjJmc193cml0ZV9iZWdpbi9lbmFibGUiIH0sCisgICAgICAgIHsgT1BULCAgICAgICIvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9mMmZzL2YyZnNfd3JpdGVfZW5kL2VuYWJsZSIgfSwKKyAgICAgICAgeyBPUFQsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2V4dDQvZXh0NF9kYV93cml0ZV9iZWdpbi9lbmFibGUiIH0sCisgICAgICAgIHsgT1BULCAgICAgICIvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9leHQ0L2V4dDRfZGFfd3JpdGVfZW5kL2VuYWJsZSIgfSwKKyAgICAgICAgeyBPUFQsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2V4dDQvZXh0NF9zeW5jX2ZpbGVfZW50ZXIvZW5hYmxlIiB9LAorICAgICAgICB7IE9QVCwgICAgICAiL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9ldmVudHMvZXh0NC9leHQ0X3N5bmNfZmlsZV9leGl0L2VuYWJsZSIgfSwKICAgICAgICAgeyBSRVEsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2Jsb2NrL2Jsb2NrX3JxX2lzc3VlL2VuYWJsZSIgfSwKICAgICAgICAgeyBSRVEsICAgICAgIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzL2Jsb2NrL2Jsb2NrX3JxX2NvbXBsZXRlL2VuYWJsZSIgfSwKICAgICB9IH0sCmRpZmYgLS1naXQgYS9jbWRzL2R1bXBzdGF0ZS9kdW1wc3RhdGUuYyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCmluZGV4IDQyMjFmOTguLjg0ZjA3OWQgMTAwNjQ0Ci0tLSBhL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCisrKyBiL2NtZHMvZHVtcHN0YXRlL2R1bXBzdGF0ZS5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgpAQCAtNzYsNiArNzcsMjggQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBfZGV2X2ZpbGVzKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpkcml2ZXJwYXRoLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBESVIgKmQ7CisgICAgc3RydWN0IGRpcmVudCAqZGU7CisgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKworICAgIGQgPSBvcGVuZGlyKGRyaXZlcnBhdGgpOworICAgIGlmIChkID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkgeworICAgICAgICBpZiAoZGUtPmRfdHlwZSAhPSBEVF9MTkspIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLyVzLyVzIiwgZHJpdmVycGF0aCwgZGUtPmRfbmFtZSwgZmlsZW5hbWUpOworICAgICAgICBkdW1wX2ZpbGUodGl0bGUsIHBhdGgpOworICAgIH0KKworICAgIGNsb3NlZGlyKGQpOworfQorCiAvKiBkdW1wcyB0aGUgY3VycmVudCBzeXN0ZW0gc3RhdGUgdG8gc3Rkb3V0ICovCiBzdGF0aWMgdm9pZCBkdW1wc3RhdGUoKSB7CiAgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CkBAIC0xMDgsNyArMTMxLDkgQEAKICAgICBwcmludGYoIkNvbW1hbmQgbGluZTogJXNcbiIsIHN0cnRvayhjbWRsaW5lX2J1ZiwgIlxuIikpOwogICAgIHByaW50ZigiXG4iKTsKIAorICAgIGR1bXBfZGV2X2ZpbGVzKCJUUlVTVFkgVkVSU0lPTiIsICIvc3lzL2J1cy9wbGF0Zm9ybS9kcml2ZXJzL3RydXN0eSIsICJ0cnVzdHlfdmVyc2lvbiIpOwogICAgIHJ1bl9jb21tYW5kKCJVUFRJTUUiLCAxMCwgInVwdGltZSIsIE5VTEwpOworICAgIGR1bXBfZmlsZSgiTU1DIFBFUkYiLCAiL3N5cy9ibG9jay9tbWNibGswL3N0YXQiKTsKICAgICBkdW1wX2ZpbGUoIk1FTU9SWSBJTkZPIiwgIi9wcm9jL21lbWluZm8iKTsKICAgICBydW5fY29tbWFuZCgiQ1BVIElORk8iLCAxMCwgInRvcCIsICItbiIsICIxIiwgIi1kIiwgIjEiLCAiLW0iLCAiMzAiLCAiLXQiLCBOVUxMKTsKICAgICBydW5fY29tbWFuZCgiUFJPQ1JBTksiLCAyMCwgInByb2NyYW5rIiwgTlVMTCk7CkBAIC0yNzcsOSArMzAyLDYgQEAKIAogICAgIHJ1bl9jb21tYW5kKCJGSUxFU1lTVEVNUyAmIEZSRUUgU1BBQ0UiLCAxMCwgImRmIiwgTlVMTCk7CiAKLSAgICBydW5fY29tbWFuZCgiUEFDS0FHRSBTRVRUSU5HUyIsIDIwLCBTVV9QQVRILCAicm9vdCIsICJjYXQiLCAiL2RhdGEvc3lzdGVtL3BhY2thZ2VzLnhtbCIsIE5VTEwpOwotICAgIGR1bXBfZmlsZSgiUEFDS0FHRSBVSUQgRVJST1JTIiwgIi9kYXRhL3N5c3RlbS91aWRlcnJvcnMudHh0Iik7Ci0KICAgICBydW5fY29tbWFuZCgiTEFTVCBSQURJTyBMT0ciLCAxMCwgInBhcnNlX3JhZGlvX2xvZyIsICIvcHJvYy9sYXN0X3JhZGlvX2xvZyIsIE5VTEwpOwogCiAgICAgcHJpbnRmKCItLS0tLS0gQkFDS0xJR0hUUyAtLS0tLS1cbiIpOwpkaWZmIC0tZ2l0IGEvY21kcy9pbnN0YWxsZC9jb21tYW5kcy5jIGIvY21kcy9pbnN0YWxsZC9jb21tYW5kcy5jCmluZGV4IDM4NmQyZjMuLjQ0YzQ5ODggMTAwNjQ0Ci0tLSBhL2NtZHMvaW5zdGFsbGQvY29tbWFuZHMuYworKysgYi9jbWRzL2luc3RhbGxkL2NvbW1hbmRzLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+CiAjaW5jbHVkZSA8ZGlza3VzYWdlL2RpcnNpemUuaD4KICNpbmNsdWRlIDxzZWxpbnV4L2FuZHJvaWQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vdGhyZWFkX2RlZnMuaD4KIAogLyogRGlyZWN0b3J5IHJlY29yZHMgdGhhdCBhcmUgdXNlZCBpbiBleGVjdXRpb24gb2YgY29tbWFuZHMuICovCiBkaXJfcmVjX3QgYW5kcm9pZF9kYXRhX2RpcjsKQEAgLTEwNjAsNiArMTA2MSwxMCBAQAogICAgICAgICAgICAgQUxPR0UoInNldF9zY2hlZF9wb2xpY3kgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgICAgIGV4aXQoNzApOwogICAgICAgICB9CisgICAgICAgIGlmIChzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEFORFJPSURfUFJJT1JJVFlfQkFDS0dST1VORCkgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0cHJpb3JpdHkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIGV4aXQoNzEpOworICAgICAgICB9CiAgICAgICAgIGlmIChmbG9jayhvdXRfZmQsIExPQ0tfRVggfCBMT0NLX05CKSAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiZmxvY2soJXMpIGZhaWxlZDogJXNcbiIsIG91dF9wYXRoLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgZXhpdCg2Nyk7CmRpZmYgLS1naXQgYS9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5tYW51YWxfcG9zdHByb2Nlc3NpbmcueG1sIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEubWFudWFsX3Bvc3Rwcm9jZXNzaW5nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc5NmJlCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEubWFudWFsX3Bvc3Rwcm9jZXNzaW5nLnhtbApAQCAtMCwwICsxLDIxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgaXMgdGhlIHNldCBvZiBmZWF0dXJlcyByZXF1aXJlZCBmb3IgYSBjYW1lcmEyIGRldmljZSB0aGF0IHN1cHBvcnRzIG1hbnVhbCBwb3N0cHJvY2Vzc2luZyBjYXBhYmlsaXR5IC0tPgorPHBlcm1pc3Npb25zPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmFueSIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jYXBhYmlsaXR5Lm1hbnVhbF9wb3N0X3Byb2Nlc3NpbmciIC8+Cis8L3Blcm1pc3Npb25zPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEubWFudWFsX3NlbnNvci54bWwgYi9kYXRhL2V0Yy9hbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5tYW51YWxfc2Vuc29yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2RiNWFiCi0tLSAvZGV2L251bGwKKysrIGIvZGF0YS9ldGMvYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEubWFudWFsX3NlbnNvci54bWwKQEAgLTAsMCArMSwyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUaGlzIGlzIHRoZSBzZXQgb2YgZmVhdHVyZXMgcmVxdWlyZWQgZm9yIGEgY2FtZXJhMiBkZXZpY2UgdGhhdCBzdXBwb3J0cyBtYW51YWwgc2Vuc29yIGNhcGFiaWxpdHktLT4KKzxwZXJtaXNzaW9ucz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5hbnkiIC8+CisgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY2FwYWJpbGl0eS5tYW51YWxfc2Vuc29yIiAvPgorPC9wZXJtaXNzaW9ucz4KZGlmZiAtLWdpdCBhL2RhdGEvZXRjL2FuZHJvaWQuc29mdHdhcmUudm9pY2VfcmVjb2duaXplcnMueG1sIGIvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS52b2ljZV9yZWNvZ25pemVycy54bWwKaW5kZXggN2U3MjE3Ny4uNDM1ZWVkNCAxMDA2NDQKLS0tIGEvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS52b2ljZV9yZWNvZ25pemVycy54bWwKKysrIGIvZGF0YS9ldGMvYW5kcm9pZC5zb2Z0d2FyZS52b2ljZV9yZWNvZ25pemVycy54bWwKQEAgLTE1LDUgKzE1LDUgQEAKIC0tPgogCiA8cGVybWlzc2lvbnM+Ci0gICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5zb2Z0d2FyZS52b2ljZV9yZWNvZ25pemVycyIgLz4KKyAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLnNvZnR3YXJlLnZvaWNlX3JlY29nbml6ZXJzIiBub3RMb3dSYW09InRydWUiIC8+CiA8L3Blcm1pc3Npb25zPgpkaWZmIC0tZ2l0IGEvZGF0YS9ldGMvaGFuZGhlbGRfY29yZV9oYXJkd2FyZS54bWwgYi9kYXRhL2V0Yy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbAppbmRleCBlYWY5M2ZkLi41MGNiZTllIDEwMDY0NAotLS0gYS9kYXRhL2V0Yy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbAorKysgYi9kYXRhL2V0Yy9oYW5kaGVsZF9jb3JlX2hhcmR3YXJlLnhtbApAQCAtMzgsNyArMzgsNyBAQAogICAgIDwhLS0gYmFzaWMgc3lzdGVtIHNlcnZpY2VzIC0tPgogICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuc29mdHdhcmUuYXBwX3dpZGdldHMiIC8+CiAgICAgPGZlYXR1cmUgbmFtZT0iYW5kcm9pZC5zb2Z0d2FyZS5jb25uZWN0aW9uc2VydmljZSIgLz4KLSAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLnNvZnR3YXJlLnZvaWNlX3JlY29nbml6ZXJzIiAvPgorICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuc29mdHdhcmUudm9pY2VfcmVjb2duaXplcnMiIG5vdExvd1JhbT0idHJ1ZSIgLz4KICAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLnNvZnR3YXJlLmJhY2t1cCIgLz4KICAgICA8ZmVhdHVyZSBuYW1lPSJhbmRyb2lkLnNvZnR3YXJlLmhvbWVfc2NyZWVuIiAvPgogICAgIDxmZWF0dXJlIG5hbWU9ImFuZHJvaWQuc29mdHdhcmUuaW5wdXRfbWV0aG9kcyIgLz4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oIGIvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKaW5kZXggZmVlODA5MC4uYTUyZTA0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKKysrIGIvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKQEAgLTIwOCw3ICsyMDgsMTEgQEAKIAogICAgIC8vIEV4cGxpY2l0bHkgY2xvc2UgYWxsIGZpbGUgZGVzY3JpcHRvcnMgaW4gdGhlIHBhcmNlbC4KICAgICB2b2lkICAgICAgICAgICAgICAgIGNsb3NlRmlsZURlc2NyaXB0b3JzKCk7Ci0gICAgCisKKyAgICAvLyBEZWJ1Z2dpbmc6IGdldCBtZXRyaWNzIG9uIGN1cnJlbnQgYWxsb2NhdGlvbnMuCisgICAgc3RhdGljIHNpemVfdCAgICAgICBnZXRHbG9iYWxBbGxvY1NpemUoKTsKKyAgICBzdGF0aWMgc2l6ZV90ICAgICAgIGdldEdsb2JhbEFsbG9jQ291bnQoKTsKKwogcHJpdmF0ZToKICAgICB0eXBlZGVmIHZvaWQgICAgICAgICgqcmVsZWFzZV9mdW5jKShQYXJjZWwqIHBhcmNlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9CdWZmZXJJdGVtLmggYi9pbmNsdWRlL2d1aS9CdWZmZXJJdGVtLmgKaW5kZXggNWVmZmQxMC4uMDFiNmZmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvQnVmZmVySXRlbS5oCisrKyBiL2luY2x1ZGUvZ3VpL0J1ZmZlckl0ZW0uaApAQCAtNDQsNiArNDQsNyBAQAogICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG9mIG1CdWYsIHVzZWQgdG8gaW5kaWNhdGUgdGhpcyBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSBzbG90LgogICAgIGVudW0geyBJTlZBTElEX0JVRkZFUl9TTE9UID0gLTEgfTsKICAgICBCdWZmZXJJdGVtKCk7CisgICAgfkJ1ZmZlckl0ZW0oKTsKICAgICBvcGVyYXRvciBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOjpCdWZmZXJJdGVtKCkgY29uc3Q7CiAKICAgICBzdGF0aWMgY29uc3QgY2hhciogc2NhbGluZ01vZGVOYW1lKHVpbnQzMl90IHNjYWxpbmdNb2RlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0J1ZmZlckl0ZW1Db25zdW1lci5oIGIvaW5jbHVkZS9ndWkvQnVmZmVySXRlbUNvbnN1bWVyLmgKaW5kZXggODY5YjQ3MC4uNTQ5NGZmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvQnVmZmVySXRlbUNvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9ndWkvQnVmZmVySXRlbUNvbnN1bWVyLmgKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAvLyBzZXREZWZhdWx0QnVmZmVyRm9ybWF0IGFsbG93cyB0aGUgQnVmZmVyUXVldWUgdG8gY3JlYXRlCiAgICAgLy8gR3JhcGhpY0J1ZmZlcnMgb2YgYSBkZWZhdWx0Rm9ybWF0IGlmIG5vIGZvcm1hdCBpcyBzcGVjaWZpZWQKICAgICAvLyBpbiBkZXF1ZXVlQnVmZmVyCi0gICAgc3RhdHVzX3Qgc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChQaXhlbEZvcm1hdCBkZWZhdWx0Rm9ybWF0KTsKKyAgICBzdGF0dXNfdCBzZXREZWZhdWx0QnVmZmVyRm9ybWF0KHVpbnQzMl90IGRlZmF1bHRGb3JtYXQpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWUuaCBiL2luY2x1ZGUvZ3VpL0J1ZmZlclF1ZXVlLmgKaW5kZXggMzI5N2IxMC4uMTE4ODgzNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWUuaAorKysgYi9pbmNsdWRlL2d1aS9CdWZmZXJRdWV1ZS5oCkBAIC02Miw3ICs2Miw3IEBACiAgICAgcHVibGljOgogICAgICAgICBQcm94eUNvbnN1bWVyTGlzdGVuZXIoY29uc3Qgd3A8Q29uc3VtZXJMaXN0ZW5lcj4mIGNvbnN1bWVyTGlzdGVuZXIpOwogICAgICAgICB2aXJ0dWFsIH5Qcm94eUNvbnN1bWVyTGlzdGVuZXIoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgYW5kcm9pZDo6QnVmZmVySXRlbSYgaXRlbSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKICAgICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWVDb25zdW1lci5oIGIvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWVDb25zdW1lci5oCmluZGV4IDg5OGM0NTEuLjE5MTJlZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3VpL0J1ZmZlclF1ZXVlQ29uc3VtZXIuaAorKysgYi9pbmNsdWRlL2d1aS9CdWZmZXJRdWV1ZUNvbnN1bWVyLmgKQEAgLTEyNSw4ICsxMjUsOSBAQAogCiAgICAgLy8gc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCBhbGxvd3MgdGhlIEJ1ZmZlclF1ZXVlIHRvIGNyZWF0ZQogICAgIC8vIEdyYXBoaWNCdWZmZXJzIG9mIGEgZGVmYXVsdEZvcm1hdCBpZiBubyBmb3JtYXQgaXMgc3BlY2lmaWVkCi0gICAgLy8gaW4gZGVxdWV1ZUJ1ZmZlci4gVGhlIGluaXRpYWwgZGVmYXVsdCBpcyBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJGb3JtYXQoUGl4ZWxGb3JtYXQgZGVmYXVsdEZvcm1hdCk7CisgICAgLy8gaW4gZGVxdWV1ZUJ1ZmZlci4gIEZvcm1hdHMgYXJlIGVudW1lcmF0ZWQgaW4gZ3JhcGhpY3MuaDsgdGhlCisgICAgLy8gaW5pdGlhbCBkZWZhdWx0IGlzIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCh1aW50MzJfdCBkZWZhdWx0Rm9ybWF0KTsKIAogICAgIC8vIHNldENvbnN1bWVyVXNhZ2VCaXRzIHdpbGwgdHVybiBvbiBhZGRpdGlvbmFsIHVzYWdlIGJpdHMgZm9yIGRlcXVldWVCdWZmZXIuCiAgICAgLy8gVGhlc2UgYXJlIG1lcmdlZCB3aXRoIHRoZSBiaXRzIHBhc3NlZCB0byBkZXF1ZXVlQnVmZmVyLiAgVGhlIHZhbHVlcyBhcmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0J1ZmZlclF1ZXVlQ29yZS5oIGIvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWVDb3JlLmgKaW5kZXggYjIzY2IwOC4uMWQ5NzVjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWVDb3JlLmgKKysrIGIvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWVDb3JlLmgKQEAgLTE5OSwxNSArMTk5LDE1IEBACiAKICAgICAvLyBtRGVmYXVsdEJ1ZmZlckZvcm1hdCBjYW4gYmUgc2V0IHNvIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGJ1ZmZlciBmb3JtYXQKICAgICAvLyB3aGVuIGl0IGlzbid0IHNwZWNpZmllZCBpbiBkZXF1ZXVlQnVmZmVyLgotICAgIFBpeGVsRm9ybWF0IG1EZWZhdWx0QnVmZmVyRm9ybWF0OworICAgIHVpbnQzMl90IG1EZWZhdWx0QnVmZmVyRm9ybWF0OwogCiAgICAgLy8gbURlZmF1bHRXaWR0aCBob2xkcyB0aGUgZGVmYXVsdCB3aWR0aCBvZiBhbGxvY2F0ZWQgYnVmZmVycy4gSXQgaXMgdXNlZAogICAgIC8vIGluIGRlcXVldWVCdWZmZXIgaWYgYSB3aWR0aCBhbmQgaGVpZ2h0IG9mIDAgYXJlIHNwZWNpZmllZC4KLSAgICB1aW50MzJfdCBtRGVmYXVsdFdpZHRoOworICAgIGludCBtRGVmYXVsdFdpZHRoOwogCiAgICAgLy8gbURlZmF1bHRIZWlnaHQgaG9sZHMgdGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGFsbG9jYXRlZCBidWZmZXJzLiBJdCBpcyB1c2VkCiAgICAgLy8gaW4gZGVxdWV1ZUJ1ZmZlciBpZiBhIHdpZHRoIGFuZCBoZWlnaHQgb2YgMCBhcmUgc3BlY2lmaWVkLgotICAgIHVpbnQzMl90IG1EZWZhdWx0SGVpZ2h0OworICAgIGludCBtRGVmYXVsdEhlaWdodDsKIAogICAgIC8vIG1EZWZhdWx0TWF4QnVmZmVyQ291bnQgaXMgdGhlIGRlZmF1bHQgbGltaXQgb24gdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQKICAgICAvLyB3aWxsIGJlIGFsbG9jYXRlZCBhdCBvbmUgdGltZS4gVGhpcyBkZWZhdWx0IGxpbWl0IGlzIHNldCBieSB0aGUgY29uc3VtZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9CdWZmZXJRdWV1ZVByb2R1Y2VyLmggYi9pbmNsdWRlL2d1aS9CdWZmZXJRdWV1ZVByb2R1Y2VyLmgKaW5kZXggMzRjMzJkYy4uZWQxMDU2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvQnVmZmVyUXVldWVQcm9kdWNlci5oCisrKyBiL2luY2x1ZGUvZ3VpL0J1ZmZlclF1ZXVlUHJvZHVjZXIuaApAQCAtNzMsNyArNzMsOSBAQAogICAgIC8vIHVwZGF0ZVRleEltYWdlKCkgaXMgY2FsbGVkLiAgSWYgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCB6ZXJvLCB0aGUKICAgICAvLyBkZWZhdWx0IHZhbHVlcyBzcGVjaWZpZWQgYnkgc2V0RGVmYXVsdEJ1ZmZlclNpemUoKSBhcmUgdXNlZCBpbnN0ZWFkLgogICAgIC8vCi0gICAgLy8gSWYgdGhlIGZvcm1hdCBpcyAwLCB0aGUgZGVmYXVsdCBmb3JtYXQgd2lsbCBiZSB1c2VkLgorICAgIC8vIFRoZSBwaXhlbCBmb3JtYXRzIGFyZSBlbnVtZXJhdGVkIGluIGdyYXBoaWNzLmgsIGUuZy4KKyAgICAvLyBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OC4gIElmIHRoZSBmb3JtYXQgaXMgMCwgdGhlIGRlZmF1bHQgZm9ybWF0CisgICAgLy8gd2lsbCBiZSB1c2VkLgogICAgIC8vCiAgICAgLy8gVGhlIHVzYWdlIGFyZ3VtZW50IHNwZWNpZmllcyBncmFsbG9jIGJ1ZmZlciB1c2FnZSBmbGFncy4gIFRoZSB2YWx1ZXMKICAgICAvLyBhcmUgZW51bWVyYXRlZCBpbiBncmFsbG9jLmgsIGUuZy4gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIuICBUaGVzZQpAQCAtOTEsOSArOTMsOCBAQAogICAgIC8vCiAgICAgLy8gSW4gYm90aCBjYXNlcywgdGhlIHByb2R1Y2VyIHdpbGwgbmVlZCB0byBjYWxsIHJlcXVlc3RCdWZmZXIgdG8gZ2V0IGEKICAgICAvLyBHcmFwaGljQnVmZmVyIGhhbmRsZSBmb3IgdGhlIHJldHVybmVkIHNsb3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQnVmZmVyKGludCAqb3V0U2xvdCwgc3A8RmVuY2U+KiBvdXRGZW5jZSwKLSAgICAgICAgICAgIGJvb2wgYXN5bmMsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50ICpvdXRTbG90LCBzcDxGZW5jZT4qIG91dEZlbmNlLCBib29sIGFzeW5jLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSk7CiAKICAgICAvLyBTZWUgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoQnVmZmVyCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoaW50IHNsb3QpOwpAQCAtMTcwLDcgKzE3MSw3IEBACiAKICAgICAvLyBTZWUgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YWxsb2NhdGVCdWZmZXJzCiAgICAgdmlydHVhbCB2b2lkIGFsbG9jYXRlQnVmZmVycyhib29sIGFzeW5jLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSk7CisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKIAogcHJpdmF0ZToKICAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbnRlcmZhY2UKQEAgLTE5Niw2ICsxOTcsMjIgQEAKIAogICAgIHVpbnQzMl90IG1TdGlja3lUcmFuc2Zvcm07CiAKKyAgICAvLyBUaGlzIHNhdmVzIHRoZSBmZW5jZSBmcm9tIHRoZSBsYXN0IHF1ZXVlQnVmZmVyLCBzdWNoIHRoYXQgdGhlCisgICAgLy8gbmV4dCBxdWV1ZUJ1ZmZlciBjYWxsIGNhbiB0aHJvdHRsZSBidWZmZXIgcHJvZHVjdGlvbi4gVGhlIHByaW9yCisgICAgLy8gcXVldWVCdWZmZXIncyBmZW5jZSBpcyBub3QgbmVzc2Vzc2FyaWx5IGF2YWlsYWJsZSBlbHNld2hlcmUsCisgICAgLy8gc2luY2UgdGhlIHByZXZpb3VzIGJ1ZmZlciBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBhY3F1aXJlZC4KKyAgICBzcDxGZW5jZT4gbUxhc3RRdWV1ZUJ1ZmZlckZlbmNlOworCisgICAgLy8gVGFrZS1hLXRpY2tldCBzeXN0ZW0gZm9yIGVuc3VyaW5nIHRoYXQgb25GcmFtZSogY2FsbGJhY2tzIGFyZSBjYWxsZWQgaW4KKyAgICAvLyB0aGUgb3JkZXIgdGhhdCBmcmFtZXMgYXJlIHF1ZXVlZC4gV2hpbGUgdGhlIEJ1ZmZlclF1ZXVlIGxvY2sKKyAgICAvLyAobUNvcmUtPm1NdXRleCkgaXMgaGVsZCwgYSB0aWNrZXQgaXMgcmV0YWluZWQgYnkgdGhlIHByb2R1Y2VyLiBBZnRlcgorICAgIC8vIGRyb3BwaW5nIHRoZSBCdWZmZXJRdWV1ZSBsb2NrLCB0aGUgcHJvZHVjZXIgbXVzdCB3YWl0IG9uIHRoZSBjb25kaXRpb24KKyAgICAvLyB2YXJpYWJsZSB1bnRpbCB0aGUgY3VycmVudCBjYWxsYmFjayB0aWNrZXQgbWF0Y2hlcyBpdHMgcmV0YWluZWQgdGlja2V0LgorICAgIE11dGV4IG1DYWxsYmFja011dGV4OworICAgIGludCBtTmV4dENhbGxiYWNrVGlja2V0OyAvLyBQcm90ZWN0ZWQgYnkgbUNvcmUtPm1NdXRleAorICAgIGludCBtQ3VycmVudENhbGxiYWNrVGlja2V0OyAvLyBQcm90ZWN0ZWQgYnkgbUNhbGxiYWNrTXV0ZXgKKyAgICBDb25kaXRpb24gbUNhbGxiYWNrQ29uZGl0aW9uOworCiB9OyAvLyBjbGFzcyBCdWZmZXJRdWV1ZVByb2R1Y2VyCiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0NvbnN1bWVyQmFzZS5oIGIvaW5jbHVkZS9ndWkvQ29uc3VtZXJCYXNlLmgKaW5kZXggMTAwYmIyNi4uZjdhYjVhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvQ29uc3VtZXJCYXNlLmgKKysrIGIvaW5jbHVkZS9ndWkvQ29uc3VtZXJCYXNlLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgICAgLy8KICAgICAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2l0aG91dCBhbnkgbG9jayBoZWxkIGFuZCBjYW4gYmUgY2FsbGVkIGNvbmN1cnJlbnRseQogICAgICAgICAvLyBieSBtdWx0aXBsZSB0aHJlYWRzLgotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgPSAwOwogICAgIH07CiAKICAgICB2aXJ0dWFsIH5Db25zdW1lckJhc2UoKTsKQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgIC8vIHRoZSBDb25zdW1lckJhc2UgaW1wbGVtZW50YXRpb24gbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgZGVyaXZlZCBjbGFzcy4KICAgICAvLyBUaGUgQ29uc3VtZXJCYXNlIHZlcnNpb24gb2Ygb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQgZG9lcyBub3RoaW5nIGFuZCBjYW4KICAgICAvLyBiZSBvdmVycmlkZW4gYnkgZGVyaXZlZCBjbGFzc2VzIGlmIHRoZXkgd2FudCB0aGUgbm90aWZpY2F0aW9uLgotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7CiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0NwdUNvbnN1bWVyLmggYi9pbmNsdWRlL2d1aS9DcHVDb25zdW1lci5oCmluZGV4IDM0MTRlZGUuLjRjNjgyMmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3VpL0NwdUNvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9ndWkvQ3B1Q29uc3VtZXIuaApAQCAtNTQsOCArNTQsMTIgQEAKICAgICAgICAgdWludDMyX3QgICAgc2NhbGluZ01vZGU7CiAgICAgICAgIGludDY0X3QgICAgIHRpbWVzdGFtcDsKICAgICAgICAgdWludDY0X3QgICAgZnJhbWVOdW1iZXI7Ci0gICAgICAgIC8vIFZhbHVlcyBiZWxvdyBhcmUgb25seSB2YWxpZCB3aGVuIHVzaW5nCi0gICAgICAgIC8vIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCwgaW4gd2hpY2ggY2FzZSBMb2NrZWRCdWZmZXI6OmRhdGEKKyAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBmb3JtYXQsIGV4Y2VwdCBmb3IgZm9ybWF0cyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGgKKyAgICAgICAgLy8gYSBmbGV4aWJsZSBmb3JtYXQgKGUuZy4gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KS4gSW4gdGhlIGxhdHRlcgorICAgICAgICAvLyBjYXNlIHRoaXMgY29udGFpbnMgdGhhdCBmbGV4aWJsZSBmb3JtYXQKKyAgICAgICAgUGl4ZWxGb3JtYXQgZmxleEZvcm1hdDsKKyAgICAgICAgLy8gVmFsdWVzIGJlbG93IGFyZSBvbmx5IHZhbGlkIHdoZW4gdXNpbmcgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4CisgICAgICAgIC8vIG9yIGNvbXBhdGlibGUgZm9ybWF0LCBpbiB3aGljaCBjYXNlIExvY2tlZEJ1ZmZlcjo6ZGF0YQogICAgICAgICAvLyBjb250YWlucyB0aGUgWSBjaGFubmVsLCBhbmQgc3RyaWRlIGlzIHRoZSBZIGNoYW5uZWwgc3RyaWRlLiBGb3Igb3RoZXIKICAgICAgICAgLy8gZm9ybWF0cywgdGhlc2Ugd2lsbCBhbGwgYmUgMC4KICAgICAgICAgdWludDhfdCAgICAqZGF0YUNiOwpAQCAtNjcsNyArNzEsNyBAQAogICAgIC8vIENyZWF0ZSBhIG5ldyBDUFUgY29uc3VtZXIuIFRoZSBtYXhMb2NrZWRCdWZmZXJzIHBhcmFtZXRlciBzcGVjaWZpZXMKICAgICAvLyBob3cgbWFueSBidWZmZXJzIGNhbiBiZSBsb2NrZWQgZm9yIHVzZXIgYWNjZXNzIGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgQ3B1Q29uc3VtZXIoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIGJxLAotICAgICAgICAgICAgc2l6ZV90IG1heExvY2tlZEJ1ZmZlcnMsIGJvb2wgY29udHJvbGxlZEJ5QXBwID0gZmFsc2UpOworICAgICAgICAgICAgdWludDMyX3QgbWF4TG9ja2VkQnVmZmVycywgYm9vbCBjb250cm9sbGVkQnlBcHAgPSBmYWxzZSk7CiAKICAgICB2aXJ0dWFsIH5DcHVDb25zdW1lcigpOwogCkBAIC04Miw5ICs4NiwxMCBAQAogICAgIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwogCiAgICAgLy8gc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCBhbGxvd3MgQ3B1Q29uc3VtZXIncyBCdWZmZXJRdWV1ZSB0byBjcmVhdGUgYnVmZmVycwotICAgIC8vIG9mIGEgZGVmYXVsdEZvcm1hdCBpZiBubyBmb3JtYXQgaXMgc3BlY2lmaWVkIGJ5IHByb2R1Y2VyLgotICAgIC8vIFRoZSBpbml0aWFsIGRlZmF1bHQgaXMgUElYRUxfRk9STUFUX1JHQkFfODg4OC4KLSAgICBzdGF0dXNfdCBzZXREZWZhdWx0QnVmZmVyRm9ybWF0KFBpeGVsRm9ybWF0IGRlZmF1bHRGb3JtYXQpOworICAgIC8vIG9mIGEgZGVmYXVsdEZvcm1hdCBpZiBubyBmb3JtYXQgaXMgc3BlY2lmaWVkIGJ5IHByb2R1Y2VyLiBGb3JtYXRzIGFyZQorICAgIC8vIGVudW1lcmF0ZWQgaW4gZ3JhcGhpY3MuaDsgdGhlIGluaXRpYWwgZGVmYXVsdCBpcworICAgIC8vIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LgorICAgIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJGb3JtYXQodWludDMyX3QgZGVmYXVsdEZvcm1hdCk7CiAKICAgICAvLyBHZXRzIHRoZSBuZXh0IGdyYXBoaWNzIGJ1ZmZlciBmcm9tIHRoZSBwcm9kdWNlciBhbmQgbG9ja3MgaXQgZm9yIENQVSB1c2UsCiAgICAgLy8gZmlsbGluZyBvdXQgdGhlIHBhc3NlZC1pbiBsb2NrZWQgYnVmZmVyIHN0cnVjdHVyZSB3aXRoIHRoZSBuYXRpdmUgcG9pbnRlcgpAQCAtMTA1LDkgKzExMCw5IEBACiAKICAgcHJpdmF0ZToKICAgICAvLyBNYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIHRoYXQgY2FuIGJlIGxvY2tlZCBhdCBhIHRpbWUKLSAgICBzaXplX3QgbU1heExvY2tlZEJ1ZmZlcnM7CisgICAgdWludDMyX3QgbU1heExvY2tlZEJ1ZmZlcnM7CiAKLSAgICBzdGF0dXNfdCByZWxlYXNlQWNxdWlyZWRCdWZmZXJMb2NrZWQoc2l6ZV90IGxvY2tlZElkeCk7CisgICAgc3RhdHVzX3QgcmVsZWFzZUFjcXVpcmVkQnVmZmVyTG9ja2VkKGludCBsb2NrZWRJZHgpOwogCiAgICAgdmlydHVhbCB2b2lkIGZyZWVCdWZmZXJMb2NrZWQoaW50IHNsb3RJbmRleCk7CiAKQEAgLTEyOCw3ICsxMzMsNyBAQAogICAgIFZlY3RvcjxBY3F1aXJlZEJ1ZmZlcj4gbUFjcXVpcmVkQnVmZmVyczsKIAogICAgIC8vIENvdW50IG9mIGN1cnJlbnRseSBsb2NrZWQgYnVmZmVycwotICAgIHNpemVfdCBtQ3VycmVudExvY2tlZEJ1ZmZlcnM7CisgICAgdWludDMyX3QgbUN1cnJlbnRMb2NrZWRCdWZmZXJzOwogCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9HTENvbnN1bWVyLmggYi9pbmNsdWRlL2d1aS9HTENvbnN1bWVyLmgKaW5kZXggMDUzZDFlZC4uZjkxZmU0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvR0xDb25zdW1lci5oCisrKyBiL2luY2x1ZGUvZ3VpL0dMQ29uc3VtZXIuaApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgLy8KICAgICAvLyBUaGUgZnJhbWUgbnVtYmVyIGlzIGFuIGluY3JlbWVudGluZyBjb3VudGVyIHNldCB0byAwIGF0IHRoZSBjcmVhdGlvbiBvZgogICAgIC8vIHRoZSBCdWZmZXJRdWV1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25zdW1lci4KLSAgICB1aW50NjRfdCBnZXRGcmFtZU51bWJlcigpOworICAgIGludDY0X3QgZ2V0RnJhbWVOdW1iZXIoKTsKIAogICAgIC8vIHNldERlZmF1bHRCdWZmZXJTaXplIGlzIHVzZWQgdG8gc2V0IHRoZSBzaXplIG9mIGJ1ZmZlcnMgcmV0dXJuZWQgYnkKICAgICAvLyByZXF1ZXN0QnVmZmVycyB3aGVuIGEgd2l0aCBhbmQgaGVpZ2h0IG9mIHplcm8gaXMgcmVxdWVzdGVkLgpAQCAtMTk3LDcgKzE5Nyw3IEBACiAKICAgICAvLyBUaGVzZSBmdW5jdGlvbnMgY2FsbCB0aGUgY29ycmVzcG9uZGluZyBCdWZmZXJRdWV1ZSBpbXBsZW1lbnRhdGlvbgogICAgIC8vIHNvIHRoZSByZWZhY3RvcmluZyBjYW4gcHJvY2VlZCBzbW9vdGhseQotICAgIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJGb3JtYXQoUGl4ZWxGb3JtYXQgZGVmYXVsdEZvcm1hdCk7CisgICAgc3RhdHVzX3Qgc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCh1aW50MzJfdCBkZWZhdWx0Rm9ybWF0KTsKICAgICBzdGF0dXNfdCBzZXRDb25zdW1lclVzYWdlQml0cyh1aW50MzJfdCB1c2FnZSk7CiAgICAgc3RhdHVzX3Qgc2V0VHJhbnNmb3JtSGludCh1aW50MzJfdCBoaW50KTsKIApAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgIHJldHVybiByZWxlYXNlQnVmZmVyTG9ja2VkKHNsb3QsIGdyYXBoaWNCdWZmZXIsIG1FZ2xEaXNwbGF5LCBlZ2xGZW5jZSk7CiAgICAgfQogCi0gICAgc3RhdGljIGJvb2wgaXNFeHRlcm5hbEZvcm1hdChQaXhlbEZvcm1hdCBmb3JtYXQpOworICAgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KTsKIAogICAgIC8vIFRoaXMgcmVsZWFzZXMgdGhlIGJ1ZmZlciBpbiB0aGUgc2xvdCByZWZlcmVuY2VkIGJ5IG1DdXJyZW50VGV4dHVyZSwKICAgICAvLyB0aGVuIHVwZGF0ZXMgc3RhdGUgdG8gcmVmZXIgdG8gdGhlIEJ1ZmZlckl0ZW0sIHdoaWNoIG11c3QgYmUgYQpAQCAtMzkxLDcgKzM5MSw3IEBACiAKICAgICAvLyBtQ3VycmVudEZyYW1lTnVtYmVyIGlzIHRoZSBmcmFtZSBjb3VudGVyIGZvciB0aGUgY3VycmVudCB0ZXh0dXJlLgogICAgIC8vIEl0IGdldHMgc2V0IGVhY2ggdGltZSB1cGRhdGVUZXhJbWFnZSBpcyBjYWxsZWQuCi0gICAgdWludDY0X3QgbUN1cnJlbnRGcmFtZU51bWJlcjsKKyAgICBpbnQ2NF90IG1DdXJyZW50RnJhbWVOdW1iZXI7CiAKICAgICB1aW50MzJfdCBtRGVmYXVsdFdpZHRoLCBtRGVmYXVsdEhlaWdodDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvR3JhcGhpY0J1ZmZlckFsbG9jLmggYi9pbmNsdWRlL2d1aS9HcmFwaGljQnVmZmVyQWxsb2MuaAppbmRleCA2OWZlNTFlLi5iMDg3NTBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2d1aS9HcmFwaGljQnVmZmVyQWxsb2MuaAorKysgYi9pbmNsdWRlL2d1aS9HcmFwaGljQnVmZmVyQWxsb2MuaApAQCAtMzMsOSArMzMsOCBAQAogcHVibGljOgogICAgIEdyYXBoaWNCdWZmZXJBbGxvYygpOwogICAgIHZpcnR1YWwgfkdyYXBoaWNCdWZmZXJBbGxvYygpOwotICAgIHZpcnR1YWwgc3A8R3JhcGhpY0J1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwKLSAgICAgICAgICAgIHN0YXR1c190KiBlcnJvcik7CisgICAgdmlydHVhbCBzcDxHcmFwaGljQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKHVpbnQzMl90IHcsIHVpbnQzMl90IGgsCisgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsIHN0YXR1c190KiBlcnJvcik7CiB9OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lDb25zdW1lckxpc3RlbmVyLmggYi9pbmNsdWRlL2d1aS9JQ29uc3VtZXJMaXN0ZW5lci5oCmluZGV4IDI2MDA5OWUuLjNmMzk3OTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3VpL0lDb25zdW1lckxpc3RlbmVyLmgKKysrIGIvaW5jbHVkZS9ndWkvSUNvbnN1bWVyTGlzdGVuZXIuaApAQCAtMjgsNiArMjgsOCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitjbGFzcyBCdWZmZXJJdGVtOworCiAvLyBDb25zdW1lckxpc3RlbmVyIGlzIHRoZSBpbnRlcmZhY2UgdGhyb3VnaCB3aGljaCB0aGUgQnVmZmVyUXVldWUgbm90aWZpZXMKIC8vIHRoZSBjb25zdW1lciBvZiBldmVudHMgdGhhdCB0aGUgY29uc3VtZXIgbWF5IHdpc2ggdG8gcmVhY3QgdG8uICBCZWNhdXNlCiAvLyB0aGUgY29uc3VtZXIgd2lsbCBnZW5lcmFsbHkgaGF2ZSBhIG11dGV4IHRoYXQgaXMgbG9ja2VkIGR1cmluZyBjYWxscyBmcm9tCkBAIC00MywxMSArNDUsMjQgQEAKICAgICAvLyBmcmFtZSBiZWNvbWVzIGF2YWlsYWJsZSBmb3IgY29uc3VtcHRpb24uIFRoaXMgbWVhbnMgdGhhdCBmcmFtZXMgdGhhdAogICAgIC8vIGFyZSBxdWV1ZWQgd2hpbGUgaW4gYXN5bmNocm9ub3VzIG1vZGUgb25seSB0cmlnZ2VyIHRoZSBjYWxsYmFjayBpZiBubwogICAgIC8vIHByZXZpb3VzIGZyYW1lcyBhcmUgcGVuZGluZy4gRnJhbWVzIHF1ZXVlZCB3aGlsZSBpbiBzeW5jaHJvbm91cyBtb2RlCi0gICAgLy8gYWx3YXlzIHRyaWdnZXIgdGhlIGNhbGxiYWNrLgorICAgIC8vIGFsd2F5cyB0cmlnZ2VyIHRoZSBjYWxsYmFjay4gVGhlIGl0ZW0gcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aWxsIGNvbnRhaW4KKyAgICAvLyBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBxdWV1ZWQgZnJhbWUgZXhjZXB0IGZvciBpdHMKKyAgICAvLyBHcmFwaGljQnVmZmVyIHBvaW50ZXIsIHdoaWNoIHdpbGwgYWx3YXlzIGJlIG51bGwuCiAgICAgLy8KICAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aXRob3V0IGFueSBsb2NrIGhlbGQgYW5kIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5CiAgICAgLy8gYnkgbXVsdGlwbGUgdGhyZWFkcy4KLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpID0gMDsgLyogQXN5bmNocm9ub3VzICovCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgPSAwOyAvKiBBc3luY2hyb25vdXMgKi8KKworICAgIC8vIG9uRnJhbWVSZXBsYWNlZCBpcyBjYWxsZWQgZnJvbSBxdWV1ZUJ1ZmZlciBpZiB0aGUgZnJhbWUgYmVpbmcgcXVldWVkIGlzCisgICAgLy8gcmVwbGFjaW5nIGFuIGV4aXN0aW5nIHNsb3QgaW4gdGhlIHF1ZXVlLiBBbnkgY2FsbCB0byBxdWV1ZUJ1ZmZlciB0aGF0CisgICAgLy8gZG9lc24ndCBjYWxsIG9uRnJhbWVBdmFpbGFibGUgd2lsbCBjYWxsIHRoaXMgY2FsbGJhY2sgaW5zdGVhZC4gVGhlIGl0ZW0KKyAgICAvLyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgIC8vIHF1ZXVlZCBmcmFtZSBleGNlcHQgZm9yIGl0cyBHcmFwaGljQnVmZmVyIHBvaW50ZXIsIHdoaWNoIHdpbGwgYWx3YXlzIGJlCisgICAgLy8gbnVsbC4KKyAgICAvLworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdpdGhvdXQgYW55IGxvY2sgaGVsZCBhbmQgY2FuIGJlIGNhbGxlZCBjb25jdXJyZW50bHkKKyAgICAvLyBieSBtdWx0aXBsZSB0aHJlYWRzLgorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVwbGFjZWQoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykge30gLyogQXN5bmNocm9ub3VzICovCiAKICAgICAvLyBvbkJ1ZmZlcnNSZWxlYXNlZCBpcyBjYWxsZWQgdG8gbm90aWZ5IHRoZSBidWZmZXIgY29uc3VtZXIgdGhhdCB0aGUKICAgICAvLyBCdWZmZXJRdWV1ZSBoYXMgcmVsZWFzZWQgaXRzIHJlZmVyZW5jZXMgdG8gb25lIG9yIG1vcmUgR3JhcGhpY0J1ZmZlcnMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaCBiL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuaAppbmRleCBmM2M0NmVjLi5jZWU0MWQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2d1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmgKKysrIGIvaW5jbHVkZS9ndWkvSUdyYXBoaWNCdWZmZXJBbGxvYy5oCkBAIC00NSwxMCArNDUsMTAgQEAKIGNsYXNzIEJuR3JhcGhpY0J1ZmZlckFsbG9jIDogcHVibGljIEJuSW50ZXJmYWNlPElHcmFwaGljQnVmZmVyQWxsb2M+CiB7CiBwdWJsaWM6Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoIHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyQ29uc3VtZXIuaCBiL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyQ29uc3VtZXIuaAppbmRleCA5YWMyM2MyLi4xNWY1MWZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2d1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9ndWkvSUdyYXBoaWNCdWZmZXJDb25zdW1lci5oCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPHVpL1BpeGVsRm9ybWF0Lmg+CiAjaW5jbHVkZSA8dWkvUmVjdC5oPgogCiAjaW5jbHVkZSA8RUdML2VnbC5oPgpAQCAtMjgxLDExICsyODAsMTEgQEAKIAogICAgIC8vIHNldERlZmF1bHRCdWZmZXJGb3JtYXQgYWxsb3dzIHRoZSBCdWZmZXJRdWV1ZSB0byBjcmVhdGUKICAgICAvLyBHcmFwaGljQnVmZmVycyBvZiBhIGRlZmF1bHRGb3JtYXQgaWYgbm8gZm9ybWF0IGlzIHNwZWNpZmllZAotICAgIC8vIGluIGRlcXVldWVCdWZmZXIuCi0gICAgLy8gVGhlIGluaXRpYWwgZGVmYXVsdCBpcyBQSVhFTF9GT1JNQVRfUkdCQV84ODg4LgorICAgIC8vIGluIGRlcXVldWVCdWZmZXIuICBGb3JtYXRzIGFyZSBlbnVtZXJhdGVkIGluIGdyYXBoaWNzLmg7IHRoZQorICAgIC8vIGluaXRpYWwgZGVmYXVsdCBpcyBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4OC4KICAgICAvLwogICAgIC8vIFJldHVybiBvZiBhIHZhbHVlIG90aGVyIHRoYW4gTk9fRVJST1IgbWVhbnMgYW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZWZhdWx0QnVmZmVyRm9ybWF0KFBpeGVsRm9ybWF0IGRlZmF1bHRGb3JtYXQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJGb3JtYXQodWludDMyX3QgZGVmYXVsdEZvcm1hdCkgPSAwOwogCiAgICAgLy8gc2V0Q29uc3VtZXJVc2FnZUJpdHMgd2lsbCB0dXJuIG9uIGFkZGl0aW9uYWwgdXNhZ2UgYml0cyBmb3IgZGVxdWV1ZUJ1ZmZlci4KICAgICAvLyBUaGVzZSBhcmUgbWVyZ2VkIHdpdGggdGhlIGJpdHMgcGFzc2VkIHRvIGRlcXVldWVCdWZmZXIuICBUaGUgdmFsdWVzIGFyZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oIGIvaW5jbHVkZS9ndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmluZGV4IDRkM2NkOWEuLjRlOWU4MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaAorKysgYi9pbmNsdWRlL2d1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmgKQEAgLTEzNCw3ICsxMzQsOSBAQAogICAgIC8vIHVwZGF0ZVRleEltYWdlKCkgaXMgY2FsbGVkLiAgSWYgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCB6ZXJvLCB0aGUKICAgICAvLyBkZWZhdWx0IHZhbHVlcyBzcGVjaWZpZWQgYnkgc2V0RGVmYXVsdEJ1ZmZlclNpemUoKSBhcmUgdXNlZCBpbnN0ZWFkLgogICAgIC8vCi0gICAgLy8gSWYgdGhlIGZvcm1hdCBpcyAwLCB0aGUgZGVmYXVsdCBmb3JtYXQgd2lsbCBiZSB1c2VkLgorICAgIC8vIFRoZSBwaXhlbCBmb3JtYXRzIGFyZSBlbnVtZXJhdGVkIGluIDxncmFwaGljcy5oPiwgZS5nLgorICAgIC8vIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4LiAgSWYgdGhlIGZvcm1hdCBpcyAwLCB0aGUgZGVmYXVsdCBmb3JtYXQKKyAgICAvLyB3aWxsIGJlIHVzZWQuCiAgICAgLy8KICAgICAvLyBUaGUgdXNhZ2UgYXJndW1lbnQgc3BlY2lmaWVzIGdyYWxsb2MgYnVmZmVyIHVzYWdlIGZsYWdzLiAgVGhlIHZhbHVlcwogICAgIC8vIGFyZSBlbnVtZXJhdGVkIGluIDxncmFsbG9jLmg+LCBlLmcuIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLiAgVGhlc2UKQEAgLTE2NSw3ICsxNjcsNyBAQAogICAgIC8vIEFsbCBvdGhlciBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGFuIHVua25vd24gZXJyb3IgcmV0dXJuZWQgZG93bnN0cmVhbQogICAgIC8vIGZyb20gdGhlIGdyYXBoaWNzIGFsbG9jYXRvciAodHlwaWNhbGx5IGVycm5vKS4KICAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50KiBzbG90LCBzcDxGZW5jZT4qIGZlbmNlLCBib29sIGFzeW5jLAotICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgPSAwOworICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgPSAwOwogCiAgICAgLy8gZGV0YWNoQnVmZmVyIGF0dGVtcHRzIHRvIHJlbW92ZSBhbGwgb3duZXJzaGlwIG9mIHRoZSBidWZmZXIgaW4gdGhlIGdpdmVuCiAgICAgLy8gc2xvdCBmcm9tIHRoZSBidWZmZXIgcXVldWUuIElmIHRoaXMgY2FsbCBzdWNjZWVkcywgdGhlIHNsb3Qgd2lsbCBiZQpAQCAtNDQ2LDcgKzQ0OCw3IEBACiAgICAgLy8gZGVxdWV1ZUJ1ZmZlci4gSWYgdGhlcmUgYXJlIGFscmVhZHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMKICAgICAvLyBhbGxvY2F0ZWQsIHRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdC4KICAgICB2aXJ0dWFsIHZvaWQgYWxsb2NhdGVCdWZmZXJzKGJvb2wgYXN5bmMsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmggYi9pbmNsdWRlL2d1aS9JU3VyZmFjZUNvbXBvc2VyLmgKaW5kZXggOGMzZDQ5ZS4uZjA0YTg0OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvSVN1cmZhY2VDb21wb3Nlci5oCisrKyBiL2luY2x1ZGUvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuaApAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAKICNpbmNsdWRlIDx1aS9GcmFtZVN0YXRzLmg+CisjaW5jbHVkZSA8dWkvUGl4ZWxGb3JtYXQuaD4KIAogI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmg+CiAjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3VpL1NlbnNvci5oIGIvaW5jbHVkZS9ndWkvU2Vuc29yLmgKaW5kZXggMjdhMjE1ZS4uNTliNGQ0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvU2Vuc29yLmgKKysrIGIvaW5jbHVkZS9ndWkvU2Vuc29yLmgKQEAgLTY3LDEyICs2NywxMiBAQAogICAgIGludDMyX3QgZ2V0TWluRGVsYXkoKSBjb25zdDsKICAgICBuc2Vjc190IGdldE1pbkRlbGF5TnMoKSBjb25zdDsKICAgICBpbnQzMl90IGdldFZlcnNpb24oKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRGaWZvUmVzZXJ2ZWRFdmVudENvdW50KCkgY29uc3Q7Ci0gICAgdWludDMyX3QgZ2V0Rmlmb01heEV2ZW50Q291bnQoKSBjb25zdDsKKyAgICBpbnQzMl90IGdldEZpZm9SZXNlcnZlZEV2ZW50Q291bnQoKSBjb25zdDsKKyAgICBpbnQzMl90IGdldEZpZm9NYXhFdmVudENvdW50KCkgY29uc3Q7CiAgICAgY29uc3QgU3RyaW5nOCYgZ2V0U3RyaW5nVHlwZSgpIGNvbnN0OwogICAgIGNvbnN0IFN0cmluZzgmIGdldFJlcXVpcmVkUGVybWlzc2lvbigpIGNvbnN0OwogICAgIGludDMyX3QgZ2V0TWF4RGVsYXkoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0OworICAgIGludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdDsKICAgICBib29sIGlzV2FrZVVwU2Vuc29yKCkgY29uc3Q7CiAgICAgaW50MzJfdCBnZXRSZXBvcnRpbmdNb2RlKCkgY29uc3Q7CiAKQEAgLTkzLDggKzkzLDggQEAKICAgICBmbG9hdCAgIG1Qb3dlcjsKICAgICBpbnQzMl90IG1NaW5EZWxheTsKICAgICBpbnQzMl90IG1WZXJzaW9uOwotICAgIHVpbnQzMl90IG1GaWZvUmVzZXJ2ZWRFdmVudENvdW50OwotICAgIHVpbnQzMl90IG1GaWZvTWF4RXZlbnRDb3VudDsKKyAgICBpbnQzMl90IG1GaWZvUmVzZXJ2ZWRFdmVudENvdW50OworICAgIGludDMyX3QgbUZpZm9NYXhFdmVudENvdW50OwogICAgIFN0cmluZzggbVN0cmluZ1R5cGU7CiAgICAgU3RyaW5nOCBtUmVxdWlyZWRQZXJtaXNzaW9uOwogICAgIGludDMyX3QgbU1heERlbGF5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvU3RyZWFtU3BsaXR0ZXIuaCBiL2luY2x1ZGUvZ3VpL1N0cmVhbVNwbGl0dGVyLmgKaW5kZXggZjkyNzk1My4uOGY0N2ViNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ndWkvU3RyZWFtU3BsaXR0ZXIuaAorKysgYi9pbmNsdWRlL2d1aS9TdHJlYW1TcGxpdHRlci5oCkBAIC03NCw3ICs3NCw3IEBACiAgICAgLy8gY2FuIGJsb2NrIGlmIHRoZXJlIGFyZSB0b28gbWFueSBvdXRzdGFuZGluZyBidWZmZXJzLiBJZiBpdCBibG9ja3MsIGl0CiAgICAgLy8gd2lsbCByZXN1bWUgd2hlbiBvbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXQgcmVsZWFzZXMgYSBidWZmZXIgYmFjayB0byB0aGUKICAgICAvLyBpbnB1dC4KLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpOworICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwogCiAgICAgLy8gRnJvbSBJQ29uc3VtZXJMaXN0ZW5lcgogICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgcmVsZWFzZWQgYnVmZmVycyBiZWNhdXNlIHdlIGRldGFjaCBlYWNoIGJ1ZmZlciBhcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ndWkvU3VyZmFjZS5oIGIvaW5jbHVkZS9ndWkvU3VyZmFjZS5oCmluZGV4IDk4ZjRmNGYuLmYyY2YwMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3VpL1N1cmZhY2UuaAorKysgYi9pbmNsdWRlL2d1aS9TdXJmYWNlLmgKQEAgLTE2MCwxMiArMTYwLDEyIEBACiAgICAgdmlydHVhbCBpbnQgY29ubmVjdChpbnQgYXBpKTsKICAgICB2aXJ0dWFsIGludCBkaXNjb25uZWN0KGludCBhcGkpOwogICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7Ci0gICAgdmlydHVhbCBpbnQgc2V0QnVmZmVyc0RpbWVuc2lvbnModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7Ci0gICAgdmlydHVhbCBpbnQgc2V0QnVmZmVyc1VzZXJEaW1lbnNpb25zKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNGb3JtYXQoUGl4ZWxGb3JtYXQgZm9ybWF0KTsKKyAgICB2aXJ0dWFsIGludCBzZXRCdWZmZXJzRGltZW5zaW9ucyhpbnQgdywgaW50IGgpOworICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNVc2VyRGltZW5zaW9ucyhpbnQgdywgaW50IGgpOworICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNGb3JtYXQoaW50IGZvcm1hdCk7CiAgICAgdmlydHVhbCBpbnQgc2V0U2NhbGluZ01vZGUoaW50IG1vZGUpOwotICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNUcmFuc2Zvcm0odWludDMyX3QgdHJhbnNmb3JtKTsKLSAgICB2aXJ0dWFsIGludCBzZXRCdWZmZXJzU3RpY2t5VHJhbnNmb3JtKHVpbnQzMl90IHRyYW5zZm9ybSk7CisgICAgdmlydHVhbCBpbnQgc2V0QnVmZmVyc1RyYW5zZm9ybShpbnQgdHJhbnNmb3JtKTsKKyAgICB2aXJ0dWFsIGludCBzZXRCdWZmZXJzU3RpY2t5VHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pOwogICAgIHZpcnR1YWwgaW50IHNldEJ1ZmZlcnNUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXApOwogICAgIHZpcnR1YWwgaW50IHNldENyb3AoUmVjdCBjb25zdCogcmVjdCk7CiAgICAgdmlydHVhbCBpbnQgc2V0VXNhZ2UodWludDMyX3QgcmVxVXNhZ2UpOwpAQCAtMjExLDcgKzIxMSw3IEBACiAKICAgICAvLyBtUmVxRm9ybWF0IGlzIHRoZSBidWZmZXIgcGl4ZWwgZm9ybWF0IHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgYXQgdGhlIG5leHQKICAgICAvLyBkZXVxdWUgb3BlcmF0aW9uLiBJdCBpcyBpbml0aWFsaXplZCB0byBQSVhFTF9GT1JNQVRfUkdCQV84ODg4LgotICAgIFBpeGVsRm9ybWF0IG1SZXFGb3JtYXQ7CisgICAgdWludDMyX3QgbVJlcUZvcm1hdDsKIAogICAgIC8vIG1SZXFVc2FnZSBpcyB0aGUgc2V0IG9mIGJ1ZmZlciB1c2FnZSBmbGFncyB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkCiAgICAgLy8gYXQgdGhlIG5leHQgZGV1cXVlIG9wZXJhdGlvbi4gSXQgaXMgaW5pdGlhbGl6ZWQgdG8gMC4KQEAgLTI0MCwyMyArMjQwLDIzIEBACiAgICAgLy8gZnJvbSBiZWluZyBzZXQgYnkgdGhlIGNvbXBvc2l0b3IuCiAgICAgdWludDMyX3QgbVN0aWNreVRyYW5zZm9ybTsKIAotICAgIC8vIG1EZWZhdWx0V2lkdGggaXMgZGVmYXVsdCB3aWR0aCBvZiB0aGUgYnVmZmVycywgcmVnYXJkbGVzcyBvZiB0aGUKLSAgICAvLyBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMgY2FsbC4KLSAgICB1aW50MzJfdCBtRGVmYXVsdFdpZHRoOworICAgICAvLyBtRGVmYXVsdFdpZHRoIGlzIGRlZmF1bHQgd2lkdGggb2YgdGhlIGJ1ZmZlcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlCisgICAgIC8vIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyBjYWxsLgorICAgICB1aW50MzJfdCBtRGVmYXVsdFdpZHRoOwogCi0gICAgLy8gbURlZmF1bHRIZWlnaHQgaXMgZGVmYXVsdCBoZWlnaHQgb2YgdGhlIGJ1ZmZlcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gICAgLy8gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zIGNhbGwuCi0gICAgdWludDMyX3QgbURlZmF1bHRIZWlnaHQ7CisgICAgIC8vIG1EZWZhdWx0SGVpZ2h0IGlzIGRlZmF1bHQgaGVpZ2h0IG9mIHRoZSBidWZmZXJzLCByZWdhcmRsZXNzIG9mIHRoZQorICAgICAvLyBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMgY2FsbC4KKyAgICAgdWludDMyX3QgbURlZmF1bHRIZWlnaHQ7CiAKLSAgICAvLyBtVXNlcldpZHRoLCBpZiBub24temVybywgaXMgYW4gYXBwbGljYXRpb24tc3BlY2lmaWVkIG92ZXJyaWRlCi0gICAgLy8gb2YgbURlZmF1bHRXaWR0aC4gIFRoaXMgaXMgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lkdGggc2V0IGJ5Ci0gICAgLy8gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zLgotICAgIHVpbnQzMl90IG1Vc2VyV2lkdGg7CisgICAgIC8vIG1Vc2VyV2lkdGgsIGlmIG5vbi16ZXJvLCBpcyBhbiBhcHBsaWNhdGlvbi1zcGVjaWZpZWQgb3ZlcnJpZGUKKyAgICAgLy8gb2YgbURlZmF1bHRXaWR0aC4gIFRoaXMgaXMgbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgd2lkdGggc2V0IGJ5CisgICAgIC8vIG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucy4KKyAgICAgdWludDMyX3QgbVVzZXJXaWR0aDsKIAotICAgIC8vIG1Vc2VySGVpZ2h0LCBpZiBub24temVybywgaXMgYW4gYXBwbGljYXRpb24tc3BlY2lmaWVkIG92ZXJyaWRlCi0gICAgLy8gb2YgbURlZmF1bHRIZWlnaHQuICBUaGlzIGlzIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGhlaWdodCBzZXQKLSAgICAvLyBieSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMuCi0gICAgdWludDMyX3QgbVVzZXJIZWlnaHQ7CisgICAgIC8vIG1Vc2VySGVpZ2h0LCBpZiBub24temVybywgaXMgYW4gYXBwbGljYXRpb24tc3BlY2lmaWVkIG92ZXJyaWRlCisgICAgIC8vIG9mIG1EZWZhdWx0SGVpZ2h0LiAgVGhpcyBpcyBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBoZWlnaHQgc2V0CisgICAgIC8vIGJ5IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucy4KKyAgICAgdWludDMyX3QgbVVzZXJIZWlnaHQ7CiAKICAgICAvLyBtVHJhbnNmb3JtSGludCBpcyB0aGUgdHJhbnNmb3JtIHByb2JhYmx5IGFwcGxpZWQgdG8gYnVmZmVycyBvZiB0aGlzCiAgICAgLy8gd2luZG93LiB0aGlzIGlzIG9ubHkgYSBoaW50LCBhY3R1YWwgdHJhbnNmb3JtIG1heSBkaWZmZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaCBiL2luY2x1ZGUvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oCmluZGV4IDM3ZDk1M2UuLjRjYmZjMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oCisrKyBiL2luY2x1ZGUvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5oCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICBzdGF0dXNfdCAgICBzaG93KGNvbnN0IHNwPElCaW5kZXI+JiBpZCk7CiAgICAgc3RhdHVzX3QgICAgc2V0RmxhZ3MoY29uc3Qgc3A8SUJpbmRlcj4mIGlkLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgbWFzayk7CiAgICAgc3RhdHVzX3QgICAgc2V0VHJhbnNwYXJlbnRSZWdpb25IaW50KGNvbnN0IHNwPElCaW5kZXI+JiBpZCwgY29uc3QgUmVnaW9uJiB0cmFuc3BhcmVudCk7Ci0gICAgc3RhdHVzX3QgICAgc2V0TGF5ZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGlkLCB1aW50MzJfdCBsYXllcik7CisgICAgc3RhdHVzX3QgICAgc2V0TGF5ZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGlkLCBpbnQzMl90IGxheWVyKTsKICAgICBzdGF0dXNfdCAgICBzZXRBbHBoYShjb25zdCBzcDxJQmluZGVyPiYgaWQsIGZsb2F0IGFscGhhPTEuMGYpOwogICAgIHN0YXR1c190ICAgIHNldE1hdHJpeChjb25zdCBzcDxJQmluZGVyPiYgaWQsIGZsb2F0IGRzZHgsIGZsb2F0IGR0ZHgsIGZsb2F0IGRzZHksIGZsb2F0IGR0ZHkpOwogICAgIHN0YXR1c190ICAgIHNldFBvc2l0aW9uKGNvbnN0IHNwPElCaW5kZXI+JiBpZCwgZmxvYXQgeCwgZmxvYXQgeSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2d1aS9TdXJmYWNlQ29udHJvbC5oIGIvaW5jbHVkZS9ndWkvU3VyZmFjZUNvbnRyb2wuaAppbmRleCA5ZjYyZjdjLi44NGZiOWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2d1aS9TdXJmYWNlQ29udHJvbC5oCisrKyBiL2luY2x1ZGUvZ3VpL1N1cmZhY2VDb250cm9sLmgKQEAgLTU3LDggKzU3LDggQEAKICAgICAvLyByZWxlYXNlIHN1cmZhY2UgZGF0YSBmcm9tIGphdmEKICAgICB2b2lkICAgICAgICBjbGVhcigpOwogCi0gICAgc3RhdHVzX3QgICAgc2V0TGF5ZXJTdGFjayh1aW50MzJfdCBsYXllclN0YWNrKTsKLSAgICBzdGF0dXNfdCAgICBzZXRMYXllcih1aW50MzJfdCBsYXllcik7CisgICAgc3RhdHVzX3QgICAgc2V0TGF5ZXJTdGFjayhpbnQzMl90IGxheWVyU3RhY2spOworICAgIHN0YXR1c190ICAgIHNldExheWVyKGludDMyX3QgbGF5ZXIpOwogICAgIHN0YXR1c190ICAgIHNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHkpOwogICAgIHN0YXR1c190ICAgIHNldFNpemUodWludDMyX3QgdywgdWludDMyX3QgaCk7CiAgICAgc3RhdHVzX3QgICAgaGlkZSgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9kcm0vRHJtQVBJLmggYi9pbmNsdWRlL21lZGlhL2RybS9Ecm1BUEkuaAppbmRleCA0NjMzYjdlLi40OTkzOWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2RybS9Ecm1BUEkuaAorKysgYi9pbmNsdWRlL21lZGlhL2RybS9Ecm1BUEkuaApAQCAtMjA5LDcgKzIwOSw5IEBACiAgICAgICAgIC8vIGNvbmZpcm1lZC4gVGhlIHBlcnNpc3RlZCByZWNvcmQgb24gdGhlIGNsaWVudCBpcyBvbmx5IHJlbW92ZWQgYWZ0ZXIgcG9zaXRpdmUKICAgICAgICAgLy8gY29uZmlybWF0aW9uIHRoYXQgdGhlIHNlcnZlciByZWNlaXZlZCB0aGUgbWVzc2FnZSB1c2luZyByZWxlYXNlU2VjdXJlU3RvcHMoKS4KICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wcyhMaXN0PFZlY3Rvcjx1aW50OF90PiA+ICZzZWN1cmVTdG9wcykgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApID0gMDsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQWxsU2VjdXJlU3RvcHMoKSA9IDA7CiAKICAgICAgICAgLy8gUmVhZCBhIHByb3BlcnR5IHZhbHVlIGdpdmVuIHRoZSBkZXZpY2UgcHJvcGVydHkgc3RyaW5nLiAgVGhlcmUgYXJlIGEgZmV3IGZvcm1zCiAgICAgICAgIC8vIG9mIHByb3BlcnR5IGFjY2VzcyBtZXRob2RzLCBkZXBlbmRpbmcgb24gdGhlIGRhdGEgdHlwZSByZXR1cm5lZC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaCBiL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaAppbmRleCA5MDE1MGM2Li5kNWY0MmJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oCkBAIC0xNzQsOCArMTc0LDggQEAKIAogICAgIFR5cGUgbVR5cGU7CiAgICAgc2l6ZV90IG1OdW1QbGFuZXM7ICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgcGxhbmVzCi0gICAgc2l6ZV90IG1XaWR0aDsgICAgICAgICAgICAgICAgICAvLyB3aWR0aCBvZiBsYXJnZXN0IHBsYW5lCi0gICAgc2l6ZV90IG1IZWlnaHQ7ICAgICAgICAgICAgICAgICAvLyBoZWlnaHQgb2YgbGFyZ2VzdCBwbGFuZQorICAgIHNpemVfdCBtV2lkdGg7ICAgICAgICAgICAgICAgICAgLy8gd2lkdGggb2YgbGFyZ2VzdCBwbGFuZSAodW5wYWRkZWQsIGFzIGluIG5GcmFtZVdpZHRoKQorICAgIHNpemVfdCBtSGVpZ2h0OyAgICAgICAgICAgICAgICAgLy8gaGVpZ2h0IG9mIGxhcmdlc3QgcGxhbmUgKHVucGFkZGVkLCBhcyBpbiBuRnJhbWVIZWlnaHQpCiAgICAgc2l6ZV90IG1CaXREZXB0aDsgICAgICAgICAgICAgICAvLyB1c2VhYmxlIGJpdCBkZXB0aAogICAgIHN0cnVjdCBQbGFuZUluZm8gewogICAgICAgICBzaXplX3QgbU9mZnNldDsgICAgICAgICAgICAgLy8gb2Zmc2V0IG9mIGZpcnN0IHBpeGVsIG9mIHRoZSBwbGFuZSBpbiBieXRlcwpAQCAtMTk0LDEyICsxOTQsMjYgQEAKIC8vIG90aGVyIHRoYW4gaW52YWxpZC4gIFRoZSBjb2xvci1mb3JtYXQsIGZyYW1lIHdpZHRoL2hlaWdodCwgYW5kIHN0cmlkZS8KIC8vIHNsaWNlLWhlaWdodCBwYXJhbWV0ZXJzIGFyZSBvbmVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIHJhdyB2aWRlbwogLy8gcG9ydCAoaW5wdXQgb3Igb3V0cHV0KSwgYnV0IHRoZSBzdHJpZGUvc2xpY2UgaGVpZ2h0IHBhcmFtZXRlcnMgbWF5IGJlCi0vLyBpbmNvcnJlY3QuICBUaGUgY29tcG9uZW50IHNoYWxsIGZpbGwgb3V0IHRoZSBNZWRpYUltYWdlIHN0cnVjdHVyZSB0aGF0CisvLyBpbmNvcnJlY3QuIGJVc2luZ05hdGl2ZUJ1ZmZlcnMgaXMgT01YX1RSVUUgaWYgbmF0aXZlIGFuZHJvaWQgYnVmZmVycyB3aWxsCisvLyBiZSB1c2VkICh3aGlsZSBzcGVjaWZ5aW5nIHRoaXMgY29sb3IgZm9ybWF0KS4KKy8vCisvLyBUaGUgY29tcG9uZW50IHNoYWxsIGZpbGwgb3V0IHRoZSBNZWRpYUltYWdlIHN0cnVjdHVyZSB0aGF0CiAvLyBjb3JyZXNwb25kcyB0byB0aGUgZGVzY3JpYmVkIHJhdyB2aWRlbyBmb3JtYXQsIGFuZCB0aGUgcG90ZW50aWFsbHkgY29ycmVjdGVkCiAvLyBzdHJpZGUgYW5kIHNsaWNlLWhlaWdodCBpbmZvLgogLy8KLS8vIEZvciBub24tWVVWIHBhY2tlZCBwbGFuYXIvc2VtaXBsYW5hciBpbWFnZSBmb3JtYXRzLCB0aGUgY29tcG9uZW50IHNoYWxsIHNldAotLy8gbU51bVBsYW5lcyB0byAwLCBhbmQgbVR5cGUgdG8gTUVESUFfSU1BR0VfVFlQRV9VTktOT1dOLgorLy8gVGhlIGJlaGF2aW9yIGlzIHNsaWdodGx5IGRpZmZlcmVudCBpZiBiVXNpbmdOYXRpdmVCdWZmZXJzIGlzIE9NWF9UUlVFLAorLy8gdGhvdWdoIG1vc3QgaW1wbGVtZW50YXRpb25zIGNhbiBpZ25vcmUgdGhpcyBkaWZmZXJlbmNlLiBXaGVuIHVzaW5nIG5hdGl2ZSBidWZmZXJzLAorLy8gdGhlIGNvbXBvbmVudCBtYXkgY2hhbmdlIHRoZSBjb25maWd1cmVkIGNvbG9yIGZvcm1hdCB0byBhbiBvcHRpbWl6ZWQgZm9ybWF0LgorLy8gQWRkaXRpb25hbGx5LCB3aGVuIGFsbG9jYXRpbmcgdGhlc2UgYnVmZmVycyBmb3IgZmxleGlibGUgdXNlY2FzZSwgdGhlIGZyYW1ld29yaworLy8gd2lsbCBzZXQgdGhlIFNXX1JFQUQvV1JJVEVfT0ZURU4gdXNhZ2UgZmxhZ3MuIEluIHRoaXMgY2FzZSAoaWYgYlVzaW5nTmF0aXZlQnVmZmVycworLy8gaXMgT01YX1RSVUUpLCB0aGUgY29tcG9uZW50IHNoYWxsIGZpbGwgb3V0IHRoZSBNZWRpYUltYWdlIGluZm9ybWF0aW9uIGZvciB0aGUKKy8vIHNjZW5hcmlvIHdoZW4gdGhlc2UgU1ctcmVhZGFibGUvd3JpdGFibGUgYnVmZmVycyBhcmUgbG9ja2VkIHVzaW5nIGdyYWxsb2NfbG9jay4KKy8vIE5vdGUsIHRoYXQgdGhlc2UgYnVmZmVycyBtYXkgYWxzbyBiZSBsb2NrZWQgdXNpbmcgZ3JhbGxvY19sb2NrX3ljYmNyLCB3aGljaCBtdXN0CisvLyBiZSBzdXBwb3J0ZWQgZm9yIHZlbmRvci1zcGVjaWZpYyBmb3JtYXRzLgorLy8KKy8vIEZvciBub24tWVVWIHBhY2tlZCBwbGFuYXIvc2VtaXBsYW5hciBpbWFnZSBmb3JtYXRzLCBvciBpZiBiVXNpbmdOYXRpdmVCdWZmZXJzCisvLyBpcyBPTVhfVFJVRSBhbmQgdGhlIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgY29sb3IgZm9ybWF0IHdpdGggbmF0aXZlCisvLyBidWZmZXJzLCB0aGUgY29tcG9uZW50IHNoYWxsIHNldCBtTnVtUGxhbmVzIHRvIDAsIGFuZCBtVHlwZSB0byBNRURJQV9JTUFHRV9UWVBFX1VOS05PV04uCiBzdHJ1Y3QgRGVzY3JpYmVDb2xvckZvcm1hdFBhcmFtcyB7CiAgICAgT01YX1UzMiBuU2l6ZTsKICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CkBAIC0yMDksNiArMjIzLDcgQEAKICAgICBPTVhfVTMyIG5GcmFtZUhlaWdodDsKICAgICBPTVhfVTMyIG5TdHJpZGU7CiAgICAgT01YX1UzMiBuU2xpY2VIZWlnaHQ7CisgICAgT01YX0JPT0wgYlVzaW5nTmF0aXZlQnVmZmVyczsKIAogICAgIC8vIG91dHB1dDogZmlsbCBvdXQgdGhlIE1lZGlhSW1hZ2UgZmllbGRzCiAgICAgTWVkaWFJbWFnZSBzTWVkaWFJbWFnZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQXNTdHJpbmcuaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQXNTdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjE3N2ExCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Bc1N0cmluZy5oCkBAIC0wLDAgKzEsOTQzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKiBOT1RFOiBUaGlzIGZpbGUgY29udGFpbnMgc2V2ZXJhbCBzZWN0aW9ucyBmb3IgaW5kaXZpZHVhbCBPTVggaW5jbHVkZSBmaWxlcy4KKyAgIEVhY2ggc2VjdGlvbiBoYXMgaXRzIG93biBpbmNsdWRlIGd1YXJkLiAgVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBBRlRFUgorICAgdGhlIE9NWCBpbmNsdWRlIGZpbGVzLiAqLworCisjaWZkZWYgT01YX0F1ZGlvX2gKKy8qIGFzU3RyaW5nIGRlZmluaXRpb25zIGlmIG1lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmggd2FzIGluY2x1ZGVkICovCisKKyNpZm5kZWYgQVNfU1RSSU5HX0ZPUl9PTVhfQVVESU9fSAorI2RlZmluZSBBU19TVFJJTkdfRk9SX09NWF9BVURJT19ICisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0FVRElPX0NPRElOR1RZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdVbnVzZWQ6ICAgICByZXR1cm4gIlVudXNlZCI7ICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0F1dG9EZXRlY3Q6IHJldHVybiAiQXV0b0RldGVjdCI7ICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nUENNOiAgICAgICAgcmV0dXJuICJQQ00iOworICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBRFBDTTogICAgICByZXR1cm4gIkFEUENNIjsgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FNUjogICAgICAgIHJldHVybiAiQU1SIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nR1NNRlI6ICAgICAgcmV0dXJuICJHU01GUiI7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0dTTUVGUjogICAgIHJldHVybiAiR1NNRUZSIjsgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nR1NNSFI6ICAgICAgcmV0dXJuICJHU01IUiI7ICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdQRENGUjogICAgICByZXR1cm4gIlBEQ0ZSIjsgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ1BEQ0VGUjogICAgIHJldHVybiAiUERDRUZSIjsgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nUERDSFI6ICAgICAgcmV0dXJuICJQRENIUiI7ICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdURE1BRlI6ICAgICByZXR1cm4gIlRETUFGUiI7ICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ1RETUFFRlI6ICAgIHJldHVybiAiVERNQUVGUiI7ICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nUUNFTFA4OiAgICAgcmV0dXJuICJRQ0VMUDgiOyAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdRQ0VMUDEzOiAgICByZXR1cm4gIlFDRUxQMTMiOyAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0VWUkM6ICAgICAgIHJldHVybiAiRVZSQyI7ICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nU01WOiAgICAgICAgcmV0dXJuICJTTVYiOyAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdHNzExOiAgICAgICByZXR1cm4gIkc3MTEiOworICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdHNzIzOiAgICAgICByZXR1cm4gIkc3MjMiOyAgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0c3MjY6ICAgICAgIHJldHVybiAiRzcyNiI7ICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nRzcyOTogICAgICAgcmV0dXJuICJHNzI5IjsgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBQUM6ICAgICAgICByZXR1cm4gIkFBQyI7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ01QMzogICAgICAgIHJldHVybiAiTVAzIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nU0JDOiAgICAgICAgcmV0dXJuICJTQkMiOyAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdWT1JCSVM6ICAgICByZXR1cm4gIlZPUkJJUyI7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ1dNQTogICAgICAgIHJldHVybiAiV01BIjsgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nUkE6ICAgICAgICAgcmV0dXJuICJSQSI7ICAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdNSURJOiAgICAgICByZXR1cm4gIk1JREkiOyAgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0ZMQUM6ICAgICAgIHJldHVybiAiRkxBQyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9BVURJT19QQ01NT0RFVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0FVRElPX1BDTU1vZGVMaW5lYXI6IHJldHVybiAiTGluZWFyIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fUENNTW9kZUFMYXc6ICAgcmV0dXJuICJBTGF3IjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fUENNTW9kZU1VTGF3OiAgcmV0dXJuICJNVUxhdyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9BVURJT19DSEFOTkVMVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NoYW5uZWxOb25lOiByZXR1cm4gIk5vbmUiOyAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0FVRElPX0NoYW5uZWxMRjogICByZXR1cm4gIkxGIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ2hhbm5lbFJGOiAgIHJldHVybiAiUkYiOworICAgICAgICBjYXNlIE9NWF9BVURJT19DaGFubmVsQ0Y6ICAgcmV0dXJuICJDRiI7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NoYW5uZWxMUzogICByZXR1cm4gIkxTIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ2hhbm5lbFJTOiAgIHJldHVybiAiUlMiOworICAgICAgICBjYXNlIE9NWF9BVURJT19DaGFubmVsTEZFOiAgcmV0dXJuICJMRkUiOworICAgICAgICBjYXNlIE9NWF9BVURJT19DaGFubmVsQ1M6ICAgcmV0dXJuICJDUyI7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NoYW5uZWxMUjogICByZXR1cm4gIkxSIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ2hhbm5lbFJSOiAgIHJldHVybiAiUlIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvOiAgICAgIHJldHVybiAiU3RlcmVvIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQ2hhbm5lbE1vZGVKb2ludFN0ZXJlbzogcmV0dXJuICJKb2ludFN0ZXJlbyI7CisvLyAgICAgIGNhc2UgT01YX0FVRElPX0NoYW5uZWxNb2RlRHVhbDogICAgICAgIHJldHVybiAiRHVhbCI7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NoYW5uZWxNb2RlTW9ubzogICAgICAgIHJldHVybiAiTW9ubyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVAyQURUUzogcmV0dXJuICJNUDJBRFRTIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0QURUUzogcmV0dXJuICJNUDRBRFRTIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0TE9BUzogcmV0dXJuICJNUDRMT0FTIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0TEFUTTogcmV0dXJuICJNUDRMQVRNIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0QURJRjogICAgcmV0dXJuICJBRElGIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkY6ICAgcmV0dXJuICJNUDRGRiI7CisvLyAgICAgIGNhc2UgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFJBVzogICAgIHJldHVybiAiUkFXIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisvLyAgICAgIGNhc2UgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0Q29uZm9ybWFuY2U6IHJldHVybiAiQ29uZm9ybWFuY2UiOworLy8gICAgICBjYXNlIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElGMTogICAgICAgICByZXR1cm4gIklGMSI7CisvLyAgICAgIGNhc2UgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYyOiAgICAgICAgIHJldHVybiAiSUYyIjsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRGU0Y6ICAgICAgICAgcmV0dXJuICJGU0YiOworLy8gICAgICBjYXNlIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdFJUUFBheWxvYWQ6ICByZXR1cm4gIlJUUFBheWxvYWQiOworLy8gICAgICBjYXNlIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElUVTogICAgICAgICByZXR1cm4gIklUVSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVVudXNlZDogcmV0dXJuICJVbnVzZWQiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMDogICAgcmV0dXJuICJOQjAiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMTogICAgcmV0dXJuICJOQjEiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMjogICAgcmV0dXJuICJOQjIiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMzogICAgcmV0dXJuICJOQjMiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNDogICAgcmV0dXJuICJOQjQiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNTogICAgcmV0dXJuICJOQjUiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNjogICAgcmV0dXJuICJOQjYiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNzogICAgcmV0dXJuICJOQjciOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMDogICAgcmV0dXJuICJXQjAiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMTogICAgcmV0dXJuICJXQjEiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMjogICAgcmV0dXJuICJXQjIiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMzogICAgcmV0dXJuICJXQjMiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNDogICAgcmV0dXJuICJXQjQiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNTogICAgcmV0dXJuICJXQjUiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNjogICAgcmV0dXJuICJXQjYiOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNzogICAgcmV0dXJuICJXQjciOworICAgICAgICBjYXNlIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCODogICAgcmV0dXJuICJXQjgiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0FVRElPX0FNUkRUWE1PREVUWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQU1SRFRYTW9kZU9mZjogICAgcmV0dXJuICJNb2RlT2ZmIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQU1SRFRYTW9kZU9uVkFEMTogcmV0dXJuICJNb2RlT25WQUQxIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQU1SRFRYTW9kZU9uVkFEMjogcmV0dXJuICJNb2RlT25WQUQyIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQU1SRFRYTW9kZU9uQXV0bzogcmV0dXJuICJNb2RlT25BdXRvIjsKKy8vICAgICAgY2FzZSBPTVhfQVVESU9fQU1SRFRYYXNFRlI6ICAgICAgcmV0dXJuICJhc0VGUiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCisjZW5kaWYgLy8gQVNfU1RSSU5HX0ZPUl9PTVhfQVVESU9fSAorCisjZW5kaWYgLy8gT01YX0F1ZGlvX2gKKworI2lmZGVmIE9NWF9BdWRpb0V4dF9oCisvKiBhc1N0cmluZyBkZWZpbml0aW9ucyBpZiBtZWRpYS9vcGVubWF4L09NWF9BdWRpb0V4dC5oIHdhcyBpbmNsdWRlZCAqLworCisjaWZuZGVmIEFTX1NUUklOR19GT1JfT01YX0FVRElPRVhUX0gKKyNkZWZpbmUgQVNfU1RSSU5HX0ZPUl9PTVhfQVVESU9FWFRfSAorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9BVURJT19DT0RJTkdFWFRUWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZEFDMzogIHJldHVybiAiQW5kcm9pZEFDMyI7CisgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRPUFVTOiByZXR1cm4gIkFuZHJvaWRPUFVTIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc1N0cmluZygoT01YX0FVRElPX0NPRElOR1RZUEUpaSwgZGVmKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBBU19TVFJJTkdfRk9SX09NWF9BVURJT0VYVF9ICisKKyNlbmRpZiAvLyBPTVhfQXVkaW9FeHRfaAorCisjaWZkZWYgT01YX0NvbXBvbmVudF9oCisvKiBhc1N0cmluZyBkZWZpbml0aW9ucyBpZiBtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaCB3YXMgaW5jbHVkZWQgKi8KKworI2lmbmRlZiBBU19TVFJJTkdfRk9SX09NWF9DT01QT05FTlRfSAorI2RlZmluZSBBU19TVFJJTkdfRk9SX09NWF9DT01QT05FTlRfSAorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9QT1JURE9NQUlOVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX1BvcnREb21haW5BdWRpbzogcmV0dXJuICJBdWRpbyI7CisgICAgICAgIGNhc2UgT01YX1BvcnREb21haW5WaWRlbzogcmV0dXJuICJWaWRlbyI7CisgICAgICAgIGNhc2UgT01YX1BvcnREb21haW5JbWFnZTogcmV0dXJuICJJbWFnZSI7CisvLyAgICAgIGNhc2UgT01YX1BvcnREb21haW5PdGhlcjogcmV0dXJuICJPdGhlciI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBBU19TVFJJTkdfRk9SX09NWF9DT01QT05FTlRfSAorCisjZW5kaWYgLy8gT01YX0NvbXBvbmVudF9oCisKKyNpZmRlZiBPTVhfQ29yZV9oCisvKiBhc1N0cmluZyBkZWZpbml0aW9ucyBpZiBtZWRpYS9vcGVubWF4L09NWF9Db3JlLmggd2FzIGluY2x1ZGVkICovCisKKyNpZm5kZWYgQVNfU1RSSU5HX0ZPUl9PTVhfQ09SRV9ICisjZGVmaW5lIEFTX1NUUklOR19GT1JfT01YX0NPUkVfSAorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9DT01NQU5EVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRTdGF0ZVNldDogICAgcmV0dXJuICJTdGF0ZVNldCI7CisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRGbHVzaDogICAgICAgcmV0dXJuICJGbHVzaCI7CisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RGlzYWJsZTogcmV0dXJuICJQb3J0RGlzYWJsZSI7CisgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RW5hYmxlOiAgcmV0dXJuICJQb3J0RW5hYmxlIjsKKy8vICAgICAgY2FzZSBPTVhfQ29tbWFuZE1hcmtCdWZmZXI6ICByZXR1cm4gIk1hcmtCdWZmZXIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9TVEFURVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9TdGF0ZUludmFsaWQ6ICAgICAgICAgIHJldHVybiAiSW52YWxpZCI7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOiAgICAgICAgICAgcmV0dXJuICJMb2FkZWQiOworICAgICAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6ICAgICAgICAgICAgIHJldHVybiAiSWRsZSI7CisgICAgICAgIGNhc2UgT01YX1N0YXRlRXhlY3V0aW5nOiAgICAgICAgcmV0dXJuICJFeGVjdXRpbmciOworLy8gICAgICBjYXNlIE9NWF9TdGF0ZVBhdXNlOiAgICAgICAgICAgIHJldHVybiAiUGF1c2UiOworLy8gICAgICBjYXNlIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXM6IHJldHVybiAiV2FpdEZvclJlc291cmNlcyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0VSUk9SVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0Vycm9yTm9uZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM6ICAgICAgICAgICAgICByZXR1cm4gIkluc3VmZmljaWVudFJlc291cmNlcyI7CisgICAgICAgIGNhc2UgT01YX0Vycm9yVW5kZWZpbmVkOiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbmRlZmluZWQiOworICAgICAgICBjYXNlIE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lOiAgICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZENvbXBvbmVudE5hbWUiOworICAgICAgICBjYXNlIE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOiAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29tcG9uZW50Tm90Rm91bmQiOworICAgICAgICBjYXNlIE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiSW52YWxpZENvbXBvbmVudCI7ICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9FcnJvckJhZFBhcmFtZXRlcjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQmFkUGFyYW1ldGVyIjsKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5vdEltcGxlbWVudGVkIjsKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JVbmRlcmZsb3c6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVuZGVyZmxvdyI7ICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JPdmVyZmxvdzogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk92ZXJmbG93IjsgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JIYXJkd2FyZTogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkhhcmR3YXJlIjsgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkludmFsaWRTdGF0ZSI7CisgICAgICAgIGNhc2UgT01YX0Vycm9yU3RyZWFtQ29ycnVwdDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJTdHJlYW1Db3JydXB0IjsKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JQb3J0c05vdENvbXBhdGlibGU6ICAgICAgICAgICAgICAgICByZXR1cm4gIlBvcnRzTm90Q29tcGF0aWJsZSI7ICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JSZXNvdXJjZXNMb3N0OiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlJlc291cmNlc0xvc3QiOworICAgICAgICBjYXNlIE9NWF9FcnJvck5vTW9yZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTm9Nb3JlIjsKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JWZXJzaW9uTWlzbWF0Y2g6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlZlcnNpb25NaXNtYXRjaCI7ICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JOb3RSZWFkeTogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5vdFJlYWR5IjsgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JUaW1lb3V0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlRpbWVvdXQiOyAgICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JTYW1lU3RhdGU6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlNhbWVTdGF0ZSI7ICAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JSZXNvdXJjZXNQcmVlbXB0ZWQ6ICAgICAgICAgICAgICAgICByZXR1cm4gIlJlc291cmNlc1ByZWVtcHRlZCI7ICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nQWxsb2NhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiAiUG9ydFVucmVzcG9uc2l2ZUR1cmluZ0FsbG9jYXRpb24iOyAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nRGVhbGxvY2F0aW9uOgorICAgICAgICAgICAgcmV0dXJuICJQb3J0VW5yZXNwb25zaXZlRHVyaW5nRGVhbGxvY2F0aW9uIjsgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdTdG9wOgorICAgICAgICAgICAgcmV0dXJuICJQb3J0VW5yZXNwb25zaXZlRHVyaW5nU3RvcCI7ICAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjoKKyAgICAgICAgICAgIHJldHVybiAiSW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uIjsgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiAiSW5jb3JyZWN0U3RhdGVPcGVyYXRpb24iOyAgICAgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc6ICAgICAgICAgICAgICAgICByZXR1cm4gIlVuc3VwcG9ydGVkU2V0dGluZyI7CisgICAgICAgIGNhc2UgT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJVbnN1cHBvcnRlZEluZGV4IjsKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkJhZFBvcnRJbmRleCI7CisgICAgICAgIGNhc2UgT01YX0Vycm9yUG9ydFVucG9wdWxhdGVkOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQb3J0VW5wb3B1bGF0ZWQiOyAgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0Vycm9yQ29tcG9uZW50U3VzcGVuZGVkOiAgICAgICAgICAgICAgICAgcmV0dXJuICJDb21wb25lbnRTdXNwZW5kZWQiOyAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0Vycm9yRHluYW1pY1Jlc291cmNlc1VuYXZhaWxhYmxlOgorICAgICAgICAgICAgcmV0dXJuICJEeW5hbWljUmVzb3VyY2VzVW5hdmFpbGFibGUiOyAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9FcnJvck1iRXJyb3JzSW5GcmFtZTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiTWJFcnJvcnNJbkZyYW1lIjsgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9FcnJvckZvcm1hdE5vdERldGVjdGVkOiAgICAgICAgICAgICAgICAgIHJldHVybiAiRm9ybWF0Tm90RGV0ZWN0ZWQiOyAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9FcnJvckNvbnRlbnRQaXBlT3BlbkZhaWxlZDogICAgICAgICAgICAgIHJldHVybiAiQ29udGVudFBpcGVPcGVuRmFpbGVkIjsgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9FcnJvckNvbnRlbnRQaXBlQ3JlYXRpb25GYWlsZWQ6CisgICAgICAgICAgICByZXR1cm4gIkNvbnRlbnRQaXBlQ3JlYXRpb25GYWlsZWQiOyAgICAgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0Vycm9yU2VwZXJhdGVUYWJsZXNVc2VkOiAgICAgICAgICAgICAgICAgcmV0dXJuICJTZXBlcmF0ZVRhYmxlc1VzZWQiOyAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQ6ICAgICAgICAgICAgICAgcmV0dXJuICJUdW5uZWxpbmdVbnN1cHBvcnRlZCI7ICAgLy8gdW51c2VkCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0VWRU5UVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0V2ZW50Q21kQ29tcGxldGU6ICAgICAgICAgICAgICAgcmV0dXJuICJDbWRDb21wbGV0ZSI7CisgICAgICAgIGNhc2UgT01YX0V2ZW50RXJyb3I6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJFcnJvciI7CisvLyAgICAgIGNhc2UgT01YX0V2ZW50TWFyazogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNYXJrIjsKKyAgICAgICAgY2FzZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkOiAgICAgICByZXR1cm4gIlBvcnRTZXR0aW5nc0NoYW5nZWQiOworICAgICAgICBjYXNlIE9NWF9FdmVudEJ1ZmZlckZsYWc6ICAgICAgICAgICAgICAgIHJldHVybiAiQnVmZmVyRmxhZyI7CisvLyAgICAgIGNhc2UgT01YX0V2ZW50UmVzb3VyY2VzQWNxdWlyZWQ6ICAgICAgICAgcmV0dXJuICJSZXNvdXJjZXNBY3F1aXJlZCI7CisvLyAgICAgIGNhc2UgT01YX0V2ZW50Q29tcG9uZW50UmVzdW1lZDogICAgICAgICAgcmV0dXJuICJDb21wb25lbnRSZXN1bWVkIjsKKy8vICAgICAgY2FzZSBPTVhfRXZlbnREeW5hbWljUmVzb3VyY2VzQXZhaWxhYmxlOiByZXR1cm4gIkR5bmFtaWNSZXNvdXJjZXNBdmFpbGFibGUiOworLy8gICAgICBjYXNlIE9NWF9FdmVudFBvcnRGb3JtYXREZXRlY3RlZDogICAgICAgIHJldHVybiAiUG9ydEZvcm1hdERldGVjdGVkIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworI2VuZGlmIC8vIEFTX1NUUklOR19GT1JfT01YX0NPUkVfSAorCisjZW5kaWYgLy8gT01YX0NvcmVfaAorCisjaWZkZWYgT01YX0ltYWdlX2gKKy8qIGFzU3RyaW5nIGRlZmluaXRpb25zIGlmIG1lZGlhL29wZW5tYXgvT01YX0ltYWdlLmggd2FzIGluY2x1ZGVkICovCisKKyNpZm5kZWYgQVNfU1RSSU5HX0ZPUl9PTVhfSU1BR0VfSAorI2RlZmluZSBBU19TVFJJTkdfRk9SX09NWF9JTUFHRV9ICisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0lNQUdFX0NPRElOR1RZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQ6ICAgICByZXR1cm4gIlVudXNlZCI7CisgICAgICAgIGNhc2UgT01YX0lNQUdFX0NvZGluZ0F1dG9EZXRlY3Q6IHJldHVybiAiQXV0b0RldGVjdCI7ICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfSU1BR0VfQ29kaW5nSlBFRzogICAgICAgcmV0dXJuICJKUEVHIjsKKyAgICAgICAgY2FzZSBPTVhfSU1BR0VfQ29kaW5nSlBFRzJLOiAgICAgcmV0dXJuICJKUEVHMksiOyAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9JTUFHRV9Db2RpbmdFWElGOiAgICAgICByZXR1cm4gIkVYSUYiOyAgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0lNQUdFX0NvZGluZ1RJRkY6ICAgICAgIHJldHVybiAiVElGRiI7ICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfSU1BR0VfQ29kaW5nR0lGOiAgICAgICAgcmV0dXJuICJHSUYiOyAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9JTUFHRV9Db2RpbmdQTkc6ICAgICAgICByZXR1cm4gIlBORyI7ICAgICAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX0lNQUdFX0NvZGluZ0xaVzogICAgICAgIHJldHVybiAiTFpXIjsgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfSU1BR0VfQ29kaW5nQk1QOiAgICAgICAgcmV0dXJuICJCTVAiOyAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworI2VuZGlmIC8vIEFTX1NUUklOR19GT1JfT01YX0lNQUdFX0gKKworI2VuZGlmIC8vIE9NWF9JbWFnZV9oCisKKyNpZmRlZiBPTVhfSW5kZXhfaAorLyogYXNTdHJpbmcgZGVmaW5pdGlvbnMgaWYgbWVkaWEvb3Blbm1heC9PTVhfSW5kZXguaCB3YXMgaW5jbHVkZWQgKi8KKworI2lmbmRlZiBBU19TVFJJTkdfRk9SX09NWF9JTkRFWF9ICisjZGVmaW5lIEFTX1NUUklOR19GT1JfT01YX0lOREVYX0gKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfSU5ERVhUWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdDogICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1Qcmlvcml0eU1nbXQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Jbml0OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvSW5pdCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1JbWFnZUluaXQ6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtSW1hZ2VJbml0IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1WaWRlb0luaXQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtT3RoZXJJbml0OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbU90aGVySW5pdCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1OdW1BdmFpbGFibGVTdHJlYW1zOiAgICAgICAgICAgICByZXR1cm4gIlBhcmFtTnVtQXZhaWxhYmxlU3RyZWFtcyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BY3RpdmVTdHJlYW06ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQWN0aXZlU3RyZWFtIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN1c3BlbnNpb25Qb2xpY3k6ICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1TdXNwZW5zaW9uUG9saWN5IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUNvbXBvbmVudFN1c3BlbmRlZDogICAgICAgICAgICAgIHJldHVybiAiUGFyYW1Db21wb25lbnRTdXNwZW5kZWQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NhcHR1cmluZzogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDYXB0dXJpbmciOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NhcHR1cmVNb2RlOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDYXB0dXJlTW9kZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4QXV0b1BhdXNlQWZ0ZXJDYXB0dXJlOiAgICAgICAgICAgICAgICByZXR1cm4gIkF1dG9QYXVzZUFmdGVyQ2FwdHVyZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db250ZW50VVJJOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQ29udGVudFVSSSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1DdXN0b21Db250ZW50UGlwZTogICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQ3VzdG9tQ29udGVudFBpcGUiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtRGlzYWJsZVJlc291cmNlQ29uY2VhbG1lbnQ6CisvLyAgICAgICAgICByZXR1cm4gIlBhcmFtRGlzYWJsZVJlc291cmNlQ29uY2VhbG1lbnQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbUNvdW50OiAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdNZXRhZGF0YUl0ZW1Db3VudCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29udGFpbmVyTm9kZUNvdW50OiAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbnRhaW5lck5vZGVDb3VudCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnTWV0YWRhdGFJdGVtOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ01ldGFkYXRhSXRlbSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ291bnRlck5vZGVJRDogICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvdW50ZXJOb2RlSUQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtTWV0YWRhdGFGaWx0ZXJUeXBlOiAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbU1ldGFkYXRhRmlsdGVyVHlwZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1NZXRhZGF0YUtleUZpbHRlcjogICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtTWV0YWRhdGFLZXlGaWx0ZXIiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ByaW9yaXR5TWdtdDogICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdQcmlvcml0eU1nbXQiOworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOiAgICAgICAgICAgcmV0dXJuICJQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZSI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjogICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtUG9ydERlZmluaXRpb24iOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOiAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUNvbXBCdWZmZXJTdXBwbGllciI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQ6ICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9Qb3J0Rm9ybWF0IjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb1BjbSI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FhYzogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9BYWMiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9SYTogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvUmEiOworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9NcDM6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvTXAzIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQWRwY206ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb0FkcGNtIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvRzcyMzogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb0c3MjMiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9HNzI5OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvRzcyOSI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0FtcjogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9BbXIiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9XbWE6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvV21hIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvU2JjOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb1NiYyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb01pZGk6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9NaWRpIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvR3NtX0ZSOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb0dzbV9GUiI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb01pZGlMb2FkVXNlclNvdW5kOiAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9NaWRpTG9hZFVzZXJTb3VuZCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0c3MjY6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9HNzI2IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvR3NtX0VGUjogICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb0dzbV9FRlIiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fSFI6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvR3NtX0hSIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0ZSOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb1BkY19GUiI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1BkY19FRlI6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9QZGNfRUZSIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0hSOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb1BkY19IUiI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1RkbWFfRlI6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9UZG1hX0ZSIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9FRlI6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb1RkbWFfRUZSIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHA4OiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb1FjZWxwOCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb1FjZWxwMTM6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9RY2VscDEzIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvRXZyYzogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb0V2cmMiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9TbXY6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvU212IjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1BdWRpb1ZvcmJpcyI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0ZsYWM6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9GbGFjIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlJbW1lZGlhdGVFdmVudDogICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9NaWRpSW1tZWRpYXRlRXZlbnQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUNvbnRyb2w6ICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdBdWRpb01pZGlDb250cm9sIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTb3VuZEJhbmtQcm9ncmFtOgorLy8gICAgICAgICAgcmV0dXJuICJDb25maWdBdWRpb01pZGlTb3VuZEJhbmtQcm9ncmFtIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTdGF0dXM6ICAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9NaWRpU3RhdHVzIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnQ6ICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9NaWRpTWV0YUV2ZW50IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnREYXRhOiAgICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9NaWRpTWV0YUV2ZW50RGF0YSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQXVkaW9Wb2x1bWU6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0F1ZGlvVm9sdW1lIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb0JhbGFuY2U6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9CYWxhbmNlIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxNdXRlOiAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9DaGFubmVsTXV0ZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQXVkaW9NdXRlOiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0F1ZGlvTXV0ZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQXVkaW9Mb3VkbmVzczogICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0F1ZGlvTG91ZG5lc3MiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0F1ZGlvRWNob0NhbmNlbGF0aW9uOiAgICAgICAgICAgcmV0dXJuICJDb25maWdBdWRpb0VjaG9DYW5jZWxhdGlvbiI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQXVkaW9Ob2lzZVJlZHVjdGlvbjogICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0F1ZGlvTm9pc2VSZWR1Y3Rpb24iOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFzczogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdBdWRpb0Jhc3MiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0F1ZGlvVHJlYmxlOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdBdWRpb1RyZWJsZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQXVkaW9TdGVyZW9XaWRlbmluZzogICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0F1ZGlvU3RlcmVvV2lkZW5pbmciOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hvcnVzOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdBdWRpb0Nob3J1cyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQXVkaW9FcXVhbGl6ZXI6ICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0F1ZGlvRXF1YWxpemVyIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb1JldmVyYmVyYXRpb246ICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9SZXZlcmJlcmF0aW9uIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxWb2x1bWU6ICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQXVkaW9DaGFubmVsVm9sdW1lIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUltYWdlUG9ydEZvcm1hdDogICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1JbWFnZVBvcnRGb3JtYXQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtRmxhc2hDb250cm9sOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUZsYXNoQ29udHJvbCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnRm9jdXNDb250cm9sOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0ZvY3VzQ29udHJvbCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1RRmFjdG9yOiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtUUZhY3RvciI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1RdWFudGl6YXRpb25UYWJsZTogICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtUXVhbnRpemF0aW9uVGFibGUiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtSHVmZm1hblRhYmxlOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbUh1ZmZtYW5UYWJsZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnRmxhc2hDb250cm9sOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0ZsYXNoQ29udHJvbCI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6ICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtVmlkZW9Qb3J0Rm9ybWF0IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUXVhbnRpemF0aW9uOiAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1WaWRlb1F1YW50aXphdGlvbiI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Zhc3RVcGRhdGU6ICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtVmlkZW9GYXN0VXBkYXRlIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1WaWRlb0JpdHJhdGUiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Nb3Rpb25WZWN0b3I6ICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvTW90aW9uVmVjdG9yIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSW50cmFSZWZyZXNoOiAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1WaWRlb0ludHJhUmVmcmVzaCI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjogICAgICAgICAgICByZXR1cm4gIlBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24iOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9WQlNNQzogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvVkJTTUMiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnMjogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvTXBlZzIiOworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvTXBlZzQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9XbXY6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvV212IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUnY6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1WaWRlb1J2IjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1WaWRlb0F2YyI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtVmlkZW9IMjYzIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQ6CisgICAgICAgICAgICByZXR1cm4gIlBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6ICAgICAgICByZXR1cm4gIlBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50IjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0JpdHJhdGU6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnVmlkZW9CaXRyYXRlIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ZyYW1lcmF0ZTogICAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnVmlkZW9GcmFtZXJhdGUiOworICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOiAgICAgICAgICAgcmV0dXJuICJDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYU1CUmVmcmVzaDogICAgICAgICAgICByZXR1cm4gIkNvbmZpZ1ZpZGVvSW50cmFNQlJlZnJlc2giOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvTUJFcnJvclJlcG9ydGluZzogICAgICAgICAgcmV0dXJuICJDb25maWdWaWRlb01CRXJyb3JSZXBvcnRpbmciOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NYWNyb2Jsb2Nrc1BlckZyYW1lOiAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvTWFjcm9ibG9ja3NQZXJGcmFtZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9NYWNyb0Jsb2NrRXJyb3JNYXA6ICAgICAgICByZXR1cm4gIkNvbmZpZ1ZpZGVvTWFjcm9CbG9ja0Vycm9yTWFwIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvU2xpY2VGTU86ICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1WaWRlb1NsaWNlRk1PIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0FWQ0ludHJhUGVyaW9kOiAgICAgICAgICAgIHJldHVybiAiQ29uZmlnVmlkZW9BVkNJbnRyYVBlcmlvZCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9OYWxTaXplOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ1ZpZGVvTmFsU2l6ZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db21tb25EZWJsb2NraW5nOiAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQ29tbW9uRGVibG9ja2luZyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db21tb25TZW5zb3JNb2RlOiAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQ29tbW9uU2Vuc29yTW9kZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db21tb25JbnRlcmxlYXZlOiAgICAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQ29tbW9uSW50ZXJsZWF2ZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JGb3JtYXRDb252ZXJzaW9uOgorLy8gICAgICAgICAgcmV0dXJuICJDb25maWdDb21tb25Db2xvckZvcm1hdENvbnZlcnNpb24iOworICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vblNjYWxlOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21tb25TY2FsZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uSW1hZ2VGaWx0ZXI6ICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkltYWdlRmlsdGVyIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckVuaGFuY2VtZW50OiAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uQ29sb3JFbmhhbmNlbWVudCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JLZXk6ICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkNvbG9yS2V5IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckJsZW5kOiAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uQ29sb3JCbGVuZCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uRnJhbWVTdGFiaWxpc2F0aW9uOiAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkZyYW1lU3RhYmlsaXNhdGlvbiI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uUm90YXRlOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vblJvdGF0ZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uTWlycm9yOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbk1pcnJvciI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0UG9zaXRpb246ICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbk91dHB1dFBvc2l0aW9uIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3A6ICAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uSW5wdXRDcm9wIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wOiAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uT3V0cHV0Q3JvcCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uRGlnaXRhbFpvb206ICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkRpZ2l0YWxab29tIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25PcHRpY2FsWm9vbTogICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uT3B0aWNhbFpvb20iOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vbldoaXRlQmFsYW5jZTogICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21tb25XaGl0ZUJhbGFuY2UiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4cG9zdXJlOiAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21tb25FeHBvc3VyZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29udHJhc3Q6ICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkNvbnRyYXN0IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25CcmlnaHRuZXNzOiAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uQnJpZ2h0bmVzcyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uQmFja2xpZ2h0OiAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkJhY2tsaWdodCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uR2FtbWE6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkdhbW1hIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25TYXR1cmF0aW9uOiAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uU2F0dXJhdGlvbiI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uTGlnaHRuZXNzOiAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkxpZ2h0bmVzcyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhjbHVzaW9uUmVjdDogICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbkV4Y2x1c2lvblJlY3QiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpdGhlcmluZzogICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21tb25EaXRoZXJpbmciOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vblBsYW5lQmxlbmQ6ICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21tb25QbGFuZUJsZW5kIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZVZhbHVlOiAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uRXhwb3N1cmVWYWx1ZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0U2l6ZTogICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vbk91dHB1dFNpemUiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tbW9uRXh0cmFRdWFudERhdGE6ICAgICAgICAgICAgcmV0dXJuICJQYXJhbUNvbW1vbkV4dHJhUXVhbnREYXRhIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1JlZ2lvbjogICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ29tbW9uRm9jdXNSZWdpb24iOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZvY3VzU3RhdHVzOiAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21tb25Gb2N1c1N0YXR1cyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uVHJhbnNpdGlvbkVmZmVjdDogICAgICAgICByZXR1cm4gIkNvbmZpZ0NvbW1vblRyYW5zaXRpb25FZmZlY3QiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtT3RoZXJQb3J0Rm9ybWF0OiAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbU90aGVyUG9ydEZvcm1hdCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnT3RoZXJQb3dlcjogICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNvbmZpZ090aGVyUG93ZXIiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ090aGVyU3RhdHM6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdPdGhlclN0YXRzIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdUaW1lU2NhbGU6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnVGltZVNjYWxlIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdUaW1lQ2xvY2tTdGF0ZTogICAgICAgICAgICAgICAgIHJldHVybiAiQ29uZmlnVGltZUNsb2NrU3RhdGUiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1RpbWVBY3RpdmVSZWZDbG9jazogICAgICAgICAgICAgcmV0dXJuICJDb25maWdUaW1lQWN0aXZlUmVmQ2xvY2siOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lOiAgICAgICAgICAgcmV0dXJuICJDb25maWdUaW1lQ3VycmVudE1lZGlhVGltZSI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRXYWxsVGltZTogICAgICAgICAgICByZXR1cm4gIkNvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWUiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50QXVkaW9SZWZlcmVuY2U6CisvLyAgICAgICAgICByZXR1cm4gIkNvbmZpZ1RpbWVDdXJyZW50QXVkaW9SZWZlcmVuY2UiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2U6CisvLyAgICAgICAgICByZXR1cm4gIkNvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1RpbWVNZWRpYVRpbWVSZXF1ZXN0OiAgICAgICAgICAgcmV0dXJuICJDb25maWdUaW1lTWVkaWFUaW1lUmVxdWVzdCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVGltZUNsaWVudFN0YXJ0VGltZTogICAgICAgICAgICByZXR1cm4gIkNvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUiOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1RpbWVQb3NpdGlvbjogICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdUaW1lUG9zaXRpb24iOworLy8gICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1RpbWVTZWVrTW9kZTogICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdUaW1lU2Vla01vZGUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBBU19TVFJJTkdfRk9SX09NWF9JTkRFWF9ICisKKyNlbmRpZiAvLyBPTVhfSW5kZXhfaAorCisjaWZkZWYgT01YX0luZGV4RXh0X2gKKy8qIGFzU3RyaW5nIGRlZmluaXRpb25zIGlmIG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmggd2FzIGluY2x1ZGVkICovCisKKyNpZm5kZWYgQVNfU1RSSU5HX0ZPUl9PTVhfSU5ERVhFWFRfSAorI2RlZmluZSBBU19TVFJJTkdfRk9SX09NWF9JTkRFWEVYVF9ICisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0lOREVYRVhUVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisvLyAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ2FsbGJhY2tSZXF1ZXN0OiAgICAgICAgICAgIHJldHVybiAiQ29uZmlnQ2FsbGJhY2tSZXF1ZXN0IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21taXRNb2RlOiAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21taXRNb2RlIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdDb21taXQ6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDb25maWdDb21taXQiOworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWMzOiAgICAgICAgICAgICByZXR1cm4gIlBhcmFtQXVkaW9BbmRyb2lkQWMzIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXM6ICAgICAgICAgICAgcmV0dXJuICJQYXJhbUF1ZGlvQW5kcm9pZE9wdXMiOworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uOiByZXR1cm4gIlBhcmFtQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbU5hbFN0cmVhbUZvcm1hdFN1cHBvcnRlZDogICAgcmV0dXJuICJQYXJhbU5hbFN0cmVhbUZvcm1hdFN1cHBvcnRlZCI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1OYWxTdHJlYW1Gb3JtYXQ6ICAgICAgICAgICAgIHJldHVybiAiUGFyYW1OYWxTdHJlYW1Gb3JtYXQiOworLy8gICAgICBjYXNlIE9NWF9JbmRleFBhcmFtTmFsU3RyZWFtRm9ybWF0U2VsZWN0OiAgICAgICByZXR1cm4gIlBhcmFtTmFsU3RyZWFtRm9ybWF0U2VsZWN0IjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvVnA4OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvVnA4IjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lOiAgICAgcmV0dXJuICJDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lIjsKKy8vICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lVHlwZTogcmV0dXJuICJDb25maWdWaWRlb1ZwOFJlZmVyZW5jZUZyYW1lVHlwZSI7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyOiAgICAgIHJldHVybiAiUGFyYW1WaWRlb0FuZHJvaWRWcDhFbmNvZGVyIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSGV2YzogICAgICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbVZpZGVvSGV2YyI7CisvLyAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1TbGljZVNlZ21lbnRzOiAgICAgICAgICAgICAgIHJldHVybiAiUGFyYW1TbGljZVNlZ21lbnRzIjsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdBdXRvRnJhbWVyYXRlQ29udmVyc2lvbjogICAgcmV0dXJuICJDb25maWdBdXRvRnJhbWVyYXRlQ29udmVyc2lvbiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhc1N0cmluZygoT01YX0lOREVYVFlQRSlpLCBkZWYpOworICAgIH0KK30KKworI2VuZGlmIC8vIEFTX1NUUklOR19GT1JfT01YX0lOREVYRVhUX0gKKworI2VuZGlmIC8vIE9NWF9JbmRleEV4dF9oCisKKyNpZmRlZiBPTVhfSVZDb21tb25faAorLyogYXNTdHJpbmcgZGVmaW5pdGlvbnMgaWYgbWVkaWEvb3Blbm1heC9PTVhfSVZDb21tb24uaCB3YXMgaW5jbHVkZWQgKi8KKworI2lmbmRlZiBBU19TVFJJTkdfRk9SX09NWF9JVkNPTU1PTl9ICisjZGVmaW5lIEFTX1NUUklOR19GT1JfT01YX0lWQ09NTU9OX0gKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfQ09MT1JfRk9STUFUVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFVudXNlZDoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0VW51c2VkIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0TW9ub2Nocm9tZToKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0TW9ub2Nocm9tZSI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDhiaXRSR0IzMzI6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdDhiaXRSR0IzMzIiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NDoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0MTJiaXRSR0I0NDQiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRBUkdCMTU1NToKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0MTZiaXRBUkdCMTU1NSI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QkdSNTY1OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NSI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE4Yml0UkdCNjY2OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NiI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjU6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjUiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXQxOWJpdEFSR0IxNjY2IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdDI0Yml0UkdCODg4IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdDI0Yml0QkdSODg4IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NzoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0MjRiaXRBUkdCMTg4NyI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODg6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODgiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OCI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQxMVBsYW5hcjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0WVVWNDExUGxhbmFyIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDExUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXRZVVY0MTFQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBsYW5hcjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyOgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WUNiWUNyOgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXRZQ2JZQ3IiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZQ3JZQ2I6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdFlDcllDYiI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdENiWUNyWToKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0Q2JZQ3JZIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q3JZQ2JZOgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXRDcllDYlkiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZDoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQ6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdCI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQ6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXRjb21wcmVzc2VkOgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXRjb21wcmVzc2VkIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0TDI6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdEwyIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0TDQ6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdEw0IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0TDg6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdEw4IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0TDE2OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXRMMTYiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRMMjQ6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdEwyNCI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdEwzMjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0TDMyIjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0MThCaXRCR1I2NjYiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2OgorICAgICAgICAgICAgcmV0dXJuICJDT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2IjsKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NjoKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiI7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWU6CisgICAgICAgICAgICByZXR1cm4gIkNPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUiOworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgIHJldHVybiAiQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUiOworICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgcmV0dXJuICJUSV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIjsKKyAgICAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgcmV0dXJuICJRQ09NX0NPTE9SX0Zvcm1hdFlWVTQyMFNlbWlQbGFuYXIiOworLy8gICAgICBjYXNlIE9NWF9RQ09NX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI2NHgzMlRpbGUybThrYToKKy8vICAgICAgICAgIHJldHVybiAiUUNPTV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyNjR4MzJUaWxlMm04a2EiOworLy8gICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkOgorLy8gICAgICAgICAgcmV0dXJuICJTRUNfQ09MT1JfRm9ybWF0TlYxMlRpbGVkIjsKKy8vICAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyMzJtOgorLy8gICAgICAgICAgcmV0dXJuICJRQ09NX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIzMm0iOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBBU19TVFJJTkdfRk9SX09NWF9JVkNPTU1PTl9ICisKKyNlbmRpZiAvLyBPTVhfSVZDb21tb25faAorCisjaWZkZWYgT01YX1R5cGVzX2gKKy8qIGFzU3RyaW5nIGRlZmluaXRpb25zIGlmIG1lZGlhL29wZW5tYXgvT01YX1R5cGVzLmggd2FzIGluY2x1ZGVkICovCisKKyNpZm5kZWYgQVNfU1RSSU5HX0ZPUl9PTVhfVFlQRVNfSAorI2RlZmluZSBBU19TVFJJTkdfRk9SX09NWF9UWVBFU19ICisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0JPT0wgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9GQUxTRTogcmV0dXJuICJGQUxTRSI7CisgICAgICAgIGNhc2UgT01YX1RSVUU6ICByZXR1cm4gIlRSVUUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX0RJUlRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9EaXJJbnB1dDogIHJldHVybiAiSW5wdXQiOworICAgICAgICBjYXNlIE9NWF9EaXJPdXRwdXQ6IHJldHVybiAiT3V0cHV0IjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfRU5ESUFOVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX0VuZGlhbkJpZzogICAgcmV0dXJuICJCaWciOworLy8gICAgICBjYXNlIE9NWF9FbmRpYW5MaXR0bGU6IHJldHVybiAiTGl0dGxlIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfTlVNRVJJQ0FMREFUQVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOiAgIHJldHVybiAiU2lnbmVkIjsKKy8vICAgICAgY2FzZSBPTVhfTnVtZXJpY2FsRGF0YVVuc2lnbmVkOiByZXR1cm4gIlVuc2lnbmVkIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworI2VuZGlmIC8vIEFTX1NUUklOR19GT1JfT01YX1RZUEVTX0gKKworI2VuZGlmIC8vIE9NWF9UeXBlc19oCisKKyNpZmRlZiBPTVhfVmlkZW9faAorLyogYXNTdHJpbmcgZGVmaW5pdGlvbnMgaWYgbWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaCB3YXMgaW5jbHVkZWQgKi8KKworI2lmbmRlZiBBU19TVFJJTkdfRk9SX09NWF9WSURFT19ICisjZGVmaW5lIEFTX1NUUklOR19GT1JfT01YX1ZJREVPX0gKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfVklERU9fQ09ESU5HVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1VudXNlZDogICAgIHJldHVybiAiVW51c2VkIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nQXV0b0RldGVjdDogcmV0dXJuICJBdXRvRGV0ZWN0IjsgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdNUEVHMjogICAgICByZXR1cm4gIk1QRUcyIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nSDI2MzogICAgICAgcmV0dXJuICJIMjYzIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nTVBFRzQ6ICAgICAgcmV0dXJuICJNUEVHNCI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ1dNVjogICAgICAgIHJldHVybiAiV01WIjsgICAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nUlY6ICAgICAgICAgcmV0dXJuICJSViI7ICAgICAgICAgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdBVkM6ICAgICAgICByZXR1cm4gIkFWQyI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ01KUEVHOiAgICAgIHJldHVybiAiTUpQRUciOyAgICAgICAvLyB1bnVzZWQKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQ29kaW5nVlA4OiAgICAgICAgcmV0dXJuICJWUDgiOworICAgICAgICBjYXNlIE9NWF9WSURFT19Db2RpbmdWUDk6ICAgICAgICByZXR1cm4gIlZQOSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0NvZGluZ0hFVkM6ICAgICAgIHJldHVybiAiSEVWQyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworLy8gICAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGU6ICAgICAgICAgICAgcmV0dXJuICJEaXNhYmxlIjsKKyAgICAgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZTogICAgICAgICAgIHJldHVybiAiVmFyaWFibGUiOworICAgICAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OiAgICAgICAgICAgcmV0dXJuICJDb25zdGFudCI7CisvLyAgICAgIGNhc2UgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGVTa2lwRnJhbWVzOiByZXR1cm4gIlZhcmlhYmxlU2tpcEZyYW1lcyI7CisvLyAgICAgIGNhc2UgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnRTa2lwRnJhbWVzOiByZXR1cm4gIkNvbnN0YW50U2tpcEZyYW1lcyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYzogICByZXR1cm4gIkN5Y2xpYyI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0ludHJhUmVmcmVzaEFkYXB0aXZlOiByZXR1cm4gIkFkYXB0aXZlIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSW50cmFSZWZyZXNoQm90aDogICAgIHJldHVybiAiQm90aCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZTogICAgICAgICAgIHJldHVybiAiQmFzZWxpbmUiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2Rpbmc6ICAgICAgICAgcmV0dXJuICJIMzIwQ29kaW5nIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGU6IHJldHVybiAiQmFja3dhcmRDb21wYXRpYmxlIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMjogICAgICAgICAgICAgIHJldHVybiAiSVNXVjIiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzOiAgICAgICAgICAgICAgcmV0dXJuICJJU1dWMyI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uOiAgICByZXR1cm4gIkhpZ2hDb21wcmVzc2lvbiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJuZXQ6ICAgICAgICAgICByZXR1cm4gIkludGVybmV0IjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2U6ICAgICAgICAgIHJldHVybiAiSW50ZXJsYWNlIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeTogICAgICAgIHJldHVybiAiSGlnaExhdGVuY3kiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWwxMDogcmV0dXJuICJMZXZlbDEwIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsMjA6IHJldHVybiAiTGV2ZWwyMCI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDMwOiByZXR1cm4gIkxldmVsMzAiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWw0MDogcmV0dXJuICJMZXZlbDQwIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsNDU6IHJldHVybiAiTGV2ZWw0NSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0gyNjNMZXZlbDUwOiByZXR1cm4gIkxldmVsNTAiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IMjYzTGV2ZWw2MDogcmV0dXJuICJMZXZlbDYwIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSDI2M0xldmVsNzA6IHJldHVybiAiTGV2ZWw3MCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfVklERU9fUElDVFVSRVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19QaWN0dXJlVHlwZUk6ICByZXR1cm4gIkkiOworICAgICAgICBjYXNlIE9NWF9WSURFT19QaWN0dXJlVHlwZVA6ICByZXR1cm4gIlAiOworICAgICAgICBjYXNlIE9NWF9WSURFT19QaWN0dXJlVHlwZUI6ICByZXR1cm4gIkIiOworLy8gICAgICBjYXNlIE9NWF9WSURFT19QaWN0dXJlVHlwZVNJOiByZXR1cm4gIlNJIjsKKy8vICAgICAgY2FzZSBPTVhfVklERU9fUGljdHVyZVR5cGVTUDogcmV0dXJuICJTUCI7CisvLyAgICAgIGNhc2UgT01YX1ZJREVPX1BpY3R1cmVUeXBlRUk6IHJldHVybiAiRUkiOworLy8gICAgICBjYXNlIE9NWF9WSURFT19QaWN0dXJlVHlwZUVQOiByZXR1cm4gIkVQIjsKKy8vICAgICAgY2FzZSBPTVhfVklERU9fUGljdHVyZVR5cGVTOiAgcmV0dXJuICJTIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGU6ICAgICAgICAgICByZXR1cm4gIlNpbXBsZSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlOiAgIHJldHVybiAiU2ltcGxlU2NhbGFibGUiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlOiAgICAgICAgICAgICByZXR1cm4gIkNvcmUiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluOiAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVOYml0OiAgICAgICAgICAgICByZXR1cm4gIk5iaXQiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmU6ICByZXR1cm4gIlNjYWxhYmxlVGV4dHVyZSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2U6ICAgICAgIHJldHVybiAiU2ltcGxlRmFjZSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZCQTogICAgICAgIHJldHVybiAiU2ltcGxlRkJBIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZDogICAgcmV0dXJuICJCYXNpY0FuaW1hdGVkIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkOiAgICAgICAgICAgcmV0dXJuICJIeWJyaWQiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lOiByZXR1cm4gIkFkdmFuY2VkUmVhbFRpbWUiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGU6ICAgICByZXR1cm4gIkNvcmVTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nOiAgIHJldHVybiAiQWR2YW5jZWRDb2RpbmciOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmU6ICAgICByZXR1cm4gIkFkdmFuY2VkQ29yZSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGU6IHJldHVybiAiQWR2YW5jZWRTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOiAgIHJldHVybiAiQWR2YW5jZWRTaW1wbGUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMDogIHJldHVybiAiTGV2ZWwwIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDBiOiByZXR1cm4gIkxldmVsMGIiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMTogIHJldHVybiAiTGV2ZWwxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDI6ICByZXR1cm4gIkxldmVsMiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwzOiAgcmV0dXJuICJMZXZlbDMiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsNDogIHJldHVybiAiTGV2ZWw0IjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDRhOiByZXR1cm4gIkxldmVsNGEiOworICAgICAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsNTogIHJldHVybiAiTGV2ZWw1IjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfVklERU9fQVZDUFJPRklMRVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU6IHJldHVybiAiQmFzZWxpbmUiOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNQcm9maWxlTWFpbjogICAgIHJldHVybiAiTWFpbiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVFeHRlbmRlZDogcmV0dXJuICJFeHRlbmRlZCI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoOiAgICAgcmV0dXJuICJIaWdoIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gxMDogICByZXR1cm4gIkhpZ2gxMCI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyOiAgcmV0dXJuICJIaWdoNDIyIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQ6ICByZXR1cm4gIkhpZ2g0NDQiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9WSURFT19BVkNMRVZFTFRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDE6ICByZXR1cm4gIkxldmVsMSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMWI6IHJldHVybiAiTGV2ZWwxYiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTE6IHJldHVybiAiTGV2ZWwxMSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTI6IHJldHVybiAiTGV2ZWwxMiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMTM6IHJldHVybiAiTGV2ZWwxMyI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsMjogIHJldHVybiAiTGV2ZWwyIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMTogcmV0dXJuICJMZXZlbDIxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwyMjogcmV0dXJuICJMZXZlbDIyIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWwzOiAgcmV0dXJuICJMZXZlbDMiOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMxOiByZXR1cm4gIkxldmVsMzEiOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDMyOiByZXR1cm4gIkxldmVsMzIiOworICAgICAgICBjYXNlIE9NWF9WSURFT19BVkNMZXZlbDQ6ICByZXR1cm4gIkxldmVsNCI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDE6IHJldHVybiAiTGV2ZWw0MSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNDI6IHJldHVybiAiTGV2ZWw0MiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xldmVsNTogIHJldHVybiAiTGV2ZWw1IjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1MTogcmV0dXJuICJMZXZlbDUxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTGV2ZWw1MjogcmV0dXJuICJMZXZlbDUyIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZTogICAgICAgICAgICAgICByZXR1cm4gIkVuYWJsZSI7CisvLyAgICAgIGNhc2UgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlOiAgICAgICAgICAgICAgcmV0dXJuICJEaXNhYmxlIjsKKy8vICAgICAgY2FzZSBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGVTbGljZUJvdW5kYXJ5OiByZXR1cm4gIkRpc2FibGVTbGljZUJvdW5kYXJ5IjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworI2VuZGlmIC8vIEFTX1NUUklOR19GT1JfT01YX1ZJREVPX0gKKworI2VuZGlmIC8vIE9NWF9WaWRlb19oCisKKyNpZmRlZiBPTVhfVmlkZW9FeHRfaAorLyogYXNTdHJpbmcgZGVmaW5pdGlvbnMgaWYgbWVkaWEvb3Blbm1heC9PTVhfVmlkZW9FeHQuaCB3YXMgaW5jbHVkZWQgKi8KKworI2lmbmRlZiBBU19TVFJJTkdfRk9SX09NWF9WSURFT0VYVF9ICisjZGVmaW5lIEFTX1NUUklOR19GT1JfT01YX1ZJREVPRVhUX0gKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhPTVhfVklERU9fVlA4UFJPRklMRVRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIiEhIikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19WUDhQcm9maWxlTWFpbjogICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fVlA4UHJvZmlsZVVua25vd246IHJldHVybiAiVW5rbm93biI7ICAvLyB1bnVzZWQKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9WSURFT19WUDhMRVZFTFRZUEUgaSwgY29uc3QgY2hhciAqZGVmID0gIiEhIikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMDogcmV0dXJuICJfVmVyc2lvbjAiOworICAgICAgICBjYXNlIE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMTogcmV0dXJuICJfVmVyc2lvbjEiOworICAgICAgICBjYXNlIE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMjogcmV0dXJuICJfVmVyc2lvbjIiOworICAgICAgICBjYXNlIE9NWF9WSURFT19WUDhMZXZlbF9WZXJzaW9uMzogcmV0dXJuICJfVmVyc2lvbjMiOworICAgICAgICBjYXNlIE9NWF9WSURFT19WUDhMZXZlbFVua25vd246ICAgcmV0dXJuICJVbmtub3duIjsgICAgLy8gdW51c2VkCisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZygKKyAgICAgICAgT01YX1ZJREVPX0FORFJPSURfVlBYVEVNUE9SQUxMQVlFUlBBVFRFUk5UWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lOiAgIHJldHVybiAiVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM6IHJldHVybiAiVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoT01YX1ZJREVPX0hFVkNQUk9GSUxFVFlQRSBpLCBjb25zdCBjaGFyICpkZWYgPSAiISEiKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNQcm9maWxlVW5rbm93bjogcmV0dXJuICJVbmtub3duIjsgIC8vIHVudXNlZAorICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDUHJvZmlsZU1haW46ICAgIHJldHVybiAiTWFpbiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNQcm9maWxlTWFpbjEwOiAgcmV0dXJuICJNYWluMTAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE9NWF9WSURFT19IRVZDTEVWRUxUWVBFIGksIGNvbnN0IGNoYXIgKmRlZiA9ICIhISIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0xldmVsVW5rbm93bjogICAgcmV0dXJuICJMZXZlbFVua25vd24iOyAgICAgLy8gdW51c2VkCisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsMTogIHJldHVybiAiTWFpblRpZXJMZXZlbDEiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDE6ICByZXR1cm4gIkhpZ2hUaWVyTGV2ZWwxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwyOiAgcmV0dXJuICJNYWluVGllckxldmVsMiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMjogIHJldHVybiAiSGlnaFRpZXJMZXZlbDIiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDIxOiByZXR1cm4gIk1haW5UaWVyTGV2ZWwyMSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMjE6IHJldHVybiAiSGlnaFRpZXJMZXZlbDIxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWwzOiAgcmV0dXJuICJNYWluVGllckxldmVsMyI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMzogIHJldHVybiAiSGlnaFRpZXJMZXZlbDMiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDMxOiByZXR1cm4gIk1haW5UaWVyTGV2ZWwzMSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsMzE6IHJldHVybiAiSGlnaFRpZXJMZXZlbDMxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw0OiAgcmV0dXJuICJNYWluVGllckxldmVsNCI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNDogIHJldHVybiAiSGlnaFRpZXJMZXZlbDQiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDQxOiByZXR1cm4gIk1haW5UaWVyTGV2ZWw0MSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNDE6IHJldHVybiAiSGlnaFRpZXJMZXZlbDQxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1OiAgcmV0dXJuICJNYWluVGllckxldmVsNSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNTogIHJldHVybiAiSGlnaFRpZXJMZXZlbDUiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDTWFpblRpZXJMZXZlbDUxOiByZXR1cm4gIk1haW5UaWVyTGV2ZWw1MSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNIaWdoVGllckxldmVsNTE6IHJldHVybiAiSGlnaFRpZXJMZXZlbDUxIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw1MjogcmV0dXJuICJNYWluVGllckxldmVsNTIiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDUyOiByZXR1cm4gIkhpZ2hUaWVyTGV2ZWw1MiI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNjogIHJldHVybiAiTWFpblRpZXJMZXZlbDYiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDY6ICByZXR1cm4gIkhpZ2hUaWVyTGV2ZWw2IjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ01haW5UaWVyTGV2ZWw2MTogcmV0dXJuICJNYWluVGllckxldmVsNjEiOworICAgICAgICBjYXNlIE9NWF9WSURFT19IRVZDSGlnaFRpZXJMZXZlbDYxOiByZXR1cm4gIkhpZ2hUaWVyTGV2ZWw2MSI7CisgICAgICAgIGNhc2UgT01YX1ZJREVPX0hFVkNNYWluVGllckxldmVsNjI6IHJldHVybiAiTWFpblRpZXJMZXZlbDYyIjsKKyAgICAgICAgY2FzZSBPTVhfVklERU9fSEVWQ0hpZ2hUaWVyTGV2ZWw2MjogcmV0dXJuICJIaWdoVGllckxldmVsNjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworI2VuZGlmIC8vIEFTX1NUUklOR19GT1JfT01YX1ZJREVPRVhUX0gKKworI2VuZGlmIC8vIE9NWF9WaWRlb0V4dF9oCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmggYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmgKaW5kZXggZjRjYjY0My4uYTBjYmQzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9BdWRpby5oCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaApAQCAtMTYsMjUgKzE2LDI1IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCiAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwogICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgogICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKICAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCiAgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgogICovCiAKQEAgLTUwLDEwICs1MCw5IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCi0KIC8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKICAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseQogICovCiAKICNpbmNsdWRlIDxPTVhfQ29yZS5oPgpAQCAtNjEsNyArNjAsNyBAQAogLyoqIEBkZWZncm91cCBtaWRpIE1JREkKICAqIEBpbmdyb3VwIGF1ZGlvCiAgKi8KLSAKKwogLyoqIEBkZWZncm91cCBlZmZlY3RzIEF1ZGlvIGVmZmVjdHMKICAqIEBpbmdyb3VwIGF1ZGlvCiAgKi8KQEAgLTcxLDEwICs3MCwxMCBAQAogICogQHsKICAqLwogCi0vKiogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGF1ZGlvIGNvZGluZ3MuICAKLSAqICBJZiAiT01YX0FVRElPX0NvZGluZ1VudXNlZCIgaXMgc2VsZWN0ZWQsIHRoZSBjb2Rpbmcgc2VsZWN0aW9uIG11c3QgCi0gKiAgYmUgZG9uZSBpbiBhIHZlbmRvciBzcGVjaWZpYyB3YXkuICBTaW5jZSB0aGlzIGlzIGZvciBhbiBhdWRpbyAKLSAqICBwcm9jZXNzaW5nIGVsZW1lbnQgdGhpcyBlbnVtIGlzIHJlbGV2YW50LiAgSG93ZXZlciwgZm9yIGFub3RoZXIgCisvKiogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGF1ZGlvIGNvZGluZ3MuCisgKiAgSWYgIk9NWF9BVURJT19Db2RpbmdVbnVzZWQiIGlzIHNlbGVjdGVkLCB0aGUgY29kaW5nIHNlbGVjdGlvbiBtdXN0CisgKiAgYmUgZG9uZSBpbiBhIHZlbmRvciBzcGVjaWZpYyB3YXkuICBTaW5jZSB0aGlzIGlzIGZvciBhbiBhdWRpbworICogIHByb2Nlc3NpbmcgZWxlbWVudCB0aGlzIGVudW0gaXMgcmVsZXZhbnQuICBIb3dldmVyLCBmb3IgYW5vdGhlcgogICogIHR5cGUgb2YgY29tcG9uZW50IG90aGVyIGVudW1zIHdvdWxkIGJlIGluIHRoaXMgYXJlYS4KICAqLwogdHlwZWRlZiBlbnVtIE9NWF9BVURJT19DT0RJTkdUWVBFIHsKQEAgLTEwNywxNCArMTA2LDE0IEBACiAgICAgT01YX0FVRElPX0NvZGluZ1JBLCAgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFJBIGVuY29kZWQgZGF0YSAqLwogICAgIE9NWF9BVURJT19Db2RpbmdNSURJLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNSURJIGVuY29kZWQgZGF0YSAqLwogICAgIE9NWF9BVURJT19Db2RpbmdGTEFDLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBGTEFDIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19Db2RpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9BVURJT19DT0RJTkdUWVBFOwogCiAKLS8qKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKLSAqICBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBhdWRpbyAKKy8qKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycworICogIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IGF1ZGlvCiAgKiAgcGF0aC4gIElmIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRlZmluZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUKICAqICBwb3J0IChzdWNoIGFzIGZyZXF1ZW5jeSksIGFkZGl0aW9uYWwgc3RydWN0dXJlcyBtdXN0IGJlIHNlbnQgc3VjaCBhcyB0aGUKICAqICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgc3RydWN0dXJlIHRvIHN1cHBseSB0aGUgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIHBvcnQuCkBAIC0xMjIsMTEgKzEyMSwxMSBAQAogdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRSB7CiAgICAgT01YX1NUUklORyBjTUlNRVR5cGU7ICAgICAgICAgICAgLyoqPCBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQgKi8KICAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsgLyoqIDwgcGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbiBvdXRwdXQgZGV2aWNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFuIG91dHB1dCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAgKi8KLSAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7ICAvKio8IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIAorICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsgIC8qKjwgVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgT01YIGNvbXBvbmVudCAqLwotICAgIE9NWF9BVURJT19DT0RJTkdUWVBFIGVFbmNvZGluZzsgIC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIAorICAgIE9NWF9BVURJT19DT0RJTkdUWVBFIGVFbmNvZGluZzsgIC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IChlLmcuIFBDTSwgQU1SLCBNUDMsIGV0YykgKi8KIH0gT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRTsKIApAQCAtMTQzLDE1ICsxNDIsMTUgQEAKIH0gT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwogCiAKLS8qKiBQQ00gbW9kZSB0eXBlICAqLyAKLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fUENNTU9ERVRZUEUgeyAKLSAgICBPTVhfQVVESU9fUENNTW9kZUxpbmVhciA9IDAsICAvKio8IExpbmVhciBQQ00gZW5jb2RlZCBkYXRhICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlQUxhdywgICAgICAgIC8qKjwgQSBsYXcgUENNIGVuY29kZWQgZGF0YSAoRy43MTEpICovIAotICAgIE9NWF9BVURJT19QQ01Nb2RlTVVMYXcsICAgICAgIC8qKjwgTXUgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAgKi8gCi0gICAgT01YX0FVRElPX1BDTU1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisvKiogUENNIG1vZGUgdHlwZSAgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fUENNTU9ERVRZUEUgeworICAgIE9NWF9BVURJT19QQ01Nb2RlTGluZWFyID0gMCwgIC8qKjwgTGluZWFyIFBDTSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fUENNTW9kZUFMYXcsICAgICAgICAvKio8IEEgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAqLworICAgIE9NWF9BVURJT19QQ01Nb2RlTVVMYXcsICAgICAgIC8qKjwgTXUgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAgKi8KKyAgICBPTVhfQVVESU9fUENNTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19QQ01Nb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfQVVESU9fUENNTW9kZU1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19QQ01NT0RFVFlQRTsgCisgICAgT01YX0FVRElPX1BDTU1vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19QQ01NT0RFVFlQRTsKIAogCiB0eXBlZGVmIGVudW0gT01YX0FVRElPX0NIQU5ORUxUWVBFIHsKQEAgLTE2NSw0NSArMTY0LDQ1IEBACiAgICAgT01YX0FVRElPX0NoYW5uZWxDUyAgID0gMHg3LCAgICAvKio8IEJhY2sgc3Vycm91bmQgKi8KICAgICBPTVhfQVVESU9fQ2hhbm5lbExSICAgPSAweDgsICAgIC8qKjwgTGVmdCByZWFyLiAqLwogICAgIE9NWF9BVURJT19DaGFubmVsUlIgICA9IDB4OSwgICAgLyoqPCBSaWdodCByZWFyLiAqLwotICAgIE9NWF9BVURJT19DaGFubmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19DaGFubmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX0NoYW5uZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTWF4ICA9IDB4N0ZGRkZGRkYgCisgICAgT01YX0FVRElPX0NoYW5uZWxNYXggID0gMHg3RkZGRkZGRgogfSBPTVhfQVVESU9fQ0hBTk5FTFRZUEU7CiAKICNkZWZpbmUgT01YX0FVRElPX01BWENIQU5ORUxTIDE2ICAvKio8IG1heGltdW0gbnVtYmVyIGRpc3RpbmN0IGF1ZGlvIGNoYW5uZWxzIHRoYXQgYSBidWZmZXIgbWF5IGNvbnRhaW4gKi8KICNkZWZpbmUgT01YX01JTl9QQ01QQVlMT0FEX01TRUMgNSAvKio8IE1pbmltdW0gYXVkaW8gYnVmZmVyIHBheWxvYWQgc2l6ZSBmb3IgdW5jb21wcmVzc2VkIChQQ00pIGF1ZGlvICovCiAKLS8qKiBQQ00gZm9ybWF0IGRlc2NyaXB0aW9uICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKLSAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGUuZy4gMiBmb3Igc3RlcmVvKSAqLyAKLSAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgZU51bURhdGE7ICAgLyoqPCBpbmRpY2F0ZXMgUENNIGRhdGEgYXMgc2lnbmVkIG9yIHVuc2lnbmVkICovIAotICAgIE9NWF9FTkRJQU5UWVBFIGVFbmRpYW47ICAgICAgICAgICAvKio8IGluZGljYXRlcyBQQ00gZGF0YSBhcyBsaXR0bGUgb3IgYmlnIGVuZGlhbiAqLyAKLSAgICBPTVhfQk9PTCBiSW50ZXJsZWF2ZWQ7ICAgICAgICAgICAgLyoqPCBUcnVlIGZvciBub3JtYWwgaW50ZXJsZWF2ZWQgZGF0YTsgZmFsc2UgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1pbnRlcmxlYXZlZCBkYXRhIChlLmcuIGJsb2NrIGRhdGEpICovIAotICAgIE9NWF9VMzIgbkJpdFBlclNhbXBsZTsgICAgICAgICAgICAvKio8IEJpdCBwZXIgc2FtcGxlICovIAotICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8gCi0gICAgT01YX0FVRElPX1BDTU1PREVUWVBFIGVQQ01Nb2RlOyAgIC8qKjwgUENNIG1vZGUgZW51bWVyYXRpb24gKi8gCisvKiogUENNIGZvcm1hdCBkZXNjcmlwdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAoZS5nLiAyIGZvciBzdGVyZW8pICovCisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIGVOdW1EYXRhOyAgIC8qKjwgaW5kaWNhdGVzIFBDTSBkYXRhIGFzIHNpZ25lZCBvciB1bnNpZ25lZCAqLworICAgIE9NWF9FTkRJQU5UWVBFIGVFbmRpYW47ICAgICAgICAgICAvKio8IGluZGljYXRlcyBQQ00gZGF0YSBhcyBsaXR0bGUgb3IgYmlnIGVuZGlhbiAqLworICAgIE9NWF9CT09MIGJJbnRlcmxlYXZlZDsgICAgICAgICAgICAvKio8IFRydWUgZm9yIG5vcm1hbCBpbnRlcmxlYXZlZCBkYXRhOyBmYWxzZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24taW50ZXJsZWF2ZWQgZGF0YSAoZS5nLiBibG9jayBkYXRhKSAqLworICAgIE9NWF9VMzIgbkJpdFBlclNhbXBsZTsgICAgICAgICAgICAvKio8IEJpdCBwZXIgc2FtcGxlICovCisgICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCisgICAgT01YX0FVRElPX1BDTU1PREVUWVBFIGVQQ01Nb2RlOyAgIC8qKjwgUENNIG1vZGUgZW51bWVyYXRpb24gKi8KICAgICBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgZUNoYW5uZWxNYXBwaW5nW09NWF9BVURJT19NQVhDSEFOTkVMU107IC8qKjwgU2xvdCBpIGNvbnRhaW5zIGNoYW5uZWwgZGVmaW5lZCBieSBlQ2hhbm5lbE1hcFtpXSAqLwogCi19IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRTsgCit9IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRTsKIAogCiAvKiogQXVkaW8gY2hhbm5lbCBtb2RlLiAgVGhpcyBpcyB1c2VkIGJ5IGJvdGggQUFDIGFuZCBNUDMsIGFsdGhvdWdoIHRoZSBuYW1lcyBhcmUgbW9yZSBhcHByb3ByaWF0ZQotICogZm9yIHRoZSBNUDMuICBGb3IgZXhhbXBsZSwgSm9pbnRTdGVyZW8gZm9yIE1QMyBpcyBDb3VwbGluZ0NoYW5uZWxzIGZvciBBQUMuIAorICogZm9yIHRoZSBNUDMuICBGb3IgZXhhbXBsZSwgSm9pbnRTdGVyZW8gZm9yIE1QMyBpcyBDb3VwbGluZ0NoYW5uZWxzIGZvciBBQUMuCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIHsKLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVTdGVyZW8gPSAwLCAgLyoqPCAyIGNoYW5uZWxzLCB0aGUgYml0cmF0ZSBhbGxvY2F0aW9uIGJldHdlZW4gdGhvc2UgCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlU3RlcmVvID0gMCwgIC8qKjwgMiBjaGFubmVscywgdGhlIGJpdHJhdGUgYWxsb2NhdGlvbiBiZXR3ZWVuIHRob3NlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gY2hhbm5lbHMgY2hhbmdlcyBhY2NvcmRpbmdseSB0byBlYWNoIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVKb2ludFN0ZXJlbywgLyoqPCBtb2RlIHRoYXQgdGFrZXMgYWR2YW50YWdlIG9mIHdoYXQgaXMgY29tbW9uIGJldHdlZW4gCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlSm9pbnRTdGVyZW8sIC8qKjwgbW9kZSB0aGF0IHRha2VzIGFkdmFudGFnZSBvZiB3aGF0IGlzIGNvbW1vbiBiZXR3ZWVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBjaGFubmVscyBmb3IgaGlnaGVyIGNvbXByZXNzaW9uIGdhaW4gKi8KLSAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVEdWFsLCAgICAgICAgLyoqPCAyIG1vbm8tY2hhbm5lbHMsIGVhY2ggY2hhbm5lbCBpcyBlbmNvZGVkIHdpdGggaGFsZiAKKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVEdWFsLCAgICAgICAgLyoqPCAyIG1vbm8tY2hhbm5lbHMsIGVhY2ggY2hhbm5lbCBpcyBlbmNvZGVkIHdpdGggaGFsZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRyYXRlIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KICAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVNb25vLCAgICAgICAgLyoqPCBNb25vIGNoYW5uZWwgbW9kZSAqLwotICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRTsKQEAgLTIxMyw3ICsyMTIsNyBAQAogICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDFMYXllcjMgPSAwLCAvKio8IE1QMyBBdWRpbyBNUEVHIDEgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCiAgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMkxheWVyMywgICAgIC8qKjwgTVAzIEF1ZGlvIE1QRUcgMiBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KICAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAyXzVMYXllcjMsICAgLyoqPCBNUDMgQXVkaW8gTVBFRzIuNSBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KLSAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRTsKQEAgLTI0Myw3ICsyNDIsNyBAQAogICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRBRElGLCAgICAgICAgLyoqPCBBQUMgQXVkaW8gRGF0YSBJbnRlcmNoYW5nZSBGb3JtYXQgKi8KICAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0RkYsICAgICAgIC8qKjwgQUFDIGluc2lkZSBNUEVHLTQvSVNPIEZpbGUgRm9ybWF0ICovCiAgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFJBVywgICAgICAgICAvKio8IEFBQyBSYXcgRm9ybWF0ICovCi0gICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEU7CkBAIC0zMjksMTYgKzMyOCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCiAgICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KLSAgICBPTVhfUzMyIG5RdWFsaXR5OwkJICAvKio8IFNldHMgZW5jb2RpbmcgcXVhbGl0eSB0byBuLCBiZXR3ZWVuIC0xIChsb3cpIGFuZCAxMCAoaGlnaCkuCisgICAgT01YX1MzMiBuUXVhbGl0eTsgICAgICAgICAvKio8IFNldHMgZW5jb2RpbmcgcXVhbGl0eSB0byBuLCBiZXR3ZWVuIC0xIChsb3cpIGFuZCAxMCAoaGlnaCkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBkZWZhdWx0IG1vZGUgb2Ygb3BlcmF0aW9uLCB0ZWggcXVhbGl0eSBsZXZlbCBpcyAzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgcXVhbGl0eSByYW5nZSBpcyAwIC0gMTAuICovCi0gICAgT01YX0JPT0wgYk1hbmFnZWQ7CQkgIC8qKjwgU2V0ICBiaXRyYXRlICBtYW5hZ2VtZW50ICBtb2RlLiBUaGlzIHR1cm5zIG9mZiB0aGUKKyAgICBPTVhfQk9PTCBiTWFuYWdlZDsgICAgICAgIC8qKjwgU2V0ICBiaXRyYXRlICBtYW5hZ2VtZW50ICBtb2RlLiBUaGlzIHR1cm5zIG9mZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsIFZCUiBlbmNvZGluZywgYnV0IGFsbG93cyBoYXJkIG9yIHNvZnQgYml0cmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cyB0byBiZSBlbmZvcmNlZCBieSB0aGUgZW5jb2Rlci4gVGhpcyBtb2RlIGNhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzbG93ZXIsIGFuZCBtYXkgYWxzbyBiZSBsb3dlciBxdWFsaXR5LiBJdCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgdXNlZnVsIGZvciBzdHJlYW1pbmcuICovCi0gICAgT01YX0JPT0wgYkRvd25taXg7CQkgIC8qKjwgRG93bm1peCBpbnB1dCBmcm9tIHN0ZXJlbyB0byBtb25vIChoYXMgbm8gZWZmZWN0IG9uIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tc3RlcmVvIHN0cmVhbXMpLiBVc2VmdWwgZm9yIGxvd2VyLWJpdHJhdGUgZW5jb2RpbmcuICovICAgICAKKyAgICBPTVhfQk9PTCBiRG93bm1peDsgICAgICAgIC8qKjwgRG93bm1peCBpbnB1dCBmcm9tIHN0ZXJlbyB0byBtb25vIChoYXMgbm8gZWZmZWN0IG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zdGVyZW8gc3RyZWFtcykuIFVzZWZ1bCBmb3IgbG93ZXItYml0cmF0ZSBlbmNvZGluZy4gKi8KIH0gT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEU7CiAKIApAQCAtMzYxLDcgKzM2MCw3IEBACiAgIE9NWF9BVURJT19XTUFGb3JtYXQ3LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDcgKi8KICAgT01YX0FVRElPX1dNQUZvcm1hdDgsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgOCAqLwogICBPTVhfQVVESU9fV01BRm9ybWF0OSwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA5ICovCi0gIE9NWF9BVURJT19XTUFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19XTUFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgT01YX0FVRElPX1dNQUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgIE9NWF9BVURJT19XTUFGb3JtYXRNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9BVURJT19XTUFGT1JNQVRUWVBFOwpAQCAtMzczLDcgKzM3Miw3IEBACiAgIE9NWF9BVURJT19XTUFQcm9maWxlTDEsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMSAqLwogICBPTVhfQVVESU9fV01BUHJvZmlsZUwyLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDIgKi8KICAgT01YX0FVRElPX1dNQVByb2ZpbGVMMywgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwzICovCi0gIE9NWF9BVURJT19XTUFQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fV01BUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICBPTVhfQVVESU9fV01BUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgIE9NWF9BVURJT19XTUFQcm9maWxlTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfQVVESU9fV01BUFJPRklMRVRZUEU7CkBAIC0zODgsMTQgKzM4NywxNCBAQAogICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCiAgICAgT01YX0FVRElPX1dNQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBWZXJzaW9uIG9mIFdNQSBzdHJlYW0gLyBkYXRhICovCi0JT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFIGVQcm9maWxlOyAgLyoqPCBQcm9maWxlIG9mIFdNQSBzdHJlYW0gLyBkYXRhICovCisgICAgT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFIGVQcm9maWxlOyAgLyoqPCBQcm9maWxlIG9mIFdNQSBzdHJlYW0gLyBkYXRhICovCiAgICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhICovCiAgICAgT01YX1UxNiBuQmxvY2tBbGlnbjsgICAgICAvKio8IGlzIHRoZSBibG9jayBhbGlnbm1lbnQsIG9yIGJsb2NrIHNpemUsIGluIGJ5dGVzIG9mIHRoZSBhdWRpbyBjb2RlYyAqLwogICAgIE9NWF9VMTYgbkVuY29kZU9wdGlvbnM7ICAgLyoqPCBXTUEgVHlwZS1zcGVjaWZpYyBkYXRhICovCiAgICAgT01YX1UzMiBuU3VwZXJCbG9ja0FsaWduOyAvKio8IFdNQSBUeXBlLXNwZWNpZmljIGRhdGEgKi8KIH0gT01YX0FVRElPX1BBUkFNX1dNQVRZUEU7CiAKLS8qKiAKKy8qKgogICogUmVhbEF1ZGlvIGZvcm1hdAogICovCiB0eXBlZGVmIGVudW0gT01YX0FVRElPX1JBRk9STUFUVFlQRSB7CkBAIC00MDcsMzIgKzQwNiwzMiBAQAogICAgIE9NWF9BVURJT19SQTEwX0xPU1NMRVNTLCAgICAgIC8qKjwgUmVhbEF1ZGlvIExvc3NsZXNzICovCiAgICAgT01YX0FVRElPX1JBMTBfTVVMVElDSEFOTkVMLCAgLyoqPCBSZWFsQXVkaW8gTXVsdGljaGFubmVsICovCiAgICAgT01YX0FVRElPX1JBMTBfVk9JQ0UsICAgICAgICAgLyoqPCBSZWFsQXVkaW8gVm9pY2UgZm9yIGJpdHJhdGVzIGJlbG93IDE1IGticHMgKi8KLSAgICBPTVhfQVVESU9fUkFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX1JBRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX1JBRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVklERU9fUkFGb3JtYXRNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9BVURJT19SQUZPUk1BVFRZUEU7CiAKLS8qKiBSQSAoUmVhbCBBdWRpbykgcGFyYW1zICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1JBVFlQRSB7IAotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovIAotICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgICAvKio8IGlzIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YSAqLyAKLSAgICBPTVhfVTMyIG5CaXRzUGVyRnJhbWU7ICAgICAgLyoqPCBpcyB0aGUgdmFsdWUgZm9yIGJpdHMgcGVyIGZyYW1lICAqLyAKLSAgICBPTVhfVTMyIG5TYW1wbGVQZXJGcmFtZTsgICAgLyoqPCBpcyB0aGUgdmFsdWUgZm9yIHNhbXBsZXMgcGVyIGZyYW1lICovIAotICAgIE9NWF9VMzIgbkNvdXBsaW5nUXVhbnRCaXRzOyAvKio8IGlzIHRoZSBudW1iZXIgb2YgY291cGxpbmcgcXVhbnRpemF0aW9uIGJpdHMgaW4gdGhlIHN0cmVhbSAqLyAKLSAgICBPTVhfVTMyIG5Db3VwbGluZ1N0YXJ0UmVnaW9uOyAgIC8qKjwgaXMgdGhlIGNvdXBsaW5nIHN0YXJ0IHJlZ2lvbiBpbiB0aGUgc3RyZWFtICAqLyAKLSAgICBPTVhfVTMyIG5OdW1SZWdpb25zOyAgICAgICAgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgdmFsdWUgKi8gCisvKiogUkEgKFJlYWwgQXVkaW8pIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1JBVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgICAgLyoqPCBpcyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8KKyAgICBPTVhfVTMyIG5CaXRzUGVyRnJhbWU7ICAgICAgLyoqPCBpcyB0aGUgdmFsdWUgZm9yIGJpdHMgcGVyIGZyYW1lICAqLworICAgIE9NWF9VMzIgblNhbXBsZVBlckZyYW1lOyAgICAvKio8IGlzIHRoZSB2YWx1ZSBmb3Igc2FtcGxlcyBwZXIgZnJhbWUgKi8KKyAgICBPTVhfVTMyIG5Db3VwbGluZ1F1YW50Qml0czsgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIGNvdXBsaW5nIHF1YW50aXphdGlvbiBiaXRzIGluIHRoZSBzdHJlYW0gKi8KKyAgICBPTVhfVTMyIG5Db3VwbGluZ1N0YXJ0UmVnaW9uOyAgIC8qKjwgaXMgdGhlIGNvdXBsaW5nIHN0YXJ0IHJlZ2lvbiBpbiB0aGUgc3RyZWFtICAqLworICAgIE9NWF9VMzIgbk51bVJlZ2lvbnM7ICAgICAgICAvKio8IGlzIHRoZSBudW1iZXIgb2YgcmVnaW9ucyB2YWx1ZSAqLwogICAgIE9NWF9BVURJT19SQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBpcyB0aGUgUmVhbEF1ZGlvIGF1ZGlvIGZvcm1hdCAqLwotfSBPTVhfQVVESU9fUEFSQU1fUkFUWVBFOyAKK30gT01YX0FVRElPX1BBUkFNX1JBVFlQRTsKIAogCiAvKiogU0JDIEFsbG9jYXRpb24gTWV0aG9kIFR5cGUgKi8KIHR5cGVkZWYgZW51bSBPTVhfQVVESU9fU0JDQUxMT0NNRVRIT0RUWVBFIHsKICAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kTG91ZG5lc3MsIC8qKjwgTG91ZG5lc3MgYWxsb2NhdGlvbiBtZXRob2QgKi8KICAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kU05SLCAgICAgIC8qKjwgU05SIGFsbG9jYXRpb24gbWV0aG9kICovCi0gIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX1NCQ0FMTE9DTUVUSE9EVFlQRTsKQEAgLTQ1NywxOCArNDU2LDE4IEBACiB9IE9NWF9BVURJT19QQVJBTV9TQkNUWVBFOwogCiAKLS8qKiBBRFBDTSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAotICAgIE9NWF9VMzIgbkJpdHNQZXJTYW1wbGU7ICAgICAvKio8IE51bWJlciBvZiBiaXRzIGluIGVhY2ggc2FtcGxlICovIAotICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLyAKLX0gT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRTsgCisvKiogQURQQ00gc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX1UzMiBuQml0c1BlclNhbXBsZTsgICAgIC8qKjwgTnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBzYW1wbGUgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLworfSBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFOwogCiAKIC8qKiBHNzIzIHJhdGUgKi8KQEAgLTQ3NiwyNSArNDc1LDI1IEBACiAgICAgT01YX0FVRElPX0c3MjNNb2RlVW51c2VkID0gMCwgIC8qKjwgQU1STkIgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCiAgICAgT01YX0FVRElPX0c3MjNNb2RlTG93LCAgICAgICAgIC8qKjwgNTMwMCBicHMgKi8KICAgICBPTVhfQVVESU9fRzcyM01vZGVIaWdoLCAgICAgICAgLyoqPCA2MzAwIGJwcyAqLwotICAgIE9NWF9BVURJT19HNzIzTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fRzcyM01vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fRzcyM01vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19HNzIzTW9kZU1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX0c3MjNSQVRFOwogCiAKIC8qKiBHNzIzIC0gU2FtcGxlIHJhdGUgbXVzdCBiZSA4IEtIeiAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAotICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLwogICAgIE9NWF9BVURJT19HNzIzUkFURSBlQml0UmF0ZTsgIC8qKjwgdG9kbzogU2hvdWxkIHRoaXMgYmUgbW92ZWQgdG8gYSBjb25maWc/ICovCi0gICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLyAKLSAgICBPTVhfQk9PTCBiUG9zdEZpbHRlcjsgICAgICAgICAvKio8IEVuYWJsZSBQb3N0IEZpbHRlciAqLyAKLX0gT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFOyAKKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCisgICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgUG9zdCBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFOwogCiAKIC8qKiBJVFUgRzcyNiAoQURQQ00pIHJhdGUgKi8KQEAgLTUwNCwyMiArNTAzLDIyIEBACiAgICAgT01YX0FVRElPX0c3MjZNb2RlMjQsICAgICAgICAgIC8qKjwgMjQga2JwcyAqLwogICAgIE9NWF9BVURJT19HNzI2TW9kZTMyLCAgICAgICAgICAvKio8IDMyIGticHMsIG1vc3QgY29tbW9uIHJhdGUsIGFsc28gRzcyMSAqLwogICAgIE9NWF9BVURJT19HNzI2TW9kZTQwLCAgICAgICAgICAvKio8IDQwIGticHMgKi8KLSAgICBPTVhfQVVESU9fRzcyNk1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0c3MjZNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX0c3MjZNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fRzcyNk1vZGVNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9BVURJT19HNzI2TU9ERTsKIAogCi0vKiogRy43MjYgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzIC0gbXVzdCBiZSBhdCA4S0h6ICovIAotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAorLyoqIEcuNzI2IHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAtIG11c3QgYmUgYXQgOEtIeiAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCiAgICAgIE9NWF9BVURJT19HNzI2TU9ERSBlRzcyNk1vZGU7Ci19IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRTsgCit9IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRTsKIAogCiAvKiogRzcyOSBjb2RlciB0eXBlICovCkBAIC01MjgsNyArNTI3LDcgQEAKICAgICBPTVhfQVVESU9fRzcyOUEsICAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSBhbm5leCBBICBlbmNvZGVkIGRhdGEgKi8KICAgICBPTVhfQVVESU9fRzcyOUIsICAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSB3aXRoIGFubmV4IEIgZW5jb2RlZCBkYXRhICovCiAgICAgT01YX0FVRElPX0c3MjlBQiwgICAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgYW5uZXhlcyBBIGFuZCBCIGVuY29kZWQgZGF0YSAqLwotICAgIE9NWF9BVURJT19HNzI5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19HNzI5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX0c3MjlWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19HNzI5TWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfQVVESU9fRzcyOVRZUEU7CkBAIC01NDcsMjMgKzU0NiwyMyBAQAogfSBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEU7CiAKIAotLyoqIEFNUiBGcmFtZSBmb3JtYXQgKi8gCi10eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRSB7IAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdENvbmZvcm1hbmNlID0gMCwgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBDb25mb3JtYW5jZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGFuZGFyZCkgRm9ybWF0ICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElGMSwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBJbnRlcmZhY2UgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgMSAqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjIsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDIqLyAKLSAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRGU0YsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgRmlsZSBTdG9yYWdlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICovIAotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdFJUUFBheWxvYWQsICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBSZWFsLVRpbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgUHJvdG9jb2wgUGF5bG9hZCBGb3JtYXQgKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SVRVLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgSVRVIEZvcm1hdCAoYWRkZWQgYXQgTW90b3JvbGEgcmVxdWVzdCkgKi8gCi0gICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorLyoqIEFNUiBGcmFtZSBmb3JtYXQgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFIHsKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRDb25mb3JtYW5jZSA9IDAsICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgQ29uZm9ybWFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGFuZGFyZCkgRm9ybWF0ICovCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYxLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDEgKi8KKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjIsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgMiovCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0RlNGLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEZpbGUgU3RvcmFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICovCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0UlRQUGF5bG9hZCwgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIFJlYWwtVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3J0IFByb3RvY29sIFBheWxvYWQgRm9ybWF0ICovCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SVRVLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgSVRVIEZvcm1hdCAoYWRkZWQgYXQgTW90b3JvbGEgcmVxdWVzdCkgKi8KKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYgCi19IE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEU7IAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRTsKIAogCiAvKiogQU1SIGJhbmQgbW9kZSAqLwpAQCAtNTcxLDcgKzU3MCw3IEBACiAgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlVW51c2VkID0gMCwgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KICAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMCA9ICA0NzUwIGJwcyAqLwogICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAxID0gIDUxNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDIgPSAgNTkwMCBicHMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDIgPSAgNTkwMCBicHMgKi8KICAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMyA9ICA2NzAwIGJwcyAqLwogICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNCwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA0ID0gIDc0MDAgYnBzICovCiAgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI1LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDUgPSAgNzk1MCBicHMgKi8KQEAgLTU3OSwzNiArNTc4LDM2IEBACiAgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI3LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDcgPSAxMjIwMCBicHMgKi8KICAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMCA9ICA2NjAwIGJwcyAqLwogICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAxID0gIDg4NTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDIgPSAxMjY1MCBicHMgKi8gCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IzLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDMgPSAxNDI1MCBicHMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDIgPSAxMjY1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMyA9IDE0MjUwIGJwcyAqLwogICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA0ID0gMTU4NTAgYnBzICovCiAgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I1LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDUgPSAxODI1MCBicHMgKi8KICAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjYsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNiA9IDE5ODUwIGJwcyAqLwogICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNywgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA3ID0gMjMwNTAgYnBzICovCi0gICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I4LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDggPSAyMzg1MCBicHMgKi8gICAgICAKLSAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I4LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDggPSAyMzg1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRTsKLSAgICAgCiAKLS8qKiBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gbW9kZSAqLyAKLXR5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgeyAKLSAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9mZiA9IDAsICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIGlzIGRpc2FibGVkICovIAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25WQUQxLCAgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgdXNpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAxIChWQUQxKSBpcyBlbmFibGVkICovIAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25WQUQyLCAgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgdXNpbmcgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAyIChWQUQyKSBpcyBlbmFibGVkICovICAgICAgIAotICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25BdXRvLCAgICAgICAgIC8qKjwgVGhlIGNvZGVjIHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgYmV0d2VlbiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZiwgVkFEMSBvciBWQUQyIG1vZGVzICovIAorCisvKiogQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIG1vZGUgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgeworICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT2ZmID0gMCwgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgaXMgZGlzYWJsZWQgKi8KKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9uVkFEMSwgICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAxIChWQUQxKSBpcyBlbmFibGVkICovCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVPblZBRDIsICAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9pY2UgQWN0aXZpdHkgRGV0ZWN0b3IgMiAoVkFEMikgaXMgZW5hYmxlZCAqLworICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25BdXRvLCAgICAgICAgIC8qKjwgVGhlIGNvZGVjIHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2ZmLCBWQUQxIG9yIFZBRDIgbW9kZXMgKi8KIAogICAgIE9NWF9BVURJT19BTVJEVFhhc0VGUiwgICAgICAgICAgICAgLyoqPCBEVFggYXMgRUZSIGluc3RlYWQgb2YgQU1SIHN0YW5kYXJkICgzR1BQIDI2LjEwMSwgZnJhbWUgdHlwZSA9OCw5LDEwKSAqLwogCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fQU1SRFRYTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX0FVRElPX0FNUkRUWE1vZGVNYXggPSAweDdGRkZGRkZGIAotfSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEU7IAotIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEU7CisKIAogLyoqIEFNUiBwYXJhbXMgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIHsKQEAgLTYxNyw3ICs2MTYsNyBAQAogICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCiAgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCiAgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgcmVhZCBvbmx5IGZpZWxkICovCi0gICAgT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRSBlQU1SQmFuZE1vZGU7IC8qKjwgQU1SIEJhbmQgTW9kZSBlbnVtZXJhdGlvbiAqLyAKKyAgICBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIGVBTVJCYW5kTW9kZTsgLyoqPCBBTVIgQmFuZCBNb2RlIGVudW1lcmF0aW9uICovCiAgICAgT01YX0FVRElPX0FNUkRUWE1PREVUWVBFICBlQU1SRFRYTW9kZTsgIC8qKjwgQU1SIERUWCBNb2RlIGVudW1lcmF0aW9uICovCiAgICAgT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRSBlQU1SRnJhbWVGb3JtYXQ7IC8qKjwgQU1SIGZyYW1lIGZvcm1hdCBlbnVtZXJhdGlvbiAqLwogfSBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRTsKQEAgLTcyNSw3ICs3MjQsNyBAQAogICAgIE9NWF9BVURJT19DRE1BUmF0ZVF1YXJ0ZXIsICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gcXVhcnRlciByYXRlICovCiAgICAgT01YX0FVRElPX0NETUFSYXRlRWlnaHRoLCAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBlaWdodGggcmF0ZSAoRFRYKSovCiAgICAgT01YX0FVRElPX0NETUFSYXRlRXJhc3VyZSwgICAgICAgICAgICAvKio8IENETUEgZXJhc3VyZSBmcmFtZSAqLwotICAgIE9NWF9BVURJT19DRE1BUmF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fQ0RNQVJhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19DRE1BUmF0ZU1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX0NETUFSQVRFVFlQRTsKQEAgLTc5Nyw3ICs3OTYsNyBAQAogfSBPTVhfQVVESU9fUEFSQU1fU01WVFlQRTsKIAogCi0vKiogTUlESSBGb3JtYXQgCisvKiogTUlESSBGb3JtYXQKICAqIEBpbmdyb3VwIG1pZGkKICAqLwogdHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJRk9STUFUVFlQRQpAQCAtODEwLDMzICs4MDksMzMgQEAKICAgICBPTVhfQVVESU9fTUlESUZvcm1hdFhNRjAsICAgICAgICAvKio8IGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMCAqLwogICAgIE9NWF9BVURJT19NSURJRm9ybWF0WE1GMSwgICAgICAgIC8qKjwgZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAxICovCiAgICAgT01YX0FVRElPX01JRElGb3JtYXRNb2JpbGVYTUYsICAgLyoqPCBNb2JpbGUgWE1GIChlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDIpICovCi0gICAgT01YX0FVRElPX01JRElGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX01JRElGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfQVVESU9fTUlESUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX01JRElGb3JtYXRNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9BVURJT19NSURJRk9STUFUVFlQRTsKIAogCi0vKiogTUlESSBwYXJhbXMgCisvKiogTUlESSBwYXJhbXMKICAqIEBpbmdyb3VwIG1pZGkKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01JRElUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfVTMyIG5GaWxlU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBNSURJIGZpbGUgaW4gYnl0ZXMsIHdoZXJlIHRoZSBlbnRpcmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSBmaWxlIHBhc3NlZCBpbiwgb3RoZXJ3aXNlIGlmIDB4MCwgdGhlIE1JREkgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBtZXJnZWQgYW5kIHN0cmVhbWVkIChpbnN0ZWFkIG9mIHBhc3NlZCBhcyBhbiAKKyAgICBPTVhfVTMyIG5GaWxlU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBNSURJIGZpbGUgaW4gYnl0ZXMsIHdoZXJlIHRoZSBlbnRpcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIGZpbGUgcGFzc2VkIGluLCBvdGhlcndpc2UgaWYgMHgwLCB0aGUgTUlESSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWVyZ2VkIGFuZCBzdHJlYW1lZCAoaW5zdGVhZCBvZiBwYXNzZWQgYXMgYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpcmUgTUlESSBmaWxlKSAqLwotICAgIE9NWF9CVTMyIHNNYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9CT09MIGJMb2FkRGVmYXVsdFNvdW5kOyAgICAvKio8IFdoZXRoZXIgdG8gbG9hZCBkZWZhdWx0IHNvdW5kIAorICAgIE9NWF9CVTMyIHNNYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlcy4gQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255IG9mIHRoZSBkZXZpY2UgaXMgdXNlZCAgKi8KKyAgICBPTVhfQk9PTCBiTG9hZERlZmF1bHRTb3VuZDsgICAgLyoqPCBXaGV0aGVyIHRvIGxvYWQgZGVmYXVsdCBzb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmsgYXQgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEUgZU1pZGlGb3JtYXQ7IC8qKjwgVmVyc2lvbiBvZiB0aGUgTUlESSBmaWxlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgT01YX0FVRElPX01JRElGT1JNQVRUWVBFIGVNaWRpRm9ybWF0OyAvKio8IFZlcnNpb24gb2YgdGhlIE1JREkgZmlsZSAqLwogfSBPTVhfQVVESU9fUEFSQU1fTUlESVRZUEU7CiAKIAotLyoqIFR5cGUgb2YgdGhlIE1JREkgc291bmQgYmFuayAKKy8qKiBUeXBlIG9mIHRoZSBNSURJIHNvdW5kIGJhbmsKICAqIEBpbmdyb3VwIG1pZGkKICAqLwogdHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJU09VTkRCQU5LVFlQRSB7CkBAIC04NDUsMTMgKzg0NCwxMyBAQAogICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rRExTMiwgICAgICAgICAgICAgICAgIC8qKjwgRExTIHZlcnNpb24gMiAqLwogICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTW9iaWxlRExTQmFzZSwgICAgICAgIC8qKjwgTW9iaWxlIERMUywgdXNpbmcgdGhlIGJhc2UgZnVuY3Rpb25hbGl0eSAqLwogICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTW9iaWxlRExTUGx1c09wdGlvbnMsIC8qKjwgTW9iaWxlIERMUywgdXNpbmcgdGhlIHNwZWNpZmljYXRpb24tZGVmaW5lZCBvcHRpb25hbCBmZWF0dXJlIHNldCAqLwotICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEU7CiAKIAotLyoqIEJhbmsgTGF5b3V0IGRlc2NyaWJlcyBob3cgYmFuayBNU0IgJiBMU0IgYXJlIHVzZWQgaW4gdGhlIERMUyBpbnN0cnVtZW50IGRlZmluaXRpb25zIHNvdW5kIGJhbmsgCisvKiogQmFuayBMYXlvdXQgZGVzY3JpYmVzIGhvdyBiYW5rIE1TQiAmIExTQiBhcmUgdXNlZCBpbiB0aGUgRExTIGluc3RydW1lbnQgZGVmaW5pdGlvbnMgc291bmQgYmFuawogICogQGluZ3JvdXAgbWlkaQogICovCiB0eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFIHsKQEAgLTg1OSwxMyArODU4LDEzIEBACiAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEdNLCAgICAgICAgICAgLyoqPCBHUyBsYXlvdXQgKGJhc2VkIG9uIGJhbmsgTVNCIDB4MDApICovCiAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEdNMiwgICAgICAgICAgLyoqPCBHZW5lcmFsIE1JREkgMiBsYXlvdXQgKHVzaW5nIE1TQiAweDc4LzB4NzksIExTQiAweDAwKSAqLwogICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRVc2VyLCAgICAgICAgIC8qKjwgRG9lcyBub3QgY29uZm9ybSB0byBhbnkgYmFuayBudW1iZXJpbmcgc3RhbmRhcmRzICovCi0gICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFOwogCiAKLS8qKiBNSURJIHBhcmFtcyB0byBsb2FkL3VubG9hZCB1c2VyIHNvdW5kYmFuayAKKy8qKiBNSURJIHBhcmFtcyB0byBsb2FkL3VubG9hZCB1c2VyIHNvdW5kYmFuawogICogQGluZ3JvdXAgbWlkaQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFIHsKQEAgLTg4MCw4ICs4NzksOCBAQAogfSBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFOwogCiAKLS8qKiBTdHJ1Y3R1cmUgZm9yIExpdmUgTUlESSBldmVudHMgYW5kIE1JUCBtZXNzYWdlcy4gCi0gKiAoTUlQID0gTWF4aW11bSBJbnN0YW50YW5lb3VzIFBvbHlwaG9ueTsgcGFydCBvZiB0aGUgU1AtTUlESSBzdGFuZGFyZC4pIAorLyoqIFN0cnVjdHVyZSBmb3IgTGl2ZSBNSURJIGV2ZW50cyBhbmQgTUlQIG1lc3NhZ2VzLgorICogKE1JUCA9IE1heGltdW0gSW5zdGFudGFuZW91cyBQb2x5cGhvbnk7IHBhcnQgb2YgdGhlIFNQLU1JREkgc3RhbmRhcmQuKQogICogQGluZ3JvdXAgbWlkaQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEUgewpAQCAtODkwLDEyICs4ODksMTIgQEAKICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KICAgICBPTVhfVTMyIG5NaWRpRXZlbnRTaXplOyAgIC8qKjwgU2l6ZSBvZiBpbW1lZGlhdGUgTUlESSBldmVudHMgb3IgTUlQIG1lc3NhZ2UgaW4gYnl0ZXMgICovCiAgICAgT01YX1U4IG5NaWRpRXZlbnRzWzFdOyAgICAvKio8IE1JREkgZXZlbnQgYXJyYXkgdG8gYmUgcmVuZGVyZWQgaW1tZWRpYXRlbHksIG9yIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IGZvciB0aGUgTUlQIG1lc3NhZ2UgYnVmZmVyLCB3aGVyZSB0aGUgc2l6ZSBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgZm9yIHRoZSBNSVAgbWVzc2FnZSBidWZmZXIsIHdoZXJlIHRoZSBzaXplIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlZCBieSBuTWlkaUV2ZW50U2l6ZSAqLwogfSBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEU7CiAKIAotLyoqIE1JREkgc291bmQgYmFuay8gcHJvZ3JhbSBwYWlyIGluIGEgZ2l2ZW4gY2hhbm5lbCAKKy8qKiBNSURJIHNvdW5kIGJhbmsvIHByb2dyYW0gcGFpciBpbiBhIGdpdmVuIGNoYW5uZWwKICAqIEBpbmdyb3VwIG1pZGkKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgewpAQCAtOTA1LDI5ICs5MDQsMjkgQEAKICAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBWYWxpZCBjaGFubmVsIHZhbHVlcyByYW5nZSBmcm9tIDEgdG8gMTYgKi8KICAgICBPTVhfVTE2IG5JRFByb2dyYW07ICAgICAgICAgLyoqPCBWYWxpZCBwcm9ncmFtIElEIHJhbmdlIGlzIDEgdG8gMTI4ICovCiAgICAgT01YX1UxNiBuSURTb3VuZEJhbms7ICAgICAgIC8qKjwgU291bmQgYmFuayBJRCAqLwotICAgIE9NWF9VMzIgblVzZXJTb3VuZEJhbmtJbmRleDsvKio8IFVzZXIgc291bmRiYW5rIGluZGV4LCBlYXNpZXIgdG8gYWNjZXNzIHNvdW5kYmFua3MgCisgICAgT01YX1UzMiBuVXNlclNvdW5kQmFua0luZGV4Oy8qKjwgVXNlciBzb3VuZGJhbmsgaW5kZXgsIGVhc2llciB0byBhY2Nlc3Mgc291bmRiYW5rcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGluZGV4IGlmIG11bHRpcGxlIGJhbmtzIGFyZSBwcmVzZW50ICovCiB9IE9NWF9BVURJT19DT05GSUdfTUlESVNPVU5EQkFOS1BST0dSQU1UWVBFOwogCiAKLS8qKiBNSURJIGNvbnRyb2wgCisvKiogTUlESSBjb250cm9sCiAgKiBAaW5ncm91cCBtaWRpCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESUNPTlRST0xUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KLSAgICBPTVhfQlMzMiBzUGl0Y2hUcmFuc3Bvc2l0aW9uOyAvKio8IFBpdGNoIHRyYW5zcG9zaXRpb24gaW4gc2VtaXRvbmVzLCBzdG9yZWQgYXMgUTIyLjEwIAorICAgIE9NWF9CUzMyIHNQaXRjaFRyYW5zcG9zaXRpb247IC8qKjwgUGl0Y2ggdHJhbnNwb3NpdGlvbiBpbiBzZW1pdG9uZXMsIHN0b3JlZCBhcyBRMjIuMTAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBiYXNlZCBvbiBKQVZBIE1NQVBJIChKU1ItMTM1KSByZXF1aXJlbWVudCAqLwogICAgIE9NWF9CVTMyIHNQbGF5QmFja1JhdGU7ICAgICAgIC8qKjwgUmVsYXRpdmUgcGxheWJhY2sgcmF0ZSwgc3RvcmVkIGFzIFExNC4xNyBmaXhlZC1wb2ludAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIGJhc2VkIG9uIEpTUi0xMzUgcmVxdWlyZW1lbnQgKi8KLSAgICBPTVhfQlUzMiBzVGVtcG8gOyAgICAgICAgICAgICAvKio8IFRlbXBvIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSksIHN0b3JlZCBhcyBRMjIuMTAgCisgICAgT01YX0JVMzIgc1RlbXBvIDsgICAgICAgICAgICAgLyoqPCBUZW1wbyBpbiBiZWF0cyBwZXIgbWludXRlIChCUE0pLCBzdG9yZWQgYXMgUTIyLjEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZC1wb2ludCBudW1iZXIgYmFzZWQgb24gSlNSLTEzNSByZXF1aXJlbWVudCAqLwotICAgIE9NWF9VMzIgbk1heFBvbHlwaG9ueTsgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBwb2x5cGhvbmljIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VzLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgCisgICAgT01YX1UzMiBuTWF4UG9seXBob255OyAgICAgICAgLyoqPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2ltdWx0YW5lb3VzIHBvbHlwaG9uaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlcy4gQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2x5cGhvbnkgb2YgdGhlIGRldmljZSBpcyB1c2VkICAqLwogICAgIE9NWF9VMzIgbk51bVJlcGVhdDsgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBwbGF5YmFjayAqLwotICAgIE9NWF9VMzIgblN0b3BUaW1lOyAgICAgICAgICAgIC8qKjwgVGltZSBpbiBtaWxsaXNlY29uZHMgdG8gaW5kaWNhdGUgd2hlbiBwbGF5YmFjayAKKyAgICBPTVhfVTMyIG5TdG9wVGltZTsgICAgICAgICAgICAvKio8IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGluZGljYXRlIHdoZW4gcGxheWJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RvcCBhdXRvbWF0aWNhbGx5LiAgU2V0IHRvIHplcm8gaWYgbm90IHVzZWQgKi8KICAgICBPTVhfVTE2IG5DaGFubmVsTXV0ZU1hc2s7ICAgICAvKio8IDE2IGJpdCBtYXNrIGZvciBjaGFubmVsIG11dGUgc3RhdHVzICovCiAgICAgT01YX1UxNiBuQ2hhbm5lbFNvbG9NYXNrOyAgICAgLyoqPCAxNiBiaXQgbWFzayBmb3IgY2hhbm5lbCBzb2xvIHN0YXR1cyAqLwpAQCAtOTM5LDIyICs5MzgsMjIgQEAKIH0gT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEU7CiAKIAotLyoqIE1JREkgUGxheWJhY2sgU3RhdGVzIAorLyoqIE1JREkgUGxheWJhY2sgU3RhdGVzCiAgKiBAaW5ncm91cCBtaWRpCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFIHsKLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlVW5rbm93biA9IDAsICAgICAgLyoqPCBVbmtub3duIHN0YXRlIG9yIHN0YXRlIGRvZXMgbm90IG1hcCB0byAKLSAgCQkJCQkJCQkJCQkJCW90aGVyIGRlZmluZWQgc3RhdGVzICovCi0gIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZUNsb3NlZEVuZ2FnZWQsICAgIC8qKjwgTm8gTUlESSByZXNvdXJjZSBpcyBjdXJyZW50bHkgb3Blbi4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIAorICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVVbmtub3duID0gMCwgICAgICAvKio8IFVua25vd24gc3RhdGUgb3Igc3RhdGUgZG9lcyBub3QgbWFwIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgZGVmaW5lZCBzdGF0ZXMgKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlQ2xvc2VkRW5nYWdlZCwgICAgLyoqPCBObyBNSURJIHJlc291cmNlIGlzIGN1cnJlbnRseSBvcGVuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgcHJvY2Vzc2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgZXZlbnRzLiAqLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQYXJzaW5nLCAgICAgICAgICAvKio8IEEgTUlESSByZXNvdXJjZSBpcyBvcGVuIGFuZCBpcyBiZWluZyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltZWQuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBhcnNpbmcsICAgICAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIGlzIGJlaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWVkLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4gKi8KLSAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlT3BlbkVuZ2FnZWQsICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgcHJpbWVkIGJ1dCAKKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlT3BlbkVuZ2FnZWQsICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgcHJpbWVkIGJ1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwbGF5aW5nLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4gVGhlIHRyYW5zaXRpb24gdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0YXRlIGlzIG9ubHkgcG9zc2libGUgZnJvbSB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSBpcyBvbmx5IHBvc3NpYmxlIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZyBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSAncGxheWJhY2sgaGVhZCcgcmVhY2hlcyB0aGUgZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbWVkaWEgZGF0YSBvciB0aGUgcGxheWJhY2sgc3RvcHMgZHVlCkBAIC05NjksOTUgKzk2OCw5NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGF1ZGlibGUgTUlESSBjb250ZW50IGR1cmluZyBwbGF5YmFjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseS4gVGhlIHNpdHVhdGlvbiBtYXkgY2hhbmdlIGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIGFyZSBmcmVlZCBsYXRlci4qLwotICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEU7CiAKIAotLyoqIE1JREkgc3RhdHVzIAorLyoqIE1JREkgc3RhdHVzCiAgKiBAaW5ncm91cCBtaWRpCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEUgewogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9VMTYgbk51bVRyYWNrczsgICAgICAgICAvKio8IE51bWJlciBvZiBNSURJIHRyYWNrcyBpbiB0aGUgZmlsZSwgcmVhZCBvbmx5IGZpZWxkLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgdW50aWwgdGhlIGVudGlyZSAKKyAgICBPTVhfVTE2IG5OdW1UcmFja3M7ICAgICAgICAgLyoqPCBOdW1iZXIgb2YgTUlESSB0cmFja3MgaW4gdGhlIGZpbGUsIHJlYWQgb25seSBmaWVsZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgdW50aWwgdGhlIGVudGlyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovCi0gICAgT01YX1UzMiBuRHVyYXRpb247ICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudGx5IG9wZW4gTUlESSByZXNvdXJjZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovICAKLSAgICBPTVhfVTMyIG5Qb3NpdGlvbjsgICAgICAgICAgLyoqPCBDdXJyZW50IFBvc2l0aW9uIG9mIHRoZSBNSURJIHJlc291cmNlIGJlaW5nIHBsYXllZCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQk9PTCBiVmlicmE7ICAgICAgICAgICAgLyoqPCBEb2VzIFZpYnJhIHRyYWNrIGV4aXN0PyBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICovCi0gICAgT01YX1UzMiBuTnVtTWV0YUV2ZW50czsgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIE1JREkgTWV0YSBFdmVudHMgaW4gdGhlIGN1cnJlbnRseSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIE1JREkgcmVzb3VyY2UuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSAKKyAgICBPTVhfVTMyIG5EdXJhdGlvbjsgICAgICAgICAgLyoqPCBUaGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50bHkgb3BlbiBNSURJIHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovCi0gICAgT01YX1UzMiBuTnVtQWN0aXZlVm9pY2VzOyAgIC8qKjwgTnVtYmVyIG9mIGFjdGl2ZSB2b2ljZXMgaW4gdGhlIGN1cnJlbnRseSBwbGF5aW5nIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgcmVzb3VyY2UuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSB1bnRpbCAKKyAgICBPTVhfVTMyIG5Qb3NpdGlvbjsgICAgICAgICAgLyoqPCBDdXJyZW50IFBvc2l0aW9uIG9mIHRoZSBNSURJIHJlc291cmNlIGJlaW5nIHBsYXllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CT09MIGJWaWJyYTsgICAgICAgICAgICAvKio8IERvZXMgVmlicmEgdHJhY2sgZXhpc3Q/IE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAqLworICAgIE9NWF9VMzIgbk51bU1ldGFFdmVudHM7ICAgICAvKio8IFRvdGFsIG51bWJlciBvZiBNSURJIE1ldGEgRXZlbnRzIGluIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIE1JREkgcmVzb3VyY2UuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAgKi8KKyAgICBPTVhfVTMyIG5OdW1BY3RpdmVWb2ljZXM7ICAgLyoqPCBOdW1iZXIgb2YgYWN0aXZlIHZvaWNlcyBpbiB0aGUgY3VycmVudGx5IHBsYXlpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIHJlc291cmNlLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgdW50aWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gKi8KICAgICBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFIGVNSURJUGxheUJhY2tTdGF0ZTsgIC8qKjwgTUlESSBwbGF5YmFjayBzdGF0ZSBlbnVtZXJhdGlvbiwgcmVhZCBvbmx5IGZpZWxkICovCiB9IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEU7CiAKIAogLyoqIE1JREkgTWV0YSBFdmVudCBzdHJ1Y3R1cmUgb25lIHBlciBNZXRhIEV2ZW50LgotICogIE1JREkgTWV0YSBFdmVudHMgYXJlIGxpa2UgYXVkaW8gbWV0YWRhdGEsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGludGVyc3BlcnNlZCAKLSAqICB3aXRoIHRoZSBNSURJIGNvbnRlbnQgdGhyb3VnaG91dCB0aGUgZmlsZSBhbmQgYXJlIG5vdCBsb2NhbGl6ZWQgaW4gdGhlIGhlYWRlci4gCi0gKiAgQXMgc3VjaCwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIE1ldGEgRXZlbnRzIGZyb20gCi0gKiAgdGhlIGVuZ2luZSwgYXMgaXQgZW5jb3VudGVycyB0aGVzZSBNZXRhIEV2ZW50cyB3aXRoaW4gdGhlIE1JREkgY29udGVudC4gCi0gKiAgRm9yIGV4YW1wbGUsIFNNRiBmaWxlcyBjYW4gaGF2ZSB1cCB0byAxNCB0eXBlcyBvZiBNSURJIE1ldGEgRXZlbnRzIChjb3B5cmlnaHQsIAotICogIGF1dGhvciwgZGVmYXVsdCB0ZW1wbywgZXRjLikgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIGZpbGUuIAorICogIE1JREkgTWV0YSBFdmVudHMgYXJlIGxpa2UgYXVkaW8gbWV0YWRhdGEsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGludGVyc3BlcnNlZAorICogIHdpdGggdGhlIE1JREkgY29udGVudCB0aHJvdWdob3V0IHRoZSBmaWxlIGFuZCBhcmUgbm90IGxvY2FsaXplZCBpbiB0aGUgaGVhZGVyLgorICogIEFzIHN1Y2gsIGl0IGlzIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBNZXRhIEV2ZW50cyBmcm9tCisgKiAgdGhlIGVuZ2luZSwgYXMgaXQgZW5jb3VudGVycyB0aGVzZSBNZXRhIEV2ZW50cyB3aXRoaW4gdGhlIE1JREkgY29udGVudC4KKyAqICBGb3IgZXhhbXBsZSwgU01GIGZpbGVzIGNhbiBoYXZlIHVwIHRvIDE0IHR5cGVzIG9mIE1JREkgTWV0YSBFdmVudHMgKGNvcHlyaWdodCwKKyAqICBhdXRob3IsIGRlZmF1bHQgdGVtcG8sIGV0Yy4pIHNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZSBmaWxlLgogICogIEBpbmdyb3VwIG1pZGkKICAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRXsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCi0gICAgT01YX1U4IG5NZXRhRXZlbnRUeXBlOyAgICAvKio8IE1ldGEgRXZlbnQgVHlwZSwgN2JpdHMgKGkuZS4gMCAtIDEyNykgKi8gCi0gICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgLyoqPCBJbmRleCBvZiBNZXRhIEV2ZW50ICovCisgICAgT01YX1U4IG5NZXRhRXZlbnRUeXBlOyAgICAvKio8IE1ldGEgRXZlbnQgVHlwZSwgN2JpdHMgKGkuZS4gMCAtIDEyNykgKi8KKyAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLwogICAgIE9NWF9VMzIgblRyYWNrOyAgICAgICAgICAgLyoqPCB0cmFjayBudW1iZXIgZm9yIHRoZSBtZXRhIGV2ZW50ICovCiAgICAgT01YX1UzMiBuUG9zaXRpb247ICAgICAgICAvKio8IFBvc2l0aW9uIG9mIHRoZSBtZXRhLWV2ZW50IGluIG1pbGxpc2Vjb25kcyAqLwotfSBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFOyAKK30gT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRTsKIAogCi0vKiogTUlESSBNZXRhIEV2ZW50IERhdGEgc3RydWN0dXJlIC0gb25lIHBlciBNZXRhIEV2ZW50LiAKKy8qKiBNSURJIE1ldGEgRXZlbnQgRGF0YSBzdHJ1Y3R1cmUgLSBvbmUgcGVyIE1ldGEgRXZlbnQuCiAgKiBAaW5ncm91cCBtaWRpCi0gKi8gCi10eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlREQVRBVFlQRXsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCi0gICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCi0gICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCi0gICAgT01YX1U4IG5EYXRhWzFdOyAgICAgICAgICAvKio8IGFycmF5IG9mIG9uZSBvciBtb3JlIGJ5dGVzIG9mIG1ldGEgZGF0YSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IHRoZSBuTWV0YUV2ZW50U2l6ZSBmaWVsZCAqLyAKLX0gT01YX0FVRElPX0NPTkZJR19fTUlESU1FVEFFVkVOVERBVEFUWVBFOyAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UREFUQVRZUEV7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8KKyAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLworICAgIE9NWF9VOCBuRGF0YVsxXTsgICAgICAgICAgLyoqPCBhcnJheSBvZiBvbmUgb3IgbW9yZSBieXRlcyBvZiBtZXRhIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaW5kaWNhdGVkIGJ5IHRoZSBuTWV0YUV2ZW50U2l6ZSBmaWVsZCAqLworfSBPTVhfQVVESU9fQ09ORklHX19NSURJTUVUQUVWRU5UREFUQVRZUEU7CiAKIAogLyoqIEF1ZGlvIFZvbHVtZSBhZGp1c3RtZW50IGZvciBhIHBvcnQgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3Mgdm9sdW1lLiAgU2VsZWN0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLiAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIAorICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbG9nYXJpdGhtaWMgc2NhbGUgKG1CKSAqLwogICAgIE9NWF9CUzMyIHNWb2x1bWU7ICAgICAgICAgICAvKio8IFZvbHVtZSBsaW5lYXIgc2V0dGluZyBpbiB0aGUgMC4uMTAwIHJhbmdlLCBPUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZSBsb2dhcml0aG1pYyBzZXR0aW5nIGZvciB0aGlzIHBvcnQuICBUaGUgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHZvbHVtZSBhcmUgaW4gbUIgKG1pbGxpYmVscyA9IDEvMTAwIGRCKSByZWxhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgZ2FpbiBvZiAxIChlLmcuIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGxldmVsKS4gIFZhbHVlcyBhcmUgaW4gbUIgZnJvbSBuTWF4IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgZ2FpbiBvZiAxIChlLmcuIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBvbmVudCBjYW5ub3QgYWNjdXJhdGVseSBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIGl0IG11c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHZvbHVtZSB0byB0aGUgY2xvc2VzdCB2YWx1ZSBCRUxPVwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgdmFsdWUuICBXaGVuIGdldHRpbmcgdGhlCkBAIC0xMDcwLDI3ICsxMDY5LDI3IEBACiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxWT0xVTUVUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIHZvbHVtZS4gIFNlbGVjdCB0aGUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUuICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwgCisgICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IHZvbHVtZSBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFsbCBjaGFubmVscyAqLwotICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIG9yIAorICAgIE9NWF9CT09MIGJMaW5lYXI7ICAgICAgICAgICAvKio8IElzIHRoZSB2b2x1bWUgdG8gYmUgc2V0IGluIGxpbmVhciAoMC4xMDApIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nYXJpdGhtaWMgc2NhbGUgKG1CKSAqLwogICAgIE9NWF9CUzMyIHNWb2x1bWU7ICAgICAgICAgICAvKio8IFZvbHVtZSBsaW5lYXIgc2V0dGluZyBpbiB0aGUgMC4uMTAwIHJhbmdlLCBPUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZSBsb2dhcml0aG1pYyBzZXR0aW5nIGZvciB0aGlzIHBvcnQuICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGZvciB2b2x1bWUgYXJlIGluIG1CIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZSBsb2dhcml0aG1pYyBzZXR0aW5nIGZvciB0aGlzIHBvcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBmb3Igdm9sdW1lIGFyZSBpbiBtQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaWxsaWJlbHMgPSAxLzEwMCBkQikgcmVsYXRpdmUgdG8gYSBnYWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgMSAoZS5nLiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBsZXZlbCkuICBWYWx1ZXMgYXJlIGluIG1CIGZyb20gbk1heCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAxIChlLmcuIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIHZvbHVtZSBpcyAidm9sdGFnZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IGEgInBvd2VyIiwgaXQgdGFrZXMgYSBzZXR0aW5nIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYwMCBtQiB0byBkZWNyZWFzZSB0aGUgdm9sdW1lIGJ5IDEvMi4gIElmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBjb21wb25lbnQgY2Fubm90IGFjY3VyYXRlbHkgc2V0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBvbmVudCBjYW5ub3QgYWNjdXJhdGVseSBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIGl0IG11c3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHZvbHVtZSB0byB0aGUgY2xvc2VzdCB2YWx1ZSBCRUxPVwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgdmFsdWUuICBXaGVuIGdldHRpbmcgdGhlCkBAIC0xMTA1LDEyICsxMTA0LDEyIEBACiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0JBTEFOQ0VUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIGJhbGFuY2UuICBTZWxlY3QgdGhlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3MgYmFsYW5jZS4gIFNlbGVjdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UuICovCi0gICAgT01YX1MzMiBuQmFsYW5jZTsgICAgICAgICAgIC8qKjwgYmFsYW5jZSBzZXR0aW5nIGZvciB0aGlzIHBvcnQgCisgICAgT01YX1MzMiBuQmFsYW5jZTsgICAgICAgICAgIC8qKjwgYmFsYW5jZSBzZXR0aW5nIGZvciB0aGlzIHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEwMCB0byAxMDAsIHdoZXJlIC0xMDAgaW5kaWNhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGxlZnQsIGFuZCBubyByaWdodCAqLwogfSBPTVhfQVVESU9fQ09ORklHX0JBTEFOQ0VUWVBFOwpAQCAtMTEyMCwxMCArMTExOSwxMCBAQAogdHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyBtdXRlLiAgU2VsZWN0IHRoZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIG11dGUuICBTZWxlY3QgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlLiAqLwogICAgIE9NWF9CT09MIGJNdXRlOyAgICAgICAgICAgICAvKio8IE11dGUgc2V0dGluZyBmb3IgdGhpcyBwb3J0ICovCiB9IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEU7CkBAIC0xMTM0LDIwICsxMTMzLDIwIEBACiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCi0gICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwgCisgICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IG11dGUgc2V0dGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbGwgY2hhbm5lbHMgKi8KICAgICBPTVhfQk9PTCBiTXV0ZTsgICAgICAgICAgICAgLyoqPCBNdXRlIHNldHRpbmcgZm9yIHRoaXMgY2hhbm5lbCAqLwogICAgIE9NWF9CT09MIGJJc01JREk7ICAgICAgICAgICAvKio8IFRSVUUgaWYgbkNoYW5uZWwgcmVmZXJzIHRvIGEgTUlESSBjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG90aGVyd2lzZSAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBvdGhlcndpc2UgKi8KIH0gT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEU7CiAKIAogCi0vKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgbG91ZG5lc3MgY29udHJvbCwgd2hpY2ggYm9vc3RzIGJhc3MgYW5kIHRvIGEgCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgbG91ZG5lc3MgY29udHJvbCwgd2hpY2ggYm9vc3RzIGJhc3MgYW5kIHRvIGEKICAqICBzbWFsbGVyIGV4dGVudCBoaWdoIGVuZCBmcmVxdWVuY2llcyB0byBjb21wZW5zYXRlIGZvciBoZWFyaW5nCiAgKiAgYWJpbGl0eSBhdCB0aGUgZXh0cmVtZSBlbmRzIG9mIHRoZSBhdWRpbyBzcGVjdHJ1bQotICovIAorICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KQEAgLTExNTcsMzMgKzExNTYsMzMgQEAKIAogCiAvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgYmFzcywgd2hpY2ggY29udHJvbHMgbG93IGZyZXF1ZW5jaWVzCi0gKi8gCisgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEUgewogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwogICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGJhc3MgY29udHJvbCAqLwotICAgIE9NWF9TMzIgbkJhc3M7ICAgICAgICAgICAgIC8qKjwgYmFzcyBzZXR0aW5nIGZvciB0aGUgcG9ydCwgYXMgYSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCisgICAgT01YX1MzMiBuQmFzczsgICAgICAgICAgICAgLyoqPCBiYXNzIHNldHRpbmcgZm9yIHRoZSBwb3J0LCBhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzIHZhbHVlIGZyb20gLTEwMCB0byAxMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiBiYXNzIGxldmVsKSovCiB9IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEU7CiAKIAogLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIHRyZWJsZSwgd2hpY2ggY29udHJvbHMgaGlnaCBmcmVxdWVuY2llcyB0b25lcwotICovIAorICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEUgewogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwogICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHRyZWJsZSBjb250cm9sICovCiAgICAgT01YX1MzMiAgblRyZWJsZTsgICAgICAgICAgLyoqPCB0cmVibGUgc2V0dGluZyBmb3IgdGhlIHBvcnQsIGFzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzIHZhbHVlIGZyb20gLTEwMCB0byAxMDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiB0cmVibGUgbGV2ZWwpICovCiB9IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRTsKIAogCi0vKiogQW4gZXF1YWxpemVyIGlzIHR5cGljYWxseSB1c2VkIGZvciB0d28gcmVhc29uczogdG8gY29tcGVuc2F0ZSBmb3IgYW4gCi0gKiAgc3ViLW9wdGltYWwgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgc3lzdGVtIHRvIG1ha2UgaXQgc291bmQgbW9yZSBuYXR1cmFsIAorLyoqIEFuIGVxdWFsaXplciBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdHdvIHJlYXNvbnM6IHRvIGNvbXBlbnNhdGUgZm9yIGFuCisgKiAgc3ViLW9wdGltYWwgZnJlcXVlbmN5IHJlc3BvbnNlIG9mIGEgc3lzdGVtIHRvIG1ha2UgaXQgc291bmQgbW9yZSBuYXR1cmFsCiAgKiAgb3IgdG8gY3JlYXRlIGludGVudGlvbmFsbHkgc29tZSB1bm5hdHVyYWwgY29sb3JpbmcgdG8gdGhlIHNvdW5kIHRvIGNyZWF0ZQogICogIGFuIGVmZmVjdC4KICAqICBAaW5ncm91cCBlZmZlY3RzCkBAIC0xMTkzLDMzICsxMTkyLDMzIEBACiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCiAgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwogICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGVxdWFsaXplciAqLwotICAgIE9NWF9CVTMyIHNCYW5kSW5kZXg7ICAgICAgIC8qKjwgQmFuZCBudW1iZXIgdG8gYmUgc2V0LiAgVXBwZXIgTGltaXQgaXMgCisgICAgT01YX0JVMzIgc0JhbmRJbmRleDsgICAgICAgLyoqPCBCYW5kIG51bWJlciB0byBiZSBzZXQuICBVcHBlciBMaW1pdCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0xLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgYmFuZHMsIGxvd2VyIGxpbWl0IGlzIDAgKi8KICAgICBPTVhfQlUzMiBzQ2VudGVyRnJlcTsgICAgICAvKio8IENlbnRlciBmcmVxdWVjaWVzIGluIEh6LiAgVGhpcyBpcyBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIG9ubHkgZWxlbWVudCBhbmQgaXMgdXNlZCB0byBkZXRlcm1pbmUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbG93ZXIsIGNlbnRlciBhbmQgdXBwZXIgZnJlcXVlbmN5IG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBvbmx5IGVsZW1lbnQgYW5kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbG93ZXIsIGNlbnRlciBhbmQgdXBwZXIgZnJlcXVlbmN5IG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJhbmQuICAqLwogICAgIE9NWF9CUzMyIHNCYW5kTGV2ZWw7ICAgICAgIC8qKjwgYmFuZCBsZXZlbCBpbiBtaWxsaWJlbHMgKi8KIH0gT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFOwogCiAKLS8qKiBTdGVyZW8gd2lkZW5pbmcgbW9kZSB0eXBlIAorLyoqIFN0ZXJlbyB3aWRlbmluZyBtb2RlIHR5cGUKICAqIEBpbmdyb3VwIGVmZmVjdHMKLSAqLyAKKyAqLwogdHlwZWRlZiBlbnVtIE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEUgewogICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0hlYWRwaG9uZXMsICAgIC8qKjwgU3RlcmVvIHdpZGVuaW5nIGZvciBsb3Vkc3BlYWtlcnMgKi8KICAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdMb3Vkc3BlYWtlcnMsICAvKio8IFN0ZXJlbyB3aWRlbmluZyBmb3IgY2xvc2VseSBzcGFjZWQgbG91ZHNwZWFrZXJzICovCi0gICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFOwogCiAKIC8qKiBDb250cm9sIGZvciBzdGVyZW8gd2lkZW5pbmcsIHdoaWNoIGlzIGEgc3BlY2lhbCAyLWNoYW5uZWwKLSAqICBjYXNlIG9mIHRoZSBhdWRpbyB2aXJ0dWFsaXplciBlZmZlY3QuIEZvciBleGFtcGxlLCBmb3IgNS4xLWNoYW5uZWwgCi0gKiAgb3V0cHV0LCBpdCB0cmFuc2xhdGVzIHRvIHZpcnR1YWwgc3Vycm91bmQgc291bmQuIAorICogIGNhc2Ugb2YgdGhlIGF1ZGlvIHZpcnR1YWxpemVyIGVmZmVjdC4gRm9yIGV4YW1wbGUsIGZvciA1LjEtY2hhbm5lbAorICogIG91dHB1dCwgaXQgdHJhbnNsYXRlcyB0byB2aXJ0dWFsIHN1cnJvdW5kIHNvdW5kLgogICogQGluZ3JvdXAgZWZmZWN0cwotICovIAorICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KQEAgLTEyMzIsMTAgKzEyMzEsMTAgQEAKIAogCiAvKiogVGhlIGNob3J1cyBlZmZlY3QgKG9yIGBgY2hvcmFsaXplcicnKSBpcyBhbnkgc2lnbmFsIHByb2Nlc3NvciB3aGljaCBtYWtlcwotICogIG9uZSBzb3VuZCBzb3VyY2UgKHN1Y2ggYXMgYSB2b2ljZSkgc291bmQgbGlrZSBtYW55IHN1Y2ggc291cmNlcyBzaW5naW5nIAotICogIChvciBwbGF5aW5nKSBpbiB1bmlzb24uIFNpbmNlIHBlcmZvcm1hbmNlIGluIHVuaXNvbiBpcyBuZXZlciBleGFjdCwgY2hvcnVzIAotICogIGVmZmVjdHMgc2ltdWxhdGUgdGhpcyBieSBtYWtpbmcgaW5kZXBlbmRlbnRseSBtb2RpZmllZCBjb3BpZXMgb2YgdGhlIGlucHV0IAotICogIHNpZ25hbC4gTW9kaWZpY2F0aW9ucyBtYXkgaW5jbHVkZSAoMSkgZGVsYXksICgyKSBmcmVxdWVuY3kgc2hpZnQsIGFuZCAKKyAqICBvbmUgc291bmQgc291cmNlIChzdWNoIGFzIGEgdm9pY2UpIHNvdW5kIGxpa2UgbWFueSBzdWNoIHNvdXJjZXMgc2luZ2luZworICogIChvciBwbGF5aW5nKSBpbiB1bmlzb24uIFNpbmNlIHBlcmZvcm1hbmNlIGluIHVuaXNvbiBpcyBuZXZlciBleGFjdCwgY2hvcnVzCisgKiAgZWZmZWN0cyBzaW11bGF0ZSB0aGlzIGJ5IG1ha2luZyBpbmRlcGVuZGVudGx5IG1vZGlmaWVkIGNvcGllcyBvZiB0aGUgaW5wdXQKKyAqICBzaWduYWwuIE1vZGlmaWNhdGlvbnMgbWF5IGluY2x1ZGUgKDEpIGRlbGF5LCAoMikgZnJlcXVlbmN5IHNoaWZ0LCBhbmQKICAqICAoMykgYW1wbGl0dWRlIG1vZHVsYXRpb24uCiAgKiBAaW5ncm91cCBlZmZlY3RzCiAgKi8KQEAgLTEyNDYsMTYgKzEyNDUsMTYgQEAKICAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBjaG9ydXMgKi8KICAgICBPTVhfQlUzMiBzRGVsYXk7ICAgICAgICAgICAvKio8IGF2ZXJhZ2UgZGVsYXkgaW4gbWlsbGlzZWNvbmRzICovCiAgICAgT01YX0JVMzIgc01vZHVsYXRpb25SYXRlOyAgLyoqPCByYXRlIG9mIG1vZHVsYXRpb24gaW4gbWlsbGloZXJ0eiAqLwotICAgIE9NWF9VMzIgbk1vZHVsYXRpb25EZXB0aDsgIC8qKjwgZGVwdGggb2YgbW9kdWxhdGlvbiBhcyBhIHBlcmNlbnRhZ2Ugb2YgCisgICAgT01YX1UzMiBuTW9kdWxhdGlvbkRlcHRoOyAgLyoqPCBkZXB0aCBvZiBtb2R1bGF0aW9uIGFzIGEgcGVyY2VudGFnZSBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgKGkuZS4gMCB0byAxMDApICovCiAgICAgT01YX0JVMzIgbkZlZWRiYWNrOyAgICAgICAgLyoqPCBGZWVkYmFjayBmcm9tIGNob3J1cyBvdXRwdXQgdG8gaW5wdXQgaW4gcGVyY2VudGFnZSAqLwogfSBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEU7CiAKIAotLyoqIFJldmVyYmVyYXRpb24gaXMgcGFydCBvZiB0aGUgcmVmbGVjdGVkIHNvdW5kIHRoYXQgZm9sbG93cyB0aGUgZWFybHkgCi0gKiAgcmVmbGVjdGlvbnMuIEluIGEgdHlwaWNhbCByb29tLCB0aGlzIGNvbnNpc3RzIG9mIGEgZGVuc2Ugc3VjY2Vzc2lvbiBvZiAKLSAqICBlY2hvZXMgd2hvc2UgZW5lcmd5IGRlY2F5cyBleHBvbmVudGlhbGx5LiBUaGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3Qgc3RydWN0dXJlIAotICogIGFzIGRlZmluZWQgaGVyZSBpbmNsdWRlcyBib3RoIChlYXJseSkgcmVmbGVjdGlvbnMgYXMgd2VsbCBhcyAobGF0ZSkgcmV2ZXJiZXJhdGlvbnMuIAorLyoqIFJldmVyYmVyYXRpb24gaXMgcGFydCBvZiB0aGUgcmVmbGVjdGVkIHNvdW5kIHRoYXQgZm9sbG93cyB0aGUgZWFybHkKKyAqICByZWZsZWN0aW9ucy4gSW4gYSB0eXBpY2FsIHJvb20sIHRoaXMgY29uc2lzdHMgb2YgYSBkZW5zZSBzdWNjZXNzaW9uIG9mCisgKiAgZWNob2VzIHdob3NlIGVuZXJneSBkZWNheXMgZXhwb25lbnRpYWxseS4gVGhlIHJldmVyYmVyYXRpb24gZWZmZWN0IHN0cnVjdHVyZQorICogIGFzIGRlZmluZWQgaGVyZSBpbmNsdWRlcyBib3RoIChlYXJseSkgcmVmbGVjdGlvbnMgYXMgd2VsbCBhcyAobGF0ZSkgcmV2ZXJiZXJhdGlvbnMuCiAgKiBAaW5ncm91cCBlZmZlY3RzCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgewpAQCAtMTI2Myw0OCArMTI2Miw0OCBAQAogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KICAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciByZXZlcmJlcmF0aW9uIGNvbnRyb2wgKi8KLSAgICBPTVhfQlMzMiBzUm9vbUxldmVsOyAgICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBmb3IgdGhlIHdob2xlIHJvb20gZWZmZWN0IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gYm90aCBlYXJseSByZWZsZWN0aW9ucyBhbmQgbGF0ZSAKKyAgICBPTVhfQlMzMiBzUm9vbUxldmVsOyAgICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBmb3IgdGhlIHdob2xlIHJvb20gZWZmZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBib3RoIGVhcmx5IHJlZmxlY3Rpb25zIGFuZCBsYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcmJlcmF0aW9uKSBpbiBtaWxsaWJlbHMgKi8KICAgICBPTVhfQlMzMiBzUm9vbUhpZ2hGcmVxTGV2ZWw7ICAvKio8IEF0dGVudWF0aW9uIGF0IGhpZ2ggZnJlcXVlbmNpZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBpbnRlbnNpdHkgYXQgbG93CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyBpbiBtaWxsaWJlbHMgKi8KICAgICBPTVhfQlMzMiBzUmVmbGVjdGlvbnNMZXZlbDsgICAvKio8IEludGVuc2l0eSBsZXZlbCBvZiBlYXJseSByZWZsZWN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aXZlIHRvIHJvb20gdmFsdWUpLCBpbiBtaWxsaWJlbHMgKi8KLSAgICBPTVhfQlUzMiBzUmVmbGVjdGlvbnNEZWxheTsgICAvKio8IERlbGF5IHRpbWUgb2YgdGhlIGZpcnN0IHJlZmxlY3Rpb24gcmVsYXRpdmUgCisgICAgT01YX0JVMzIgc1JlZmxlY3Rpb25zRGVsYXk7ICAgLyoqPCBEZWxheSB0aW1lIG9mIHRoZSBmaXJzdCByZWZsZWN0aW9uIHJlbGF0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgZGlyZWN0IHBhdGgsIGluIG1pbGxpc2Vjb25kcyAqLwogICAgIE9NWF9CUzMyIHNSZXZlcmJMZXZlbDsgICAgICAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIG9mIGxhdGUgcmV2ZXJiZXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gcm9vbSBsZXZlbCwgaW4gbWlsbGliZWxzICovCi0gICAgT01YX0JVMzIgc1JldmVyYkRlbGF5OyAgICAgICAgLyoqPCBUaW1lIGRlbGF5IGZyb20gdGhlIGZpcnN0IGVhcmx5IHJlZmxlY3Rpb24gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gCisgICAgT01YX0JVMzIgc1JldmVyYkRlbGF5OyAgICAgICAgLyoqPCBUaW1lIGRlbGF5IGZyb20gdGhlIGZpcnN0IGVhcmx5IHJlZmxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgaW4gbWlsbGlzZWNvbmRzICovCiAgICAgT01YX0JVMzIgc0RlY2F5VGltZTsgICAgICAgICAgLyoqPCBMYXRlIHJldmVyYmVyYXRpb24gZGVjYXkgdGltZSBhdCBsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzLCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQlUzMiBuRGVjYXlIaWdoRnJlcVJhdGlvOyAvKio8IFJhdGlvIG9mIGhpZ2ggZnJlcXVlbmN5IGRlY2F5IHRpbWUgcmVsYXRpdmUgCisgICAgT01YX0JVMzIgbkRlY2F5SGlnaEZyZXFSYXRpbzsgLyoqPCBSYXRpbyBvZiBoaWdoIGZyZXF1ZW5jeSBkZWNheSB0aW1lIHJlbGF0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBsb3cgZnJlcXVlbmN5IGRlY2F5IHRpbWUgaW4gcGVyY2VudCAgKi8KICAgICBPTVhfVTMyIG5EZW5zaXR5OyAgICAgICAgICAgICAvKio8IE1vZGFsIGRlbnNpdHkgaW4gdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBlcmNlbnQgKGkuZS4gMCAtIDEwMCkgKi8KICAgICBPTVhfVTMyIG5EaWZmdXNpb247ICAgICAgICAgICAvKio8IEVjaG8gZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGVyY2VudCAoaS5lLiAwIC0gMTAwKSAqLwotICAgIE9NWF9CVTMyIHNSZWZlcmVuY2VIaWdoRnJlcTsgIC8qKjwgUmVmZXJlbmNlIGhpZ2ggZnJlcXVlbmN5IGluIEhlcnR6LiBUaGlzIGlzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyZXF1ZW5jeSB1c2VkIGFzIHRoZSByZWZlcmVuY2UgZm9yIGFsbCAKKyAgICBPTVhfQlUzMiBzUmVmZXJlbmNlSGlnaEZyZXE7ICAvKio8IFJlZmVyZW5jZSBoaWdoIGZyZXF1ZW5jeSBpbiBIZXJ0ei4gVGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyZXF1ZW5jeSB1c2VkIGFzIHRoZSByZWZlcmVuY2UgZm9yIGFsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhpZ2gtZnJlcXVlbmN5IHNldHRpbmdzIGFib3ZlICovCiAKIH0gT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRTsKIAogCi0vKiogUG9zc2libGUgc2V0dGluZ3MgZm9yIHRoZSBFY2hvIENhbmNlbGF0aW9uIHN0cnVjdHVyZSB0byB1c2UgCisvKiogUG9zc2libGUgc2V0dGluZ3MgZm9yIHRoZSBFY2hvIENhbmNlbGF0aW9uIHN0cnVjdHVyZSB0byB1c2UKICAqIEBpbmdyb3VwIGVmZmVjdHMKICAqLwogdHlwZWRlZiBlbnVtIE9NWF9BVURJT19FQ0hPQ0FOVFlQRSB7CiAgICBPTVhfQVVESU9fRWNob0Nhbk9mZiA9IDAsICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gaXMgZGlzYWJsZWQgKi8KLSAgIE9NWF9BVURJT19FY2hvQ2FuTm9ybWFsLCAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBub3JtYWwgb3BlcmF0aW9uIC0gCisgICBPTVhfQVVESU9fRWNob0Nhbk5vcm1hbCwgICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gbm9ybWFsIG9wZXJhdGlvbiAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBmcm9tIHBsYXN0aWNzIGFuZCBmYWNlICovCi0gICBPTVhfQVVESU9fRWNob0NhbkhGcmVlLCAgICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gb3B0aW1pemVkIGZvciAKKyAgIE9NWF9BVURJT19FY2hvQ2FuSEZyZWUsICAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZHMgRnJlZSBvcGVyYXRpb24gKi8KLSAgIE9NWF9BVURJT19FY2hvQ2FuQ2FyS2l0LCAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG9wdGltaXplZCBmb3IgCisgICBPTVhfQVVESU9fRWNob0NhbkNhcktpdCwgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBvcHRpbWl6ZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyIEtpdCAobG9uZ2VyIGVjaG8pICovCi0gICBPTVhfQVVESU9fRWNob0Nhbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgIE9NWF9BVURJT19FY2hvQ2FuS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICBPTVhfQVVESU9fRWNob0NhblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICBPTVhfQVVESU9fRWNob0Nhbk1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0FVRElPX0VDSE9DQU5UWVBFOwpAQCAtMTMxMyw3ICsxMzEyLDcgQEAKIC8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBlY2hvIGNhbmNlbGF0aW9uLCB3aGljaCByZW1vdmVzIHVuZGVzaXJlZCBlY2hvJ3MKICAqICBmcm9tIHRoZSBhdWRpbwogICogQGluZ3JvdXAgZWZmZWN0cwotICovIAorICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEUgewogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCkBAIC0xMzI1LDcgKzEzMjQsNyBAQAogLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIG5vaXNlIHJlZHVjdGlvbiwgd2hpY2ggdW5kZXNpcmVkIG5vaXNlIGZyb20KICAqIHRoZSBhdWRpbwogICogQGluZ3JvdXAgZWZmZWN0cwotICovIAorICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQXVkaW9FeHQuaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQXVkaW9FeHQuaAppbmRleCA1YWMxNWY3Li4yYTFjM2YyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0F1ZGlvRXh0LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9BdWRpb0V4dC5oCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRVbnVzZWQgPSBPTVhfQVVESU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgKyAweDAwMTAwMDAwLAogICAgIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkQUMzLCAgICAgICAgIC8qKjwgQUMzIGVuY29kZWQgZGF0YSAqLwogICAgIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUywgICAgICAgIC8qKjwgT1BVUyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZEVBQzMsICAgICAgICAvKio8IEVBQzMgZW5jb2RlZCBkYXRhICovCiB9IE9NWF9BVURJT19DT0RJTkdFWFRUWVBFOwogCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzNUWVBFIHsKQEAgLTU4LDYgKzU5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLwogfSBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzNUWVBFOwogCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9FQUMzVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCit9IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0VBQzNUWVBFOworCiB0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaAppbmRleCBiNWI3ODRlLi4wZGMyYzc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvbXBvbmVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50LmgKQEAgLTE2LDI1ICsxNiwyNSBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgogICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KICAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCiAgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKICAqLwogCkBAIC01NSw3ICs1NSw3IEBACiAKIC8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKICAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseQogICovCiAKICNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KQEAgLTY0LDEyICs2NCwxMiBAQAogI2luY2x1ZGUgPE9NWF9PdGhlci5oPgogCiAvKiogQGluZ3JvdXAgY29tcCAqLwotdHlwZWRlZiBlbnVtIE9NWF9QT1JURE9NQUlOVFlQRSB7IAotICAgIE9NWF9Qb3J0RG9tYWluQXVkaW8sIAotICAgIE9NWF9Qb3J0RG9tYWluVmlkZW8sIAotICAgIE9NWF9Qb3J0RG9tYWluSW1hZ2UsIAordHlwZWRlZiBlbnVtIE9NWF9QT1JURE9NQUlOVFlQRSB7CisgICAgT01YX1BvcnREb21haW5BdWRpbywKKyAgICBPTVhfUG9ydERvbWFpblZpZGVvLAorICAgIE9NWF9Qb3J0RG9tYWluSW1hZ2UsCiAgICAgT01YX1BvcnREb21haW5PdGhlciwKLSAgICBPTVhfUG9ydERvbWFpbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfUG9ydERvbWFpbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9Qb3J0RG9tYWluVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfUG9ydERvbWFpbk1heCA9IDB4N2ZmZmZmZgogfSBPTVhfUE9SVERPTUFJTlRZUEU7CkBAIC04OCw3ICs4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBkaXNhYmxlZCBhIHBvcnQgaXMgdW5wb3B1bGF0ZWQuIEEgZGlzYWJsZWQgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBwb3B1bGF0ZWQgd2l0aCBidWZmZXJzIG9uIGEgdHJhbnNpdGlvbiB0byBJRExFLiAqLwogICAgIE9NWF9CT09MIGJQb3B1bGF0ZWQ7ICAgICAgICAgICAvKio8IFBvcnQgaXMgcG9wdWxhdGVkIHdpdGggYWxsIG9mIGl0cyBidWZmZXJzIGFzIGluZGljYXRlZCBieQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5CdWZmZXJDb3VudEFjdHVhbC4gQSBkaXNhYmxlZCBwb3J0IGlzIGFsd2F5cyB1bnBvcHVsYXRlZC4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ1ZmZlckNvdW50QWN0dWFsLiBBIGRpc2FibGVkIHBvcnQgaXMgYWx3YXlzIHVucG9wdWxhdGVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuIGVuYWJsZWQgcG9ydCBpcyBwb3B1bGF0ZWQgb24gYSB0cmFuc2l0aW9uIHRvIE9NWF9TdGF0ZUlkbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdW5wb3B1bGF0ZWQgb24gYSB0cmFuc2l0aW9uIHRvIGxvYWRlZC4gKi8KICAgICBPTVhfUE9SVERPTUFJTlRZUEUgZURvbWFpbjsgICAgLyoqPCBEb21haW4gb2YgdGhlIHBvcnQuIERldGVybWluZXMgdGhlIGNvbnRlbnRzIG9mIG1ldGFkYXRhIGJlbG93LiAqLwpAQCAtMTAzLDI2ICsxMDMsMjYgQEAKIH0gT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRTsKIAogLyoqIEBpbmdyb3VwIGNvbXAgKi8KLXR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9VMzJUWVBFIHsgCi0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9VMzJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwogICAgIE9NWF9VMzIgblUzMjsgICAgICAgICAgICAgICAgICAgICAvKio8IFUzMiB2YWx1ZSAqLwogfSBPTVhfUEFSQU1fVTMyVFlQRTsKIAogLyoqIEBpbmdyb3VwIHJwbSAqLwogdHlwZWRlZiBlbnVtIE9NWF9TVVNQRU5TSU9OUE9MSUNZVFlQRSB7CiAgICAgT01YX1N1c3BlbnNpb25EaXNhYmxlZCwgLyoqPCBObyBzdXNwZW5zaW9uOyB2MS4wIGJlaGF2aW9yICovCi0gICAgT01YX1N1c3BlbnNpb25FbmFibGVkLCAgLyoqPCBTdXNwZW5zaW9uIGFsbG93ZWQgKi8gICAKLSAgICBPTVhfU3VzcGVuc2lvblBvbGljeUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfU3VzcGVuc2lvbkVuYWJsZWQsICAvKio8IFN1c3BlbnNpb24gYWxsb3dlZCAqLworICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1N1c3BlbnNpb25Qb2xpY3lTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5TWF4ID0gMHg3ZmZmZmZmZgogfSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEU7CiAKIC8qKiBAaW5ncm91cCBycG0gKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKICAgICBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgZVBvbGljeTsKIH0gT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFOwogCkBAIC0xMzAsMjIgKzEzMCwyMiBAQAogdHlwZWRlZiBlbnVtIE9NWF9TVVNQRU5TSU9OVFlQRSB7CiAgICAgT01YX05vdFN1c3BlbmRlZCwgLyoqPCBjb21wb25lbnQgaXMgbm90IHN1c3BlbmRlZCAqLwogICAgIE9NWF9TdXNwZW5kZWQsICAgIC8qKjwgY29tcG9uZW50IGlzIHN1c3BlbmRlZCAqLwotICAgIE9NWF9TdXNwZW5zaW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9TdXNwZW5zaW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1N1c3BlbnNpb25WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9TdXNwZW5kTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfU1VTUEVOU0lPTlRZUEU7CiAKIC8qKiBAaW5ncm91cCBycG0gKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIAotICAgIE9NWF9TVVNQRU5TSU9OVFlQRSBlVHlwZTsgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1NVU1BFTlNJT05UWVBFIGVUeXBlOwogfSBPTVhfUEFSQU1fU1VTUEVOU0lPTlRZUEUgOwogCiB0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JPT0xFQU5UWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfQk9PTCBiRW5hYmxlZDsgICAgCisgICAgT01YX0JPT0wgYkVuYWJsZWQ7CiB9IE9NWF9DT05GSUdfQk9PTEVBTlRZUEU7CiAKIC8qIFBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZSBjb250ZW50IHVyaSB0byB1c2UuICovCkBAIC0xNzEsOSArMTcxLDkgQEAKIHR5cGVkZWYgc3RydWN0IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfQk9PTCBiUmVzb3VyY2VDb25jZWFsbWVudEZvcmJpZGRlbjsgLyoqPCBkaXNhbGxvdyB0aGUgdXNlIG9mIHJlc291cmNlIGNvbmNlYWxtZW50IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIChsaWtlIGRlZ3JhZGluZyBhbGdvcml0aG0gcXVhbGl0eSB0byAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgcmVzb3VyY2UgY29uc3VtcHRpb24gb3IgZnVuY3Rpb25hbCBieXBhc3MpIAorICAgIE9NWF9CT09MIGJSZXNvdXJjZUNvbmNlYWxtZW50Rm9yYmlkZGVuOyAvKio8IGRpc2FsbG93IHRoZSB1c2Ugb2YgcmVzb3VyY2UgY29uY2VhbG1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyAobGlrZSBkZWdyYWRpbmcgYWxnb3JpdGhtIHF1YWxpdHkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgcmVzb3VyY2UgY29uc3VtcHRpb24gb3IgZnVuY3Rpb25hbCBieXBhc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgY29tcG9uZW50IGFzIGEgcmVzb2x1dGlvbiB0byByZXNvdXJjZSBjb25mbGljdHMuICovCiB9IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRTsKIApAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgT01YX01ldGFkYXRhQ2hhcnNldEphdmFDb25mb3JtYW50VVRGOCwKICAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGNywKICAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SW1hcFVURjcsCi0gICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjE2TEUsIAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkxFLAogICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkJFLAogICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjEyMzQ1LAogICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRIWkdCMjMxMiwKQEAgLTIxNCw3ICsyMTQsNyBAQAogICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU08yMDIySlAxLAogICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU09FVUNKUCwKICAgICBPTVhfTWV0YWRhdGFDaGFyc2V0U01TN0JpdCwKLSAgICBPTVhfTWV0YWRhdGFDaGFyc2V0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VHlwZU1heD0gMHg3RkZGRkZGRgogfSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRTsKQEAgLTIyNiw3ICsyMjYsNyBAQAogICAgIE9NWF9NZXRhZGF0YVNjb3BlVG9wTGV2ZWwsCiAgICAgT01YX01ldGFkYXRhU2NvcGVQb3J0TGV2ZWwsCiAgICAgT01YX01ldGFkYXRhU2NvcGVOb2RlTGV2ZWwsCi0gICAgT01YX01ldGFkYXRhU2NvcGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX01ldGFkYXRhU2NvcGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfTWV0YWRhdGFTY29wZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX01ldGFkYXRhU2NvcGVUeXBlTWF4ID0gMHg3ZmZmZmZmZgogfSBPTVhfTUVUQURBVEFTQ09QRVRZUEU7CkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICBPTVhfTWV0YWRhdGFTZWFyY2hWYWx1ZVNpemVCeUluZGV4LAogICAgIE9NWF9NZXRhZGF0YVNlYXJjaEl0ZW1CeUluZGV4LAogICAgIE9NWF9NZXRhZGF0YVNlYXJjaE5leHRJdGVtQnlLZXksCi0gICAgT01YX01ldGFkYXRhU2VhcmNoS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9NZXRhZGF0YVNlYXJjaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9NZXRhZGF0YVNlYXJjaFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX01ldGFkYXRhU2VhcmNoVHlwZU1heCA9IDB4N2ZmZmZmZmYKIH0gT01YX01FVEFEQVRBU0VBUkNITU9ERVRZUEU7CkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CiAgICAgT01YX01FVEFEQVRBU0NPUEVUWVBFIGVTY29wZU1vZGU7CiAgICAgT01YX1UzMiBuU2NvcGVTcGVjaWZpZXI7Ci0gICAgT01YX1UzMiBuTWV0YWRhdGFJdGVtSW5kZXg7ICAKKyAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1JbmRleDsKICAgICBPTVhfTUVUQURBVEFTRUFSQ0hNT0RFVFlQRSBlU2VhcmNoTW9kZTsKICAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKICAgICBPTVhfVTggbktleVNpemVVc2VkOwpAQCAtMjg3LDMwICsyODcsMzAgQEAKICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CiAgICAgT01YX0JPT0wgYkFsbEtleXM7CiAgICAgT01YX1UzMiBuUGFyZW50Tm9kZUlEOwotICAgIE9NWF9VMzIgbk5vZGVJbmRleDsgCi0gICAgT01YX1UzMiBuTm9kZUlEOyAKKyAgICBPTVhfVTMyIG5Ob2RlSW5kZXg7CisgICAgT01YX1UzMiBuTm9kZUlEOwogICAgIE9NWF9TVFJJTkcgY05vZGVOYW1lOwogICAgIE9NWF9CT09MIGJJc0xlYWZUeXBlOwogfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEU7CiAKIC8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRSAKLXsgCi0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfQk9PTCBiQWxsS2V5czsJLyogaWYgdHJ1ZSB0aGVuIHRoaXMgc3RydWN0dXJlIHJlZmVycyB0byBhbGwga2V5cyBhbmQgCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX0JPT0wgYkFsbEtleXM7ICAvKiBpZiB0cnVlIHRoZW4gdGhpcyBzdHJ1Y3R1cmUgcmVmZXJzIHRvIGFsbCBrZXlzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICogdGhlIHRocmVlIGtleSBmaWVsZHMgYmVsb3cgYXJlIGlnbm9yZWQgKi8KICAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlS2V5Q2hhcnNldDsKLSAgICBPTVhfVTMyIG5LZXlTaXplVXNlZDsgCi0gICAgT01YX1U4ICAgbktleSBbMTI4XTsgCisgICAgT01YX1UzMiBuS2V5U2l6ZVVzZWQ7CisgICAgT01YX1U4ICAgbktleSBbMTI4XTsKICAgICBPTVhfVTMyIG5MYW5ndWFnZUNvdW50cnlTaXplVXNlZDsKICAgICBPTVhfVTggbkxhbmd1YWdlQ291bnRyeVsxMjhdOwotICAgIE9NWF9CT09MIGJFbmFibGVkOwkvKiBpZiB0cnVlIHRoZW4ga2V5IGlzIHBhcnQgb2YgZmlsdGVyIChlLmcuIAorICAgIE9NWF9CT09MIGJFbmFibGVkOyAgLyogaWYgdHJ1ZSB0aGVuIGtleSBpcyBwYXJ0IG9mIGZpbHRlciAoZS5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0YWluZWQgZm9yIHF1ZXJ5IGxhdGVyKS4gSWYgZmFsc2UgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5IGlzIG5vdCBwYXJ0IG9mIGZpbHRlciAqLwotfSBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFOyAKK30gT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRTsKIAotLyoqIFRoZSBPTVhfSEFORExFVFlQRSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29tcG9uZW50IGhhbmRsZS4gIFRoZSBjb21wb25lbnQgCisvKiogVGhlIE9NWF9IQU5ETEVUWVBFIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBjb21wb25lbnQgaGFuZGxlLiAgVGhlIGNvbXBvbmVudAogICogIGhhbmRsZSBpcyB1c2VkIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNvbXBvbmVudCdzIHB1YmxpYyBtZXRob2RzIGFuZCBhbHNvCiAgKiAgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGNvbXBvbmVudCdzIHByaXZhdGUgZGF0YSBhcmVhLiAgVGhlIGNvbXBvbmVudAogICogIGhhbmRsZSBpcyBpbml0aWFsaXplZCBieSB0aGUgT01YIGNvcmUgKHdpdGggaGVscCBmcm9tIHRoZSBjb21wb25lbnQpCkBAIC0zMTgsNyArMzE4LDcgQEAKICAqICBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIHNhZmVseSBhY2Nlc3MgYW55IG9mIHRoZQogICogIGNvbXBvbmVudCdzIHB1YmxpYyBmdW5jdGlvbnMgKGFsdGhvdWdoIHNvbWUgbWF5IHJldHVybiBhbiBlcnJvciBiZWNhdXNlCiAgKiAgdGhlIHN0YXRlIGlzIGluYXBwcm9wcmlhdGUgZm9yIHRoZSBhY2Nlc3MpLgotICogCisgKgogICogIEBpbmdyb3VwIGNvbXAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0NPTVBPTkVOVFRZUEUKQEAgLTMyOSwyNiArMzI5LDI2IEBACiAgICAgICAgIGZ1bmN0aW9uIHdpbGwgZmlsbCBpbiB0aGlzIHZhbHVlLiAqLwogICAgIE9NWF9VMzIgblNpemU7CiAKLSAgICAvKiogblZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIE9NWCBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIHN0cnVjdHVyZSAKLSAgICAgICAgaXMgYnVpbHQgYWdhaW5zdC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY3JlYXRvciBvZiB0aGlzIAotICAgICAgICBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhbHVlIGFuZCBldmVyeSB1c2VyIG9mIHRoaXMgc3RydWN0dXJlIAotICAgICAgICBzaG91bGQgdmVyaWZ5IHRoYXQgaXQga25vd3MgaG93IHRvIHVzZSB0aGUgZXhhY3QgdmVyc2lvbiBvZiAKKyAgICAvKiogblZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIE9NWCBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIHN0cnVjdHVyZQorICAgICAgICBpcyBidWlsdCBhZ2FpbnN0LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjcmVhdG9yIG9mIHRoaXMKKyAgICAgICAgc3RydWN0dXJlIHRvIGluaXRpYWxpemUgdGhpcyB2YWx1ZSBhbmQgZXZlcnkgdXNlciBvZiB0aGlzIHN0cnVjdHVyZQorICAgICAgICBzaG91bGQgdmVyaWZ5IHRoYXQgaXQga25vd3MgaG93IHRvIHVzZSB0aGUgZXhhY3QgdmVyc2lvbiBvZgogICAgICAgICB0aGlzIHN0cnVjdHVyZSBmb3VuZCBoZXJlaW4uICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwogCi0gICAgLyoqIHBDb21wb25lbnRQcml2YXRlIGlzIGEgcG9pbnRlciB0byB0aGUgY29tcG9uZW50IHByaXZhdGUgZGF0YSBhcmVhLiAgCi0gICAgICAgIFRoaXMgbWVtYmVyIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYnkgdGhlIGNvbXBvbmVudCB3aGVuIHRoZSAKLSAgICAgICAgY29tcG9uZW50IGlzIGZpcnN0IGxvYWRlZC4gIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGFjY2VzcyB0aGlzIAorICAgIC8qKiBwQ29tcG9uZW50UHJpdmF0ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvbXBvbmVudCBwcml2YXRlIGRhdGEgYXJlYS4KKyAgICAgICAgVGhpcyBtZW1iZXIgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBieSB0aGUgY29tcG9uZW50IHdoZW4gdGhlCisgICAgICAgIGNvbXBvbmVudCBpcyBmaXJzdCBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhY2Nlc3MgdGhpcwogICAgICAgICBkYXRhIGFyZWEuICovCiAgICAgT01YX1BUUiBwQ29tcG9uZW50UHJpdmF0ZTsKIAotICAgIC8qKiBwQXBwbGljYXRpb25Qcml2YXRlIGlzIGEgcG9pbnRlciB0aGF0IGlzIGEgcGFyYW1ldGVyIHRvIHRoZSAKLSAgICAgICAgT01YX0dldEhhbmRsZSBtZXRob2QsIGFuZCBjb250YWlucyBhbiBhcHBsaWNhdGlvbiBwcml2YXRlIHZhbHVlIAotICAgICAgICBwcm92aWRlZCBieSB0aGUgSUwgY2xpZW50LiAgVGhpcyBhcHBsaWNhdGlvbiBwcml2YXRlIGRhdGEgaXMgCisgICAgLyoqIHBBcHBsaWNhdGlvblByaXZhdGUgaXMgYSBwb2ludGVyIHRoYXQgaXMgYSBwYXJhbWV0ZXIgdG8gdGhlCisgICAgICAgIE9NWF9HZXRIYW5kbGUgbWV0aG9kLCBhbmQgY29udGFpbnMgYW4gYXBwbGljYXRpb24gcHJpdmF0ZSB2YWx1ZQorICAgICAgICBwcm92aWRlZCBieSB0aGUgSUwgY2xpZW50LiAgVGhpcyBhcHBsaWNhdGlvbiBwcml2YXRlIGRhdGEgaXMKICAgICAgICAgcmV0dXJuZWQgdG8gdGhlIElMIENsaWVudCBieSBPTVggaW4gYWxsIGNhbGxiYWNrcyAqLwogICAgIE9NWF9QVFIgcEFwcGxpY2F0aW9uUHJpdmF0ZTsKIAotICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29tcG9uZW50VmVyc2lvbiBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRDb21wb25lbnRWZXJzaW9uIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTAogICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRDb21wb25lbnRWZXJzaW9uIG1ldGhvZC4KICAgICAgKi8KICAgICBPTVhfRVJST1JUWVBFICgqR2V0Q29tcG9uZW50VmVyc2lvbikoCkBAIC0zNTgsNyArMzU4LDcgQEAKICAgICAgICAgICAgIE9NWF9PVVQgT01YX1ZFUlNJT05UWVBFKiBwU3BlY1ZlcnNpb24sCiAgICAgICAgICAgICBPTVhfT1VUIE9NWF9VVUlEVFlQRSogcENvbXBvbmVudFVVSUQpOwogCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9TZW5kQ29tbWFuZCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgLyoqIHJlZmVyIHRvIE9NWF9TZW5kQ29tbWFuZCBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwKICAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2VuZENvbW1hbmQgbWV0aG9kLgogICAgICAqLwogICAgIE9NWF9FUlJPUlRZUEUgKCpTZW5kQ29tbWFuZCkoCkBAIC0zNjcsNDMgKzM2Nyw0MyBAQAogICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5QYXJhbTEsCiAgICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENtZERhdGEpOwogCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgIC8qKiByZWZlciB0byBPTVhfR2V0UGFyYW1ldGVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTAogICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRQYXJhbWV0ZXIgbWV0aG9kLgogICAgICAqLwogICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRQYXJhbWV0ZXIpKAotICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuUGFyYW1JbmRleCwgIAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5QYXJhbUluZGV4LAogICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CiAKIAotICAgIC8qKiByZWZlciB0byBPTVhfU2V0UGFyYW1ldGVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAvKiogcmVmZXIgdG8gT01YX1NldFBhcmFtZXRlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwKICAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0UGFyYW1ldGVyIG1ldGhvZC4KICAgICAgKi8KICAgICBPTVhfRVJST1JUWVBFICgqU2V0UGFyYW1ldGVyKSgKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCiAgICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LAogICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOwogCiAKLSAgICAvKiogcmVmZXIgdG8gT01YX0dldENvbmZpZyBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRDb25maWcgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMCiAgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldENvbmZpZyBtZXRob2QuCiAgICAgICovCiAgICAgT01YX0VSUk9SVFlQRSAoKkdldENvbmZpZykoCiAgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCi0gICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LCAKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsCiAgICAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKIAogCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9TZXRDb25maWcgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgIC8qKiByZWZlciB0byBPTVhfU2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTAogICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBTZXRDb25maWcgbWV0aG9kLgogICAgICAqLwogICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRDb25maWcpKAogICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAotICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5JbmRleCwgCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9JTkRFWFRZUEUgbkluZGV4LAogICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOwogCiAKLSAgICAvKiogcmVmZXIgdG8gT01YX0dldEV4dGVuc2lvbkluZGV4IGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldEV4dGVuc2lvbkluZGV4IGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTAogICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRFeHRlbnNpb25JbmRleCBtZXRob2QuCiAgICAgICovCiAgICAgT01YX0VSUk9SVFlQRSAoKkdldEV4dGVuc2lvbkluZGV4KSgKQEAgLTQxMiw1MCArNDEyLDUwIEBACiAgICAgICAgICAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUqIHBJbmRleFR5cGUpOwogCiAKLSAgICAvKiogcmVmZXIgdG8gT01YX0dldFN0YXRlIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldFN0YXRlIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTAogICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBHZXRTdGF0ZSBtZXRob2QuCiAgICAgICovCiAgICAgT01YX0VSUk9SVFlQRSAoKkdldFN0YXRlKSgKICAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKICAgICAgICAgICAgIE9NWF9PVVQgT01YX1NUQVRFVFlQRSogcFN0YXRlKTsKIAotICAgIAorCiAgICAgLyoqIFRoZSBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB3aWxsIGludGVyYWN0IHdpdGggYW5vdGhlciBPTVgKICAgICAgICAgY29tcG9uZW50IHRvIGRldGVybWluZSBpZiB0dW5uZWxpbmcgaXMgcG9zc2libGUgYW5kIHRvIHNldHVwIHRoZQotICAgICAgICB0dW5uZWxpbmcuICBUaGUgcmV0dXJuIGNvZGVzIGZvciB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byAKKyAgICAgICAgdHVubmVsaW5nLiAgVGhlIHJldHVybiBjb2RlcyBmb3IgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBub3QgcG9zc2libGUsIG9yIGlmIHR1bm5lbGluZyBpcyBub3QKLSAgICAgICAgc3VwcG9ydGVkLiAgCi0gICAgICAgIAotICAgICAgICBCYXNlIHByb2ZpbGUgY29tcG9uZW50cyAoaS5lLiBub24taW50ZXJvcCkgZG8gbm90IHN1cHBvcnQgdGhpcwotICAgICAgICBtZXRob2QgYW5kIHNob3VsZCByZXR1cm4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgCisgICAgICAgIHN1cHBvcnRlZC4KIAotICAgICAgICBUaGUgaW50ZXJvcCBwcm9maWxlIGNvbXBvbmVudCBNVVNUIHN1cHBvcnQgdHVubmVsaW5nIHRvIGFub3RoZXIgCi0gICAgICAgIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgd2l0aCBhIGNvbXBhdGlibGUgcG9ydCBwYXJhbWV0ZXJzLiAgCisgICAgICAgIEJhc2UgcHJvZmlsZSBjb21wb25lbnRzIChpLmUuIG5vbi1pbnRlcm9wKSBkbyBub3Qgc3VwcG9ydCB0aGlzCisgICAgICAgIG1ldGhvZCBhbmQgc2hvdWxkIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZAorCisgICAgICAgIFRoZSBpbnRlcm9wIHByb2ZpbGUgY29tcG9uZW50IE1VU1Qgc3VwcG9ydCB0dW5uZWxpbmcgdG8gYW5vdGhlcgorICAgICAgICBpbnRlcm9wIHByb2ZpbGUgY29tcG9uZW50IHdpdGggYSBjb21wYXRpYmxlIHBvcnQgcGFyYW1ldGVycy4KICAgICAgICAgQSBjb21wb25lbnQgbWF5IGFsc28gc3VwcG9ydCBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uLgotICAgICAgICAKLSAgICAgICAgSWYgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbiBpcyBzdXBwb3J0ZWQgdGhlIG5lZ290aWF0aW9uIG9mIAotICAgICAgICBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uIGlzIGRvbmUgb3V0c2lkZSBvZiBPTVggaW4gYSB2ZW5kb3IgCi0gICAgICAgIHNwZWNpZmljIHdheS4gSXQgaXMgb25seSByZXF1aXJlZCB0aGF0IHRoZSBwcm9wZXIgcmVzdWx0IGJlIAotICAgICAgICByZXR1cm5lZCBhbmQgdGhlIGRldGFpbHMgb2YgaG93IHRoZSBzZXR1cCBpcyBkb25lIGlzIGxlZnQgCi0gICAgICAgIHRvIHRoZSBjb21wb25lbnQgaW1wbGVtZW50YXRpb24uICAKLSAgICAKKworICAgICAgICBJZiBwcm9wcmlldGFyeSBjb21tdW5pY2F0aW9uIGlzIHN1cHBvcnRlZCB0aGUgbmVnb3RpYXRpb24gb2YKKyAgICAgICAgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbiBpcyBkb25lIG91dHNpZGUgb2YgT01YIGluIGEgdmVuZG9yCisgICAgICAgIHNwZWNpZmljIHdheS4gSXQgaXMgb25seSByZXF1aXJlZCB0aGF0IHRoZSBwcm9wZXIgcmVzdWx0IGJlCisgICAgICAgIHJldHVybmVkIGFuZCB0aGUgZGV0YWlscyBvZiBob3cgdGhlIHNldHVwIGlzIGRvbmUgaXMgbGVmdAorICAgICAgICB0byB0aGUgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLgorCiAgICAgICAgIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIG5Qb3J0IGluIGFuIG91dHB1dCBwb3J0LCB0aGUKICAgICAgICAgY29tcG9uZW50IHdpbGw6Ci0gICAgICAgIDEuICBQb3B1bGF0ZSB0aGUgcFR1bm5lbFNldHVwIHN0cnVjdHVyZSB3aXRoIHRoZSBvdXRwdXQgcG9ydCdzIAorICAgICAgICAxLiAgUG9wdWxhdGUgdGhlIHBUdW5uZWxTZXR1cCBzdHJ1Y3R1cmUgd2l0aCB0aGUgb3V0cHV0IHBvcnQncwogICAgICAgICAgICAgcmVxdWlyZW1lbnRzIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIHR1bm5lbC4KIAogICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBpbnB1dCBwb3J0LCB0aGUKICAgICAgICAgY29tcG9uZW50IHdpbGw6Ci0gICAgICAgIDEuICBRdWVyeSB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgb3V0cHV0IHBvcnQgdG8gCisgICAgICAgIDEuICBRdWVyeSB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgb3V0cHV0IHBvcnQgdG8KICAgICAgICAgICAgIGRldGVybWluZSBpZiB0aGUgcG9ydHMgYXJlIGNvbXBhdGlibGUgZm9yIHR1bm5lbGluZwogICAgICAgICAyLiAgSWYgdGhlIHBvcnRzIGFyZSBjb21wYXRpYmxlLCB0aGUgY29tcG9uZW50IHNob3VsZCBzdG9yZQogICAgICAgICAgICAgdGhlIHR1bm5lbCBzdGVwIHByb3ZpZGVkIGJ5IHRoZSBvdXRwdXQgcG9ydAogICAgICAgICAzLiAgRGV0ZXJtaW5lIHdoaWNoIHBvcnQgKGVpdGhlciBpbnB1dCBvciBvdXRwdXQpIGlzIHRoZSBidWZmZXIKICAgICAgICAgICAgIHN1cHBsaWVyLCBhbmQgY2FsbCBPTVhfU2V0UGFyYW1ldGVyIG9uIHRoZSBvdXRwdXQgcG9ydCB0bwogICAgICAgICAgICAgaW5kaWNhdGUgdGhpcyBzZWxlY3Rpb24uCi0gICAgICAgIAorCiAgICAgICAgIFRoZSBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKKwogICAgICAgICBAcGFyYW0gW2luXSBoQ29tcAogICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKICAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuCkBAIC00NjMsNyArNDYzLDcgQEAKICAgICAgICAgICAgIG5Qb3J0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBwb3J0IG9uIHRoZSBjb21wb25lbnQgdG8gYmUgdXNlZAogICAgICAgICAgICAgZm9yIHR1bm5lbGluZy4KICAgICAgICAgQHBhcmFtIFtpbl0gaFR1bm5lbGVkQ29tcAotICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gdHVubmVsIHdpdGguICBUaGlzIGlzIHRoZSBjb21wb25lbnQgCisgICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byB0dW5uZWwgd2l0aC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAogICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZC4gIFdoZW4KICAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDB4MCB0aGUgY29tcG9uZW50IHNob3VsZCBzZXR1cCB0aGUgcG9ydCBmb3IKICAgICAgICAgICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCkBAIC00ODYsOSArNDg2LDkgQEAKICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0LAogICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhUdW5uZWxlZENvbXAsCiAgICAgICAgIE9NWF9JTiAgT01YX1UzMiBuVHVubmVsZWRQb3J0LAotICAgICAgICBPTVhfSU5PVVQgIE9NWF9UVU5ORUxTRVRVUFRZUEUqIHBUdW5uZWxTZXR1cCk7IAorICAgICAgICBPTVhfSU5PVVQgIE9NWF9UVU5ORUxTRVRVUFRZUEUqIHBUdW5uZWxTZXR1cCk7CiAKLSAgICAvKiogcmVmZXIgdG8gT01YX1VzZUJ1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgLyoqIHJlZmVyIHRvIE9NWF9Vc2VCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMCiAgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFVzZUJ1ZmZlciBtZXRob2QuCiAgICAgICAgIEBpbmdyb3VwIGJ1ZgogICAgICAqLwpAQCAtNTAwLDcgKzUwMCw3IEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuU2l6ZUJ5dGVzLAogICAgICAgICAgICAgT01YX0lOIE9NWF9VOCogcEJ1ZmZlcik7CiAKLSAgICAvKiogcmVmZXIgdG8gT01YX0FsbG9jYXRlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAvKiogcmVmZXIgdG8gT01YX0FsbG9jYXRlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTAogICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBBbGxvY2F0ZUJ1ZmZlciBtZXRob2QuCiAgICAgICAgIEBpbmdyb3VwIGJ1ZgogICAgICAqLwpAQCAtNTExLDcgKzUxMSw3IEBACiAgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKICAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMpOwogCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9GcmVlQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAvKiogcmVmZXIgdG8gT01YX0ZyZWVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMCiAgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEZyZWVCdWZmZXIgbWV0aG9kLgogICAgICAgICBAaW5ncm91cCBidWYKICAgICAgKi8KQEAgLTUyMCw3ICs1MjAsNyBAQAogICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5kZXgsCiAgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKIAotICAgIC8qKiByZWZlciB0byBPTVhfRW1wdHlUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAvKiogcmVmZXIgdG8gT01YX0VtcHR5VGhpc0J1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwKICAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRW1wdHlUaGlzQnVmZmVyIG1ldGhvZC4KICAgICAgICAgQGluZ3JvdXAgYnVmCiAgICAgICovCkBAIC01MjgsNyArNTI4LDcgQEAKICAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKICAgICAgICAgICAgIE9NWF9JTiAgT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOwogCi0gICAgLyoqIHJlZmVyIHRvIE9NWF9GaWxsVGhpc0J1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgLyoqIHJlZmVyIHRvIE9NWF9GaWxsVGhpc0J1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwKICAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRmlsbFRoaXNCdWZmZXIgbWV0aG9kLgogICAgICAgICBAaW5ncm91cCBidWYKICAgICAgKi8KQEAgLTU0MywxMCArNTQzLDEwIEBACiAgICAgICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAogICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCiAgICAgICAgIEBwYXJhbSBbaW5dIHBDYWxsYmFja3MKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0NBTExCQUNLVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSAKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0NBTExCQUNLVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZQogICAgICAgICAgICAgY2FsbGJhY2sgaW5mb3JtYXRpb24gdG8gdGhlIGNvbXBvbmVudAogICAgICAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQotICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlLiAgSXQgaXMgYW50aWNpcGF0ZWQgdGhhdCAKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZS4gIEl0IGlzIGFudGljaXBhdGVkIHRoYXQKICAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgb3IgYSAidGhpcwogICAgICAgICAgICAgcG9pbnRlciIgaW4gdGhpcyBhcmVhIHRvIGFsbG93IHRoZSBjYWxsYmFjayAoaW4gdGhlIGFwcGxpY2F0aW9uKQogICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsCkBAIC01NTYsNyArNTU2LDcgQEAKICAgICAgKi8KICAgICBPTVhfRVJST1JUWVBFICgqU2V0Q2FsbGJhY2tzKSgKICAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLSAgICAgICAgICAgIE9NWF9JTiAgT01YX0NBTExCQUNLVFlQRSogcENhbGxiYWNrcywgCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsYmFja3MsCiAgICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcEFwcERhdGEpOwogCiAgICAgLyoqIENvbXBvbmVudERlSW5pdCBtZXRob2QgaXMgdXNlZCB0byBkZWluaXRpYWxpemUgdGhlIGNvbXBvbmVudApAQCAtNTgzLDggKzU4Myw4IEBACiAKICAgICBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50Um9sZUVudW0pKAogICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKLQkJT01YX09VVCBPTVhfVTggKmNSb2xlLAotCQlPTVhfSU4gT01YX1UzMiBuSW5kZXgpOworICAgICAgICBPTVhfT1VUIE9NWF9VOCAqY1JvbGUsCisgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5JbmRleCk7CiAKIH0gT01YX0NPTVBPTkVOVFRZUEU7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQ29udGVudFBpcGUuaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQ29udGVudFBpcGUuaAppbmRleCBlZTllNGRiLi4wMjI0YzhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvbnRlbnRQaXBlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db250ZW50UGlwZS5oCkBAIC0xNiwyNSArMTYsMjUgQEAKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKICAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCiAgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCiAgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQogICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCiAgKi8KIApAQCAtODEsODMgKzgxLDgzIEBACiAKIC8qKiBNYXAgdHlwZXMgZnJvbSBPTVggc3RhbmRhcmQgdHlwZXMgb25seSBoZXJlIHNvIGludGVyZmFjZSBpcyBhcyBnZW5lcmljIGFzIHBvc3NpYmxlLiAqLwogdHlwZWRlZiBPTVhfVTMyICAgIENQcmVzdWx0OwotdHlwZWRlZiBjaGFyICogICAgIENQc3RyaW5nOyAgCit0eXBlZGVmIGNoYXIgKiAgICAgQ1BzdHJpbmc7CiB0eXBlZGVmIHZvaWQgKiAgICAgQ1BoYW5kbGU7CiB0eXBlZGVmIE9NWF9VMzIgICAgQ1B1aW50OwotdHlwZWRlZiBPTVhfUzMyICAgIENQaW50OyAgCi10eXBlZGVmIGNoYXIgICAgICAgQ1BieXRlOyAgCit0eXBlZGVmIE9NWF9TMzIgICAgQ1BpbnQ7Cit0eXBlZGVmIGNoYXIgICAgICAgQ1BieXRlOwogdHlwZWRlZiBPTVhfQk9PTCAgIENQYm9vbDsKIAotLyoqIGVudW1lcmF0aW9uIG9mIG9yaWdpbiB0eXBlcyB1c2VkIGluIHRoZSBDUF9QSVBFVFlQRSdzIFNlZWsgZnVuY3Rpb24gCisvKiogZW51bWVyYXRpb24gb2Ygb3JpZ2luIHR5cGVzIHVzZWQgaW4gdGhlIENQX1BJUEVUWVBFJ3MgU2VlayBmdW5jdGlvbgogICogQGluZ3JvdXAgY3AKICAqLwogdHlwZWRlZiBlbnVtIENQX09SSUdJTlRZUEUgewotICAgIENQX09yaWdpbkJlZ2luLCAgICAgIAotICAgIENQX09yaWdpbkN1ciwgICAgICAKLSAgICBDUF9PcmlnaW5FbmQsICAgICAgCi0gICAgQ1BfT3JpZ2luS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIENQX09yaWdpbkJlZ2luLAorICAgIENQX09yaWdpbkN1ciwKKyAgICBDUF9PcmlnaW5FbmQsCisgICAgQ1BfT3JpZ2luS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgQ1BfT3JpZ2luVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBDUF9PcmlnaW5NYXggPSAwWDdGRkZGRkZGCiB9IENQX09SSUdJTlRZUEU7CiAKLS8qKiBlbnVtZXJhdGlvbiBvZiBjb250YWN0IGFjY2VzcyB0eXBlcyB1c2VkIGluIHRoZSBDUF9QSVBFVFlQRSdzIE9wZW4gZnVuY3Rpb24gCisvKiogZW51bWVyYXRpb24gb2YgY29udGFjdCBhY2Nlc3MgdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBPcGVuIGZ1bmN0aW9uCiAgKiBAaW5ncm91cCBjcAogICovCiB0eXBlZGVmIGVudW0gQ1BfQUNDRVNTVFlQRSB7Ci0gICAgQ1BfQWNjZXNzUmVhZCwgICAgICAKLSAgICBDUF9BY2Nlc3NXcml0ZSwgIAotICAgIENQX0FjY2Vzc1JlYWRXcml0ZSAsICAKLSAgICBDUF9BY2Nlc3NLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgQ1BfQWNjZXNzUmVhZCwKKyAgICBDUF9BY2Nlc3NXcml0ZSwKKyAgICBDUF9BY2Nlc3NSZWFkV3JpdGUsCisgICAgQ1BfQWNjZXNzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgQ1BfQWNjZXNzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBDUF9BY2Nlc3NNYXggPSAwWDdGRkZGRkZGCiB9IENQX0FDQ0VTU1RZUEU7CiAKLS8qKiBlbnVtZXJhdGlvbiBvZiByZXN1bHRzIHJldHVybmVkIGJ5IHRoZSBDUF9QSVBFVFlQRSdzIENoZWNrQXZhaWxhYmxlQnl0ZXMgZnVuY3Rpb24gCisvKiogZW51bWVyYXRpb24gb2YgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgQ1BfUElQRVRZUEUncyBDaGVja0F2YWlsYWJsZUJ5dGVzIGZ1bmN0aW9uCiAgKiBAaW5ncm91cCBjcAogICovCiB0eXBlZGVmIGVudW0gQ1BfQ0hFQ0tCWVRFU1JFU1VMVFRZUEUKIHsKLSAgICBDUF9DaGVja0J5dGVzT2ssICAgICAgICAgICAgICAgICAgICAvKio8IFRoZXJlIGFyZSBhdCBsZWFzdCB0aGUgcmVxdWVzdCBudW1iZXIgCisgICAgQ1BfQ2hlY2tCeXRlc09rLCAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGVyZSBhcmUgYXQgbGVhc3QgdGhlIHJlcXVlc3QgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYnl0ZXMgYXZhaWxhYmxlICovCi0gICAgQ1BfQ2hlY2tCeXRlc05vdFJlYWR5LCAgICAgICAgICAgICAgLyoqPCBUaGUgcGlwZSBpcyBzdGlsbCByZXRyaWV2aW5nIGJ5dGVzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmVzZW50bHkgbGFja3Mgc3VmZmljaWVudCBieXRlcy4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhleSBhcmUgCisgICAgQ1BfQ2hlY2tCeXRlc05vdFJlYWR5LCAgICAgICAgICAgICAgLyoqPCBUaGUgcGlwZSBpcyBzdGlsbCByZXRyaWV2aW5nIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByZXNlbnRseSBsYWNrcyBzdWZmaWNpZW50IGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VmZmljaWVudCBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLwotICAgIENQX0NoZWNrQnl0ZXNJbnN1ZmZpY2llbnRCeXRlcyAgLCAgICAgLyoqPCBUaGUgcGlwZSBoYXMgcmV0cmlldmVkIGFsbCBieXRlcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhvc2UgYXZhaWxhYmxlIGFyZSBsZXNzIHRoYW4gdGhvc2UgCisgICAgQ1BfQ2hlY2tCeXRlc0luc3VmZmljaWVudEJ5dGVzLCAgICAgLyoqPCBUaGUgcGlwZSBoYXMgcmV0cmlldmVkIGFsbCBieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aG9zZSBhdmFpbGFibGUgYXJlIGxlc3MgdGhhbiB0aG9zZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCAqLwogICAgIENQX0NoZWNrQnl0ZXNBdEVuZE9mU3RyZWFtLCAgICAgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBzdHJlYW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm8gbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLwogICAgIENQX0NoZWNrQnl0ZXNPdXRPZkJ1ZmZlcnMsICAgICAgICAgIC8qKjwgQWxsIHJlYWQvd3JpdGUgYnVmZmVycyBhcmUgY3VycmVudGx5IGluIHVzZS4gKi8KLSAgICBDUF9DaGVja0J5dGVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIENQX0NoZWNrQnl0ZXNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBDUF9DaGVja0J5dGVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBDUF9DaGVja0J5dGVzTWF4ID0gMFg3RkZGRkZGRgogfSBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRTsKIAotLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrLiAKKy8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjay4KICAqIEBpbmdyb3VwIGNwCiAgKi8KIHR5cGVkZWYgZW51bSBDUF9FVkVOVFRZUEV7Ci0gICAgQ1BfQnl0ZXNBdmFpbGFibGUsICAgICAgCSAgICAvKiogYnl0ZXMgcmVxdWVzdGVkIGluIGEgQ2hlY2tBdmFpbGFibGVCeXRlcyBjYWxsIGFyZSBub3cgYXZhaWxhYmxlKi8KLSAgICBDUF9PdmVyZmxvdywgIAkJICAgICAgICAgICAvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2sqLwotICAgIENQX1BpcGVEaXNjb25uZWN0ZWQgICwgIAkJICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCi0gICAgQ1BfRXZlbnRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgQ1BfQnl0ZXNBdmFpbGFibGUsICAgICAgICAgICAgICAgICAgICAgIC8qKiBieXRlcyByZXF1ZXN0ZWQgaW4gYSBDaGVja0F2YWlsYWJsZUJ5dGVzIGNhbGwgYXJlIG5vdyBhdmFpbGFibGUqLworICAgIENQX092ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2sqLworICAgIENQX1BpcGVEaXNjb25uZWN0ZWQsICAgICAgICAgICAgICAgICAgICAvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2sqLworICAgIENQX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgQ1BfRXZlbnRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIENQX0V2ZW50TWF4ID0gMFg3RkZGRkZGRgogfSBDUF9FVkVOVFRZUEU7CiAKLS8qKiBjb250ZW50IHBpcGUgZGVmaW5pdGlvbiAKKy8qKiBjb250ZW50IHBpcGUgZGVmaW5pdGlvbgogICogQGluZ3JvdXAgY3AKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQ1BfUElQRVRZUEUKIHsKLSAgICAvKiogT3BlbiBhIGNvbnRlbnQgc3RyZWFtIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICovIAorICAgIC8qKiBPcGVuIGEgY29udGVudCBzdHJlYW0gZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4gKi8KICAgICBDUHJlc3VsdCAoKk9wZW4pKCBDUGhhbmRsZSogaENvbnRlbnQsIENQc3RyaW5nIHN6VVJJLCBDUF9BQ0NFU1NUWVBFIGVBY2Nlc3MgKTsKIAotICAgIC8qKiBDbG9zZSBhIGNvbnRlbnQgc3RyZWFtLiAqLyAKKyAgICAvKiogQ2xvc2UgYSBjb250ZW50IHN0cmVhbS4gKi8KICAgICBDUHJlc3VsdCAoKkNsb3NlKSggQ1BoYW5kbGUgaENvbnRlbnQgKTsKIAotICAgIC8qKiBDcmVhdGUgYSBjb250ZW50IHNvdXJjZSBhbmQgb3BlbiBpdCBmb3Igd3JpdGluZy4gKi8gCisgICAgLyoqIENyZWF0ZSBhIGNvbnRlbnQgc291cmNlIGFuZCBvcGVuIGl0IGZvciB3cml0aW5nLiAqLwogICAgIENQcmVzdWx0ICgqQ3JlYXRlKSggQ1BoYW5kbGUgKmhDb250ZW50LCBDUHN0cmluZyBzelVSSSApOwogCiAgICAgLyoqIENoZWNrIHRoZSB0aGF0IHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nIChkZXBlbmRpbmcgb24gYWNjZXNzIHR5cGUpLiovCkBAIC0xNzEsMTkgKzE3MSwxOSBAQAogCiAgICAgLyoqIFJldHJpZXZlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBzaXplIGZyb20gdGhlIGNvbnRlbnQgc3RyZWFtIChhZHZhbmNlIGNvbnRlbnQgcG9pbnRlciBieSBzaXplIG9mIGRhdGEpLgogICAgICAgIE5vdGU6IHBpcGUgY2xpZW50IHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHNtYWxsIGhpZ2ggZnJlcXVlbmN5IHJlYWRzLiAqLwotICAgIENQcmVzdWx0ICgqUmVhZCkoIENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKnBEYXRhLCBDUHVpbnQgblNpemUpOyAKKyAgICBDUHJlc3VsdCAoKlJlYWQpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwRGF0YSwgQ1B1aW50IG5TaXplKTsKIAotICAgIC8qKiBSZXRyaWV2ZSBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIHBpcGUgdGhhdCBjb250YWlucyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcy4gCisgICAgLyoqIFJldHJpZXZlIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgcGlwZSB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLgogICAgICAgIEJ1ZmZlciBjb250YWlucyB0aGUgbmV4dCBibG9jayBvZiBieXRlcywgYXMgc3BlY2lmaWVkIGJ5IG5TaXplLCBvZiB0aGUgY29udGVudC4gblNpemUgYWxzbwotICAgICAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJsb2NrIGFjdHVhbGx5IHJlYWQuIENvbnRlbnQgcG9pbnRlciBhZHZhbmNlcyB0aGUgYnkgdGhlIHJldHVybmVkIHNpemUuIAotICAgICAgIE5vdGU6IHBpcGUgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgbGFyZ2UgcmVhZHMuIFRoZSBjbGllbnQgbXVzdCBjYWxsIAotICAgICAgIFJlbGVhc2VSZWFkQnVmZmVyIHdoZW4gZG9uZSB3aXRoIGJ1ZmZlci4gCisgICAgICAgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYmxvY2sgYWN0dWFsbHkgcmVhZC4gQ29udGVudCBwb2ludGVyIGFkdmFuY2VzIHRoZSBieSB0aGUgcmV0dXJuZWQgc2l6ZS4KKyAgICAgICBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIGxhcmdlIHJlYWRzLiBUaGUgY2xpZW50IG11c3QgY2FsbAorICAgICAgIFJlbGVhc2VSZWFkQnVmZmVyIHdoZW4gZG9uZSB3aXRoIGJ1ZmZlci4KIAogICAgICAgIEluIHNvbWUgY2FzZXMgdGhlIHJlcXVlc3RlZCBibG9jayBtYXkgbm90IHJlc2lkZSBpbiBjb250aWd1b3VzIG1lbW9yeSB3aXRoaW4gdGhlCi0gICAgICAgcGlwZSBpbXBsZW1lbnRhdGlvbi4gRm9yIGluc3RhbmNlIGlmIHRoZSBwaXBlIGxldmVyYWdlcyBhIGNpcmN1bGFyIGJ1ZmZlciB0aGVuIHRoZSByZXF1ZXN0ZWQgCi0gICAgICAgYmxvY2sgbWF5IHN0cmFkZGxlIHRoZSBib3VuZGFyeSBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyLiBCeSBkZWZhdWx0IGEgcGlwZSBpbXBsZW1lbnRhdGlvbiAKKyAgICAgICBwaXBlIGltcGxlbWVudGF0aW9uLiBGb3IgaW5zdGFuY2UgaWYgdGhlIHBpcGUgbGV2ZXJhZ2VzIGEgY2lyY3VsYXIgYnVmZmVyIHRoZW4gdGhlIHJlcXVlc3RlZAorICAgICAgIGJsb2NrIG1heSBzdHJhZGRsZSB0aGUgYm91bmRhcnkgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlci4gQnkgZGVmYXVsdCBhIHBpcGUgaW1wbGVtZW50YXRpb24KICAgICAgICBwZXJmb3JtcyBhIGNvcHkgaW4gdGhpcyBjYXNlIHRvIHByb3ZpZGUgdGhlIGJsb2NrIHRvIHRoZSBwaXBlIGNsaWVudCBpbiBvbmUgY29udGlndW91cyBidWZmZXIuCi0gICAgICAgSWYsIGhvd2V2ZXIsIHRoZSBjbGllbnQgc2V0cyBiRm9yYmlkQ29weSwgdGhlbiB0aGUgcGlwZSByZXR1cm5zIG9ubHkgdGhvc2UgYnl0ZXMgcHJlY2VkaW5nIHRoZSBtZW1vcnkgCisgICAgICAgSWYsIGhvd2V2ZXIsIHRoZSBjbGllbnQgc2V0cyBiRm9yYmlkQ29weSwgdGhlbiB0aGUgcGlwZSByZXR1cm5zIG9ubHkgdGhvc2UgYnl0ZXMgcHJlY2VkaW5nIHRoZSBtZW1vcnkKICAgICAgICBib3VuZGFyeS4gSGVyZSB0aGUgY2xpZW50IG1heSByZXRyaWV2ZSB0aGUgZGF0YSBpbiBzZWdtZW50cyBvdmVyIHN1Y2Nlc3NpdmUgY2FsbHMuICovCiAgICAgQ1ByZXN1bHQgKCpSZWFkQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgKm5TaXplLCBDUGJvb2wgYkZvcmJpZENvcHkpOwogCkBAIC0xOTIsMTQgKzE5MiwxNCBAQAogCiAgICAgLyoqIFdyaXRlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBzaXplIHRvIHRoZSBjb250ZW50IChhZHZhbmNlIGNvbnRlbnQgcG9pbnRlciBieSBzaXplIG9mIGRhdGEpLgogICAgICAgIE5vdGU6IHBpcGUgY2xpZW50IHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHNtYWxsIGhpZ2ggZnJlcXVlbmN5IHdyaXRlcy4gKi8KLSAgICBDUHJlc3VsdCAoKldyaXRlKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqZGF0YSwgQ1B1aW50IG5TaXplKTsgCisgICAgQ1ByZXN1bHQgKCpXcml0ZSkoIENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKmRhdGEsIENQdWludCBuU2l6ZSk7CiAKLSAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHVzZWQgdG8gd3JpdGUgZGF0YSB0byB0aGUgY29udGVudC4gCisgICAgLyoqIFJldHJpZXZlIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgcGlwZSB1c2VkIHRvIHdyaXRlIGRhdGEgdG8gdGhlIGNvbnRlbnQuCiAgICAgICAgQ2xpZW50IHdpbGwgZmlsbCBidWZmZXIgd2l0aCBvdXRwdXQgZGF0YS4gTm90ZTogcGlwZSBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlCiAgICAgICAgZm9yIGxhcmdlIHdyaXRlcy4gVGhlIGNsaWVudCBtdXN0IGNhbGwgV3JpdGVCdWZmZXIgd2hlbiBkb25lIGl0IGhhcyBmaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGRhdGEuKi8KICAgICBDUHJlc3VsdCAoKkdldFdyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgblNpemUpOwogCi0gICAgLyoqIERlbGl2ZXIgYSBidWZmZXIgb2J0YWluZWQgdmlhIEdldFdyaXRlQnVmZmVyIHRvIHRoZSBwaXBlLiBQaXBlIHdpbGwgd3JpdGUgdGhlIAorICAgIC8qKiBEZWxpdmVyIGEgYnVmZmVyIG9idGFpbmVkIHZpYSBHZXRXcml0ZUJ1ZmZlciB0byB0aGUgcGlwZS4gUGlwZSB3aWxsIHdyaXRlIHRoZQogICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvIGNvbnRlbnQgYW5kIGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KICAgICBDUHJlc3VsdCAoKldyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlciwgQ1B1aW50IG5GaWxsZWRTaXplKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db3JlLmggYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvcmUuaAppbmRleCA5ZmIwZjZmLi4xMmYyYjNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvcmUuaAorKysgYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvcmUuaApAQCAtMTYsMjUgKzE2LDI1IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCiAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwogICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgogICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKICAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCiAgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgogICovCiAKQEAgLTUzLDE0ICs1MywxNCBAQAogCiAvKiBFYWNoIE9NWCBoZWFkZXIgc2hhbGwgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQogICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAotICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5CiAgKi8KIAogI2luY2x1ZGUgPE9NWF9JbmRleC5oPgogCiAKIC8qKiBUaGUgT01YX0NPTU1BTkRUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWN0aW9uIGluIHRoZQotICogIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4gIAorICogIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4KICAqICBAaW5ncm91cCBjb3JlCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfQ09NTUFORFRZUEUKQEAgLTcwLDcgKzcwLDcgQEAKICAgICBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCAvKio8IERpc2FibGUgYSBwb3J0IG9uIGEgY29tcG9uZW50LiAqLwogICAgIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwgIC8qKjwgRW5hYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KICAgICBPTVhfQ29tbWFuZE1hcmtCdWZmZXIsICAvKio8IE1hcmsgYSBjb21wb25lbnQvYnVmZmVyIGZvciBvYnNlcnZhdGlvbiAqLwotICAgIE9NWF9Db21tYW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9Db21tYW5kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0NvbW1hbmRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9Db21tYW5kTWF4ID0gMFg3RkZGRkZGRgogfSBPTVhfQ09NTUFORFRZUEU7CkBAIC05MywyOCArOTMsMjggQEAKICAqICBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBhbmQgd2lsbCB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGlmIHRoZQogICogIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bC4gIElmIHRoZSBjb21wb25lbnQgY2Fubm90IHN1Y2Nlc3NmdWxseQogICogIHRyYW5zaXRpb24gdG8gdGhlIGlkbGUgc3RhdGUgZm9yIGFueSByZWFzb24sIHRoZSBzdGF0ZSBvZiB0aGUgY29tcG9uZW50Ci0gKiAgc2hhbGwgYmUgZnVsbHkgcm9sbGVkIGJhY2sgdG8gdGhlIExvYWRlZCBzdGF0ZSAoZS5nLiBhbGwgYWxsb2NhdGVkIAorICogIHNoYWxsIGJlIGZ1bGx5IHJvbGxlZCBiYWNrIHRvIHRoZSBMb2FkZWQgc3RhdGUgKGUuZy4gYWxsIGFsbG9jYXRlZAogICogIHJlc291cmNlcyBzaGFsbCBiZSByZWxlYXNlZCkuICBXaGVuIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIGNvbW1hbmQKICAqICB0byBnbyB0byB0aGUgRXhlY3V0aW5nIHN0YXRlLCBpdCBzaGFsbCBiZWdpbiBwcm9jZXNzaW5nIGJ1ZmZlcnMgYnkKICAqICBzZW5kaW5nIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSBhcHBsaWNhdGlvbi4gIFdoaWxlCiAgKiAgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgSWRsZSBzdGF0ZSwgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHNlbmQgdGhlCiAgKiAgUGF1c2UgY29tbWFuZC4gIElmIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgdGhlIHBhdXNlIGNvbW1hbmQgd2hpbGUgaW4gdGhlCi0gKiAgSWRsZSBzdGF0ZSwgdGhlIGNvbXBvbmVudCBzaGFsbCBzZW5kIGFsbCBpbnB1dCBidWZmZXJzIGl0IGhvbGRzIHRvIHRoZSAKKyAqICBJZGxlIHN0YXRlLCB0aGUgY29tcG9uZW50IHNoYWxsIHNlbmQgYWxsIGlucHV0IGJ1ZmZlcnMgaXQgaG9sZHMgdG8gdGhlCiAgKiAgYXBwbGljYXRpb24sIGJ1dCBzaGFsbCBub3QgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzLiAgVGhpcyB3aWxsIGFsbG93IHRoZQogICogIGFwcGxpY2F0aW9uIHRvIHByZWZpbGwgYnVmZmVycy4KLSAqIAorICoKICAqICBAaW5ncm91cCBjb21wCiAgKi8KIAogdHlwZWRlZiBlbnVtIE9NWF9TVEFURVRZUEUKIHsKLSAgICBPTVhfU3RhdGVJbnZhbGlkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCB0aGF0IGl0J3MgaW50ZXJuYWwgZGF0YSAKKyAgICBPTVhfU3RhdGVJbnZhbGlkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCB0aGF0IGl0J3MgaW50ZXJuYWwgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFyZSBjb3JydXB0ZWQgdG8gdGhlIHBvaW50IHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2Fubm90IGRldGVybWluZSBpdCdzIHN0YXRlIHByb3Blcmx5ICovCiAgICAgT01YX1N0YXRlTG9hZGVkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZCBidXQgaGFzIG5vdCBjb21wbGV0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uICBUaGUgT01YX1NldFBhcmFtZXRlciBtYWNybwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIE9NWF9HZXRQYXJhbWV0ZXIgbWFjcm8gYXJlIHRoZSBvbmx5IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBtYWNyb3MgYWxsb3dlZCB0byBiZSBzZW50IHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBPTVhfR2V0UGFyYW1ldGVyIG1hY3JvIGFyZSB0aGUgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBtYWNyb3MgYWxsb3dlZCB0byBiZSBzZW50IHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgaW4gdGhpcyBzdGF0ZS4gKi8KICAgICBPTVhfU3RhdGVJZGxlLCAgICAgICAgLyoqPCBjb21wb25lbnQgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGNvbXBvbmVudCBpcyByZWFkeSB0bwpAQCAtMTIyLDE3ICsxMjIsMTcgQEAKICAgICBPTVhfU3RhdGVFeGVjdXRpbmcsICAgLyoqPCBjb21wb25lbnQgaGFzIGFjY2VwdGVkIHRoZSBzdGFydCBjb21tYW5kIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwcm9jZXNzaW5nIGRhdGEgKGlmIGRhdGEgaXMgYXZhaWxhYmxlKSAqLwogICAgIE9NWF9TdGF0ZVBhdXNlLCAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgcmVjZWl2ZWQgcGF1c2UgY29tbWFuZCAqLwotICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMsIC8qKjwgY29tcG9uZW50IGlzIHdhaXRpbmcgZm9yIHJlc291cmNlcywgZWl0aGVyIGFmdGVyIAorICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMsIC8qKjwgY29tcG9uZW50IGlzIHdhaXRpbmcgZm9yIHJlc291cmNlcywgZWl0aGVyIGFmdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWVtcHRpb24gb3IgYmVmb3JlIGl0IGdldHMgdGhlIHJlc291cmNlcyByZXF1ZXN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBzcGVjaWZpY2F0aW9uIGZvciBjb21wbGV0ZSBkZXRhaWxzLiAqLwotICAgIE9NWF9TdGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfU3RhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9TdGF0ZU1heCA9IDBYN0ZGRkZGRkYKIH0gT01YX1NUQVRFVFlQRTsKIAotLyoqIFRoZSBPTVhfRVJST1JUWVBFIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHN0YW5kYXJkIE9NWCBFcnJvcnMuICBUaGVzZSAKLSAqICBlcnJvcnMgc2hvdWxkIGNvdmVyIG1vc3Qgb2YgdGhlIGNvbW1vbiBmYWlsdXJlIGNhc2VzLiAgSG93ZXZlciwgCi0gKiAgdmVuZG9ycyBhcmUgZnJlZSB0byBhZGQgYWRkaXRpb25hbCBlcnJvciBtZXNzYWdlcyBvZiB0aGVpciBvd24gYXMgCisvKiogVGhlIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgc3RhbmRhcmQgT01YIEVycm9ycy4gIFRoZXNlCisgKiAgZXJyb3JzIHNob3VsZCBjb3ZlciBtb3N0IG9mIHRoZSBjb21tb24gZmFpbHVyZSBjYXNlcy4gIEhvd2V2ZXIsCisgKiAgdmVuZG9ycyBhcmUgZnJlZSB0byBhZGQgYWRkaXRpb25hbCBlcnJvciBtZXNzYWdlcyBvZiB0aGVpciBvd24gYXMKICAqICBsb25nIGFzIHRoZXkgZm9sbG93IHRoZXNlIHJ1bGVzOgogICogIDEuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIG9mIDB4OTAwMDAwMDAgdG8KICAqICAgICAgMHg5MDAwRkZGRi4KQEAgLTIwMywyNSArMjAzLDI1IEBACiAgIC8qKiBUaGlzIGVycm9yIG9jY3VycyB3aGVuIHRyeWluZyB0byB0cmFuc2l0aW9uIGludG8gdGhlIHN0YXRlIHlvdSBhcmUgYWxyZWFkeSBpbiAqLwogICBPTVhfRXJyb3JTYW1lU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAxMiwKIAotICAvKiogUmVzb3VyY2VzIGFsbG9jYXRlZCB0byBhbiBleGVjdXRpbmcgb3IgcGF1c2VkIGNvbXBvbmVudCBoYXZlIGJlZW4gCisgIC8qKiBSZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGFuIGV4ZWN1dGluZyBvciBwYXVzZWQgY29tcG9uZW50IGhhdmUgYmVlbgogICAgICAgcHJlZW1wdGVkLCBjYXVzaW5nIHRoZSBjb21wb25lbnQgdG8gcmV0dXJuIHRvIHRoZSBpZGxlIHN0YXRlICovCi0gIE9NWF9FcnJvclJlc291cmNlc1ByZWVtcHRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDEzLCAKKyAgT01YX0Vycm9yUmVzb3VyY2VzUHJlZW1wdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMTMsCiAKLSAgLyoqIEEgbm9uLXN1cHBsaWVyIHBvcnQgc2VuZHMgdGhpcyBlcnJvciB0byB0aGUgSUwgY2xpZW50ICh2aWEgdGhlIEV2ZW50SGFuZGxlciBjYWxsYmFjaykgCisgIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spCiAgICAgICBkdXJpbmcgdGhlIGFsbG9jYXRpb24gb2YgYnVmZmVycyAob24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIExPQURFRCB0byB0aGUgSURMRSBzdGF0ZSBvcgotICAgICAgb24gYSBwb3J0IHJlc3RhcnQpIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIHRoZSBzdXBwbGllciAKKyAgICAgIG9uIGEgcG9ydCByZXN0YXJ0KSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciB0aGUgc3VwcGxpZXIKICAgICAgIHRvIHNlbmQgaXQgYW4gYWxsb2NhdGVkIGJ1ZmZlciB2aWEgYSBVc2VCdWZmZXIgY2FsbC4gKi8KICAgT01YX0Vycm9yUG9ydFVucmVzcG9uc2l2ZUR1cmluZ0FsbG9jYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNCwKIAotICAvKiogQSBub24tc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKLSAgICAgIGR1cmluZyB0aGUgZGVhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKG9uIGEgdHJhbnNpdGlvbiBmcm9tIHRoZSBJRExFIHRvIExPQURFRCBzdGF0ZSBvciAKLSAgICAgIG9uIGEgcG9ydCBzdG9wKSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciB0aGUgc3VwcGxpZXIgCisgIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spCisgICAgICBkdXJpbmcgdGhlIGRlYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgSURMRSB0byBMT0FERUQgc3RhdGUgb3IKKyAgICAgIG9uIGEgcG9ydCBzdG9wKSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciB0aGUgc3VwcGxpZXIKICAgICAgIHRvIHJlcXVlc3QgdGhlIGRlYWxsb2NhdGlvbiBvZiBhIGJ1ZmZlciBoZWFkZXIgdmlhIGEgRnJlZUJ1ZmZlciBjYWxsLiAqLwogICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nRGVhbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTUsCiAKLSAgLyoqIEEgc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKLSAgICAgIGR1cmluZyB0aGUgc3RvcHBpbmcgb2YgYSBwb3J0IChlaXRoZXIgb24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIAotICAgICAgc3RhdGUgb3IgYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIAorICAvKiogQSBzdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spCisgICAgICBkdXJpbmcgdGhlIHN0b3BwaW5nIG9mIGEgcG9ydCAoZWl0aGVyIG9uIGEgdHJhbnNpdGlvbiBmcm9tIHRoZSBJRExFIHRvIExPQURFRAorICAgICAgc3RhdGUgb3IgYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yCiAgICAgICB0aGUgbm9uLXN1cHBsaWVyIHRvIHJldHVybiBhIGJ1ZmZlciB2aWEgYW4gRW1wdHlUaGlzQnVmZmVyIG9yIEZpbGxUaGlzQnVmZmVyIGNhbGwuICovCiAgIE9NWF9FcnJvclBvcnRVbnJlc3BvbnNpdmVEdXJpbmdTdG9wID0gKE9NWF9TMzIpIDB4ODAwMDEwMTYsCiAKQEAgLTIyOSw3ICsyMjksNyBAQAogICBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNywKIAogICAvKiBBdHRlbXB0aW5nIGEgY29tbWFuZCB0aGF0IGlzIG5vdCBhbGxvd2VkIGR1cmluZyB0aGUgcHJlc2VudCBzdGF0ZS4gKi8KLSAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxOCwgCisgIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTgsCiAKICAgLyoqIFRoZSB2YWx1ZXMgZW5jYXBzdWxhdGVkIGluIHRoZSBwYXJhbWV0ZXIgb3IgY29uZmlnIHN0cnVjdHVyZSBhcmUgbm90IHN1cHBvcnRlZC4gKi8KICAgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nID0gKE9NWF9TMzIpIDB4ODAwMDEwMTksCkBAIC0yNDksMTIgKzI0OSwxMiBAQAogICAvKiogQ29tcG9uZW50IHN1c3BlbmRlZCBkdWUgdG8gYW4gaW5hYmlsaXR5IHRvIGFjcXVpcmUgZHluYW1pYyByZXNvdXJjZXMgKi8KICAgT01YX0Vycm9yRHluYW1pY1Jlc291cmNlc1VuYXZhaWxhYmxlID0gKE9NWF9TMzIpIDB4ODAwMDEwMUUsCiAKLSAgLyoqIFdoZW4gdGhlIG1hY3JvYmxvY2sgZXJyb3IgcmVwb3J0aW5nIGlzIGVuYWJsZWQgdGhlIGNvbXBvbmVudCByZXR1cm5zIG5ldyBlcnJvciAKKyAgLyoqIFdoZW4gdGhlIG1hY3JvYmxvY2sgZXJyb3IgcmVwb3J0aW5nIGlzIGVuYWJsZWQgdGhlIGNvbXBvbmVudCByZXR1cm5zIG5ldyBlcnJvcgogICBmb3IgZXZlcnkgZnJhbWUgdGhhdCBoYXMgZXJyb3JzICovCiAgIE9NWF9FcnJvck1iRXJyb3JzSW5GcmFtZSA9IChPTVhfUzMyKSAweDgwMDAxMDFGLAogCiAgIC8qKiBBIGNvbXBvbmVudCByZXBvcnRzIHRoaXMgZXJyb3Igd2hlbiBpdCBjYW5ub3QgcGFyc2Ugb3IgZGV0ZXJtaW5lIHRoZSBmb3JtYXQgb2YgYW4gaW5wdXQgc3RyZWFtLiAqLwotICBPTVhfRXJyb3JGb3JtYXROb3REZXRlY3RlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIwLCAKKyAgT01YX0Vycm9yRm9ybWF0Tm90RGV0ZWN0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMCwKIAogICAvKiogVGhlIGNvbnRlbnQgb3BlbiBvcGVyYXRpb24gZmFpbGVkLiAqLwogICBPTVhfRXJyb3JDb250ZW50UGlwZU9wZW5GYWlsZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMSwKQEAgLTI2OCw3ICsyNjgsNyBAQAogICAvKiogVHVubmVsaW5nIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQqLwogICBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDI0LAogCi0gIE9NWF9FcnJvcktocm9ub3NFeHRlbnNpb25zID0gKE9NWF9TMzIpMHg4RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0Vycm9yS2hyb25vc0V4dGVuc2lvbnMgPSAoT01YX1MzMikweDhGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgIE9NWF9FcnJvclZlbmRvclN0YXJ0VW51c2VkID0gKE9NWF9TMzIpMHg5MDAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgIE9NWF9FcnJvck1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0VSUk9SVFlQRTsKQEAgLTMwNCw2OSArMzA0LDY5IEBACiAgICAgT01YX1U4IGNSb2xlW09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsgIC8qKjwgbmFtZSBvZiBzdGFuZGFyZCBjb21wb25lbnQgd2hpY2ggZGVmaW5lcyBjb21wb25lbnQgcm9sZSAqLwogfSBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEU7CiAKLS8qKiBFbmQgb2YgU3RyZWFtIEJ1ZmZlciBGbGFnOiAKKy8qKiBFbmQgb2YgU3RyZWFtIEJ1ZmZlciBGbGFnOgogICAqCi0gICogQSBjb21wb25lbnQgc2V0cyBFT1Mgd2hlbiBpdCBoYXMgbm8gbW9yZSBkYXRhIHRvIGVtaXQgb24gYSBwYXJ0aWN1bGFyIAotICAqIG91dHB1dCBwb3J0LiBUaHVzIGFuIG91dHB1dCBwb3J0IHNoYWxsIHNldCBFT1Mgb24gdGhlIGxhc3QgYnVmZmVyIGl0IAotICAqIGVtaXRzLiBBIGNvbXBvbmVudCdzIGRldGVybWluYXRpb24gb2Ygd2hlbiBhbiBvdXRwdXQgcG9ydCBzaG91bGQgCisgICogQSBjb21wb25lbnQgc2V0cyBFT1Mgd2hlbiBpdCBoYXMgbm8gbW9yZSBkYXRhIHRvIGVtaXQgb24gYSBwYXJ0aWN1bGFyCisgICogb3V0cHV0IHBvcnQuIFRodXMgYW4gb3V0cHV0IHBvcnQgc2hhbGwgc2V0IEVPUyBvbiB0aGUgbGFzdCBidWZmZXIgaXQKKyAgKiBlbWl0cy4gQSBjb21wb25lbnQncyBkZXRlcm1pbmF0aW9uIG9mIHdoZW4gYW4gb3V0cHV0IHBvcnQgc2hvdWxkCiAgICogY2Vhc2Ugc2VuZGluZyBkYXRhIGlzIGltcGxlbWVuYXRpb24gc3BlY2lmaWMuCiAgICogQGluZ3JvdXAgYnVmCiAgICovCiAKLSNkZWZpbmUgT01YX0JVRkZFUkZMQUdfRU9TIDB4MDAwMDAwMDEgCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0VPUyAweDAwMDAwMDAxCiAKLS8qKiBTdGFydCBUaW1lIEJ1ZmZlciBGbGFnOiAKKy8qKiBTdGFydCBUaW1lIEJ1ZmZlciBGbGFnOgogICoKICAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIFNUQVJUVElNRQogICogZmxhZyBvbiB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBmb3IgdGhlCiAgKiBzdHJlYW0uIFRoZSBzdGFydGluZyB0aW1lc3RhbXAgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGRhdGEgdGhhdAogICogc2hvdWxkIGJlIGRpc3BsYXllZCBhdCBzdGFydHVwIG9yIGFmdGVyIGEgc2Vlay4KICAqIFRoZSBmaXJzdCB0aW1lc3RhbXAgb2YgdGhlIHN0cmVhbSBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHN0YXJ0IHRpbWUuCi0gKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIGEgc2VlayB0byBhIHBhcnRpY3VsYXIgdmlkZW8gZnJhbWUsIAotICogdGhlIHRhcmdldCBmcmFtZSBtYXkgYmUgYW4gaW50ZXJmcmFtZS4gVGh1cyB0aGUgZmlyc3QgYnVmZmVyIG9mIAorICogRm9yIGluc3RhbmNlLCBpbiB0aGUgY2FzZSBvZiBhIHNlZWsgdG8gYSBwYXJ0aWN1bGFyIHZpZGVvIGZyYW1lLAorICogdGhlIHRhcmdldCBmcmFtZSBtYXkgYmUgYW4gaW50ZXJmcmFtZS4gVGh1cyB0aGUgZmlyc3QgYnVmZmVyIG9mCiAgKiB0aGUgc3RyZWFtIHdpbGwgYmUgdGhlIGludHJhLWZyYW1lIHByZWNlZGluZyB0aGUgdGFyZ2V0IGZyYW1lIGFuZAogICogdGhlIHN0YXJ0dGltZSB3aWxsIG9jY3VyIHdpdGggdGhlIHRhcmdldCBmcmFtZSAod2l0aCBhbnkgb3RoZXIKICAqIHJlcXVpcmVkIGZyYW1lcyByZXF1aXJlZCB0byByZWNvbnN0cnVjdCB0aGUgdGFyZ2V0IGludGVydmVuaW5nKS4KICAqCi0gKiBUaGUgU1RBUlRUSU1FIGZsYWcgaXMgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIncyAKLSAqIHRpbWVzdGFtcCAnIHRodXMgaXRzIGFzc29jaWF0aW9uIHRvIGJ1ZmZlciBkYXRhIGFuZCBpdHMgCisgKiBUaGUgU1RBUlRUSU1FIGZsYWcgaXMgZGlyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBidWZmZXIncworICogdGltZXN0YW1wICcgdGh1cyBpdHMgYXNzb2NpYXRpb24gdG8gYnVmZmVyIGRhdGEgYW5kIGl0cwogICogcHJvcGFnYXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSB0aW1lc3RhbXAncy4KICAqCi0gKiBXaGVuIGEgU3luYyBDb21wb25lbnQgY2xpZW50IHJlY2VpdmVzIGEgYnVmZmVyIHdpdGggdGhlIAotICogU1RBUlRUSU1FIGZsYWcgaXQgc2hhbGwgcGVyZm9ybSBhIFNldENvbmZpZyBvbiBpdHMgc3luYyBwb3J0IAorICogV2hlbiBhIFN5bmMgQ29tcG9uZW50IGNsaWVudCByZWNlaXZlcyBhIGJ1ZmZlciB3aXRoIHRoZQorICogU1RBUlRUSU1FIGZsYWcgaXQgc2hhbGwgcGVyZm9ybSBhIFNldENvbmZpZyBvbiBpdHMgc3luYyBwb3J0CiAgKiB1c2luZyBPTVhfQ29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSBhbmQgcGFzc2luZyB0aGUgYnVmZmVyJ3MKICAqIHRpbWVzdGFtcC4KLSAqIAorICoKICAqIEBpbmdyb3VwIGJ1ZgogICovCiAKICNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIDB4MDAwMDAwMDIKIAotIAogCi0vKiogRGVjb2RlIE9ubHkgQnVmZmVyIEZsYWc6IAorCisvKiogRGVjb2RlIE9ubHkgQnVmZmVyIEZsYWc6CiAgKgogICogVGhlIHNvdXJjZSBvZiBhIHN0cmVhbSAoZS5nLiBhIGRlbXV4IGNvbXBvbmVudCkgc2V0cyB0aGUgREVDT0RFT05MWQogICogZmxhZyBvbiBhbnkgYnVmZmVyIHRoYXQgc2hvdWxkIHNoYWxsIGJlIGRlY29kZWQgYnV0IHNob3VsZCBub3QgYmUKLSAqIGRpc3BsYXllZC4gVGhpcyBmbGFnIGlzIHVzZWQsIGZvciBpbnN0YW5jZSwgd2hlbiBhIHNvdXJjZSBzZWVrcyB0byAKLSAqIGEgdGFyZ2V0IGludGVyZnJhbWUgdGhhdCByZXF1aXJlcyB0aGUgZGVjb2RlIG9mIGZyYW1lcyBwcmVjZWRpbmcgdGhlIAotICogdGFyZ2V0IHRvIGZhY2lsaXRhdGUgdGhlIHRhcmdldCdzIHJlY29uc3RydWN0aW9uLiBJbiB0aGlzIGNhc2UgdGhlIAotICogc291cmNlIHdvdWxkIGVtaXQgdGhlIGZyYW1lcyBwcmVjZWRpbmcgdGhlIHRhcmdldCBkb3duc3RyZWFtIAorICogZGlzcGxheWVkLiBUaGlzIGZsYWcgaXMgdXNlZCwgZm9yIGluc3RhbmNlLCB3aGVuIGEgc291cmNlIHNlZWtzIHRvCisgKiBhIHRhcmdldCBpbnRlcmZyYW1lIHRoYXQgcmVxdWlyZXMgdGhlIGRlY29kZSBvZiBmcmFtZXMgcHJlY2VkaW5nIHRoZQorICogdGFyZ2V0IHRvIGZhY2lsaXRhdGUgdGhlIHRhcmdldCdzIHJlY29uc3RydWN0aW9uLiBJbiB0aGlzIGNhc2UgdGhlCisgKiBzb3VyY2Ugd291bGQgZW1pdCB0aGUgZnJhbWVzIHByZWNlZGluZyB0aGUgdGFyZ2V0IGRvd25zdHJlYW0KICAqIGJ1dCBtYXJrIHRoZW0gYXMgZGVjb2RlIG9ubHkuCiAgKgotICogVGhlIERFQ09ERU9OTFkgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciBkYXRhIGFuZCBwcm9wYWdhdGVkIGluIGEgCisgKiBUaGUgREVDT0RFT05MWSBpcyBhc3NvY2lhdGVkIHdpdGggYnVmZmVyIGRhdGEgYW5kIHByb3BhZ2F0ZWQgaW4gYQogICogbWFubmVyIGlkZW50aWNhbCB0byB0aGUgYnVmZmVyIHRpbWVzdGFtcC4KICAqCi0gKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgZGF0YSBzaG91bGQgaWdub3JlIGFsbCBidWZmZXJzIHdpdGggCisgKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgZGF0YSBzaG91bGQgaWdub3JlIGFsbCBidWZmZXJzIHdpdGgKICAqIHRoZSBERUNPREVPTkxZIGZsYWcgc2V0LgotICogCisgKgogICogQGluZ3JvdXAgYnVmCiAgKi8KIAogI2RlZmluZSBPTVhfQlVGRkVSRkxBR19ERUNPREVPTkxZIDB4MDAwMDAwMDQKIAogCi0vKiBEYXRhIENvcnJ1cHQgRmxhZzogVGhpcyBmbGFnIGlzIHNldCB3aGVuIHRoZSBJTCBjbGllbnQgYmVsaWV2ZXMgdGhlIGRhdGEgaW4gdGhlIGFzc29jaWF0ZWQgYnVmZmVyIGlzIGNvcnJ1cHQgCisvKiBEYXRhIENvcnJ1cHQgRmxhZzogVGhpcyBmbGFnIGlzIHNldCB3aGVuIHRoZSBJTCBjbGllbnQgYmVsaWV2ZXMgdGhlIGRhdGEgaW4gdGhlIGFzc29jaWF0ZWQgYnVmZmVyIGlzIGNvcnJ1cHQKICAqIEBpbmdyb3VwIGJ1ZgogICovCiAKQEAgLTM3NCwyOSArMzc0LDI5IEBACiAKIC8qIEVuZCBvZiBGcmFtZTogVGhlIGJ1ZmZlciBjb250YWlucyBleGFjdGx5IG9uZSBlbmQgb2YgZnJhbWUgYW5kIG5vIGRhdGEKICAqICBvY2N1cnMgYWZ0ZXIgdGhlIGVuZCBvZiBmcmFtZS4gVGhpcyBmbGFnIGlzIGFuIG9wdGlvbmFsIGhpbnQuIFRoZSBhYnNlbmNlCi0gKiAgb2YgdGhpcyBmbGFnIGRvZXMgbm90IGltcGx5IHRoZSBhYnNlbmNlIG9mIGFuIGVuZCBvZiBmcmFtZSB3aXRoaW4gdGhlIGJ1ZmZlci4gCisgKiAgb2YgdGhpcyBmbGFnIGRvZXMgbm90IGltcGx5IHRoZSBhYnNlbmNlIG9mIGFuIGVuZCBvZiBmcmFtZSB3aXRoaW4gdGhlIGJ1ZmZlci4KICAqIEBpbmdyb3VwIGJ1ZgogKi8KICNkZWZpbmUgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSAweDAwMDAwMDEwCiAKLS8qIFN5bmMgRnJhbWUgRmxhZzogVGhpcyBmbGFnIGlzIHNldCB3aGVuIHRoZSBidWZmZXIgY29udGVudCBjb250YWlucyBhIGNvZGVkIHN5bmMgZnJhbWUgJyAKLSAqICBhIGZyYW1lIHRoYXQgaGFzIG5vIGRlcGVuZGVuY3kgb24gYW55IG90aGVyIGZyYW1lIGluZm9ybWF0aW9uIAorLyogU3luYyBGcmFtZSBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIGJ1ZmZlciBjb250ZW50IGNvbnRhaW5zIGEgY29kZWQgc3luYyBmcmFtZSAnCisgKiAgYSBmcmFtZSB0aGF0IGhhcyBubyBkZXBlbmRlbmN5IG9uIGFueSBvdGhlciBmcmFtZSBpbmZvcm1hdGlvbgogICogIEBpbmdyb3VwIGJ1ZgogICovCiAjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRSAweDAwMDAwMDIwCiAKIC8qIEV4dHJhIGRhdGEgcHJlc2VudCBmbGFnOiB0aGVyZSBpcyBleHRyYSBkYXRhIGFwcGVuZGVkIHRvIHRoZSBkYXRhIHN0cmVhbQotICogcmVzaWRpbmcgaW4gdGhlIGJ1ZmZlciAKLSAqIEBpbmdyb3VwIGJ1ZiAgCisgKiByZXNpZGluZyBpbiB0aGUgYnVmZmVyCisgKiBAaW5ncm91cCBidWYKICAqLwogI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FWFRSQURBVEEgMHgwMDAwMDA0MAogCi0vKiogQ29kZWMgQ29uZmlnIEJ1ZmZlciBGbGFnOiAKKy8qKiBDb2RlYyBDb25maWcgQnVmZmVyIEZsYWc6CiAqIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIGlzIGFuIG9wdGlvbmFsIGZsYWcgdGhhdCBpcyBzZXQgYnkgYW4KICogb3V0cHV0IHBvcnQgd2hlbiBhbGwgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBmb3JtIHBhcnQgb3IgYWxsIG9mIGEgc2V0IG9mCiAqIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGF0YS4gIEV4YW1wbGVzIGluY2x1ZGUgU1BTL1BQUyBuYWwgdW5pdHMKICogZm9yIE9NWF9WSURFT19Db2RpbmdBVkMgb3IgQXVkaW9TcGVjaWZpY0NvbmZpZyBkYXRhIGZvcgotKiBPTVhfQVVESU9fQ29kaW5nQUFDLiAgQW55IGNvbXBvbmVudCB0aGF0IGZvciBhIGdpdmVuIHN0cmVhbSBzZXRzIAorKiBPTVhfQVVESU9fQ29kaW5nQUFDLiAgQW55IGNvbXBvbmVudCB0aGF0IGZvciBhIGdpdmVuIHN0cmVhbSBzZXRzCiAqIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNoYWxsIG5vdCBtaXggY29kZWMgY29uZmlndXJhdGlvbiBieXRlcwogKiB3aXRoIGZyYW1lIGRhdGEgaW4gdGhlIHNhbWUgYnVmZmVyLCBhbmQgc2hhbGwgc2VuZCBhbGwgYnVmZmVycwogKiBjb250YWluaW5nIGNvZGVjIGNvbmZpZ3VyYXRpb24gYnl0ZXMgYmVmb3JlIGFueSBidWZmZXJzIGNvbnRhaW5pbmcKQEAgLTQxNiw1MCArNDE2LDUwIEBACiB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9VOCogcEJ1ZmZlcjsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gYWN0dWFsIGJsb2NrIG9mIG1lbW9yeSAKKyAgICBPTVhfVTgqIHBCdWZmZXI7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIGFjdHVhbCBibG9jayBvZiBtZW1vcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGFjdGluZyBhcyB0aGUgYnVmZmVyICovCiAgICAgT01YX1UzMiBuQWxsb2NMZW47ICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCwgaW4gYnl0ZXMgKi8KLSAgICBPTVhfVTMyIG5GaWxsZWRMZW47ICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGluIHRoZSAKKyAgICBPTVhfVTMyIG5GaWxsZWRMZW47ICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAqLwogICAgIE9NWF9VMzIgbk9mZnNldDsgICAgICAgICAgICAvKio8IHN0YXJ0IG9mZnNldCBvZiB2YWxpZCBkYXRhIGluIGJ5dGVzIGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLwogICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7ICAgICAgICAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KICAgICBPTVhfUFRSIHBQbGF0Zm9ybVByaXZhdGU7ICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCiAgICAgT01YX1BUUiBwSW5wdXRQb3J0UHJpdmF0ZTsgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgaW5wdXQgcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCiAgICAgT01YX1BUUiBwT3V0cHV0UG9ydFByaXZhdGU7IC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgb3V0cHV0IHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLwotICAgIE9NWF9IQU5ETEVUWVBFIGhNYXJrVGFyZ2V0Q29tcG9uZW50OyAvKio8IFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIGdlbmVyYXRlIGEgCisgICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7IC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZ2VuZXJhdGUgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmsgZXZlbnQgdXBvbiBwcm9jZXNzaW5nIHRoaXMgYnVmZmVyLiAqLwotICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgICAgICAgICAvKio8IEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgYXNzb2NpYXRlZCB3aXRoIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrIHNlbnQgb24gYSBtYXJrIGV2ZW50IHRvIGRpc2FtYmlndWF0ZSAKKyAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrIHNlbnQgb24gYSBtYXJrIGV2ZW50IHRvIGRpc2FtYmlndWF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWFyayBmcm9tIG90aGVycy4gKi8KICAgICBPTVhfVTMyIG5UaWNrQ291bnQ7ICAgICAgICAgLyoqPCBPcHRpb25hbCBlbnRyeSB0aGF0IHRoZSBjb21wb25lbnQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2FuIHVwZGF0ZSB3aXRoIGEgdGljayBjb3VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhleSBhY2Nlc3MgdGhlIGNvbXBvbmVudC4gIFRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgaW4gbWljcm9zZWNvbmRzLiAgU2luY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIGEgdmFsdWUgcmVsYXRpdmUgdG8gYW4gYXJiaXRyYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgcG9pbnQsIHRoaXMgdmFsdWUgY2Fubm90IGJlIHVzZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgcG9pbnQsIHRoaXMgdmFsdWUgY2Fubm90IGJlIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmUgYWJzb2x1dGUgdGltZS4gIFRoaXMgaXMgYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbnRyeSBhbmQgbm90IGFsbCBjb21wb25lbnRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB1cGRhdGUgaXQuKi8KLSBPTVhfVElDS1MgblRpbWVTdGFtcDsgICAgICAgICAgLyoqPCBUaW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtcGxlIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBsb2dpY2FsIHNhbXBsZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSBpbiB0aGUgYnVmZmVyLiBUaW1lc3RhbXBzIG9mIAorIE9NWF9USUNLUyBuVGltZVN0YW1wOyAgICAgICAgICAvKio8IFRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1wbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCB0aGUgZmlyc3QgbG9naWNhbCBzYW1wbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSBpbiB0aGUgYnVmZmVyLiBUaW1lc3RhbXBzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2l2ZSBzYW1wbGVzIHdpdGhpbiB0aGUgYnVmZmVyIG1heQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluZmVycmVkIGJ5IGFkZGluZyB0aGUgZHVyYXRpb24gb2YgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGluZmVycmVkIGJ5IGFkZGluZyB0aGUgZHVyYXRpb24gb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByZWNlZGluZyBidWZmZXIgdG8gdGhlIHRpbWVzdGFtcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcmVjZWRpbmcgYnVmZmVyLiovCiAgIE9NWF9VMzIgICAgIG5GbGFnczsgICAgICAgICAgIC8qKjwgYnVmZmVyIHNwZWNpZmljIGZsYWdzICovCi0gIE9NWF9VMzIgbk91dHB1dFBvcnRJbmRleDsgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgcG9ydCAoaWYgYW55KSB1c2luZyAKKyAgT01YX1UzMiBuT3V0cHV0UG9ydEluZGV4OyAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBwb3J0IChpZiBhbnkpIHVzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KICAgT01YX1UzMiBuSW5wdXRQb3J0SW5kZXg7ICAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIGlucHV0IHBvcnQgKGlmIGFueSkgdXNpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJ1ZmZlciAqLwogfSBPTVhfQlVGRkVSSEVBREVSVFlQRTsKIAotLyoqIFRoZSBPTVhfRVhUUkFEQVRBVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgCisvKiogVGhlIE9NWF9FWFRSQURBVEFUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGVmaW5lIHRoZQogICogcG9zc2libGUgZXh0cmEgZGF0YSBwYXlsb2FkIHR5cGVzLgogICogTkI6IHRoaXMgZW51bSBpcyBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMKICAqIE9NWF9FWFRSQURBVEFfUVVBTlQgZGVmaW5lLiAgVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aApAQCAtNDY3LDkgKzQ2Nyw5IEBACiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfRVhUUkFEQVRBVFlQRQogewotICAgT01YX0V4dHJhRGF0YU5vbmUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgdGhhdCBubyBtb3JlIGV4dHJhIGRhdGEgc2VjdGlvbnMgZm9sbG93ICovICAgICAgICAKKyAgIE9NWF9FeHRyYURhdGFOb25lID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHRoYXQgbm8gbW9yZSBleHRyYSBkYXRhIHNlY3Rpb25zIGZvbGxvdyAqLwogICAgT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbiwgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5zIHF1YW50aXphdGlvbiBkYXRhICovCi0gICBPTVhfRXh0cmFEYXRhS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0V4dHJhRGF0YUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgT01YX0V4dHJhRGF0YVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICBPTVhfRXh0cmFEYXRhTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfRVhUUkFEQVRBVFlQRTsKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAgewogICAgIE9NWF9VMzIgblNpemU7Ci0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CiAgICAgT01YX0VYVFJBREFUQVRZUEUgZVR5cGU7ICAgICAgIC8qIEV4dHJhIERhdGEgdHlwZSAqLwogICAgIE9NWF9VMzIgbkRhdGFTaXplOyAgIC8qIFNpemUgb2YgdGhlIHN1cHBvcnRpbmcgZGF0YSB0byBmb2xsb3cgKi8KQEAgLTQ5MCw3ICs0OTAsNyBAQAogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KICAgICBPTVhfVTMyIG5Qb3J0czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIGZvciB0aGlzIGNvbXBvbmVudCAqLwogICAgIE9NWF9VMzIgblN0YXJ0UG9ydE51bWJlcjsgICAvKiogZmlyc3QgcG9ydCBudW1iZXIgZm9yIHRoaXMgdHlwZSBvZiBwb3J0ICovCi19IE9NWF9QT1JUX1BBUkFNX1RZUEU7IAorfSBPTVhfUE9SVF9QQVJBTV9UWVBFOwogCiAvKiogQGluZ3JvdXAgY29tcCAqLwogdHlwZWRlZiBlbnVtIE9NWF9FVkVOVFRZUEUKQEAgLTQ5OSwxNCArNDk5LDE0IEBACiAgICAgT01YX0V2ZW50RXJyb3IsICAgICAgICAgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIGFuIGVycm9yIGNvbmRpdGlvbiAqLwogICAgIE9NWF9FdmVudE1hcmssICAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhIGJ1ZmZlciBtYXJrICovCiAgICAgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgLyoqPCBjb21wb25lbnQgaXMgcmVwb3J0ZWQgYSBwb3J0IHNldHRpbmdzIGNoYW5nZSAqLwotICAgIE9NWF9FdmVudEJ1ZmZlckZsYWcsICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBFT1MgKi8gCisgICAgT01YX0V2ZW50QnVmZmVyRmxhZywgICAgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIGFuIEVPUyAqLwogICAgIE9NWF9FdmVudFJlc291cmNlc0FjcXVpcmVkLCAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGdyYW50ZWQgcmVzb3VyY2VzIGFuZCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBzdGFydGluZyB0aGUgc3RhdGUgY2hhbmdlIGZyb20KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMgdG8gT01YX1N0YXRlSWRsZS4gKi8KICAgIE9NWF9FdmVudENvbXBvbmVudFJlc3VtZWQsICAgICAvKio8IENvbXBvbmVudCByZXN1bWVkIGR1ZSB0byByZWFjcXVpc2l0aW9uIG9mIHJlc291cmNlcyAqLwogICAgT01YX0V2ZW50RHluYW1pY1Jlc291cmNlc0F2YWlsYWJsZSwgLyoqPCBDb21wb25lbnQgaGFzIGFjcXVpcmVkIHByZXZpb3VzbHkgdW5hdmFpbGFibGUgZHluYW1pYyByZXNvdXJjZXMgKi8KICAgIE9NWF9FdmVudFBvcnRGb3JtYXREZXRlY3RlZCwgICAgICAvKio8IENvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBzdXBwb3J0ZWQgZm9ybWF0LiAqLwotICAgT01YX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICBPTVhfRXZlbnRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgT01YX0V2ZW50TWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfRVZFTlRUWVBFOwpAQCAtNTE3LDcgKzUxNyw3IEBACiAgICAgICAgIGV2ZW50IG9mIGludGVyZXN0IG9jY3Vycy4gIEV2ZW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgT01YX0VWRU5UVFlQRQogICAgICAgICBlbnVtZXJhdGlvbi4gIFBsZWFzZSBzZWUgdGhhdCBlbnVtZXJhdGlvbiBmb3IgZGV0YWlscyBvZiB3aGF0IHdpbGwKICAgICAgICAgYmUgcmV0dXJuZWQgZm9yIGVhY2ggdHlwZSBvZiBldmVudC4gQ2FsbGJhY2tzIHNob3VsZCBub3QgcmV0dXJuCi0gICAgICAgIGFuIGVycm9yIHRvIHRoZSBjb21wb25lbnQsIHNvIGlmIGFuIGVycm9yIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICBhbiBlcnJvciB0byB0aGUgY29tcG9uZW50LCBzbyBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbgogICAgICAgICBzaGFsbCBoYW5kbGUgaXQgaW50ZXJuYWxseS4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgogCiAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMgdG8gYXZvaWQKQEAgLTUyNywxNCArNTI3LDE0IEBACiAgICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKICAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgogICAgICAgICBAcGFyYW0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KICAgICAgICAgQHBhcmFtIGVFdmVudAogICAgICAgICAgICAgRXZlbnQgdGhhdCB0aGUgY29tcG9uZW50IHdhbnRzIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gYWJvdXQuCiAgICAgICAgIEBwYXJhbSBuRGF0YTEKLSAgICAgICAgICAgIG5EYXRhIHdpbGwgYmUgdGhlIE9NWF9FUlJPUlRZUEUgZm9yIGFuIGVycm9yIGV2ZW50IGFuZCB3aWxsIGJlIAorICAgICAgICAgICAgbkRhdGEgd2lsbCBiZSB0aGUgT01YX0VSUk9SVFlQRSBmb3IgYW4gZXJyb3IgZXZlbnQgYW5kIHdpbGwgYmUKICAgICAgICAgICAgIGFuIE9NWF9DT01NQU5EVFlQRSBmb3IgYSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGFuZCBPTVhfSU5ERVhUWVBFIGZvciBhIE9NWF9Qb3J0U2V0dGluZ3NDaGFuZ2VkIGV2ZW50LgogICAgICAgICAgQHBhcmFtIG5EYXRhMgogICAgICAgICAgICAgbkRhdGEyIHdpbGwgaG9sZCBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGV2ZW50LiBDYW4gYmUgT01YX1NUQVRFVFlQRSBmb3IKQEAgLTU1MywyMSArNTUzLDIxIEBACiAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOwogCiAgICAgLyoqIFRoZSBFbXB0eUJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGVtcHRpZWQgYnVmZmVycyBmcm9tIGFuCi0gICAgICAgIGlucHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIHJldXNlLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgCisgICAgICAgIGlucHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIHJldXNlLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwKICAgICAgICAgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byByZWZpbGwgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMKICAgICAgICAgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGVtIGFuZCByZWZpbGwgdGhlbSBpbiBhbm90aGVyIHRocmVhZC4gIFRoZXJlCiAgICAgICAgIGlzIG5vIGVycm9yIHJldHVybiwgc28gdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGhhbmRsZSBhbnkgZXJyb3JzIGdlbmVyYXRlZAotICAgICAgICBpbnRlcm5hbGx5LiAgCi0gICAgICAgIAorICAgICAgICBpbnRlcm5hbGx5LgorCiAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgICAgIAorCiAgICAgICAgIEBwYXJhbSBoQ29tcG9uZW50CiAgICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKICAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgogICAgICAgICBAcGFyYW0gcEFwcERhdGEKLSAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgotICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KICAgICAgICAgQHBhcmFtIHBCdWZmZXIKICAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgpAQCAtNTgwLDIzICs1ODAsMjMgQEAKICAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKIAogICAgIC8qKiBUaGUgRmlsbEJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGZpbGxlZCBidWZmZXJzIGZyb20gYW4KLSAgICAgICAgb3V0cHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIGVtcHR5aW5nIGFuZCB0aGVuIHJldXNlLiAgCi0gICAgICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gCi0gICAgICAgIGVtcHR5IHRoZSBidWZmZXJzIGR1cmluZyB0aGlzIGNhbGwsIGJ1dCBzaG91bGQgcXVldWUgdGhlIGJ1ZmZlcnMgCi0gICAgICAgIGFuZCBlbXB0eSB0aGVtIGluIGFub3RoZXIgdGhyZWFkLiAgVGhlcmUgaXMgbm8gZXJyb3IgcmV0dXJuLCBzbyAKLSAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGhhbmRsZSBhbnkgZXJyb3JzIGdlbmVyYXRlZCBpbnRlcm5hbGx5LiAgVGhlIAorICAgICAgICBvdXRwdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgZW1wdHlpbmcgYW5kIHRoZW4gcmV1c2UuCisgICAgICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8KKyAgICAgICAgZW1wdHkgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGUgYnVmZmVycworICAgICAgICBhbmQgZW1wdHkgdGhlbSBpbiBhbm90aGVyIHRocmVhZC4gIFRoZXJlIGlzIG5vIGVycm9yIHJldHVybiwgc28KKyAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGhhbmRsZSBhbnkgZXJyb3JzIGdlbmVyYXRlZCBpbnRlcm5hbGx5LiAgVGhlCiAgICAgICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsc28gdXBkYXRlIHRoZSBidWZmZXIgaGVhZGVyIHRvIGluZGljYXRlIHRoZQotICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIGJ1ZmZlci4gIAorICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIGJ1ZmZlci4KIAogICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgICAgICAKKwogICAgICAgICBAcGFyYW0gaENvbXBvbmVudAogICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CiAgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KICAgICAgICAgQHBhcmFtIHBBcHBEYXRhCi0gICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZQogICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKKyAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbgogICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCiAgICAgICAgIEBwYXJhbSBwQnVmZmVyCiAgICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKQEAgLTYyMCwxMyArNjIwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG9uJ3QgY2FyZSAqLwogICAgIE9NWF9CdWZmZXJTdXBwbHlJbnB1dCwgICAgICAgICAgICAgLyoqPCBpbnB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCiAgICAgT01YX0J1ZmZlclN1cHBseU91dHB1dCwgICAgICAgICAgICAvKio8IG91dHB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCi0gICAgT01YX0J1ZmZlclN1cHBseUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQnVmZmVyU3VwcGx5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0J1ZmZlclN1cHBseVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0J1ZmZlclN1cHBseU1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0JVRkZFUlNVUFBMSUVSVFlQRTsKIAogCi0vKiogYnVmZmVyIHN1cHBsaWVyIHBhcmFtZXRlciAKKy8qKiBidWZmZXIgc3VwcGxpZXIgcGFyYW1ldGVyCiAgKiBAaW5ncm91cCB0dW4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSB7CkBAIC02MzcsNjEgKzYzNyw2MSBAQAogfSBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFOwogCiAKLS8qKjwgaW5kaWNhdGVzIHRoYXQgYnVmZmVycyByZWNlaXZlZCBieSBhbiBpbnB1dCBwb3J0IG9mIGEgdHVubmVsIAotICAgICBtYXkgbm90IG1vZGlmeSB0aGUgZGF0YSBpbiB0aGUgYnVmZmVycyAKKy8qKjwgaW5kaWNhdGVzIHRoYXQgYnVmZmVycyByZWNlaXZlZCBieSBhbiBpbnB1dCBwb3J0IG9mIGEgdHVubmVsCisgICAgIG1heSBub3QgbW9kaWZ5IHRoZSBkYXRhIGluIHRoZSBidWZmZXJzCiAgICAgIEBpbmdyb3VwIHR1bgogICovCi0jZGVmaW5lIE9NWF9QT1JUVFVOTkVMRkxBR19SRUFET05MWSAweDAwMDAwMDAxIAorI2RlZmluZSBPTVhfUE9SVFRVTk5FTEZMQUdfUkVBRE9OTFkgMHgwMDAwMDAwMQogCiAKIC8qKiBUaGUgT01YX1RVTk5FTFNFVFVQVFlQRSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSBhbiBvdXRwdXQKICAgICBwb3J0IHRvIGFuIGlucHV0IHBvcnQgYXMgcGFydCB0aGUgdHdvIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgY2FsbHMKLSAgICByZXN1bHRpbmcgZnJvbSBhIE9NWF9TZXR1cFR1bm5lbCBjYWxsIGZyb20gdGhlIElMIENsaWVudC4gCisgICAgcmVzdWx0aW5nIGZyb20gYSBPTVhfU2V0dXBUdW5uZWwgY2FsbCBmcm9tIHRoZSBJTCBDbGllbnQuCiAgICAgQGluZ3JvdXAgdHVuCi0gKi8gICAKKyAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX1RVTk5FTFNFVFVQVFlQRQogewogICAgIE9NWF9VMzIgblR1bm5lbEZsYWdzOyAgICAgICAgICAgICAvKio8IGJpdCBmbGFncyBmb3IgdHVubmVsaW5nICovCiAgICAgT01YX0JVRkZFUlNVUFBMSUVSVFlQRSBlU3VwcGxpZXI7IC8qKjwgc3VwcGxpZXIgcHJlZmVyZW5jZSAqLwotfSBPTVhfVFVOTkVMU0VUVVBUWVBFOyAKK30gT01YX1RVTk5FTFNFVFVQVFlQRTsKIAogLyogT01YIENvbXBvbmVudCBoZWFkZXJzIGlzIGluY2x1ZGVkIHRvIGVuYWJsZSB0aGUgY29yZSB0byB1c2UKLSAgIG1hY3JvcyBmb3IgZnVuY3Rpb25zIGludG8gdGhlIGNvbXBvbmVudCBmb3IgT01YIHJlbGVhc2UgMS4wLiAgCisgICBtYWNyb3MgZm9yIGZ1bmN0aW9ucyBpbnRvIHRoZSBjb21wb25lbnQgZm9yIE9NWCByZWxlYXNlIDEuMC4KICAgIERldmVsb3BlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgYW55IHN0cnVjdHVyZXMgb3IgZGF0YSBmcm9tIHdpdGhpbgogICAgdGhlIGNvbXBvbmVudCBoZWFkZXIgZGlyZWN0bHkgKi8KIC8qIFRPIEJFIFJFTU9WRUQgLSAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPiAqLwogCi0vKiogR2V0Q29tcG9uZW50VmVyc2lvbiB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcG9uZW50LiAgCisvKiogR2V0Q29tcG9uZW50VmVyc2lvbiB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcG9uZW50LgogICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlCiAgICAgYXBwbGljYXRpb24gdG8gdGhlIGNvbXBvbmVudCAodmlhIGEgY29yZSBtYWNybykuICBUaGUKICAgICBjb21wb25lbnQgd2lsbCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CiAgICAgICAgIGhhbmRsZSBvZiBjb21wb25lbnQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZAogICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50TmFtZQotICAgICAgICBwb2ludGVyIHRvIGFuIGVtcHR5IHN0cmluZyBvZiBsZW5ndGggMTI4IGJ5dGVzLiAgVGhlIGNvbXBvbmVudCAKLSAgICAgICAgd2lsbCB3cml0ZSBpdHMgbmFtZSBpbnRvIHRoaXMgc3RyaW5nLiAgVGhlIG5hbWUgd2lsbCBiZSAKLSAgICAgICAgdGVybWluYXRlZCBieSBhIHNpbmdsZSB6ZXJvIGJ5dGUuICBUaGUgbmFtZSBvZiBhIGNvbXBvbmVudCB3aWxsIAotICAgICAgICBiZSAxMjcgYnl0ZXMgb3IgbGVzcyB0byBsZWF2ZSByb29tIGZvciB0aGUgdHJhaWxpbmcgemVybyBieXRlLiAgCisgICAgICAgIHBvaW50ZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9mIGxlbmd0aCAxMjggYnl0ZXMuICBUaGUgY29tcG9uZW50CisgICAgICAgIHdpbGwgd3JpdGUgaXRzIG5hbWUgaW50byB0aGlzIHN0cmluZy4gIFRoZSBuYW1lIHdpbGwgYmUKKyAgICAgICAgdGVybWluYXRlZCBieSBhIHNpbmdsZSB6ZXJvIGJ5dGUuICBUaGUgbmFtZSBvZiBhIGNvbXBvbmVudCB3aWxsCisgICAgICAgIGJlIDEyNyBieXRlcyBvciBsZXNzIHRvIGxlYXZlIHJvb20gZm9yIHRoZSB0cmFpbGluZyB6ZXJvIGJ5dGUuCiAgICAgICAgIEFuIGV4YW1wbGUgb2YgYSB2YWxpZCBjb21wb25lbnQgbmFtZSBpcyAiT01YLkFCQy5DaGFubmVsTWl4ZXJcMCIuCiAgICAgQHBhcmFtIFtvdXRdIHBDb21wb25lbnRWZXJzaW9uCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YIFZlcnNpb24gc3RydWN0dXJlIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgCi0gICAgICAgIGluLiAgVGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgaW4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgCi0gICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uLiAgTk9URTogdGhlIGNvbXBvbmVudCB2ZXJzaW9uIGlzIE5PVCB0aGUgc2FtZSAKLSAgICAgICAgYXMgdGhlIE9NWCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gKGZvdW5kIGluIGFsbCBzdHJ1Y3R1cmVzKS4gIFRoZSAKLSAgICAgICAgY29tcG9uZW50IHZlcnNpb24gaXMgZGVmaW5lZCBieSB0aGUgdmVuZG9yIG9mIHRoZSBjb21wb25lbnQgYW5kIAorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsCisgICAgICAgIGluLiAgVGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgaW4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUKKyAgICAgICAgY29tcG9uZW50IHZlcnNpb24uICBOT1RFOiB0aGUgY29tcG9uZW50IHZlcnNpb24gaXMgTk9UIHRoZSBzYW1lCisgICAgICAgIGFzIHRoZSBPTVggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIChmb3VuZCBpbiBhbGwgc3RydWN0dXJlcykuICBUaGUKKyAgICAgICAgY29tcG9uZW50IHZlcnNpb24gaXMgZGVmaW5lZCBieSB0aGUgdmVuZG9yIG9mIHRoZSBjb21wb25lbnQgYW5kCiAgICAgICAgIGl0cyB2YWx1ZSBpcyBlbnRpcmVseSB1cCB0byB0aGUgY29tcG9uZW50IHZlbmRvci4KICAgICBAcGFyYW0gW291dF0gcFNwZWNWZXJzaW9uCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YIFZlcnNpb24gc3RydWN0dXJlIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgCi0gICAgICAgIGluLiAgVGhlIFNwZWNWZXJzaW9uIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIAotICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgdmFsdWUgbWF5IG9yIAotICAgICAgICBtYXkgbm90IG1hdGNoIHRoZSBzdHJ1Y3R1cmUncyB2ZXJzaW9uLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSAKLSAgICAgICAgY29tcG9uZW50IHdhcyBidWlsdCBhZ2FpbnN0IHRoZSAyLjAgc3BlY2lmaWNhdGlvbiwgYnV0IHRoZSAKLSAgICAgICAgYXBwbGljYXRpb24gKHdoaWNoIGNyZWF0ZXMgdGhlIHN0cnVjdHVyZSBpcyBidWlsdCBhZ2FpbnN0IHRoZSAKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVggVmVyc2lvbiBzdHJ1Y3R1cmUgdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgZmlsbAorICAgICAgICBpbi4gIFRoZSBTcGVjVmVyc2lvbiBpcyB0aGUgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWNhdGlvbiB0aGF0IHRoZQorICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgdmFsdWUgbWF5IG9yCisgICAgICAgIG1heSBub3QgbWF0Y2ggdGhlIHN0cnVjdHVyZSdzIHZlcnNpb24uICBGb3IgZXhhbXBsZSwgaWYgdGhlCisgICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdCB0aGUgMi4wIHNwZWNpZmljYXRpb24sIGJ1dCB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gKHdoaWNoIGNyZWF0ZXMgdGhlIHN0cnVjdHVyZSBpcyBidWlsdCBhZ2FpbnN0IHRoZQogICAgICAgICAxLjAgc3BlY2lmaWNhdGlvbiB0aGUgdmVyc2lvbnMgd291bGQgYmUgZGlmZmVyZW50LgogICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VVVJRAotICAgICAgICBwb2ludGVyIHRvIHRoZSBVVUlEIG9mIHRoZSBjb21wb25lbnQgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gYnkgCi0gICAgICAgIHRoZSBjb21wb25lbnQuICBUaGUgVVVJRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2V0IGF0IAotICAgICAgICBSVU4gdGltZSBmb3IgdGhlIGNvbXBvbmVudCBhbmQgaXMgdW5pcXVlIHRvIGVhY2ggaW5zdGFudGlvbiBvZiAKKyAgICAgICAgcG9pbnRlciB0byB0aGUgVVVJRCBvZiB0aGUgY29tcG9uZW50IHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIGJ5CisgICAgICAgIHRoZSBjb21wb25lbnQuICBUaGUgVVVJRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2V0IGF0CisgICAgICAgIFJVTiB0aW1lIGZvciB0aGUgY29tcG9uZW50IGFuZCBpcyB1bmlxdWUgdG8gZWFjaCBpbnN0YW50aW9uIG9mCiAgICAgICAgIHRoZSBjb21wb25lbnQuCiAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCiAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKQEAgLTcxNCw0NiArNzE0LDQ2IEBACiAKIC8qKiBTZW5kIGEgY29tbWFuZCB0byB0aGUgY29tcG9uZW50LiAgVGhpcyBjYWxsIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwuCiAgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgY2hlY2sgdGhlIHBhcmFtZXRlcnMgYW5kIHRoZW4gcXVldWUgdGhlIGNvbW1hbmQKLSAgICB0byB0aGUgY29tcG9uZW50IHRocmVhZCB0byBiZSBleGVjdXRlZC4gIFRoZSBjb21wb25lbnQgdGhyZWFkIHNoYWxsIAotICAgIHNlbmQgdGhlIEV2ZW50SGFuZGxlcigpIGNhbGxiYWNrIGF0IHRoZSBjb25jbHVzaW9uIG9mIHRoZSBjb21tYW5kLiAKKyAgICB0byB0aGUgY29tcG9uZW50IHRocmVhZCB0byBiZSBleGVjdXRlZC4gIFRoZSBjb21wb25lbnQgdGhyZWFkIHNoYWxsCisgICAgc2VuZCB0aGUgRXZlbnRIYW5kbGVyKCkgY2FsbGJhY2sgYXQgdGhlIGNvbmNsdXNpb24gb2YgdGhlIGNvbW1hbmQuCiAgICAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYQogICAgIGEgY29yZSBtYWNybykuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCisKICAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFN0YXRlU2V0IiB0aGUgY29tcG9uZW50IHdpbGwgcXVldWUgYQogICAgIHN0YXRlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBzdGF0ZSBpZGVuZmllZCBpbiBuUGFyYW0uCi0gICAgCisKICAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZEZsdXNoIiwgdG8gZmx1c2ggYSBwb3J0J3MgYnVmZmVyIHF1ZXVlcywKLSAgICB0aGUgY29tbWFuZCB3aWxsIGZvcmNlIHRoZSBjb21wb25lbnQgdG8gcmV0dXJuIGFsbCBidWZmZXJzIE5PVCBDVVJSRU5UTFkgCi0gICAgQkVJTkcgUFJPQ0VTU0VEIHRvIHRoZSBhcHBsaWNhdGlvbiwgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBidWZmZXJzIAorICAgIHRoZSBjb21tYW5kIHdpbGwgZm9yY2UgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgTk9UIENVUlJFTlRMWQorICAgIEJFSU5HIFBST0NFU1NFRCB0byB0aGUgYXBwbGljYXRpb24sIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYnVmZmVycwogICAgIHdlcmUgcmVjZWl2ZWQuCi0gICAgCi0gICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRQb3J0RGlzYWJsZSIgb3IgCisKKyAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIiBvcgogICAgICJPTVhfQ29tbWFuZFBvcnRFbmFibGUiLCB0aGUgY29tcG9uZW50J3MgcG9ydCAoZ2l2ZW4gYnkgdGhlIHZhbHVlIG9mCi0gICAgblBhcmFtKSB3aWxsIGJlIHN0b3BwZWQgb3IgcmVzdGFydGVkLiAKLSAgICAKKyAgICBuUGFyYW0pIHdpbGwgYmUgc3RvcHBlZCBvciByZXN0YXJ0ZWQuCisKICAgICBXaGVuIHRoZSBjb21tYW5kICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiIGlzIHVzZWQgdG8gbWFyayBhIGJ1ZmZlciwgdGhlCiAgICAgcENtZERhdGEgd2lsbCBwb2ludCB0byBhIE9NWF9NQVJLVFlQRSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgY29tcG9uZW50CiAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gZXhhbWluZSB0aGUgYnVmZmVyIGNoYWluIGZvciB0aGUgbWFyay4gIG5QYXJhbTEKICAgICBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIHBvcnQgb24gd2hpY2ggdGhlIGJ1ZmZlciBtYXJrIGlzIGFwcGxpZWQuCiAKLSAgICBTcGVjaWZpY2F0aW9uIHRleHQgZm9yIG1vcmUgZGV0YWlscy4gCi0gICAgCisgICAgU3BlY2lmaWNhdGlvbiB0ZXh0IGZvciBtb3JlIGRldGFpbHMuCisKICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CiAgICAgICAgIGhhbmRsZSBvZiBjb21wb25lbnQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZAogICAgIEBwYXJhbSBbaW5dIENtZAogICAgICAgICBDb21tYW5kIGZvciB0aGUgY29tcG9uZW50IHRvIGV4ZWN1dGUKICAgICBAcGFyYW0gW2luXSBuUGFyYW0KLSAgICAgICAgUGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZC4gIFdoZW4gQ21kIGhhcyB0aGUgdmFsdWUgCi0gICAgICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsIHZhbHVlIGlzIGEgbWVtYmVyIG9mIE9NWF9TVEFURVRZUEUuICBXaGVuIENtZCBoYXMgCi0gICAgICAgIHRoZSB2YWx1ZSBPTVhfQ29tbWFuZEZsdXNoLCB2YWx1ZSBvZiBuUGFyYW0gaW5kaWNhdGVzIHdoaWNoIHBvcnQocykgCi0gICAgICAgIHRvIGZsdXNoLiAtMSBpcyB1c2VkIHRvIGZsdXNoIGFsbCBwb3J0cyBhIHNpbmdsZSBwb3J0IGluZGV4IHdpbGwgCisgICAgICAgIFBhcmFtZXRlciBmb3IgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlCisgICAgICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsIHZhbHVlIGlzIGEgbWVtYmVyIG9mIE9NWF9TVEFURVRZUEUuICBXaGVuIENtZCBoYXMKKyAgICAgICAgdGhlIHZhbHVlIE9NWF9Db21tYW5kRmx1c2gsIHZhbHVlIG9mIG5QYXJhbSBpbmRpY2F0ZXMgd2hpY2ggcG9ydChzKQorICAgICAgICB0byBmbHVzaC4gLTEgaXMgdXNlZCB0byBmbHVzaCBhbGwgcG9ydHMgYSBzaW5nbGUgcG9ydCBpbmRleCB3aWxsCiAgICAgICAgIG9ubHkgZmx1c2ggdGhhdCBwb3J0LiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAiT01YX0NvbW1hbmRQb3J0RGlzYWJsZSIKLSAgICAgICAgb3IgIk9NWF9Db21tYW5kUG9ydEVuYWJsZSIsIHRoZSBjb21wb25lbnQncyBwb3J0IGlzIGdpdmVuIGJ5IAorICAgICAgICBvciAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgaXMgZ2l2ZW4gYnkKICAgICAgICAgdGhlIHZhbHVlIG9mIG5QYXJhbS4gIFdoZW4gQ21kIGhhcyB0aGUgdmFsdWUgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIKICAgICAgICAgdGhlIGNvbXBvbmVudHMgcG90IGlzIGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZiBuUGFyYW0uCiAgICAgQHBhcmFtIFtpbl0gcENtZERhdGEKICAgICAgICAgUGFyYW1ldGVyIHBvaW50aW5nIHRvIHRoZSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIHdoZW4gQ21kIGhhcyB0aGUgdmFsdWUKLSAgICAgICAgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIuICAgICAKKyAgICAgICAgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIuCiAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCiAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCkBAIC03NzEsMjEgKzc3MSwyMSBAQAogICAgICAgICAgcENtZERhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KIAogCi0vKiogVGhlIE9NWF9HZXRQYXJhbWV0ZXIgbWFjcm8gd2lsbCBnZXQgb25lIG9mIHRoZSBjdXJyZW50IHBhcmFtZXRlciAKLSAgICBzZXR0aW5ncyBmcm9tIHRoZSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbm5vdCBvbmx5IGJlIGludm9rZWQgd2hlbiAKKy8qKiBUaGUgT01YX0dldFBhcmFtZXRlciBtYWNybyB3aWxsIGdldCBvbmUgb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyCisgICAgc2V0dGluZ3MgZnJvbSB0aGUgY29tcG9uZW50LiAgVGhpcyBtYWNybyBjYW5ub3Qgb25seSBiZSBpbnZva2VkIHdoZW4KICAgICB0aGUgY29tcG9uZW50IGlzIGluIHRoZSBPTVhfU3RhdGVJbnZhbGlkIHN0YXRlLiAgVGhlIG5QYXJhbUluZGV4CiAgICAgcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nIHJlcXVlc3RlZCBmcm9tCi0gICAgdGhlIGNvbXBvbmVudC4gIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgCi0gICAgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSAKKyAgICB0aGUgY29tcG9uZW50LiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZQorICAgIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiBiZWZvcmUKICAgICBpbnZva2luZyB0aGlzIG1hY3JvLiAgV2hlbiB0aGUgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBwb3J0LCB0aGUKICAgICBjYWxsZXIgc2hhbGwgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgblBvcnRJbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoZQotICAgIHBvcnQgb24gd2hpY2ggdGhlIHBhcmFtZXRlciBhcHBsaWVzLiBJZiB0aGUgY29tcG9uZW50IGhhcyBub3QgaGFkIAotICAgIGFueSBzZXR0aW5ncyBjaGFuZ2VkLCB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiAKLSAgICB2YWxpZCBERUZBVUxUICBwYXJhbWV0ZXJzIGZvciB0aGUgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nIAotICAgIGNhbGwuICAKLSAgICAKKyAgICBwb3J0IG9uIHdoaWNoIHRoZSBwYXJhbWV0ZXIgYXBwbGllcy4gSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZAorICAgIGFueSBzZXR0aW5ncyBjaGFuZ2VkLCB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZgorICAgIHZhbGlkIERFRkFVTFQgIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcKKyAgICBjYWxsLgorCiAgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAogICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAogICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCkBAIC03OTMsNyArNzkzLDcgQEAKICAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uCiAgICAgQHBhcmFtIFtpbixvdXRdIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUKLSAgICAgICAgUG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBieSB0aGUgCisgICAgICAgIFBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlCiAgICAgICAgIGNvbXBvbmVudC4KICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQpAQCAtODE0LDE3ICs4MTQsMTcgQEAKICAgICBzdHJ1Y3R1cmUgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCiAgICAgaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIG9ubHkgYmUKICAgICBpbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlTG9hZGVkIHN0YXRlLCBvciB0aGUKLSAgICBwb3J0IGlzIGRpc2FibGVkICh3aGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQpLiBUaGUgCisgICAgcG9ydCBpcyBkaXNhYmxlZCAod2hlbiB0aGUgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBwb3J0KS4gVGhlCiAgICAgblBhcmFtSW5kZXggcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nCi0gICAgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIAotICAgIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiAKKyAgICBwYXNzZWQgdG8gdGhlIGNvbXBvbmVudC4gIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUKKyAgICBjb3JyZWN0IHN0cnVjdHVyZSBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24KICAgICBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLgogICAgIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgdGhlIGNhbGwKLSAgICBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgVGhpcyAKLSAgICBpcyBhIGJsb2NraW5nIGNhbGwuICAKLSAgICAKKyAgICBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgVGhpcworICAgIGlzIGEgYmxvY2tpbmcgY2FsbC4KKwogICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKKwogICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgpAQCAtODQ5LDE4ICs4NDksMTggQEAKICAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCiAKIAotLyoqIFRoZSBPTVhfR2V0Q29uZmlnIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIAotICAgIGZyb20gYSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIGFueXRpbWUgYWZ0ZXIgdGhlIAotICAgIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgblBhcmFtSW5kZXggY2FsbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byAKLSAgICBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoZSAKLSAgICBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIAotICAgIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLiAgCi0gICAgSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCB0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHNlbnQgYmVmb3JlLCAKLSAgICB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiB2YWxpZCBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIAotICAgIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCisvKiogVGhlIE9NWF9HZXRDb25maWcgbWFjcm8gd2lsbCBnZXQgb25lIG9mIHRoZSBjb25maWd1cmF0aW9uIHN0cnVjdHVyZXMKKyAgICBmcm9tIGEgY29tcG9uZW50LiAgVGhpcyBtYWNybyBjYW4gYmUgaW52b2tlZCBhbnl0aW1lIGFmdGVyIHRoZQorICAgIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgblBhcmFtSW5kZXggY2FsbCBwYXJhbWV0ZXIgaXMgdXNlZCB0bworICAgIGluZGljYXRlIHdoaWNoIHN0cnVjdHVyZSBpcyBiZWluZyByZXF1ZXN0ZWQgZnJvbSB0aGUgY29tcG9uZW50LiAgVGhlCisgICAgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZQorICAgIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLgorICAgIElmIHRoZSBjb21wb25lbnQgaGFzIG5vdCBoYWQgdGhpcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBzZW50IGJlZm9yZSwKKyAgICB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiB2YWxpZCBERUZBVUxUIHZhbHVlcyBmb3IgdGhlCisgICAgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCisKICAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKKwogICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgpAQCAtODY4LDEzICs4NjgsMTMgQEAKICAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uCiAgICAgQHBhcmFtIFtpbixvdXRdIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKLSAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBieSB0aGUgCisgICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlCiAgICAgICAgIGNvbXBvbmVudC4KICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQogICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KICAgICBAaW5ncm91cCBjb21wCi0qLyAgICAgICAgCisqLwogI2RlZmluZSBPTVhfR2V0Q29uZmlnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtODg1LDE4ICs4ODUsMTggQEAKICAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCiAKIAotLyoqIFRoZSBPTVhfU2V0Q29uZmlnIG1hY3JvIHdpbGwgc2VuZCBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gCisvKiogVGhlIE9NWF9TZXRDb25maWcgbWFjcm8gd2lsbCBzZW5kIG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbgogICAgIHN0cnVjdHVyZXMgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCi0gICAgZWFjaCBpbiBhIHNlcGFyYXRlIGludm9jYXRpb24gb2YgdGhlIG1hY3JvLiAgVGhpcyBtYWNybyBjYW4gYmUgaW52b2tlZCAKLSAgICBhbnl0aW1lIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkLiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIAotICAgIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgCi0gICAgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gKGFzIHdlbGwgYXMgdGhlIGFjdHVhbCBkYXRhKSBiZWZvcmUgaW52b2tpbmcgCi0gICAgdGhpcyBtYWNyby4gIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgCi0gICAgdGhlIGNhbGwgYXMgdGhlIGNvbXBvbmVudCBpcyByZXF1aXJlZCB0byBjb3B5IGFueSBkYXRhIGl0IHNoYWxsIHJldGFpbi4gIAotICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCi0gICAgCisgICAgZWFjaCBpbiBhIHNlcGFyYXRlIGludm9jYXRpb24gb2YgdGhlIG1hY3JvLiAgVGhpcyBtYWNybyBjYW4gYmUgaW52b2tlZAorICAgIGFueXRpbWUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwKKyAgICBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSBzaXplCisgICAgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gKGFzIHdlbGwgYXMgdGhlIGFjdHVhbCBkYXRhKSBiZWZvcmUgaW52b2tpbmcKKyAgICB0aGlzIG1hY3JvLiAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlcgorICAgIHRoZSBjYWxsIGFzIHRoZSBjb21wb25lbnQgaXMgcmVxdWlyZWQgdG8gY29weSBhbnkgZGF0YSBpdCBzaGFsbCByZXRhaW4uCisgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCisKICAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KLSAgICAKKwogICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgpAQCAtOTIxLDIyICs5MjEsMjIgQEAKICAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCiAKIAotLyoqIFRoZSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXggbWFjcm8gd2lsbCBpbnZva2UgYSBjb21wb25lbnQgdG8gdHJhbnNsYXRlIAotICAgIGEgdmVuZG9yIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3IgcGFyYW1ldGVyIHN0cmluZyBpbnRvIGFuIE9NWCAKLSAgICBzdHJ1Y3R1cmUgaW5kZXguICBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgdGhlIHZlbmRvciB0byBzdXBwb3J0IAotICAgIHRoaXMgY29tbWFuZCBmb3IgdGhlIGluZGV4ZXMgYWxyZWFkeSBmb3VuZCBpbiB0aGUgT01YX0lOREVYVFlQRSAKLSAgICBlbnVtZXJhdGlvbiAodGhpcyBpcyBkb25lIHRvIHNhdmUgc3BhY2UgaW4gc21hbGwgY29tcG9uZW50cykuICBUaGUgCisvKiogVGhlIE9NWF9HZXRFeHRlbnNpb25JbmRleCBtYWNybyB3aWxsIGludm9rZSBhIGNvbXBvbmVudCB0byB0cmFuc2xhdGUKKyAgICBhIHZlbmRvciBzcGVjaWZpYyBjb25maWd1cmF0aW9uIG9yIHBhcmFtZXRlciBzdHJpbmcgaW50byBhbiBPTVgKKyAgICBzdHJ1Y3R1cmUgaW5kZXguICBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgdGhlIHZlbmRvciB0byBzdXBwb3J0CisgICAgdGhpcyBjb21tYW5kIGZvciB0aGUgaW5kZXhlcyBhbHJlYWR5IGZvdW5kIGluIHRoZSBPTVhfSU5ERVhUWVBFCisgICAgZW51bWVyYXRpb24gKHRoaXMgaXMgZG9uZSB0byBzYXZlIHNwYWNlIGluIHNtYWxsIGNvbXBvbmVudHMpLiAgVGhlCiAgICAgY29tcG9uZW50IHNoYWxsIHN1cHBvcnQgYWxsIHZlbmRvciBzdXBwbGllZCBleHRlbnNpb24gaW5kZXhlcyBub3QgZm91bmQKLSAgICBpbiB0aGUgbWFzdGVyIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIAotICAgIAorICAgIGluIHRoZSBtYXN0ZXIgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgorCiAgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCisKICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CiAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CiAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgogICAgIEBwYXJhbSBbaW5dIGNQYXJhbWV0ZXJOYW1lCiAgICAgICAgIE9NWF9TVFJJTkcgdGhhdCBzaGFsbCBiZSBsZXNzIHRoYW4gMTI4IGNoYXJhY3RlcnMgbG9uZyBpbmNsdWRpbmcKLSAgICAgICAgdGhlIHRyYWlsaW5nIG51bGwgYnl0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IHdpbGwgZ2V0IAorICAgICAgICB0aGUgdHJhaWxpbmcgbnVsbCBieXRlLiAgVGhpcyBpcyB0aGUgc3RyaW5nIHRoYXQgd2lsbCBnZXQKICAgICAgICAgdHJhbnNsYXRlZCBieSB0aGUgY29tcG9uZW50IGludG8gYSBjb25maWd1cmF0aW9uIGluZGV4LgogICAgIEBwYXJhbSBbb3V0XSBwSW5kZXhUeXBlCiAgICAgICAgIGEgcG9pbnRlciB0byBhIE9NWF9JTkRFWFRZUEUgdG8gcmVjZWl2ZSB0aGUgaW5kZXggdmFsdWUuCkBAIC05NTUsMTggKzk1NSwxOCBAQAogICAgICAgICBwSW5kZXhUeXBlKSAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLwogCiAKLS8qKiBUaGUgT01YX0dldFN0YXRlIG1hY3JvIHdpbGwgaW52b2tlIHRoZSBjb21wb25lbnQgdG8gZ2V0IHRoZSBjdXJyZW50IAorLyoqIFRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gd2lsbCBpbnZva2UgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIGN1cnJlbnQKICAgICBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IGFuZCBwbGFjZSB0aGUgc3RhdGUgdmFsdWUgaW50byB0aGUgbG9jYXRpb24KLSAgICBwb2ludGVkIHRvIGJ5IHBTdGF0ZS4gIAotICAgIAorICAgIHBvaW50ZWQgdG8gYnkgcFN0YXRlLgorCiAgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCisKICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CiAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CiAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KICAgICBAcGFyYW0gW291dF0gcFN0YXRlCiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHJlY2VpdmUgdGhlIHN0YXRlLiAgVGhlIHZhbHVlIHJldHVybmVkCi0gICAgICAgIGlzIG9uZSBvZiB0aGUgT01YX1NUQVRFVFlQRSBtZW1iZXJzIAorICAgICAgICBpcyBvbmUgb2YgdGhlIE9NWF9TVEFURVRZUEUgbWVtYmVycwogICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQogICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCiAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgpAQCAtOTgxLDE3ICs5ODEsMTcgQEAKIAogCiAvKiogVGhlIE9NWF9Vc2VCdWZmZXIgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCB1c2UKLSAgICBhIGJ1ZmZlciAoYW5kIGFsbG9jYXRlIGl0cyBvd24gYnVmZmVyIGhlYWRlcikgYWxyZWFkeSBhbGxvY2F0ZWQgCi0gICAgYnkgYW5vdGhlciBjb21wb25lbnQsIG9yIGJ5IHRoZSBJTCBDbGllbnQuIFRoaXMgaXMgYSBibG9ja2luZyAKKyAgICBhIGJ1ZmZlciAoYW5kIGFsbG9jYXRlIGl0cyBvd24gYnVmZmVyIGhlYWRlcikgYWxyZWFkeSBhbGxvY2F0ZWQKKyAgICBieSBhbm90aGVyIGNvbXBvbmVudCwgb3IgYnkgdGhlIElMIENsaWVudC4gVGhpcyBpcyBhIGJsb2NraW5nCiAgICAgY2FsbC4KLSAgICAKKwogICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KLSAgICAKKwogICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgogICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgotICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlCiAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkZXIKICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQpAQCAtMTAxNSwyNSArMTAxNSwyNSBAQAogICAgICAgICAgICBwQnVmZmVyKQogCiAKLS8qKiBUaGUgT01YX0FsbG9jYXRlQnVmZmVyIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgYWxsb2NhdGUgCi0gICAgYSBuZXcgYnVmZmVyIGFuZCBidWZmZXIgaGVhZGVyLiAgVGhlIGNvbXBvbmVudCB3aWxsIGFsbG9jYXRlIHRoZSAKLSAgICBidWZmZXIgYW5kIHRoZSBidWZmZXIgaGVhZGVyIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgCisvKiogVGhlIE9NWF9BbGxvY2F0ZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IGFsbG9jYXRlCisgICAgYSBuZXcgYnVmZmVyIGFuZCBidWZmZXIgaGVhZGVyLiAgVGhlIGNvbXBvbmVudCB3aWxsIGFsbG9jYXRlIHRoZQorICAgIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBoZWFkZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlcgogICAgIGhlYWRlci4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgotICAgIAorCiAgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCi0gICAgCisKICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CiAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CiAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KICAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKLSAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIAorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUKICAgICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkZXIKICAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4CiAgICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKICAgICAgICAgYmUgdXNlZCB3aXRoLiAgVGhlIHBvcnQgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBuUG9ydEluZGV4CiAgICAgICAgIHZhbHVlIGFzIGFuIGluZGV4IGludG8gdGhlIFBvcnQgRGVmaW5pdGlvbiBhcnJheSBvZiB0aGUgY29tcG9uZW50LgogICAgIEBwYXJhbSBbaW5dIHBBcHBQcml2YXRlCi0gICAgICAgIHBBcHBQcml2YXRlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcEFwcFByaXZhdGUgbWVtYmVyIG9mIHRoZSAKKyAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlCiAgICAgICAgIGJ1ZmZlciBoZWFkZXIgc3RydWN0dXJlLgogICAgIEBwYXJhbSBbaW5dIG5TaXplQnl0ZXMKICAgICAgICAgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlLiAgVXNlZCB3aGVuIGJBbGxvY2F0ZU5ldyBpcyB0cnVlLgpAQCAtMTA0MSw3ICsxMDQxLDcgQEAKICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQogICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KICAgICBAaW5ncm91cCBjb21wIGJ1ZgotICovICAgIAorICovCiAjZGVmaW5lIE9NWF9BbGxvY2F0ZUJ1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHBwQnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMDU3LDEzICsxMDU3LDEzIEBACiAKIAogLyoqIFRoZSBPTVhfRnJlZUJ1ZmZlciBtYWNybyB3aWxsIHJlbGVhc2UgYSBidWZmZXIgaGVhZGVyIGZyb20gdGhlIGNvbXBvbmVudAotICAgIHdoaWNoIHdhcyBhbGxvY2F0ZWQgdXNpbmcgZWl0aGVyIE9NWF9BbGxvY2F0ZUJ1ZmZlciBvciBPTVhfVXNlQnVmZmVyLiBJZiAgCi0gICAgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZWQgdGhlIGJ1ZmZlciAoc2VlIHRoZSBPTVhfVXNlQnVmZmVyIG1hY3JvKSB0aGVuIAotICAgIHRoZSBjb21wb25lbnQgc2hhbGwgZnJlZSB0aGUgYnVmZmVyIGFuZCBidWZmZXIgaGVhZGVyLiBUaGlzIGlzIGEgCi0gICAgYmxvY2tpbmcgY2FsbC4gCi0gICAgCisgICAgd2hpY2ggd2FzIGFsbG9jYXRlZCB1c2luZyBlaXRoZXIgT01YX0FsbG9jYXRlQnVmZmVyIG9yIE9NWF9Vc2VCdWZmZXIuIElmCisgICAgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZWQgdGhlIGJ1ZmZlciAoc2VlIHRoZSBPTVhfVXNlQnVmZmVyIG1hY3JvKSB0aGVuCisgICAgdGhlIGNvbXBvbmVudCBzaGFsbCBmcmVlIHRoZSBidWZmZXIgYW5kIGJ1ZmZlciBoZWFkZXIuIFRoaXMgaXMgYQorICAgIGJsb2NraW5nIGNhbGwuCisKICAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCisKICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CiAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CiAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KQEAgLTEwODgsMTcgKzEwODgsMTcgQEAKICAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KIAogCi0vKiogVGhlIE9NWF9FbXB0eVRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGEgYnVmZmVyIGZ1bGwgb2YgZGF0YSB0byBhbiAKKy8qKiBUaGUgT01YX0VtcHR5VGhpc0J1ZmZlciBtYWNybyB3aWxsIHNlbmQgYSBidWZmZXIgZnVsbCBvZiBkYXRhIHRvIGFuCiAgICAgaW5wdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBlbXB0aWVkIGJ5IHRoZSBjb21wb25lbnQKICAgICBhbmQgcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYSB0aGUgRW1wdHlCdWZmZXJEb25lIGNhbGwgYmFjay4KICAgICBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwgaW4gdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIHRoZSBidWZmZXIKLSAgICBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IGFuZCB0aGVuIGVtcHR5IHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAotICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCisgICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBlbXB0eSB0aGUgYnVmZmVyLCBsYXRlciwgYXQgdGhlIHByb3BlcgorICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQKICAgICBpcyBpbiB0aGUgT01YX1N0YXRlRXhlY3V0aW5nLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGlucHV0Ci0gICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKLSAgICAKKyAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4KKwogICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAogICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAogICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCkBAIC0xMTE4LDE3ICsxMTE4LDE3IEBACiAgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCiAKIAotLyoqIFRoZSBPTVhfRmlsbFRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGVtcHR5IGJ1ZmZlciB0byBhbiAKKy8qKiBUaGUgT01YX0ZpbGxUaGlzQnVmZmVyIG1hY3JvIHdpbGwgc2VuZCBhbiBlbXB0eSBidWZmZXIgdG8gYW4KICAgICBvdXRwdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGNvbXBvbmVudAogICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBGaWxsQnVmZmVyRG9uZSBjYWxsIGJhY2suCiAgICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCi0gICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBmaWxsIHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAotICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCisgICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBmaWxsIHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyCisgICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudAogICAgIGlzIGluIHRoZSBPTVhfRXhlY3V0aW5nU3RhdGUuICBJZiBuUG9ydEluZGV4IGRvZXMgbm90IHNwZWNpZnkgYW4gb3V0cHV0Ci0gICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKLSAgICAKKyAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4KKwogICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAogICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAogICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCkBAIC0xMTUyLDE0ICsxMTUyLDE0IEBACiAvKiogVGhlIE9NWF9Vc2VFR0xJbWFnZSBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IHVzZQogICAgIGEgRUdMSW1hZ2UgcHJvdmlkZWQgYnkgRUdMIChhbmQgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgaGVhZGVyKQogICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgotICAgIAorCiAgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAogICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAogICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCiAgICAgQHBhcmFtIFtvdXRdIHBwQnVmZmVyCi0gICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIHVzZWQgdG8gcmVjZWl2ZSB0aGUgCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIHVzZWQgdG8gcmVjZWl2ZSB0aGUKICAgICAgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlci4gIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGxvY2F0aW9uIHVzZWQKICAgICAgICAgZm9yIHRoaXMgYnVmZmVyIGlzIE5PVCB2aXNpYmxlIHRvIHRoZSBJTCBDbGllbnQuCiAgICAgQHBhcmFtIFtpbl0gblBvcnRJbmRleApAQCAtMTE2NywxMyArMTE2NywxMyBAQAogICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKICAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCiAgICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKLSAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAorICAgICAgICBwQXBwUHJpdmF0ZSBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHBBcHBQcml2YXRlIG1lbWJlciBvZiB0aGUKICAgICAgICAgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCiAgICAgQHBhcmFtIFtpbl0gZWdsSW1hZ2UKICAgICAgICAgZWdsSW1hZ2UgY29udGFpbnMgdGhlIGhhbmRsZSBvZiB0aGUgRUdMSW1hZ2UgdG8gdXNlIGFzIGEgYnVmZmVyIG9uIHRoZQotICAgICAgICBzcGVjaWZpZWQgcG9ydC4gIFRoZSBjb21wb25lbnQgaXMgZXhwZWN0ZWQgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBvZiAKKyAgICAgICAgc3BlY2lmaWVkIHBvcnQuICBUaGUgY29tcG9uZW50IGlzIGV4cGVjdGVkIHRvIHZhbGlkYXRlIHByb3BlcnRpZXMgb2YKICAgICAgICAgdGhlIEVHTEltYWdlIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQKLSAgICAgICAgY2FuIHVzZSB0aGUgRUdMSW1hZ2UgYXMgYSBidWZmZXIuICAgICAgICAgIAorICAgICAgICBjYW4gdXNlIHRoZSBFR0xJbWFnZSBhcyBhIGJ1ZmZlci4KICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQogICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KQEAgLTExOTQsOCArMTE5NCw4IEBACiAKIC8qKiBUaGUgT01YX0luaXQgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSB0aGUKICAgICBmaXJzdCBjYWxsIG1hZGUgaW50byBPTVggYW5kIGl0IHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uZSB0aW1lIHdpdGhvdXQKLSAgICBhbiBpbnRlcnZpZW5pbmcgT01YX0RlaW5pdCBjYWxsLiAgCi0gICAgCisgICAgYW4gaW50ZXJ2aWVuaW5nIE9NWF9EZWluaXQgY2FsbC4KKwogICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCiAKICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKQEAgLTEyMDYsMTMgKzEyMDYsMTMgQEAKIE9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0luaXQodm9pZCk7CiAKIAotLyoqIFRoZSBPTVhfRGVpbml0IG1ldGhvZCBpcyB1c2VkIHRvIGRlaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSAKLSAgICB0aGUgbGFzdCBjYWxsIG1hZGUgaW50byBPTVguIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JlIGRldGVybWluZXMgdGhhdCAKLSAgICB0aGFyZSBhcmUgY29tcG9uZW50cyBsb2FkZWQgd2hlbiB0aGlzIGNhbGwgaXMgbWFkZSwgdGhlIGNvcmUgbWF5IHJldHVybiAKKy8qKiBUaGUgT01YX0RlaW5pdCBtZXRob2QgaXMgdXNlZCB0byBkZWluaXRpYWxpemUgdGhlIE9NWCBjb3JlLiAgSXQgc2hhbGwgYmUKKyAgICB0aGUgbGFzdCBjYWxsIG1hZGUgaW50byBPTVguIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JlIGRldGVybWluZXMgdGhhdAorICAgIHRoYXJlIGFyZSBjb21wb25lbnRzIGxvYWRlZCB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLCB0aGUgY29yZSBtYXkgcmV0dXJuCiAgICAgd2l0aCBhbiBlcnJvciByYXRoZXIgdGhhbiB0cnkgdG8gdW5sb2FkIHRoZSBjb21wb25lbnRzLgotICAgICAgICAKKwogICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCi0gICAgCisKICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQogICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KQEAgLTEyMjksMjMgKzEyMjksMjMgQEAKICAgICBpbnN0YWxsYXRpb24gb2YgbmV3IGNvbXBvbmVudHMsIGl0IGlzIG9ubHkgcmVxdXJpZWQgdG8gZGV0ZWN0IG5ld2x5CiAgICAgaW5zdGFsbGVkIGNvbXBvbmVudHMgd2hlbiB0aGUgZmlyc3QgY2FsbCB0byBlbnVtZXJhdGUgY29tcG9uZW50IG5hbWVzCiAgICAgaXMgbWFkZSAoaS5lLiB3aGVuIG5JbmRleCBpcyAweDApLgotICAgIAorCiAgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpbiAyMCBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtvdXRdIGNDb21wb25lbnROYW1lCiAgICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCiAgICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCi0gICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCi0gICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCi0gICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAorICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlCisgICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUKKyAgICAgICAgYXNzaWduZWQgYnkgdGhlIHZlbmRvciwgYnV0IHNoYWxsIHN0YXJ0IHdpdGggIk9NWC4iIGFuZCB0aGVuIGhhdmUKICAgICAgICAgdGhlIFZlbmRvciBkZXNpZ25hdGlvbiBuZXh0LgogICAgIEBwYXJhbSBbaW5dIG5OYW1lTGVuZ3RoCi0gICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjQ29tcG9uZW50TmFtZSBzdHJpbmcuICBXaXRoIGFsbCAKLSAgICAgICAgY29tcG9uZW50IG5hbWUgc3RyaW5ncyByZXN0cmljdGVkIHRvIGxlc3MgdGhhbiAxMjggY2hhcmFjdGVycyAKKyAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGNDb21wb25lbnROYW1lIHN0cmluZy4gIFdpdGggYWxsCisgICAgICAgIGNvbXBvbmVudCBuYW1lIHN0cmluZ3MgcmVzdHJpY3RlZCB0byBsZXNzIHRoYW4gMTI4IGNoYXJhY3RlcnMKICAgICAgICAgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCkgaXQgaXMgcmVjb21lbmRlZCB0aGF0IHRoZSBjYWxsZXIKICAgICAgICAgcHJvdmlkZSBhIGlucHV0IHN0cmluZyBmb3IgdGhlIGNDb21wb25lbnROYW1lIG9mIDEyOCBjaGFyYWN0ZXJzLgogICAgIEBwYXJhbSBbaW5dIG5JbmRleAotICAgICAgICBudW1iZXIgY29udGFpbmluZyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBjb21wb25lbnQuIAorICAgICAgICBudW1iZXIgY29udGFpbmluZyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBjb21wb25lbnQuCiAgICAgICAgIE11bHRpcGxlIGNhbGxzIHRvIE9NWF9Db21wb25lbnROYW1lRW51bSB3aXRoIGluY3JlYXNpbmcgdmFsdWVzCiAgICAgICAgIG9mIG5JbmRleCB3aWxsIGVudW1lcmF0ZSB0aHJvdWdoIHRoZSBjb21wb25lbnQgbmFtZXMgaW4gdGhlCiAgICAgICAgIHN5c3RlbSB1bnRpbCBPTVhfRXJyb3JOb01vcmUgaXMgcmV0dXJuZWQuICBUaGUgdmFsdWUgb2YgbkluZGV4CkBAIC0xMjUzLDcgKzEyNTMsNyBAQAogICAgICAgICBpbiB0aGUgc3lzdGVtLgogICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQogICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCi0gICAgICAgIE9NWF9FcnJvck5vbmUuICBXaGVuIHRoZSB2YWx1ZSBvZiBuSW5kZXggZXhjZWVkcyB0aGUgbnVtYmVyIG9mIAorICAgICAgICBPTVhfRXJyb3JOb25lLiAgV2hlbiB0aGUgdmFsdWUgb2YgbkluZGV4IGV4Y2VlZHMgdGhlIG51bWJlciBvZgogICAgICAgICBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0gbWludXMgMSwgT01YX0Vycm9yTm9Nb3JlIHdpbGwgYmUKICAgICAgICAgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgQGluZ3JvdXAgY29yZQpAQCAtMTI2NiwxOCArMTI2NiwxOCBAQAogCiAvKiogVGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIHdpbGwgbG9jYXRlIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IHRoZQogICAgIGNvbXBvbmVudCBuYW1lIGdpdmVuLCBsb2FkIHRoYXQgY29tcG9uZW50IGludG8gbWVtb3J5IGFuZCB0aGVuIGludm9rZQotICAgIHRoZSBjb21wb25lbnQncyBtZXRob2RzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiAgCi0gICAgCisgICAgdGhlIGNvbXBvbmVudCdzIG1ldGhvZHMgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQuCisKICAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtvdXRdIHBIYW5kbGUKICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfSEFORExFVFlQRSBwb2ludGVyIHRvIGJlIGZpbGxlZCBpbiBieSB0aGlzIG1ldGhvZC4KICAgICBAcGFyYW0gW2luXSBjQ29tcG9uZW50TmFtZQogICAgICAgICBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gIFRoZQogICAgICAgICBuYW1lcyBvZiB0aGUgY29tcG9uZW50cyBhcmUgc3RyaW5ncyBsZXNzIHRoYW4gMTI3IGJ5dGVzIGluIGxlbmd0aAotICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlIAotICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlIAotICAgICAgICBhc3NpZ25lZCBieSB0aGUgdmVuZG9yLCBidXQgc2hhbGwgc3RhcnQgd2l0aCAiT01YLiIgYW5kIHRoZW4gaGF2ZSAKKyAgICAgICAgcGx1cyB0aGUgdHJhaWxpbmcgbnVsbCBmb3IgYSBtYXhpbXVtIHNpemUgb2YgMTI4IGJ5dGVzLiAgQW4gZXhhbXBsZQorICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlCisgICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlCiAgICAgICAgIHRoZSBWZW5kb3IgZGVzaWduYXRpb24gbmV4dC4KICAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQogICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3aWxsIGJlIHJldHVybmVkCkBAIC0xMjg1LDI0ICsxMjg1LDI0IEBACiAgICAgICAgIG9mIHRoZSBjYWxsYmFjay4KICAgICBAcGFyYW0gW2luXSBwQ2FsbEJhY2tzCiAgICAgICAgIHBvaW50ZXIgdG8gYSBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQotICAgICAgICBjb21wb25lbnQgdG8gaW5pdGlhbGl6ZSBpdCB3aXRoLiAgCisgICAgICAgIGNvbXBvbmVudCB0byBpbml0aWFsaXplIGl0IHdpdGguCiAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCiAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgQGluZ3JvdXAgY29yZQogICovCiBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9HZXRIYW5kbGUoCi0gICAgT01YX09VVCBPTVhfSEFORExFVFlQRSogcEhhbmRsZSwgCisgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSogcEhhbmRsZSwKICAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY0NvbXBvbmVudE5hbWUsCiAgICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhLAogICAgIE9NWF9JTiAgT01YX0NBTExCQUNLVFlQRSogcENhbGxCYWNrcyk7CiAKIAotLyoqIFRoZSBPTVhfRnJlZUhhbmRsZSBtZXRob2Qgd2lsbCBmcmVlIGEgaGFuZGxlIGFsbG9jYXRlZCBieSB0aGUgT01YX0dldEhhbmRsZSAKKy8qKiBUaGUgT01YX0ZyZWVIYW5kbGUgbWV0aG9kIHdpbGwgZnJlZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgdGhlIE9NWF9HZXRIYW5kbGUKICAgICBtZXRob2QuICBJZiB0aGUgY29tcG9uZW50IHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvIHplcm8sIHRoZSBjb21wb25lbnQgd2lsbAotICAgIGJlIHVubG9hZGVkIGZyb20gbWVtb3J5LiAgCi0gICAgCi0gICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYyB3aGVuIHRoZSBjb21wb25lbnQgaXMgCisgICAgYmUgdW5sb2FkZWQgZnJvbSBtZW1vcnkuCisKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjIHdoZW4gdGhlIGNvbXBvbmVudCBpcwogICAgIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUuCiAKICAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CkBAIC0xMzIxLDM0ICsxMzIxLDM0IEBACiAvKiogVGhlIE9NWF9TZXR1cFR1bm5lbCBtZXRob2Qgd2lsbCBoYW5kbGUgdGhlIG5lY2Vzc2FyeSBjYWxscyB0byB0aGUgY29tcG9uZW50cwogICAgIHRvIHNldHVwIHRoZSBzcGVjaWZpZWQgdHVubmVsIHRoZSB0d28gY29tcG9uZW50cy4gIE5PVEU6IFRoaXMgaXMKICAgICBhbiBhY3R1YWwgbWV0aG9kIChub3QgYSAjZGVmaW5lIG1hY3JvKS4gIFRoaXMgbWV0aG9kIHdpbGwgbWFrZSBjYWxscyBpbnRvCi0gICAgdGhlIGNvbXBvbmVudCBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHR1bm5lbCAKLSAgICBjb25uZWN0aW9uLiAgCisgICAgdGhlIGNvbXBvbmVudCBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCB0byBkbyB0aGUgYWN0dWFsIHR1bm5lbAorICAgIGNvbm5lY3Rpb24uCiAKLSAgICBUaGUgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2Qgb24gYm90aCBjb21wb25lbnRzIHdpbGwgYmUgY2FsbGVkLiAKLSAgICBUaGlzIG1ldGhvZCBzaGFsbCBub3QgYmUgY2FsbGVkIHVubGVzcyB0aGUgY29tcG9uZW50IGlzIGluIHRoZSAKKyAgICBUaGUgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2Qgb24gYm90aCBjb21wb25lbnRzIHdpbGwgYmUgY2FsbGVkLgorICAgIFRoaXMgbWV0aG9kIHNoYWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlCiAgICAgT01YX1N0YXRlTG9hZGVkIHN0YXRlIGV4Y2VwdCB3aGVuIHRoZSBwb3J0cyB1c2VkIGZvciB0aGUgdHVubmVsIGFyZQogICAgIGRpc2FibGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgbWF5IGJlIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcsCi0gICAgT01YX1N0YXRlUGF1c2UsIG9yIE9NWF9TdGF0ZUlkbGUgc3RhdGVzLiAKKyAgICBPTVhfU3RhdGVQYXVzZSwgb3IgT01YX1N0YXRlSWRsZSBzdGF0ZXMuCiAKICAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtpbl0gaE91dHB1dAogICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIEFsc28gdGhpcyBpcyB0aGUgaGFuZGxlCiAgICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydE91dHB1dCBwYXJhbWV0ZXIKICAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBzb3VyY2UgZm9yIHRoZSB0dW5uZWwuIFRoaXMgaXMgdGhlIGNvbXBvbmVudCBoYW5kbGUKLSAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uICBUaGVyZSBpcyBhIAorICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEKICAgICAgICAgcmVxdWlyZW1lbnQgdGhhdCBoT3V0cHV0IGJlIHRoZSBzb3VyY2UgZm9yIHRoZSBkYXRhIHdoZW4KICAgICAgICAgdHVuZWxsaW5nIChpLmUuIG5Qb3J0T3V0cHV0IGlzIGFuIG91dHB1dCBwb3J0KS4gIElmIDB4MCwgdGhlIGNvbXBvbmVudAogICAgICAgICBzcGVjaWZpZWQgaW4gaElucHV0IHdpbGwgaGF2ZSBpdCdzIHBvcnQgc3BlY2lmaWVkIGluIG5Qb3J0SW5wdXQKICAgICAgICAgc2V0dXAgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBjbGllbnQuCiAgICAgQHBhcmFtIFtpbl0gblBvcnRPdXRwdXQKICAgICAgICAgblBvcnRPdXRwdXQgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHNvdXJjZSBwb3J0IG9uIGNvbXBvbmVudCB0byBiZQotICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuIAorICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuCiAgICAgQHBhcmFtIFtpbl0gaElucHV0CiAgICAgICAgIFRoaXMgaXMgdGhlIGNvbXBvbmVudCB0byBzZXR1cCB0aGUgdHVubmVsIHdpdGguIFRoaXMgaXMgdGhlIGhhbmRsZQogICAgICAgICBvZiB0aGUgY29tcG9uZW50IHdob3NlIHBvcnQsIHNwZWNpZmllZCBpbiB0aGUgblBvcnRJbnB1dCBwYXJhbWV0ZXIKICAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQotICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCisgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLiAgVGhlcmUgaXMgYQogICAgICAgICByZXF1aXJlbWVudCB0aGF0IGhJbnB1dCBiZSB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBkYXRhIHdoZW4KICAgICAgICAgdHVuZWxsaW5nIChpLmUuIG5Qb3J0SW51dCBpcyBhbiBpbnB1dCBwb3J0KS4gICBJZiAweDAsIHRoZSBjb21wb25lbnQKICAgICAgICAgc3BlY2lmaWVkIGluIGhPdXRwdXQgd2lsbCBoYXZlIGl0J3MgcG9ydCBzcGVjaWZpZWQgaW4gblBvcnRQT3V0cHV0CkBAIC0xMzU5LDkgKzEzNTksOSBAQAogICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQogICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCiAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgotICAgICAgICBXaGVuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLCBvbmUgb3IgYm90aCBjb21wb25lbnRzIGlzIAorICAgICAgICBXaGVuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLCBvbmUgb3IgYm90aCBjb21wb25lbnRzIGlzCiAgICAgICAgIGEgbm9uLWludGVyb3AgY29tcG9uZW50IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHR1bm5lbGluZy4KLSAgICAgICAgCisKICAgICAgICAgT24gZmFpbHVyZSwgdGhlIHBvcnRzIG9mIGJvdGggY29tcG9uZW50cyBhcmUgc2V0dXAgZm9yIGNvbW11bmljYXRpb24KICAgICAgICAgd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCiAgICAgQGluZ3JvdXAgY29yZSB0dW4KQEAgLTEzNzEsNTAgKzEzNzEsNTAgQEAKICAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRPdXRwdXQsCiAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoSW5wdXQsCiAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5wdXQpOwotICAgIAorCiAvKiogQGluZ3JvdXAgY3AgKi8KIE9NWF9BUEkgT01YX0VSUk9SVFlQRSAgIE9NWF9HZXRDb250ZW50UGlwZSgKICAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFICpoUGlwZSwKICAgICBPTVhfSU4gT01YX1NUUklORyBzelVSSSk7CiAKIC8qKiBUaGUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyB0aGF0IHN1cHBvcnQgdGhlIGdpdmVuCi0gICAgcm9sZSBhbmQgKGlmIHRoZSBjb21wTmFtZXMgZmllbGQgaXMgbm9uLU5VTEwpIHRoZSBuYW1lcyBvZiB0aG9zZSBjb21wb25lbnRzLiBUaGUgY2FsbCB3aWxsIGZhaWwgaWYgCisgICAgcm9sZSBhbmQgKGlmIHRoZSBjb21wTmFtZXMgZmllbGQgaXMgbm9uLU5VTEwpIHRoZSBuYW1lcyBvZiB0aG9zZSBjb21wb25lbnRzLiBUaGUgY2FsbCB3aWxsIGZhaWwgaWYKICAgICBhbiBpbnN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBvZiBuYW1lcyBpcyBzdXBwbGllZC4gVG8gZW5zdXJlIHRoZSBhcnJheSBpcyBzdWZmaWNpZW50bHkgc2l6ZWQgdGhlCiAgICAgY2xpZW50IHNob3VsZDoKICAgICAgICAgKiBmaXJzdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgY29tcE5hbWVzIGZpZWxkIE5VTEwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY29tcG9uZW50IG5hbWVzCi0gICAgICAgICogc2Vjb25kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb21wTmFtZXMgZmllbGQgcG9pbnRpbmcgdG8gYW4gYXJyYXkgb2YgbmFtZXMgYWxsb2NhdGVkIAorICAgICAgICAqIHNlY29uZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgY29tcE5hbWVzIGZpZWxkIHBvaW50aW5nIHRvIGFuIGFycmF5IG9mIG5hbWVzIGFsbG9jYXRlZAogICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmaXJzdCBjYWxsLgogCiAgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgotICAgIAorCiAgICAgQHBhcmFtIFtpbl0gcm9sZQotICAgICAgICBUaGlzIGlzIGdlbmVyaWMgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUgY29uc2lzdGluZyBvbmx5IG9mIGNvbXBvbmVudCBjbGFzcyAKKyAgICAgICAgVGhpcyBpcyBnZW5lcmljIHN0YW5kYXJkIGNvbXBvbmVudCBuYW1lIGNvbnNpc3Rpbmcgb25seSBvZiBjb21wb25lbnQgY2xhc3MKICAgICAgICAgbmFtZSBhbmQgdGhlIHR5cGUgd2l0aGluIHRoYXQgY2xhc3MgKGUuZy4gJ2F1ZGlvX2RlY29kZXIuYWFjJykuCiAgICAgQHBhcmFtIFtpbm91dF0gcE51bUNvbXBzCi0gICAgICAgIFRoaXMgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQuIAotIAorICAgICAgICBUaGlzIGlzIHVzZWQgYm90aCBhcyBpbnB1dCBhbmQgb3V0cHV0LgorCiAgICAgICAgIElmIGNvbXBOYW1lcyBpcyBOVUxMLCB0aGUgaW5wdXQgaXMgaWdub3JlZCBhbmQgdGhlIG91dHB1dCBzcGVjaWZpZXMgaG93IG1hbnkgY29tcG9uZW50cyBzdXBwb3J0CiAgICAgICAgIHRoZSBnaXZlbiByb2xlLgotICAgICAKLSAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCisKKyAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQKICAgICAgICAgb24gb3V0cHV0LCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHN0cmluZyBuYW1lcyBsaXN0ZWQgd2l0aGluIHRoZSBjb21wTmFtZXMgcGFyYW1ldGVyLgogICAgIEBwYXJhbSBbaW5vdXRdIGNvbXBOYW1lcwotICAgICAgICBJZiBOVUxMIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gSWYgbm9uLU5VTEwgdGhpcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgMTI4LWJ5dGUgc3RyaW5ncyB3aGljaCBhY2NlcHRzIAotICAgICAgICBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCBwaHlzaWNhbCBjb21wb25lbnRzIHRoYXQgaW1wbGVtZW50IHRoZSBzcGVjaWZpZWQgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUuIAorICAgICAgICBJZiBOVUxMIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gSWYgbm9uLU5VTEwgdGhpcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgMTI4LWJ5dGUgc3RyaW5ncyB3aGljaCBhY2NlcHRzCisgICAgICAgIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHBoeXNpY2FsIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBjb21wb25lbnQgbmFtZS4KICAgICAgICAgRWFjaCBuYW1lIGlzIE5VTEwgdGVybWluYXRlZC4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCiAgICAgQGluZ3JvdXAgY29yZQogICovCi1PTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgKCAKLQlPTVhfSU4gICAgICBPTVhfU1RSSU5HIHJvbGUsCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldENvbXBvbmVudHNPZlJvbGUgKAorICAgIE9NWF9JTiAgICAgIE9NWF9TVFJJTkcgcm9sZSwKICAgICBPTVhfSU5PVVQgICBPTVhfVTMyICpwTnVtQ29tcHMsCiAgICAgT01YX0lOT1VUICAgT01YX1U4ICAqKmNvbXBOYW1lcyk7CiAKIC8qKiBUaGUgT01YX0dldFJvbGVzT2ZDb21wb25lbnQgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3VwcG9ydGVkIGJ5IHRoZSBnaXZlbgotICAgIGNvbXBvbmVudCBhbmQgKGlmIHRoZSByb2xlcyBmaWVsZCBpcyBub24tTlVMTCkgdGhlIG5hbWVzIG9mIHRob3NlIHJvbGVzLiBUaGUgY2FsbCB3aWxsIGZhaWwgaWYgCisgICAgY29tcG9uZW50IGFuZCAoaWYgdGhlIHJvbGVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2Ugcm9sZXMuIFRoZSBjYWxsIHdpbGwgZmFpbCBpZgogICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKICAgICBjbGllbnQgc2hvdWxkOgogICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBOVUxMIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHJvbGUgbmFtZXMKLSAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIHJvbGVzIGZpZWxkIHBvaW50aW5nIHRvIGFuIGFycmF5IG9mIG5hbWVzIGFsbG9jYXRlZCAKKyAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIHJvbGVzIGZpZWxkIHBvaW50aW5nIHRvIGFuIGFycmF5IG9mIG5hbWVzIGFsbG9jYXRlZAogICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmaXJzdCBjYWxsLgogCiAgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgpAQCAtMTQyMiwyMCArMTQyMiwyMCBAQAogICAgIEBwYXJhbSBbaW5dIGNvbXBOYW1lCiAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBiZWluZyBxdWVyaWVkIGFib3V0LgogICAgIEBwYXJhbSBbaW5vdXRdIHBOdW1Sb2xlcwotICAgICAgICBUaGlzIGlzIHVzZWQgYm90aCBhcyBpbnB1dCBhbmQgb3V0cHV0LiAKLSAKKyAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4KKwogICAgICAgICBJZiByb2xlcyBpcyBOVUxMLCB0aGUgaW5wdXQgaXMgaWdub3JlZCBhbmQgdGhlIG91dHB1dCBzcGVjaWZpZXMgaG93IG1hbnkgcm9sZXMgdGhlIGNvbXBvbmVudCBzdXBwb3J0cy4KLSAgICAgCi0gICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kIAorCisgICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kCiAgICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIHJvbGVzIHBhcmFtZXRlci4KICAgICBAcGFyYW0gW291dF0gcm9sZXMKLSAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3MgCi0gICAgICAgIHdoaWNoIGFjY2VwdHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgc3RhbmRhcmQgY29tcG9uZW50cyByb2xlcyBpbXBsZW1lbnRlZCBvbiB0aGUgCisgICAgICAgIElmIE5VTEwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBJZiBub24tTlVMTCB0aGlzIHBvaW50cyB0byBhbiBhcnJheSBvZiAxMjgtYnl0ZSBzdHJpbmdzCisgICAgICAgIHdoaWNoIGFjY2VwdHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgc3RhbmRhcmQgY29tcG9uZW50cyByb2xlcyBpbXBsZW1lbnRlZCBvbiB0aGUKICAgICAgICAgc3BlY2lmaWVkIGNvbXBvbmVudCBuYW1lLiBudW1Db21wcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBuYW1lcy4KICAgICBAaW5ncm91cCBjb3JlCiAgKi8KLU9NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCAoIAotCU9NWF9JTiAgICAgIE9NWF9TVFJJTkcgY29tcE5hbWUsIAorT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9HZXRSb2xlc09mQ29tcG9uZW50ICgKKyAgICBPTVhfSU4gICAgICBPTVhfU1RSSU5HIGNvbXBOYW1lLAogICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Sb2xlcywKICAgICBPTVhfT1VUICAgICBPTVhfVTggKipyb2xlcyk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSVZDb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSVZDb21tb24uaAppbmRleCA1ZjllOWI2Li5hNWI5ZDE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0lWQ29tbW9uLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JVkNvbW1vbi5oCkBAIC04NDUsNyArODQ1LDcgQEAKIHR5cGVkZWYgZW51bSBPTVhfTUVURVJJTkdUWVBFIHsKIAogICAgIE9NWF9NZXRlcmluZ01vZGVBdmVyYWdlLCAgICAgLyoqPCBDZW50ZXItd2VpZ2h0ZWQgYXZlcmFnZSBtZXRlcmluZy4gKi8KLSAgICBPTVhfTWV0ZXJpbmdNb2RlU3BvdCwgIAkgICAgICAvKio8IFNwb3QgKHBhcnRpYWwpIG1ldGVyaW5nLiAqLworICAgIE9NWF9NZXRlcmluZ01vZGVTcG90LCAgICAgICAgLyoqPCBTcG90IChwYXJ0aWFsKSBtZXRlcmluZy4gKi8KICAgICBPTVhfTWV0ZXJpbmdNb2RlTWF0cml4LCAgICAgIC8qKjwgTWF0cml4IG9yIGV2YWx1YXRpdmUgbWV0ZXJpbmcuICovCiAKICAgICBPTVhfTWV0ZXJpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KQEAgLTg2MCwxMSArODYwLDExIEBACiAgICAgT01YX01FVEVSSU5HVFlQRSBlTWV0ZXJpbmc7CiAgICAgT01YX1MzMiB4RVZDb21wZW5zYXRpb247ICAgICAgLyoqPCBGaXhlZCBwb2ludCB2YWx1ZSBzdG9yZWQgYXMgUTE2ICovCiAgICAgT01YX1UzMiBuQXBlcnR1cmVGTnVtYmVyOyAgICAgLyoqPCBlLmcuIG5BcGVydHVyZUZOdW1iZXIgPSAyIGltcGxpZXMgImYvMiIgLSBRMTYgZm9ybWF0ICovCi0gICAgT01YX0JPT0wgYkF1dG9BcGVydHVyZTsJCS8qKjwgV2hldGhlciBhcGVydHVyZSBudW1iZXIgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCisgICAgT01YX0JPT0wgYkF1dG9BcGVydHVyZTsgICAgICAgLyoqPCBXaGV0aGVyIGFwZXJ0dXJlIG51bWJlciBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KICAgICBPTVhfVTMyIG5TaHV0dGVyU3BlZWRNc2VjOyAgICAvKio8IFNodXR0ZXJzcGVlZCBpbiBtaWxsaXNlY29uZHMgKi8KLSAgICBPTVhfQk9PTCBiQXV0b1NodXR0ZXJTcGVlZDsJLyoqPCBXaGV0aGVyIHNodXR0ZXIgc3BlZWQgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCisgICAgT01YX0JPT0wgYkF1dG9TaHV0dGVyU3BlZWQ7ICAgLyoqPCBXaGV0aGVyIHNodXR0ZXIgc3BlZWQgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCiAgICAgT01YX1UzMiBuU2Vuc2l0aXZpdHk7ICAgICAgICAgLyoqPCBlLmcuIG5TZW5zaXRpdml0eSA9IDEwMCBpbXBsaWVzICJJU08gMTAwIiAqLwotICAgIE9NWF9CT09MIGJBdXRvU2Vuc2l0aXZpdHk7CS8qKjwgV2hldGhlciBzZW5zaXRpdml0eSBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KKyAgICBPTVhfQk9PTCBiQXV0b1NlbnNpdGl2aXR5OyAgICAvKio8IFdoZXRoZXIgc2Vuc2l0aXZpdHkgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCiB9IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEU7CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbWFnZS5oIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbWFnZS5oCmluZGV4IDQyZTM5ZWMuLjIzYTAyMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSW1hZ2UuaAorKysgYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0ltYWdlLmgKQEAgLTE2LDMwICsxNiwzMCBAQAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAvKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKICAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCiAgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCiAgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQogICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqLwogCi0vKiogCisvKioKICAqIEBmaWxlIE9NWF9JbWFnZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgSW1hZ2UgY29tcG9uZW50cyB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGFuZCAKKyAqIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBJbWFnZSBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgYW5kCiAgKiBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KICAqLwogI2lmbmRlZiBPTVhfSW1hZ2VfaApAQCAtNTEsOSArNTEsOSBAQAogCiAKIC8qKgotICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSAKLSAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZCAgCi0gKiBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKKyAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAorICogZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkKICAqLwogCiAjaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+CkBAIC02NCw4ICs2NCw4IEBACiAgKiBAewogICovCiAKLS8qKiAKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSBpbWFnZSBjb21wcmVzc2lvbiBjb2RpbmcuIAorLyoqCisgKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgaW1hZ2UgY29tcHJlc3Npb24gY29kaW5nLgogICovCiB0eXBlZGVmIGVudW0gT01YX0lNQUdFX0NPRElOR1RZUEUgewogICAgIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQsICAgICAgLyoqPCBWYWx1ZSB3aGVuIGZvcm1hdCBpcyBOL0EgKi8KQEAgLTc4LDU5ICs3OCw1OSBAQAogICAgIE9NWF9JTUFHRV9Db2RpbmdQTkcsICAgICAgICAgLyoqPCBQTkcgaW1hZ2UgZm9ybWF0ICovCiAgICAgT01YX0lNQUdFX0NvZGluZ0xaVywgICAgICAgICAvKio8IExaVyBpbWFnZSBmb3JtYXQgKi8KICAgICBPTVhfSU1BR0VfQ29kaW5nQk1QLCAgICAgICAgIC8qKjwgV2luZG93cyBCaXRtYXAgZm9ybWF0ICovCi0gICAgT01YX0lNQUdFX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0lNQUdFX0NvZGluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX0lNQUdFX0NvZGluZ01heCA9IDB4N0ZGRkZGRkYKIH0gT01YX0lNQUdFX0NPRElOR1RZUEU7CiAKIAogLyoqCi0gKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGRlZmluZSBhbiBpbWFnZSBwYXRoLiBUaGUgbnVtYmVyIG9mIGltYWdlIHBhdGhzIAotICogZm9yIGlucHV0IGFuZCBvdXRwdXQgd2lsbCB2YXJ5IGJ5IHR5cGUgb2YgdGhlIGltYWdlIGNvbXBvbmVudC4gIAotICogCisgKiBEYXRhIHN0cnVjdHVyZSB1c2VkIHRvIGRlZmluZSBhbiBpbWFnZSBwYXRoLiBUaGUgbnVtYmVyIG9mIGltYWdlIHBhdGhzCisgKiBmb3IgaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgaW1hZ2UgY29tcG9uZW50LgorICoKICAqICBJbnB1dCAoYWthIFNvdXJjZSkgOiBaZXJvIElucHV0cywgb25lIE91dHB1dCwKICAqICBTcGxpdHRlciAgICAgICAgICAgOiBPbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAogICogIFByb2Nlc3NpbmcgRWxlbWVudCA6IE9uZSBJbnB1dCwgb25lIG91dHB1dCwKICAqICBNaXhlciAgICAgICAgICAgICAgOiAyIG9yIG1vcmUgaW5wdXRzLCBvbmUgb3V0cHV0LAogICogIE91dHB1dCAoYWthIFNpbmspICA6IE9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgotICogCi0gKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKLSAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0ICAKLSAqIGltYWdlIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgIAotICogYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgQ3VzdG9tQ29tbWFuZCBmdW5jdGlvbi4gICAKLSAqIENvbXBsaWFudCBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsICAKKyAqCisgKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycworICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQKKyAqIGltYWdlIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQKKyAqIGJlIHRyYW5zbWl0dGVkIHRvIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIEN1c3RvbUNvbW1hbmQgZnVuY3Rpb24uCisgKiBDb21wbGlhbnQgY29tcG9uZW50cyB3aWxsIHByZXBvcHVsYXRlIHRoaXMgc3RydWN0dXJlIHdpdGggb3B0aW1hbAogICogdmFsdWVzIGR1cmluZyB0aGUgT01YX0dldFBhcmFtZXRlcigpIGNvbW1hbmQuCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0Ci0gKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKKyAqICBwTmF0aXZlUmVuZGVyICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgZGlzcGxheSBpZiBhCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYywgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMAotICogIG5GcmFtZVdpZHRoICAgICAgICAgICA6IFdpZHRoIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuICBVc2UgMCBmb3IgCisgKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBwb3J0IGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiAgVXNlIDAgZm9yCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIHBvcnQgaWYgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgCisgKiAgbkZyYW1lSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAoaS5lLiAKKyAqICBuU3RyaWRlICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNwYW4gb2YgYW4gaW1hZ2UgKGkuZS4KICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQgZnJvbQotICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKICAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcwotICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKKyAqICBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQgOiBUdXJucyBvbiBlcnJvciBjb25jZWFsbWVudCBpZiBpdCBpcyBzdXBwb3J0ZWQgYnkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAotICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuIFdoZW4gT01YX0lNQUdFX0NvZGluZ1VudXNlZCBpcyAKKyAqICBlQ29tcHJlc3Npb25Gb3JtYXQgICAgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudC4gV2hlbiBPTVhfSU1BR0VfQ29kaW5nVW51c2VkIGlzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKICAqICBlQ29sb3JGb3JtYXQgICAgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKLSAqICBwTmF0aXZlV2luZG93ICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCisgKiAgcE5hdGl2ZVdpbmRvdyAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIHdpbmRvdyBvYmplY3QgaWYgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BPUlRERUZJTklUSU9OVFlQRSB7CiAgICAgT01YX1NUUklORyBjTUlNRVR5cGU7CiAgICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7Ci0gICAgT01YX1UzMiBuRnJhbWVXaWR0aDsgCisgICAgT01YX1UzMiBuRnJhbWVXaWR0aDsKICAgICBPTVhfVTMyIG5GcmFtZUhlaWdodDsKLSAgICBPTVhfUzMyIG5TdHJpZGU7ICAgICAKKyAgICBPTVhfUzMyIG5TdHJpZGU7CiAgICAgT01YX1UzMiBuU2xpY2VIZWlnaHQ7CiAgICAgT01YX0JPT0wgYkZsYWdFcnJvckNvbmNlYWxtZW50OwogICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKQEAgLTEzOSwxOCArMTM5LDE4IEBACiB9IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEU7CiAKIAotLyoqICAKLSAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAorLyoqCisgKiBQb3J0IGZvcm1hdCBwYXJhbWV0ZXIuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVudW1lcmF0ZSB0aGUgdmFyaW91cwogICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KLSAqIAorICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwogICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KICAqICBuUG9ydEluZGV4ICAgICAgICAgOiBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQKLSAqICBuSW5kZXggICAgICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gCisgKiAgbkluZGV4ICAgICAgICAgICAgIDogSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tCiAgKiAgICAgICAgICAgICAgICAgICAgICAgMHgwIHRvIE4tMQotICogIGVDb21wcmVzc2lvbkZvcm1hdCA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfSU1BR0VfQ29kaW5nVW51c2VkIGlzIHNwZWNpZmllZCwgCisgKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuIFdoZW4gT01YX0lNQUdFX0NvZGluZ1VudXNlZCBpcyBzcGVjaWZpZWQsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgZUNvbG9yRm9ybWF0IGlzIHZhbGlkCiAgKiAgZUNvbG9yRm9ybWF0ICAgICAgIDogRGVjb21wcmVzc2VkIGZvcm1hdCB1c2VkIGJ5IHRoaXMgY29tcG9uZW50CiAgKi8KQEAgLTE2NCw4ICsxNjQsOCBAQAogfSBPTVhfSU1BR0VfUEFSQU1fUE9SVEZPUk1BVFRZUEU7CiAKIAotLyoqIAotICogRmxhc2ggY29udHJvbCB0eXBlIAorLyoqCisgKiBGbGFzaCBjb250cm9sIHR5cGUKICAqCiAgKiBFTlVNUwogICogIFRvcmNoIDogRmxhc2ggZm9yY2VkIGNvbnN0YW50bHkgb24KQEAgLTE3NywxNCArMTc3LDE0IEBACiAgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbFJlZEV5ZVJlZHVjdGlvbiwKICAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sRmlsbGluLAogICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xUb3JjaCwKLSAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRTsKIAogCi0vKiogCi0gKiBGbGFzaCBjb250cm9sIGNvbmZpZ3VyYXRpb24gCisvKioKKyAqIEZsYXNoIGNvbnRyb2wgY29uZmlndXJhdGlvbgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKQEAgLTIwMCwyOSArMjAwLDI5IEBACiB9IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFOwogCiAKLS8qKiAKLSAqIEZvY3VzIGNvbnRyb2wgdHlwZSAKKy8qKgorICogRm9jdXMgY29udHJvbCB0eXBlCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRSB7CiAgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE9uID0gMCwKICAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sT2ZmLAogICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xBdXRvLAogICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xBdXRvTG9jaywKLSAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRTsKIAotIAotLyoqIAotICogRm9jdXMgY29udHJvbCBjb25maWd1cmF0aW9uIAorCisvKioKKyAqIEZvY3VzIGNvbnRyb2wgY29uZmlndXJhdGlvbgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwogICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KICAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwogICogIGVGb2N1c0NvbnRyb2wgICA6IEZvY3VzIGNvbnRyb2wKLSAqICBuRm9jdXNTdGVwcyAgICAgOiBGb2N1cyBjYW4gdGFrZSBvbiB2YWx1ZXMgZnJvbSAwIG1tIHRvIGluZmluaXR5LiAKKyAqICBuRm9jdXNTdGVwcyAgICAgOiBGb2N1cyBjYW4gdGFrZSBvbiB2YWx1ZXMgZnJvbSAwIG1tIHRvIGluZmluaXR5LgogICogICAgICAgICAgICAgICAgICAgIEludGVyZXN0IGlzIG9ubHkgaW4gbnVtYmVyIG9mIHN0ZXBzIG92ZXIgdGhpcyByYW5nZS4KICAqICBuRm9jdXNTdGVwSW5kZXggOiBDdXJyZW50IGZvY3VzIHN0ZXAgaW5kZXgKICAqLwpAQCAtMjM2LDMwICsyMzYsMzAgQEAKIH0gT01YX0lNQUdFX0NPTkZJR19GT0NVU0NPTlRST0xUWVBFOwogCiAKLS8qKiAKKy8qKgogICogUSBGYWN0b3IgZm9yIEpQRUcgY29tcHJlc3Npb24sIHdoaWNoIGNvbnRyb2xzIHRoZSB0cmFkZW9mZiBiZXR3ZWVuIGltYWdlCiAgKiBxdWFsaXR5IGFuZCBzaXplLiAgUSBGYWN0b3IgcHJvdmlkZXMgYSBtb3JlIHNpbXBsZSBtZWFucyBvZiBjb250cm9sbGluZwogICogSlBFRyBjb21wcmVzc2lvbiBxdWFsaXR5LCB3aXRob3V0IGRpcmVjdGx5IHByb2dyYW1taW5nIFF1YW50aXphdGlvbgotICogdGFibGVzIGZvciBjaHJvbWEgYW5kIGx1bWEgCisgKiB0YWJsZXMgZm9yIGNocm9tYSBhbmQgbHVtYQogICoKICAqIFNUUlVDVCBNRU1CRVJTOgotICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKLSAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCi0gKiAgblFGYWN0b3IgICA6IEpQRUcgUSBmYWN0b3IgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIDEtMTAwLiBBIGZhY3RvciBvZiAxIAotICogICAgICAgICAgICAgICBwcm9kdWNlcyB0aGUgc21hbGxlc3QsIHdvcnN0IHF1YWxpdHkgaW1hZ2VzLCBhbmQgYSBmYWN0b3IgCi0gKiAgICAgICAgICAgICAgIG9mIDEwMCBwcm9kdWNlcyB0aGUgbGFyZ2VzdCwgYmVzdCBxdWFsaXR5IGltYWdlcy4gIEEgCi0gKiAgICAgICAgICAgICAgIHR5cGljYWwgZGVmYXVsdCBpcyA3NSBmb3Igc21hbGwgZ29vZCBxdWFsaXR5IGltYWdlcyAgICAgICAgICAgICAgIAorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5RRmFjdG9yICAgOiBKUEVHIFEgZmFjdG9yIHZhbHVlIGluIHRoZSByYW5nZSBvZiAxLTEwMC4gQSBmYWN0b3Igb2YgMQorICogICAgICAgICAgICAgICBwcm9kdWNlcyB0aGUgc21hbGxlc3QsIHdvcnN0IHF1YWxpdHkgaW1hZ2VzLCBhbmQgYSBmYWN0b3IKKyAqICAgICAgICAgICAgICAgb2YgMTAwIHByb2R1Y2VzIHRoZSBsYXJnZXN0LCBiZXN0IHF1YWxpdHkgaW1hZ2VzLiAgQQorICogICAgICAgICAgICAgICB0eXBpY2FsIGRlZmF1bHQgaXMgNzUgZm9yIHNtYWxsIGdvb2QgcXVhbGl0eSBpbWFnZXMKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKLSAgICBPTVhfVTMyIG5RRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUUZhY3RvcjsKIH0gT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFOwogCi0vKiogCi0gKiBRdWFudGl6YXRpb24gdGFibGUgdHlwZSAKKy8qKgorICogUXVhbnRpemF0aW9uIHRhYmxlIHR5cGUKICAqLwogCiB0eXBlZGVmIGVudW0gT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7CkBAIC0yNjcsMjcgKzI2NywyNyBAQAogICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYSwKICAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWFDYiwKICAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWFDciwKLSAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9JTUFHRV9RVUFOVElaQVRJT05UQUJMRVRZUEU7CiAKLS8qKiAKKy8qKgogICogSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB1c2VkIHRvIGRldGVybWluZSBEQ1QgY29tcHJlc3Npb24gZm9yCi0gKiBZVVYgZGF0YSwgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyBRIGZhY3RvciwgcHJvdmlkaW5nIGV4YWN0IAotICogY29udHJvbCBvZiBjb21wcmVzc2lvbiAKKyAqIFlVViBkYXRhLCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIFEgZmFjdG9yLCBwcm92aWRpbmcgZXhhY3QKKyAqIGNvbnRyb2wgb2YgY29tcHJlc3Npb24KICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KICAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCiAgKiAgZVF1YW50aXphdGlvblRhYmxlICAgICAgOiBRdWFudGl6YXRpb24gdGFibGUgdHlwZQotICogIG5RdWFudGl6YXRpb25NYXRyaXhbNjRdIDogSlBFRyBxdWFudGl6YXRpb24gdGFibGUgb2YgY29lZmZpY2llbnRzIHN0b3JlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGluY3JlYXNpbmcgY29sdW1ucyB0aGVuIGJ5IHJvd3Mgb2YgZGF0YSAoaS5lLiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyAxLCAuLi4gcm93IDgpLiBRdWFudGl6YXRpb24gdmFsdWVzIGFyZSBpbiAKKyAqICBuUXVhbnRpemF0aW9uTWF0cml4WzY0XSA6IEpQRUcgcXVhbnRpemF0aW9uIHRhYmxlIG9mIGNvZWZmaWNpZW50cyBzdG9yZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGluY3JlYXNpbmcgY29sdW1ucyB0aGVuIGJ5IHJvd3Mgb2YgZGF0YSAoaS5lLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDEsIC4uLiByb3cgOCkuIFF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGluCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmFuZ2UgMC0yNTUgYW5kIHN0b3JlZCBpbiBsaW5lYXIgb3JkZXIKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHRoZSBjb21wb25lbnQgd2lsbCB6aWctemFnIHRoZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbiB0YWJsZSBkYXRhIGlmIHJlcXVpcmVkIGludGVybmFsbHkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhlIGNvbXBvbmVudCB3aWxsIHppZy16YWcgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gdGFibGUgZGF0YSBpZiByZXF1aXJlZCBpbnRlcm5hbGx5KQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fUVVBTlRJWkFUSU9OVEFCTEVUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOwpAQCAtMjk4LDkgKzI5OCw5IEBACiB9IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEU7CiAKIAotLyoqIAotICogSHVmZm1hbiB0YWJsZSB0eXBlLCB0aGUgc2FtZSBIdWZmbWFuIHRhYmxlIGlzIGFwcGxpZWQgZm9yIGNocm9tYSBhbmQgCi0gKiBsdW1hIGNvbXBvbmVudCAKKy8qKgorICogSHVmZm1hbiB0YWJsZSB0eXBlLCB0aGUgc2FtZSBIdWZmbWFuIHRhYmxlIGlzIGFwcGxpZWQgZm9yIGNocm9tYSBhbmQKKyAqIGx1bWEgY29tcG9uZW50CiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfSU1BR0VfSFVGRk1BTlRBQkxFVFlQRSB7CiAgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDID0gMCwKQEAgLTMwOSwyMyArMzA5LDIzIEBACiAgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDQ2hyb21hLAogICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0x1bWEsCiAgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDQ2hyb21hLAotICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFOwogCi0vKiogCi0gKiBKUEVHIEh1ZmZtYW4gdGFibGUgCisvKioKKyAqIEpQRUcgSHVmZm1hbiB0YWJsZQogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwogICogIGVIdWZmbWFuVGFibGUgICAgICAgICAgICAgICAgICAgIDogSHVmZm1hbiB0YWJsZSB0eXBlCi0gKiAgbk51bWJlck9mSHVmZm1hbkNvZGVPZkxlbmd0aFsxNl0gOiAwLTE2LCBudW1iZXIgb2YgSHVmZm1hbiBjb2RlcyBvZiBlYWNoIAorICogIG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdIDogMC0xNiwgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZXMgb2YgZWFjaAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgbGVuZ3RoCi0gKiAgbkh1ZmZtYW5UYWJsZVsyNTZdICAgICAgICAgICAgICAgOiAwLTI1NSwgdGhlIHNpemUgdXNlZCBmb3IgQUMgYW5kIERDIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlIGFyZSAxNiBhbmQgMTYyIAorICogIG5IdWZmbWFuVGFibGVbMjU2XSAgICAgICAgICAgICAgIDogMC0yNTUsIHRoZSBzaXplIHVzZWQgZm9yIEFDIGFuZCBEQworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlIGFyZSAxNiBhbmQgMTYyCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9IVUZGTUFOVFRBQkxFVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSW5kZXguaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSW5kZXguaAppbmRleCBiZTlhMWE2Li4xYTJhNTQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0luZGV4LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbmRleC5oCkBAIC0xNiwyNSArMTYsMjUgQEAKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKICAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCiAgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCiAgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQogICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCiAgKi8KIApAQCAtNTEsMjUgKzUxLDIzIEBACiBleHRlcm4gIkMiIHsKICNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCi0KIC8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKICAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKLSAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseQogICovCiAjaW5jbHVkZSA8T01YX1R5cGVzLmg+CiAKLQogLyoqIFRoZSBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc2VsZWN0IGEgc3RydWN0dXJlIHdoZW4gZWl0aGVyCi0gKiAgZ2V0dGluZyBvciBzZXR0aW5nIHBhcmFtZXRlcnMgYW5kL29yIGNvbmZpZ3VyYXRpb24gZGF0YS4gIEVhY2ggZW50cnkgaW4gCi0gKiAgdGhpcyBlbnVtZXJhdGlvbiBtYXBzIHRvIGFuIE9NWCBzcGVjaWZpZWQgc3RydWN0dXJlLiAgV2hlbiB0aGUgCisgKiAgZ2V0dGluZyBvciBzZXR0aW5nIHBhcmFtZXRlcnMgYW5kL29yIGNvbmZpZ3VyYXRpb24gZGF0YS4gIEVhY2ggZW50cnkgaW4KKyAqICB0aGlzIGVudW1lcmF0aW9uIG1hcHMgdG8gYW4gT01YIHNwZWNpZmllZCBzdHJ1Y3R1cmUuICBXaGVuIHRoZQogICogIE9NWF9HZXRQYXJhbWV0ZXIsIE9NWF9TZXRQYXJhbWV0ZXIsIE9NWF9HZXRDb25maWcgb3IgT01YX1NldENvbmZpZyBtZXRob2RzCiAgKiAgYXJlIHVzZWQsIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHdpbGwgYWx3YXlzIGJlIGFuIGVudHJ5IGZyb20gdGhpcyBlbnVtZXJhdGlvbgogICogIGFuZCB0aGUgdGhpcmQgZW50cnkgd2lsbCBiZSB0aGUgc3RydWN0dXJlIHNob3duIGluIHRoZSBjb21tZW50cyBmb3IgdGhlIGVudHJ5LgotICogIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6aW5nIGEgY3JvcHBpbmcgZnVuY3Rpb24sIHRoZSAKLSAqICBPTVhfU2V0Q29uZmlnIGNvbW1hbmQgd291bGQgaGF2ZSBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgCi0gKiAgYW5kIHdvdWxkIHNlbmQgYSBwb2ludGVyIHRvIGFuIGluaXRpYWxpemVkIE9NWF9SRUNUVFlQRSBzdHJ1Y3R1cmUgYXMgdGhlIAorICogIEZvciBleGFtcGxlLCBpZiB0aGUgYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6aW5nIGEgY3JvcHBpbmcgZnVuY3Rpb24sIHRoZQorICogIE9NWF9TZXRDb25maWcgY29tbWFuZCB3b3VsZCBoYXZlIE9NWF9JbmRleENvbmZpZ0NvbW1vbklucHV0Q3JvcCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlcgorICogIGFuZCB3b3VsZCBzZW5kIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBPTVhfUkVDVFRZUEUgc3RydWN0dXJlIGFzIHRoZQogICogIHRoaXJkIHBhcmFtZXRlci4KLSAqICAKKyAqCiAgKiAgVGhlIGVudW1lcmF0aW9uIGVudHJpZXMgbmFtZWQgd2l0aCB0aGUgT01YX0NvbmZpZyBwcmVmaXggYXJlIHNlbnQgdXNpbmcKICAqICB0aGUgT01YX1NldENvbmZpZyBjb21tYW5kIGFuZCB0aGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZQogICogIE9NWF9QQVJBTV8gcHJlZml4IGFyZSBzZW50IHVzaW5nIHRoZSBPTVhfU2V0UGFyYW1ldGVyIGNvbW1hbmQuCkBAIC04NiwxMSArODQsMTEgQEAKICAgICBPTVhfSW5kZXhQYXJhbUFjdGl2ZVN0cmVhbSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9VMzJUWVBFICovCiAgICAgT01YX0luZGV4UGFyYW1TdXNwZW5zaW9uUG9saWN5LCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU1VTUEVOU0lPTlBPTElDWVRZUEUgKi8KICAgICBPTVhfSW5kZXhQYXJhbUNvbXBvbmVudFN1c3BlbmRlZCwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleENvbmZpZ0NhcHR1cmluZywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CT09MRUFOVFlQRSAqLyAKLSAgICBPTVhfSW5kZXhDb25maWdDYXB0dXJlTW9kZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFICovIAotICAgIE9NWF9JbmRleEF1dG9QYXVzZUFmdGVyQ2FwdHVyZSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CT09MRUFOVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhDb25maWdDYXB0dXJpbmcsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDYXB0dXJlTW9kZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFICovCisgICAgT01YX0luZGV4QXV0b1BhdXNlQWZ0ZXJDYXB0dXJlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovCiAgICAgT01YX0luZGV4UGFyYW1Db250ZW50VVJJLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFVSSVRZUEUgKi8KLSAgICBPTVhfSW5kZXhQYXJhbUN1c3RvbUNvbnRlbnRQaXBlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUgKi8gCisgICAgT01YX0luZGV4UGFyYW1DdXN0b21Db250ZW50UGlwZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFICovCiAgICAgT01YX0luZGV4UGFyYW1EaXNhYmxlUmVzb3VyY2VDb25jZWFsbWVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRSAqLwogICAgIE9NWF9JbmRleENvbmZpZ01ldGFkYXRhSXRlbUNvdW50LCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NRVRBREFUQUlURU1DT1VOVFRZUEUgKi8KICAgICBPTVhfSW5kZXhDb25maWdDb250YWluZXJOb2RlQ291bnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRSAqLwpAQCAtMTAzLDcgKzEwMSw3IEBACiAKICAgICBPTVhfSW5kZXhQb3J0U3RhcnRVbnVzZWQgPSAweDAyMDAwMDAwLAogICAgIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqLwotICAgIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgKi8KICAgICBPTVhfSW5kZXhSZXNlcnZlZFN0YXJ0VW51c2VkID0gMHgwMzAwMDAwMCwKIAogICAgIC8qIEF1ZGlvIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCkBAIC0yNTYsMTAgKzI1NCwxMCBAQAogICAgIE9NWF9JbmRleENvbmZpZ1RpbWVTZWVrTW9kZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSAqLwogCiAKLSAgICBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0luZGV4S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgLyogVmVuZG9yIHNwZWNpZmljIGFyZWEgKi8KICAgICBPTVhfSW5kZXhWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsCi0gICAgLyogVmVuZG9yIHNwZWNpZmljIHN0cnVjdHVyZXMgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBvZiAweDdGMDAwMDAwIAorICAgIC8qIFZlbmRvciBzcGVjaWZpYyBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg3RjAwMDAwMAogICAgICAgIHRvIDB4N0ZGRkZGRkUuICBUaGlzIHJhbmdlIGlzIG5vdCBicm9rZW4gb3V0IGJ5IHZlbmRvciwgc28KICAgICAgICBwcml2YXRlIGluZGV4ZXMgYXJlIG5vdCBndWFyYW50ZWVkIHVuaXF1ZSBhbmQgdGhlcmVmb3JlIHNob3VsZAogICAgICAgIG9ubHkgYmUgc2VudCB0byB0aGUgYXBwcm9wcmlhdGUgY29tcG9uZW50LiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oCmluZGV4IDZjZDc3NGIuLmVhM2QwZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaAorKysgYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0LmgKQEAgLTYwLDYgKzYwLDcgQEAKICAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjMywgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUMzVFlQRSAqLwogICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSAqLwogICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWFjUHJlc2VudGF0aW9uLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQUNQUkVTRU5UQVRJT05UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRFYWMzLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0VBQzNUWVBFICovCiAKICAgICAvKiBJbWFnZSBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLwogICAgIE9NWF9JbmRleEV4dEltYWdlU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA1MDAwMDAsCkBAIC04MSw2ICs4Miw3IEBACiAKICAgICAvKiBPdGhlciBjb25maWd1cmF0aW9ucyAqLwogICAgIE9NWF9JbmRleEV4dE90aGVyU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA4MDAwMDAsCisgICAgT01YX0luZGV4Q29uZmlnQXV0b0ZyYW1lcmF0ZUNvbnZlcnNpb24sICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgKi8KIAogICAgIC8qIFRpbWUgY29uZmlndXJhdGlvbnMgKi8KICAgICBPTVhfSW5kZXhFeHRUaW1lU3RhcnRVbnVzZWQgPSBPTVhfSW5kZXhLaHJvbm9zRXh0ZW5zaW9ucyArIDB4MDA5MDAwMDAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX090aGVyLmggYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX090aGVyLmgKaW5kZXggZWZiY2U4My4uNjA3MmVmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9PdGhlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfT3RoZXIuaApAQCAtMTYsMjUgKzE2LDI1IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKLSAqIAorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4KKyAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKICAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQogICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKLSAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAotICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAotICogCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCiAgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUwogICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgogICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgogICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKICAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCiAgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQotICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKgogICovCiAKQEAgLTUzLDQ2ICs1Myw0NiBAQAogCiAvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCiAgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCi0gKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkKICAqLwogCiAjaW5jbHVkZSA8T01YX0NvcmUuaD4KIAogCi0vKiogCisvKioKICAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGRhdGEgdHlwZXMgd2hpY2ggbWF0Y2ggdG8gbXVsdGlwbGUgZG9tYWlucyBvciBubwogICogZG9tYWluIGF0IGFsbC4gIEZvciB0eXBlcyB3aGljaCBhcmUgdmVuZG9yIHNwZWNpZmljLCBhIHZhbHVlIGFib3ZlCiAgKiBPTVhfT1RIRVJfVkVORE9SVFNUQVJUIHNob3VsZCBiZSB1c2VkLgogICovCiB0eXBlZGVmIGVudW0gT01YX09USEVSX0ZPUk1BVFRZUEUgewotICAgIE9NWF9PVEhFUl9Gb3JtYXRUaW1lID0gMCwgLyoqPCBUcmFuc21pc3Npb24gb2YgdmFyaW91cyB0aW1lc3RhbXBzLCBlbGFwc2VkIHRpbWUsIAorICAgIE9NWF9PVEhFUl9Gb3JtYXRUaW1lID0gMCwgLyoqPCBUcmFuc21pc3Npb24gb2YgdmFyaW91cyB0aW1lc3RhbXBzLCBlbGFwc2VkIHRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgZGVsdGFzLCBldGMgKi8KLSAgICBPTVhfT1RIRVJfRm9ybWF0UG93ZXIsICAgIC8qKjwgUGVyaGFwcyB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgcG93ZXIgCisgICAgT01YX09USEVSX0Zvcm1hdFBvd2VyLCAgICAvKio8IFBlcmhhcHMgdXNlZCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHBvd2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQsIHNldHRpbmcgY2xvY2tzPyAqLwotICAgIE9NWF9PVEhFUl9Gb3JtYXRTdGF0cywgICAgLyoqPCBDb3VsZCBiZSB0aGluZ3Mgc3VjaCBhcyBmcmFtZSByYXRlLCBmcmFtZXMgCisgICAgT01YX09USEVSX0Zvcm1hdFN0YXRzLCAgICAvKio8IENvdWxkIGJlIHRoaW5ncyBzdWNoIGFzIGZyYW1lIHJhdGUsIGZyYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wcGVkLCBldGMgKi8KICAgICBPTVhfT1RIRVJfRm9ybWF0QmluYXJ5LCAgIC8qKjwgQXJiaXRyYXJ5IGJpbmFyeSBkYXRhICovCi0gICAgT01YX09USEVSX0Zvcm1hdFZlbmRvclJlc2VydmVkID0gMTAwMCwgLyoqPCBTdGFydGluZyB2YWx1ZSBmb3IgdmVuZG9yIHNwZWNpZmljIAorICAgIE9NWF9PVEhFUl9Gb3JtYXRWZW5kb3JSZXNlcnZlZCA9IDEwMDAsIC8qKjwgU3RhcnRpbmcgdmFsdWUgZm9yIHZlbmRvciBzcGVjaWZpYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cyAqLwogCi0gICAgT01YX09USEVSX0Zvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfT1RIRVJfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX09USEVSX0Zvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX09USEVSX0Zvcm1hdE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX09USEVSX0ZPUk1BVFRZUEU7CiAKLS8qKiAKKy8qKgogICogRW51bWVyYXRpb24gb2Ygc2VlayBtb2Rlcy4KICAqLwogdHlwZWRlZiBlbnVtIE9NWF9USU1FX1NFRUtNT0RFVFlQRSB7CiAgICAgT01YX1RJTUVfU2Vla01vZGVGYXN0ID0gMCwgLyoqPCBQcmVmZXIgc2Vla2luZyB0byBhbiBhcHByb3hpbWF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIHJlcXVlc3RlZCBzZWVrIHBvc2l0aW9uIG92ZXIgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gb3ZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBhY3R1YWwgc2VlayBwb3NpdGlvbiBpZiBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdHMgaW4gYSBmYXN0ZXIgc2Vlay4gKi8KLSAgICBPTVhfVElNRV9TZWVrTW9kZUFjY3VyYXRlLCAvKio8IFByZWZlciBzZWVraW5nIHRvIHRoZSBhY3R1YWwgc2VlayAKKyAgICBPTVhfVElNRV9TZWVrTW9kZUFjY3VyYXRlLCAvKio8IFByZWZlciBzZWVraW5nIHRvIHRoZSBhY3R1YWwgc2VlawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBvc2l0aW9uIG92ZXIgYW4gYXBwcm94aW1hdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG9mIHRoZSByZXF1ZXN0ZWQgc2VlayBwb3NpdGlvbiBldmVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgaXQgcmVzdWx0cyBpbiBhIHNsb3dlciBzZWVrLiAqLwotICAgIE9NWF9USU1FX1NlZWtNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9USU1FX1NlZWtNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1RJTUVfU2Vla01vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9USU1FX1NlZWtNb2RlTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfVElNRV9TRUVLTU9ERVRZUEU7CkBAIC0xMDQsNDIgKzEwNCw0MiBAQAogICAgIE9NWF9USU1FX1NFRUtNT0RFVFlQRSBlVHlwZTsgICAgLyoqPCBUaGUgc2VlayBtb2RlICovCiB9IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEU7CiAKLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgdGltZSBzdGFtcCB1c2VkIHdpdGggdGhlIGZvbGxvd2luZyBjb25maWdzIAorLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0aW1lIHN0YW1wIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZ3MKICAqIG9uIHRoZSBDbG9jayBDb21wb25lbnQgKENDKToKLSAqIAotICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRXYWxsVGltZTogcXVlcnkgb2YgdGhlIENDknMgY3VycmVudCB3YWxsICAKKyAqCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lOiBxdWVyeSBvZiB0aGUgQ0MncyBjdXJyZW50IHdhbGwKICAqICAgICB0aW1lCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudE1lZGlhVGltZTogcXVlcnkgb2YgdGhlIENDknMgY3VycmVudCBtZWRpYQorICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWU6IHF1ZXJ5IG9mIHRoZSBDQydzIGN1cnJlbnQgbWVkaWEKICAqICAgICB0aW1lCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlIGFuZCAgCi0gKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlOiBhdWRpby92aWRlbyByZWZlcmVuY2UgCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlIGFuZAorICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZTogYXVkaW8vdmlkZW8gcmVmZXJlbmNlCiAgKiAgICAgY2xvY2sgc2VuZGluZyBTQyBpdHMgcmVmZXJlbmNlIHRpbWUKLSAqIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWU6IGEgQ2xvY2sgQ29tcG9uZW50IGNsaWVudCBzZW5kcyAKLSAqICAgICB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZyBvbiBpdHMgCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lOiBhIENsb2NrIENvbXBvbmVudCBjbGllbnQgc2VuZHMKKyAqICAgICB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZyBvbiBpdHMKICAqICAgICBjbGllbnQgcG9ydCB3aGVuIGl0IHJlY2VpdmVzIGEgYnVmZmVyIHdpdGgKICAqICAgICBPTVhfQlVGRkVSRkxBR19TVEFSVFRJTUUgc2V0LiBJdCBtdXN0IHVzZSB0aGUgdGltZXN0YW1wCi0gKiAgICAgc3BlY2lmaWVkIGJ5IHRoYXQgYnVmZmVyIGZvciBuU3RhcnRUaW1lc3RhbXAuIAorICogICAgIHNwZWNpZmllZCBieSB0aGF0IGJ1ZmZlciBmb3IgblN0YXJ0VGltZXN0YW1wLgogICoKLSAqIEl0knMgYWxzbyB1c2VkIHdpdGggdGhlIGZvbGxvd2luZyBjb25maWcgb24gY29tcG9uZW50cyBpbiBnZW5lcmFsOgorICogSXQncyBhbHNvIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZyBvbiBjb21wb25lbnRzIGluIGdlbmVyYWw6CiAgKgotICogT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uOiBJTCBjbGllbnQgcXVlcnlpbmcgY29tcG9uZW50IHBvc2l0aW9uIAorICogT01YX0luZGV4Q29uZmlnVGltZVBvc2l0aW9uOiBJTCBjbGllbnQgcXVlcnlpbmcgY29tcG9uZW50IHBvc2l0aW9uCiAgKiAoR2V0Q29uZmlnKSBvciBjb21tYW5kaW5nIGEgY29tcG9uZW50IHRvIHNlZWsgdG8gdGhlIGdpdmVuIGxvY2F0aW9uCiAgKiAoU2V0Q29uZmlnKQotICovCQorICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluZm9ybWF0aW9uICovCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9USUNLUyBuVGltZXN0YW1wOyAgCSAgICAgLyoqPCB0aW1lc3RhbXAgLiovIAotfSBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRTsgIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9USUNLUyBuVGltZXN0YW1wOyAgICAgICAgLyoqPCB0aW1lc3RhbXAgLiovCit9IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFOwogCiAvKiogRW51bWVyYXRpb24gb2YgcG9zc2libGUgcmVmZXJlbmNlIGNsb2NrcyB0byB0aGUgbWVkaWEgdGltZS4gKi8KIHR5cGVkZWYgZW51bSBPTVhfVElNRV9VUERBVEVUWVBFIHsKICAgICAgIE9NWF9USU1FX1VwZGF0ZVJlcXVlc3RGdWxmaWxsbWVudCwgICAgLyoqPCBVcGRhdGUgaXMgdGhlIGZ1bGZpbGxtZW50IG9mIGEgbWVkaWEgdGltZSByZXF1ZXN0LiAqLwotICAgICAgT01YX1RJTUVfVXBkYXRlU2NhbGVDaGFuZ2VkLAkgICAgICAgIC8qKjwgVXBkYXRlIHdhcyBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgc2NhbGUgY2hhZ25lZC4gKi8KKyAgICAgIE9NWF9USU1FX1VwZGF0ZVNjYWxlQ2hhbmdlZCwgICAgICAgICAgLyoqPCBVcGRhdGUgd2FzIGdlbmVyYXRlZCBiZWNhdXNlIHRoZSBzY2FsZSBjaGFnbmVkLiAqLwogICAgICAgT01YX1RJTUVfVXBkYXRlQ2xvY2tTdGF0ZUNoYW5nZWQsICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIGNsb2NrIHN0YXRlIGNoYW5nZWQuICovCi0gICAgICBPTVhfVElNRV9VcGRhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgICBPTVhfVElNRV9VcGRhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICAgIE9NWF9USU1FX1VwZGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgICBPTVhfVElNRV9VcGRhdGVNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9USU1FX1VQREFURVRZUEU7CkBAIC0xNDcsOSArMTQ3LDkgQEAKIC8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwogdHlwZWRlZiBlbnVtIE9NWF9USU1FX1JFRkNMT0NLVFlQRSB7CiAgICAgICBPTVhfVElNRV9SZWZDbG9ja05vbmUsICAgIC8qKjwgVXNlIG5vIHJlZmVyZW5jZXMuICovCi0gICAgICBPTVhfVElNRV9SZWZDbG9ja0F1ZGlvLAkvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja0F1ZGlvLCAgIC8qKjwgVXNlIHJlZmVyZW5jZXMgc2VudCB0aHJvdWdoIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50QXVkaW9SZWZlcmVuY2UgKi8KICAgICAgIE9NWF9USU1FX1JlZkNsb2NrVmlkZW8sICAgLyoqPCBVc2UgcmVmZXJlbmNlcyBzZW50IHRocm91Z2ggT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRWaWRlb1JlZmVyZW5jZSAqLwotICAgICAgT01YX1RJTUVfUmVmQ2xvY2tLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgICBPTVhfVElNRV9SZWZDbG9ja0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgICAgT01YX1RJTUVfUmVmQ2xvY2tNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9USU1FX1JFRkNMT0NLVFlQRTsKQEAgLTE1NywxMSArMTU3LDExIEBACiAvKiogRW51bWVyYXRpb24gb2YgY2xvY2sgc3RhdGVzLiAqLwogdHlwZWRlZiBlbnVtIE9NWF9USU1FX0NMT0NLU1RBVEUgewogICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVJ1bm5pbmcsICAgICAgICAgICAgIC8qKjwgQ2xvY2sgcnVubmluZy4gKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVXYWl0aW5nRm9yU3RhcnRUaW1lLCAvKio8IENsb2NrIHdhaXRpbmcgdW50aWwgdGhlIAorICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUsIC8qKjwgQ2xvY2sgd2FpdGluZyB1bnRpbCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNjcmliZWQgY2xpZW50cyBlbWl0IHRoZWlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzdGFydCB0aW1lLiAqLwogICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVN0b3BwZWQsICAgICAgICAgICAgIC8qKjwgQ2xvY2sgc3RvcHBlZC4gKi8KLSAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9USU1FX0NMT0NLU1RBVEU7CkBAIC0xNzEsMTggKzE3MSwxOCBAQAogICogIEEgY2xpZW50IGNvbXBvbmVudCBzZW5kcyB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZwogICogIG9uIGl0cyBjbGllbnQgcG9ydCB0byBzcGVjaWZ5IGEgbWVkaWEgdGltZXN0YW1wIHRoZSBDbG9jayBDb21wb25lbnQKICAqICBzaG91bGQgZW1pdC4gIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIGZ1bGZpbGwgdGhlIHJlcXVlc3QgYnkgc2VuZGluZyBhCi0gKiAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB3aGVuIGl0cyBtZWRpYSBjbG9jayBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgCisgKiAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB3aGVuIGl0cyBtZWRpYSBjbG9jayBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQKICAqICB0aW1lc3RhbXAuCiAgKgogICogIFRoZSBjbGllbnQgbWF5IHJlcXVpcmUgYSBtZWRpYSB0aW1lIHJlcXVlc3QgYmUgZnVsZmlsbGVkIHNsaWdodGx5Ci0gKiAgZWFybGllciB0aGFuIHRoZSBtZWRpYSB0aW1lIHNwZWNpZmllZC4gSW4gdGhpcyBjYXNlIHRoZSBjbGllbnQgc3BlY2lmaWVzIAotICogIGFuIG9mZnNldCB3aGljaCBpcyBlcXVhbCB0byB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHdhbGwgdGltZSBjb3JyZXNwb25kaW5nIAotICogIHRvIHRoZSByZXF1ZXN0ZWQgbWVkaWEgdGltZSBhbmQgdGhlIHdhbGwgdGltZSB3aGVuIGl0IHdpbGwgYmUgCi0gKiAgZnVsZmlsbGVkLiAKKyAqICBlYXJsaWVyIHRoYW4gdGhlIG1lZGlhIHRpbWUgc3BlY2lmaWVkLiBJbiB0aGlzIGNhc2UgdGhlIGNsaWVudCBzcGVjaWZpZXMKKyAqICBhbiBvZmZzZXQgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YWxsIHRpbWUgY29ycmVzcG9uZGluZworICogIHRvIHRoZSByZXF1ZXN0ZWQgbWVkaWEgdGltZSBhbmQgdGhlIHdhbGwgdGltZSB3aGVuIGl0IHdpbGwgYmUKKyAqICBmdWxmaWxsZWQuCiAgKgogICogIEEgY2xpZW50IGNvbXBvbmVudCBtYXkgdXNlcyB0aGVzZSByZXF1ZXN0cyBhbmQgdGhlIE9NWF9USU1FX01FRElBVElNRVRZUEUgdG8KICAqICB0aW1lIGV2ZW50cyBhY2NvcmRpbmcgdG8gdGltZXN0YW1wcy4gSWYgYSBjbGllbnQgbXVzdCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBPIGF0Ci0gKiAgYSB0aW1lIFQgKGUuZy4gZGVsaXZlciBhIHZpZGVvIGZyYW1lIGF0IGl0cyBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCksIGl0IG1ha2VzIGEgCisgKiAgYSB0aW1lIFQgKGUuZy4gZGVsaXZlciBhIHZpZGVvIGZyYW1lIGF0IGl0cyBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCksIGl0IG1ha2VzIGEKICAqICBtZWRpYSB0aW1lIHJlcXVlc3QgYXQgVCAocGVyaGFwcyBzcGVjaWZ5aW5nIGFuIG9mZnNldCB0byBlbnN1cmUgdGhlIHJlcXVlc3QgZnVsZmlsbG1lbnQKICAqICBpcyBhIGxpdHRsZSBlYXJseSkuIFdoZW4gdGhlIGNsb2NrIGNvbXBvbmVudCBwYXNzZXMgdGhlIHJlc3VsdGluZyBPTVhfVElNRV9NRURJQVRJTUVUWVBFCiAgKiAgc3RydWN0dXJlIGJhY2sgdG8gdGhlIGNsaWVudCBjb21wb25lbnQsIHRoZSBjbGllbnQgbWF5IHBlcmZvcm0gb3BlcmF0aW9uIE8gKHBlcmhhcHMgaGF2aW5nCkBAIC0xOTMsNTIgKzE5Myw1MiBAQAogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLwotICAgIE9NWF9QVFIgcENsaWVudFByaXZhdGU7ICAgICAvKio8IENsaWVudCBwcml2YXRlIGRhdGEgdG8gZGlzYWJpZ3VhdGUgdGhpcyBtZWRpYSB0aW1lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzIChlLmcuIHRoZSBudW1iZXIgb2YgdGhlIGZyYW1lIHRvIGRlbGl2ZXIpLiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBEdXBsaWNhdGVkIGluIHRoZSBtZWRpYSB0aW1lIHN0cnVjdHVyZSB0aGF0IGZ1bGZpbGxzIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMgcmVxdWVzdC4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIAorICAgIE9NWF9QVFIgcENsaWVudFByaXZhdGU7ICAgICAvKio8IENsaWVudCBwcml2YXRlIGRhdGEgdG8gZGlzYWJpZ3VhdGUgdGhpcyBtZWRpYSB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZnJvbSBvdGhlcnMgKGUuZy4gdGhlIG51bWJlciBvZiB0aGUgZnJhbWUgdG8gZGVsaXZlcikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRHVwbGljYXRlZCBpbiB0aGUgbWVkaWEgdGltZSBzdHJ1Y3R1cmUgdGhhdCBmdWxmaWxscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMgcmVxdWVzdC4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdXBkYXRlcy4gKi8KLSAgICBPTVhfVElDS1Mgbk1lZGlhVGltZXN0YW1wOyAgLyoqPCBNZWRpYSB0aW1lc3RhbXAgcmVxdWVzdGVkLiovIAorICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAvKio8IE1lZGlhIHRpbWVzdGFtcCByZXF1ZXN0ZWQuKi8KICAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHNob3VsZCBiZSBmdWxmaWxsZWQgZWFybHkgKi8KIH0gT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFOwogCi0vKio8IFN0cnVjdHVyZSBzZW50IGZyb20gdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgZWl0aGVyIHdoZW4gZnVsZmlsbGluZyAKLSAqICAgYSBtZWRpYSB0aW1lIHJlcXVlc3Qgb3Igd2hlbiB0aGUgdGltZSBzY2FsZSBoYXMgY2hhbmdlZC4gCisvKio8IFN0cnVjdHVyZSBzZW50IGZyb20gdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgZWl0aGVyIHdoZW4gZnVsZmlsbGluZworICogICBhIG1lZGlhIHRpbWUgcmVxdWVzdCBvciB3aGVuIHRoZSB0aW1lIHNjYWxlIGhhcyBjaGFuZ2VkLgogICoKLSAqICAgSW4gdGhlIGZvcm1lciBjYXNlIHRoZSBDbG9jayBDb21wb25lbnQgZmlsbHMgdGhpcyBzdHJ1Y3R1cmUgYW5kIHRpbWVzIGl0cyBlbWlzc2lvbiAKLSAqICAgdG8gYSBjbGllbnQgY29tcG9uZW50ICh2aWEgdGhlIGNsaWVudCBwb3J0KSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWVkaWEgCisgKiAgIEluIHRoZSBmb3JtZXIgY2FzZSB0aGUgQ2xvY2sgQ29tcG9uZW50IGZpbGxzIHRoaXMgc3RydWN0dXJlIGFuZCB0aW1lcyBpdHMgZW1pc3Npb24KKyAqICAgdG8gYSBjbGllbnQgY29tcG9uZW50ICh2aWEgdGhlIGNsaWVudCBwb3J0KSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWVkaWEKICAqICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudC4gVGhlIENsb2NrIENvbXBvbmVudCBzaG91bGQgdGltZSB0aGUgZW1pc3Npb24gdG8gb2NjdXIKLSAqICAgd2hlbiB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBtYXRjaGVzIHRoZSBDbG9jayBDb21wb25lbnQncyBtZWRpYSB0aW1lIGJ1dCBhbHNvIHRoZSAKLSAqICAgcHJlc2NyaWJlZCBvZmZzZXQgZWFybHkuIAorICogICB3aGVuIHRoZSByZXF1ZXN0ZWQgdGltZXN0YW1wIG1hdGNoZXMgdGhlIENsb2NrIENvbXBvbmVudCdzIG1lZGlhIHRpbWUgYnV0IGFsc28gdGhlCisgKiAgIHByZXNjcmliZWQgb2Zmc2V0IGVhcmx5LgogICoKICAqICAgVXBvbiBzY2FsZSBjaGFuZ2VzIHRoZSBjbG9jayBjb21wb25lbnQgY2xlYXJzIHRoZSBuQ2xpZW50UHJpdmF0ZSBkYXRhLCBzZW5kcyB0aGUgY3VycmVudAotICogICBtZWRpYSB0aW1lIGFuZCBzZXRzIHRoZSBuU2NhbGUgdG8gdGhlIG5ldyBzY2FsZSB2aWEgdGhlIGNsaWVudCBwb3J0LiBJdCBlbWl0cyBhIAotICogICBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvIGFsbCBjbGllbnRzIGluZGVwZW5kZW50IG9mIGFueSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byAKLSAqICAgYWx0ZXIgcHJvY2Vzc2luZyB0byBhY2NvbW9kYXRlIHNjYWxpbmcuIEZvciBpbnN0YW5jZSBhIHZpZGVvIGNvbXBvbmVudCBtaWdodCBza2lwIGludGVyLWZyYW1lcyAKLSAqICAgaW4gdGhlIGNhc2Ugb2YgZXh0cmVtZSBmYXN0Zm9yd2FyZC4gTGlrZXdpc2UgYW4gYXVkaW8gY29tcG9uZW50IG1pZ2h0IGFkZCBvciByZW1vdmUgc2FtcGxlcyAKLSAqICAgZnJvbSBhbiBhdWRpbyBmcmFtZSB0byBzY2FsZSBhdWRpbyBkYXRhLiAKKyAqICAgbWVkaWEgdGltZSBhbmQgc2V0cyB0aGUgblNjYWxlIHRvIHRoZSBuZXcgc2NhbGUgdmlhIHRoZSBjbGllbnQgcG9ydC4gSXQgZW1pdHMgYQorICogICBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvIGFsbCBjbGllbnRzIGluZGVwZW5kZW50IG9mIGFueSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0bworICogICBhbHRlciBwcm9jZXNzaW5nIHRvIGFjY29tb2RhdGUgc2NhbGluZy4gRm9yIGluc3RhbmNlIGEgdmlkZW8gY29tcG9uZW50IG1pZ2h0IHNraXAgaW50ZXItZnJhbWVzCisgKiAgIGluIHRoZSBjYXNlIG9mIGV4dHJlbWUgZmFzdGZvcndhcmQuIExpa2V3aXNlIGFuIGF1ZGlvIGNvbXBvbmVudCBtaWdodCBhZGQgb3IgcmVtb3ZlIHNhbXBsZXMKKyAqICAgZnJvbSBhbiBhdWRpbyBmcmFtZSB0byBzY2FsZSBhdWRpbyBkYXRhLgogICoKICAqICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCBzb21lIGNsb2NrIGNvbXBvbmVudHMgbWF5IG5vdCBiZSBhYmxlIHRvIGZ1bGZpbGwgcmVxdWVzdHMKLSAqICAgYXQgZXhhY3RseSB0aGUgcHJlc2NyaWJlZCB0aW1lLiBUaGlzIGlzIGFjY2VwdGFibGUgc28gbG9uZyBhcyB0aGUgcmVxdWVzdCBpcyAKLSAqICAgZnVsZmlsbGVkIGF0IGxlYXN0IGFzIGVhcmx5IGFzIGRlc2NyaWJlZCBhbmQgbm90IGxhdGVyLiBUaGlzIHN0cnVjdHVyZSBwcm92aWRlcyAKKyAqICAgYXQgZXhhY3RseSB0aGUgcHJlc2NyaWJlZCB0aW1lLiBUaGlzIGlzIGFjY2VwdGFibGUgc28gbG9uZyBhcyB0aGUgcmVxdWVzdCBpcworICogICBmdWxmaWxsZWQgYXQgbGVhc3QgYXMgZWFybHkgYXMgZGVzY3JpYmVkIGFuZCBub3QgbGF0ZXIuIFRoaXMgc3RydWN0dXJlIHByb3ZpZGVzCiAgKiAgIGZpZWxkcyB0aGUgY2xpZW50IG1heSB1c2UgdG8gd2FpdCBmb3IgdGhlIHJlbWFpbmluZyB0aW1lLgogICoKLSAqICAgVGhlIGNsaWVudCBtYXkgdXNlIGVpdGhlciB0aGUgbk9mZnNldCBvciBuV2FsbFRpbWVBdE1lZGlhIGZpZWxkcyB0byBkZXRlcm1pbmUgdGhlIAorICogICBUaGUgY2xpZW50IG1heSB1c2UgZWl0aGVyIHRoZSBuT2Zmc2V0IG9yIG5XYWxsVGltZUF0TWVkaWEgZmllbGRzIHRvIGRldGVybWluZSB0aGUKICAqICAgd2FsbCB0aW1lIHVudGlsIHRoZSBuTWVkaWFUaW1lc3RhbXAgYWN0dWFsbHkgb2NjdXJzLiBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlCiAgKiAgIGNsaWVudCBjYW4gZ2V0IGEgbW9yZSBhY2N1cmF0ZSB2YWx1ZSBmb3Igb2Zmc2V0IGJ5IGdldHRpbmcgdGhlIGN1cnJlbnQgd2FsbAotICogICBmcm9tIHRoZSBjbG9jIGNvbXBvbmVudCBhbmQgc3VidHJhY3RpbmcgaXQgZnJvbSBuV2FsbFRpbWVBdE1lZGlhLiAKKyAqICAgZnJvbSB0aGUgY2xvYyBjb21wb25lbnQgYW5kIHN1YnRyYWN0aW5nIGl0IGZyb20gbldhbGxUaW1lQXRNZWRpYS4KICAqLwogCiB0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KLSAgICBPTVhfVTMyIG5DbGllbnRQcml2YXRlOyAgICAgICAgIC8qKjwgQ2xpZW50IHByaXZhdGUgZGF0YSB0byBkaXNhYmlndWF0ZSB0aGlzIG1lZGlhIHRpbWUgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzLiBDb3BpZWQgZnJvbSB0aGUgbWVkaWEgdGltZSByZXF1ZXN0LiAKKyAgICBPTVhfVTMyIG5DbGllbnRQcml2YXRlOyAgICAgICAgIC8qKjwgQ2xpZW50IHByaXZhdGUgZGF0YSB0byBkaXNhYmlndWF0ZSB0aGlzIG1lZGlhIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZnJvbSBvdGhlcnMuIENvcGllZCBmcm9tIHRoZSBtZWRpYSB0aW1lIHJlcXVlc3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEEgdmFsdWUgb2YgemVybyBpcyByZXNlcnZlZCBmb3IgdGltZSBzY2FsZSB1cGRhdGVzLiAqLwogICAgIE9NWF9USU1FX1VQREFURVRZUEUgZVVwZGF0ZVR5cGU7IC8qKjwgUmVhc29uIGZvciB0aGUgdXBkYXRlICovCi0gICAgT01YX1RJQ0tTIG5NZWRpYVRpbWVzdGFtcDsgICAgICAvKio8IE1lZGlhIHRpbWUgcmVxdWVzdGVkLiBJZiBubyBtZWRpYSB0aW1lIHdhcyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVxdWVzdGVkIHRoZW4gdGhpcyBpcyB0aGUgY3VycmVudCBtZWRpYSB0aW1lLiAqLyAKKyAgICBPTVhfVElDS1Mgbk1lZGlhVGltZXN0YW1wOyAgICAgIC8qKjwgTWVkaWEgdGltZSByZXF1ZXN0ZWQuIElmIG5vIG1lZGlhIHRpbWUgd2FzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJlcXVlc3RlZCB0aGVuIHRoaXMgaXMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZS4gKi8KICAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgICAgIC8qKjwgQW1vdW50IG9mIHdhbGwgY2xvY2sgdGltZSBieSB3aGljaCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJlcXVlc3Qgd2FzIGFjdHVhbGx5IGZ1bGZpbGxlZCBlYXJseSAqLwogCkBAIC0yNTAsMjEgKzI1MCwyMSBAQAogICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgaW4gUTE2IGZvcm1hdC4gKi8KICAgICBPTVhfVElNRV9DTE9DS1NUQVRFIGVTdGF0ZTsgICAgIC8qIFNlZWtpbmcgQ2hhbmdlLiBBZGRlZCA3LzEyLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLwotfSBPTVhfVElNRV9NRURJQVRJTUVUWVBFOyAgCit9IE9NWF9USU1FX01FRElBVElNRVRZUEU7CiAKLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgZmFjdG9yLiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sgCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtZWRpYSB0aW1lIHNjYWxlIGZhY3Rvci4gQXBwbGljYWJsZSBvbmx5IHRvIGNsb2NrCiAgKiAgY29tcG9uZW50LCBvdGhlciBjb21wb25lbnRzIHNlZSBzY2FsZSBjaGFuZ2VzIHZpYSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIGJ1ZmZlcnMgc2VudCB2aWEKLSAqICB0aGUgY2xvY2sgY29tcG9uZW50IGNsaWVudCBwb3J0cy4gVXBvbiByZWNpZXZpbmcgdGhpcyBjb25maWcgdGhlIGNsb2NrIGNvbXBvbmVudCBjaGFuZ2VzIAotICogIHRoZSByYXRlIGJ5IHdoaWNoIHRoZSBtZWRpYSB0aW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50aW5nIHRyaWNrIG1vZGVzLiAKLSAqLyAKKyAqICB0aGUgY2xvY2sgY29tcG9uZW50IGNsaWVudCBwb3J0cy4gVXBvbiByZWNpZXZpbmcgdGhpcyBjb25maWcgdGhlIGNsb2NrIGNvbXBvbmVudCBjaGFuZ2VzCisgKiAgdGhlIHJhdGUgYnkgd2hpY2ggdGhlIG1lZGlhIHRpbWUgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBlZmZlY3RpdmVseSBpbXBsZW1lbnRpbmcgdHJpY2sgbW9kZXMuCisgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgewogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwogICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGlzIGlzIGEgdmFsdWUgaW4gUTE2IGZvcm1hdCB3aGljaCBpcyB1c2VkIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2NhbGluZyB0aGUgbWVkaWEgdGltZSAqLwogfSBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFOwotIAotLyoqIEJpdHMgdXNlZCB0byBpZGVudGlmeSBhIGNsb2NrIHBvcnQuIFVzZWQgaW4gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFknMgbldhaXRNYXNrIGZpZWxkICovCisKKy8qKiBCaXRzIHVzZWQgdG8gaWRlbnRpZnkgYSBjbG9jayBwb3J0LiBVc2VkIGluIE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSdzIG5XYWl0TWFzayBmaWVsZCAqLwogI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMCAweDAwMDAwMDAxCiAjZGVmaW5lIE9NWF9DTE9DS1BPUlQxIDB4MDAwMDAwMDIKICNkZWZpbmUgT01YX0NMT0NLUE9SVDIgMHgwMDAwMDAwNApAQCAtMjc0LDM4ICsyNzQsMzggQEAKICNkZWZpbmUgT01YX0NMT0NLUE9SVDYgMHgwMDAwMDA0MAogI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNyAweDAwMDAwMDgwCiAKLS8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1vZGUgb2YgdGhlIG1lZGlhIGNsb2NrLiAKLSAqICBJTCBDbGllbnQgdXNlcyB0aGlzIGNvbmZpZyB0byBjaGFuZ2Ugb3IgcXVlcnkgdGhlIG1vZGUgb2YgdGhlIAorLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgbWVkaWEgY2xvY2suCisgKiAgSUwgQ2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSBtb2RlIG9mIHRoZQogICogIG1lZGlhIGNsb2NrIG9mIHRoZSBjbG9jayBjb21wb25lbnQuIEFwcGxpY2FibGUgb25seSB0byBjbG9jawotICogIGNvbXBvbmVudC4gCi0gKiAgCisgKiAgY29tcG9uZW50LgorICoKICAqICBPbiBhIFNldENvbmZpZyBpZiBlU3RhdGUgaXMgT01YX1RJTUVfQ2xvY2tTdGF0ZVJ1bm5pbmcgbWVkaWEgdGltZQogICogIHN0YXJ0cyBpbW1lZGlhdGVseSBhdCB0aGUgcHJlc2NyaWJlZCBzdGFydCB0aW1lLiBJZgogICogIE9NWF9USU1FX0Nsb2NrU3RhdGVXYWl0aW5nRm9yU3RhcnRUaW1lIHRoZSBDbG9jayBDb21wb25lbnQgaWdub3JlcwotICogIHRoZSBnaXZlbiBuU3RhcnRUaW1lIGFuZCB3YWl0cyBmb3IgYWxsIGNsaWVudHMgc3BlY2lmaWVkIGluIHRoZSAKLSAqICBuV2FpdE1hc2sgdG8gc2VuZCBzdGFydHRpbWVzICh2aWEgCi0gKiAgT01YX0luZGV4Q29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSkuIFRoZSBDbG9jayBDb21wb25lbnQgdGhlbiBzdGFydHMgCi0gKiAgdGhlIG1lZGlhIGNsb2NrIHVzaW5nIHRoZSBlYXJsaWVzdCBzdGFydCB0aW1lIHN1cHBsaWVkLiAqLyAgICAKKyAqICB0aGUgZ2l2ZW4gblN0YXJ0VGltZSBhbmQgd2FpdHMgZm9yIGFsbCBjbGllbnRzIHNwZWNpZmllZCBpbiB0aGUKKyAqICBuV2FpdE1hc2sgdG8gc2VuZCBzdGFydHRpbWVzICh2aWEKKyAqICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lKS4gVGhlIENsb2NrIENvbXBvbmVudCB0aGVuIHN0YXJ0cworICogIHRoZSBtZWRpYSBjbG9jayB1c2luZyB0aGUgZWFybGllc3Qgc3RhcnQgdGltZSBzdXBwbGllZC4gKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSB7CiAgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaW5mb3JtYXRpb24gKi8KICAgICBPTVhfVElNRV9DTE9DS1NUQVRFIGVTdGF0ZTsgLyoqPCBTdGF0ZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KICAgICBPTVhfVElDS1MgblN0YXJ0VGltZTsgICAgICAgLyoqPCBTdGFydCB0aW1lIG9mIHRoZSBtZWRpYSB0aW1lLiAqLwotICAgIE9NWF9USUNLUyBuT2Zmc2V0OyAgICAgICAgICAvKio8IFRpbWUgdG8gb2Zmc2V0IHRoZSBtZWRpYSB0aW1lIGJ5IAorICAgIE9NWF9USUNLUyBuT2Zmc2V0OyAgICAgICAgICAvKio8IFRpbWUgdG8gb2Zmc2V0IHRoZSBtZWRpYSB0aW1lIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChlLmcuIHByZXJvbGwpLiBNZWRpYSB0aW1lIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVwb3J0ZWQgdG8gYmUgbk9mZnNldCB0aWNrcyBlYXJsaWVyLiAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlcG9ydGVkIHRvIGJlIG5PZmZzZXQgdGlja3MgZWFybGllci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgT01YX1UzMiBuV2FpdE1hc2s7ICAgICAgICAgIC8qKjwgTWFzayBvZiBPTVhfQ0xPQ0tQT1JUIHZhbHVlcy4gKi8KIH0gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFOwogCiAvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvCi0gKiAgY29tcHV0ZSBtZWRpYSB0aW1lLiBJTCBjbGllbnQgdXNlcyB0aGlzIGNvbmZpZyB0byBjaGFuZ2Ugb3IgcXVlcnkgdGhlIAorICogIGNvbXB1dGUgbWVkaWEgdGltZS4gSUwgY2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZQogICogIGNsb2NrIGNvbXBvbmVudCdzIGFjdGl2ZSByZWZlcmVuY2UgY2xvY2sgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEUgewogICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLwotICAgIE9NWF9USU1FX1JFRkNMT0NLVFlQRSBlQ2xvY2s7ICAgLyoqPCBSZWZlcmVuY2UgY2xvY2sgdXNlZCB0byBjb21wdXRlIG1lZGlhIHRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVElNRV9SRUZDTE9DS1RZUEUgZUNsb2NrOyAgIC8qKjwgUmVmZXJlbmNlIGNsb2NrIHVzZWQgdG8gY29tcHV0ZSBtZWRpYSB0aW1lICovCiB9IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEU7CiAKIC8qKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHNwZWNpZmljcyBvZiBwb3dlciB0eXBlLgpAQCAtMzI3LDggKzMyNyw4IEBACiAKIAogLyoqCi0gKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKLSAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IG90aGVyIAorICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IG90aGVyCiAgKiBwYXRoLgogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfUE9SVERFRklOSVRJT05UWVBFIHsKQEAgLTM0NCw3ICszNDQsNyBAQAogICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KICAgICBPTVhfVTMyIG5JbmRleDsgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLwogICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIGNoYW5uZWwgKi8KLX0gT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFOyAKK30gT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfVHlwZXMuaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfVHlwZXMuaAppbmRleCA3MWUzNDZhLi41YWZhYmEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX1R5cGVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9UeXBlcy5oCkBAIC0xNiwzMiArMTYsMzIgQEAKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAotICogCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwogICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiAgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAotICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCi0gKiAKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKICAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCiAgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCiAgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCiAgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQogICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKICAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCi0gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICAqCiAgKi8KIAogLyoqIE9NWF9UeXBlcy5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCi0gKiAgVGhlIE9NWF9UeXBlcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgcHJpbWl0aXZlIHR5cGUgZGVmaW5pdGlvbnMgdXNlZCBieSAKKyAqICBUaGUgT01YX1R5cGVzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBwcmltaXRpdmUgdHlwZSBkZWZpbml0aW9ucyB1c2VkIGJ5CiAgKiAgdGhlIGNvcmUsIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudC4gIFRoaXMgZmlsZSBtYXkgbmVlZCB0byBiZQotICogIG1vZGlmaWVkIHRvIGJlIHVzZWQgb24gc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlICJjaGFyIiBzZXQgdG8gOCBiaXRzLCAKKyAqICBtb2RpZmllZCB0byBiZSB1c2VkIG9uIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSAiY2hhciIgc2V0IHRvIDggYml0cywKICAqICAic2hvcnQiIHNldCB0byAxNiBiaXRzIGFuZCAibG9uZyIgc2V0IHRvIDMyIGJpdHMuCiAgKi8KIApAQCAtNTcsMTIgKzU3LDEyIEBACiAvKiogVGhlIE9NWF9BUEkgYW5kIE9NWF9BUElFTlRSWSBhcmUgcGxhdGZvcm0gc3BlY2lmaWMgZGVmaW5pdGlvbnMgdXNlZAogICogIHRvIGRlY2xhcmUgT01YIGZ1bmN0aW9uIHByb3RvdHlwZXMuICBUaGV5IGFyZSBtb2RpZmllZCB0byBtZWV0IHRoZQogICogIHJlcXVpcmVtZW50cyBmb3IgYSBwYXJ0aWN1bGFyIHBsYXRmb3JtICovCi0jaWZkZWYgX19TWU1CSUFOMzJfXyAgIAorI2lmZGVmIF9fU1lNQklBTjMyX18KICMgICBpZmRlZiBfX09NWF9FWFBPUlRTCiAjICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQogIyAgIGVsc2UKICMgICAgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgCisjICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKICMgICAgICAgZWxzZQogIyAgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxpbXBvcnQpCiAjICAgICAgIGVuZGlmCkBAIC04NSwxOCArODUsMTggQEAKICNlbmRpZgogCiAjaWZuZGVmIE9NWF9BUElFTlRSWQotI2RlZmluZSBPTVhfQVBJRU5UUlkgCi0jZW5kaWYgCisjZGVmaW5lIE9NWF9BUElFTlRSWQorI2VuZGlmCiAKLS8qKiBPTVhfSU4gaXMgdXNlZCB0byBpZGVudGlmeSBpbnB1dHMgdG8gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcyBkZXNpZ25hdGlvbiAKLSAgICB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgCisvKiogT01YX0lOIGlzIHVzZWQgdG8gaWRlbnRpZnkgaW5wdXRzIHRvIGFuIE9NWCBmdW5jdGlvbi4gIFRoaXMgZGVzaWduYXRpb24KKyAgICB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBwYXJhbWV0ZXIKICAgICB0aGF0IGlzIHVzZWQgYXMgYW4gb3V0cHV0LiAqLwogI2lmbmRlZiBPTVhfSU4KICNkZWZpbmUgT01YX0lOCiAjZW5kaWYKIAotLyoqIE9NWF9PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcyAKLSAgICBkZXNpZ25hdGlvbiB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgCisvKiogT01YX09VVCBpcyB1c2VkIHRvIGlkZW50aWZ5IG91dHB1dHMgZnJvbSBhbiBPTVggZnVuY3Rpb24uICBUaGlzCisgICAgZGVzaWduYXRpb24gd2lsbCBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgcG9pbnRzCiAgICAgdG8gYSBwYXJhbWV0ZXIgdGhhdCBpcyB1c2VkIGFzIGFuIGlucHV0LiAqLwogI2lmbmRlZiBPTVhfT1VUCiAjZGVmaW5lIE9NWF9PVVQKQEAgLTEwNCw4ICsxMDQsOCBAQAogCiAKIC8qKiBPTVhfSU5PVVQgaXMgdXNlZCB0byBpZGVudGlmeSBwYXJhbWV0ZXJzIHRoYXQgbWF5IGJlIGVpdGhlciBpbnB1dHMgb3IKLSAgICBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGRlc2lnbmF0aW9uIHdpbGwgCi0gICAgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0ICBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgdGhhdCAKKyAgICBvdXRwdXRzIGZyb20gYW4gT01YIGZ1bmN0aW9uIGF0IHRoZSBzYW1lIHRpbWUuICBUaGlzIGRlc2lnbmF0aW9uIHdpbGwKKyAgICBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgIHBvaW50cyB0byBhIHBhcmFtZXRlciB0aGF0CiAgICAgaXMgdXNlZCBib3RoIGFzIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQuICovCiAjaWZuZGVmIE9NWF9JTk9VVAogI2RlZmluZSBPTVhfSU5PVVQKQEAgLTEyMywzMSArMTIzLDMxIEBACiAvKiogQGRlZmdyb3VwIGNvcmUgT3Blbk1BWCBJTCBjb3JlCiAgKiBGdW5jdGlvbnMgYW5kIHN0cnVjdHVyZSByZWxhdGVkIHRvIHRoZSBPTVggSUwgY29yZQogICovCi0gCisKICAvKiogQGRlZmdyb3VwIGNvbXAgT3Blbk1BWCBJTCBjb21wb25lbnQKICAqIEZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlIHJlbGF0ZWQgdG8gdGhlIE9NWCBJTCBjb21wb25lbnQKICAqLwotIAotLyoqIEBkZWZncm91cCBycG0gUmVzb3VyY2UgYW5kIFBvbGljeSBNYW5hZ2VtZW50IAorCisvKiogQGRlZmdyb3VwIHJwbSBSZXNvdXJjZSBhbmQgUG9saWN5IE1hbmFnZW1lbnQKICAqIFN0cnVjdHVyZXMgZm9yIHJlc291cmNlIGFuZCBwb2xpY3kgbWFuYWdlbWVudCBvZiBjb21wb25lbnRzCiAgKi8KIAogLyoqIEBkZWZncm91cCBidWYgQnVmZmVyIE1hbmFnZW1lbnQKICAqIEJ1ZmZlciBoYW5kbGluZyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMKICAqLwotICAKKwogLyoqIEBkZWZncm91cCB0dW4gVHVubmVsaW5nCiAgKiBAaW5ncm91cCBjb3JlIGNvbXAKICAqIFN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdHVubmVscyBhbW9uZyBjb21wb25lbnQgcG9ydHMKICAqLwotIAorCiAvKiogQGRlZmdyb3VwIGNwIENvbnRlbnQgUGlwZXMKICAqICBAaW5ncm91cCBjb3JlCiAgKi8KLSAKKwogIC8qKiBAZGVmZ3JvdXAgbWV0YWRhdGEgTWV0YWRhdGEgaGFuZGxpbmcKLSAgKiAKLSAgKi8gCisgICoKKyAgKi8KIAogLyoqIE9NWF9VOCBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKQEAgLTE2OSw3ICsxNjksNyBAQAogCiAKIC8qIFVzZXJzIHdpdGggY29tcGlsZXJzIHRoYXQgY2Fubm90IGFjY2VwdCB0aGUgImxvbmcgbG9uZyIgZGVzaWduYXRpb24gc2hvdWxkCi0gICBkZWZpbmUgdGhlIE9NWF9TS0lQNjRCSVQgbWFjcm8uICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIG1heSBjYXVzZSAKKyAgIGRlZmluZSB0aGUgT01YX1NLSVA2NEJJVCBtYWNyby4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgbWF5IGNhdXNlCiAgICBzb21lIGNvbXBvbmVudHMgdG8gZmFpbCB0byBjb21waWxlIGlmIHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4gdG8gcmVxdWlyZQogICAgNjQgYml0IGludGVncmFsIHR5cGVzLiAgSG93ZXZlciwgdGhlc2UgY29tcG9uZW50cyB3b3VsZCBOT1QgY29tcGlsZSBhbnl3YXkKICAgIHNpbmNlIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB3YXkgdGhlIGNvbXBvbmVudCB3YXMgd3JpdHRlbi4KQEAgLTE4NCw3ICsxODQsNyBAQAogCiAjZWxpZiBkZWZpbmVkKFdJTjMyKQogCi0vKiogT01YX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8gICAKKy8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwogdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICBPTVhfVTY0OwogCiAvKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCkBAIC0yMDIsNyArMjAyLDcgQEAKICNlbmRpZgogCiAKLS8qKiBUaGUgT01YX0JPT0wgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHRydWUgb3IgYSBmYWxzZSAKKy8qKiBUaGUgT01YX0JPT0wgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHRydWUgb3IgYSBmYWxzZQogICAgIHZhbHVlIHdoZW4gcGFzc2luZyBwYXJhbWV0ZXJzIHRvIGFuZCBmcm9tIHRoZSBPTVggY29yZSBhbmQgY29tcG9uZW50cy4gIFRoZQogICAgIE9NWF9CT09MIGlzIGEgMzIgYml0IHF1YW50aXR5IGFuZCBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IHdvcmQgYm91bmRhcnkuCiAgKi8KQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgIE9NWF9GQUxTRSA9IDAsCiAgICAgT01YX1RSVUUgPSAhT01YX0ZBTFNFLAogICAgIE9NWF9CT09MX01BWCA9IDB4N0ZGRkZGRkYKLX0gT01YX0JPT0w7IAorfSBPTVhfQk9PTDsKIAogLyoKICAqIFRlbXBvcmFyeSBBbmRyb2lkIDY0IGJpdCBtb2RpZmljYXRpb24KQEAgLTIzNywxNCArMjM3LDE0IEBACiB0eXBlZGVmIHZvaWQqIE9NWF9QVFI7CiAKIC8qKiBUaGUgT01YX1NUUklORyB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyAiQyIgdHlwZSBzdHJpbmdzIGJldHdlZW4KLSAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb3JlIGFuZCBjb21wb25lbnQuICBUaGUgT01YX1NUUklORyB0eXBlIGlzIGEgMzIgCi0gICAgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQgYWxpZ25lZCBhbmQgCi0gICAgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuICAKKyAgICB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb3JlIGFuZCBjb21wb25lbnQuICBUaGUgT01YX1NUUklORyB0eXBlIGlzIGEgMzIKKyAgICBiaXQgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcuICBUaGUgIHBvaW50ZXIgaXMgd29yZCBhbGlnbmVkIGFuZAorICAgIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLgogICovCiB0eXBlZGVmIGNoYXIqIE9NWF9TVFJJTkc7CiAKIC8qKiBUaGUgT01YX0JZVEUgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgYXJyYXlzIG9mIGJ5dGVzIHN1Y2ggYXMKLSAgICBidWZmZXJzIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IGFuZCBjb3JlLiAgVGhlIE9NWF9CWVRFIAorICAgIGJ1ZmZlcnMgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgYW5kIGNvcmUuICBUaGUgT01YX0JZVEUKICAgICB0eXBlIGlzIGEgMzIgYml0IHBvaW50ZXIgdG8gYSB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5nLiAgVGhlICBwb2ludGVyIGlzIHdvcmQKICAgICBhbGlnbmVkIGFuZCB0aGUgc3RyaW5nIGlzIGJ5dGUgYWxpZ25lZC4KICAqLwpAQCAtMjU5LDcgKzI1OSw3IEBACiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1VVSURUWVBFWzEyOF07CiAKIC8qKiBUaGUgT01YX0RJUlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiBhIHBvcnQgaXMgYW4gaW5wdXQgb3IKLSAgICBhbiBvdXRwdXQgcG9ydC4gIFRoaXMgZW51bWVyYXRpb24gaXMgY29tbW9uIGFjcm9zcyBhbGwgY29tcG9uZW50IHR5cGVzLiAgICAKKyAgICBhbiBvdXRwdXQgcG9ydC4gIFRoaXMgZW51bWVyYXRpb24gaXMgY29tbW9uIGFjcm9zcyBhbGwgY29tcG9uZW50IHR5cGVzLgogICovCiB0eXBlZGVmIGVudW0gT01YX0RJUlRZUEUKIHsKQEAgLTI2OCw4ICsyNjgsOCBAQAogICAgIE9NWF9EaXJNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9ESVJUWVBFOwogCi0vKiogVGhlIE9NWF9FTkRJQU5UWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGJpdCBvcmRlcmluZyAKLSAgICBmb3IgbnVtZXJpY2FsIGRhdGEgKGkuZS4gYmlnIGVuZGlhbiwgb3IgbGl0dGxlIGVuZGlhbikuICAgIAorLyoqIFRoZSBPTVhfRU5ESUFOVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBiaXQgb3JkZXJpbmcKKyAgICBmb3IgbnVtZXJpY2FsIGRhdGEgKGkuZS4gYmlnIGVuZGlhbiwgb3IgbGl0dGxlIGVuZGlhbikuCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfRU5ESUFOVFlQRQogewpAQCAtMjc5LDcgKzI3OSw3IEBACiB9IE9NWF9FTkRJQU5UWVBFOwogCiAKLS8qKiBUaGUgT01YX05VTUVSSUNBTERBVEFUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgZGF0YSAKKy8qKiBUaGUgT01YX05VTUVSSUNBTERBVEFUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgZGF0YQogICAgIGlzIHNpZ25lZCBvciB1bnNpZ25lZAogICovCiB0eXBlZGVmIGVudW0gT01YX05VTUVSSUNBTERBVEFUWVBFCkBAIC0zMDcsMTYgKzMwNywxNiBAQAogCiAKIC8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHNvbWUgdGltZSBvciBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMuIFRoaXMgc3RydWN0dXJlCi0gICogIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgNjQgYml0IHZhbHVlLiBUaGUgcXVhbnRpdHkgaXMgc2lnbmVkIHRvIGFjY29tbW9kYXRlIAotICAqICBuZWdhdGl2ZSBkZWx0YXMgYW5kIHByZXJvbGwgc2NlbmFyaW9zLiBUaGUgcXVhbnRpdHkgaXMgcmVwcmVzZW50ZWQgaW4gbWljcm9zZWNvbmRzIAorICAqICBtdXN0IGJlIGludGVycHJldGVkIGFzIGEgc2lnbmVkIDY0IGJpdCB2YWx1ZS4gVGhlIHF1YW50aXR5IGlzIHNpZ25lZCB0byBhY2NvbW1vZGF0ZQorICAqICBuZWdhdGl2ZSBkZWx0YXMgYW5kIHByZXJvbGwgc2NlbmFyaW9zLiBUaGUgcXVhbnRpdHkgaXMgcmVwcmVzZW50ZWQgaW4gbWljcm9zZWNvbmRzCiAgICogIHRvIGFjY29tb2RhdGUgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcHMgKGUuZy4gRFZEIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzIGJhc2VkCi0gICogIG9uIGEgOTBrSHogY2xvY2spIGFuZCB0byBhbGxvdyBtb3JlIGFjY3VyYXRlIGFuZCBzeW5jaHJvbml6ZWQgZGVsaXZlcnkgKGUuZy4gCi0gICogIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBkZWxpdmVyZWQgYXQgMTkyIGtIeikuIFRoZSBxdWFudGl0eSBpcyA2NCBiaXQgdG8gCisgICogIG9uIGEgOTBrSHogY2xvY2spIGFuZCB0byBhbGxvdyBtb3JlIGFjY3VyYXRlIGFuZCBzeW5jaHJvbml6ZWQgZGVsaXZlcnkgKGUuZy4KKyAgKiAgaW5kaXZpZHVhbCBhdWRpbyBzYW1wbGVzIGRlbGl2ZXJlZCBhdCAxOTIga0h6KS4gVGhlIHF1YW50aXR5IGlzIDY0IGJpdCB0bwogICAqICBhY2NvbW1vZGF0ZSBhIGxhcmdlIGR5bmFtaWMgcmFuZ2UgKHNpZ25lZCAzMiBiaXQgdmFsdWVzIHdvdWxkIGFsbG93IG9ubHkgZm9yIHBsdXMKICAgKiAgb3IgbWludXMgMzUgbWludXRlcykuCiAgICoKLSAgKiAgSW1wbGVtZW50YXRpb25zIHdpdGggbGltaXRlZCBwcmVjaXNpb24gbWF5IGNvbnZlcnQgdGhlIHNpZ25lZCA2NCBiaXQgdmFsdWUgdG8gCi0gICogIGEgc2lnbmVkIDMyIGJpdCB2YWx1ZSBpbnRlcm5hbGx5IGJ1dCByaXNrIGxvc3Mgb2YgcHJlY2lzaW9uLiAgCisgICogIEltcGxlbWVudGF0aW9ucyB3aXRoIGxpbWl0ZWQgcHJlY2lzaW9uIG1heSBjb252ZXJ0IHRoZSBzaWduZWQgNjQgYml0IHZhbHVlIHRvCisgICogIGEgc2lnbmVkIDMyIGJpdCB2YWx1ZSBpbnRlcm5hbGx5IGJ1dCByaXNrIGxvc3Mgb2YgcHJlY2lzaW9uLgogICAqLwogI2lmbmRlZiBPTVhfU0tJUDY0QklUCiB0eXBlZGVmIE9NWF9TNjQgT01YX1RJQ0tTOwpAQCAtMzM2LDE3ICszMzYsMTcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgT01YX01BUktUWVBFCiB7Ci0gICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7ICAgLyoqPCBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbWFyayBldmVudCB1cG9uIAorICAgIE9NWF9IQU5ETEVUWVBFIGhNYXJrVGFyZ2V0Q29tcG9uZW50OyAgIC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbWFyayBldmVudCB1cG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIHRoZSBtYXJrLiAqLwotICAgIE9NWF9QVFIgcE1hcmtEYXRhOyAgIC8qKjwgQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSBhc3NvY2lhdGVkIHdpdGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCisgICAgT01YX1BUUiBwTWFya0RhdGE7ICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmsgc2VudCBvbiBhIG1hcmsgZXZlbnQgdG8gZGlzYW1iaWd1YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hcmsgZnJvbSBvdGhlcnMuICovCiB9IE9NWF9NQVJLVFlQRTsKIAogCiAvKiogT01YX05BVElWRV9ERVZJQ0VUWVBFIGlzIHVzZWQgdG8gbWFwIGEgT01YIHZpZGVvIHBvcnQgdG8gdGhlCi0gKiAgcGxhdGZvcm0gJiBvcGVyYXRpbmcgc3BlY2lmaWMgb2JqZWN0IHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBkaXNwbGF5IAorICogIHBsYXRmb3JtICYgb3BlcmF0aW5nIHNwZWNpZmljIG9iamVjdCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgZGlzcGxheQogICogIG9yIGNhbiBiZSB1c2VkIGJ5IGEgYXVkaW8gcG9ydCBmb3IgbmF0aXZlIGF1ZGlvIHJlbmRlcmluZyAqLwogdHlwZWRlZiBPTVhfUFRSIE9NWF9OQVRJVkVfREVWSUNFVFlQRTsKIApAQCAtMzU3LDcgKzM1Nyw3IEBACiAvKiogVGhlIE9NWF9WRVJTSU9OVFlQRSB1bmlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHZlcnNpb24gZm9yCiAgICAgYSBzdHJ1Y3R1cmUgb3IgY29tcG9uZW50LiAgRm9yIGEgY29tcG9uZW50LCB0aGUgdmVyc2lvbiBpcyBlbnRpcmVseQogICAgIHNwZWNpZmllZCBieSB0aGUgY29tcG9uZW50IHZlbmRvci4gIENvbXBvbmVudHMgZG9pbmcgdGhlIHNhbWUgZnVuY3Rpb24KLSAgICBmcm9tIGRpZmZlcmVudCB2ZW5kb3JzIG1heSBvciBtYXkgbm90IGhhdmUgdGhlIHNhbWUgdmVyc2lvbi4gIEZvciAKKyAgICBmcm9tIGRpZmZlcmVudCB2ZW5kb3JzIG1heSBvciBtYXkgbm90IGhhdmUgdGhlIHNhbWUgdmVyc2lvbi4gIEZvcgogICAgIHN0cnVjdHVyZXMsIHRoZSB2ZXJzaW9uIHNoYWxsIGJlIHNldCBieSB0aGUgZW50aXR5IHRoYXQgYWxsb2NhdGVzIHRoZQogICAgIHN0cnVjdHVyZS4gIEZvciBzdHJ1Y3R1cmVzIHNwZWNpZmllZCBpbiB0aGUgT01YIDEuMSBzcGVjaWZpY2F0aW9uLCB0aGUKICAgICB2YWx1ZSBvZiB0aGUgdmVyc2lvbiBzaGFsbCBiZSBzZXQgdG8gMS4xLjAuMCBpbiBhbGwgY2FzZXMuICBBY2Nlc3MgdG8gdGhlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmggYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX1ZpZGVvLmgKaW5kZXggODk0MjVlMC4uZGVjYzQxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9WaWRlby5oCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaApAQCAtMTYsMzEgKzE2LDMxIEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIC8qKgotICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCi0gKiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuCisgKgogICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCiAgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKICAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwogICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0Ci0gKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgogICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKLSAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKLSAqIAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgogICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKICAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKICAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KICAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCiAgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAogICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKICAqLwogCi0vKiogCisvKioKICAqICBAZmlsZSBPTVhfVmlkZW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgotICogIFRoZSBzdHJ1Y3R1cmVzIGlzIG5lZWRlZCBieSBWaWRlbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgCisgKiAgVGhlIHN0cnVjdHVyZXMgaXMgbmVlZGVkIGJ5IFZpZGVvIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UgcGFyYW1ldGVycwogICogIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCBPTVggY29tcG9uZW50cy4KICAqLwogI2lmbmRlZiBPTVhfVmlkZW9faApAQCAtNjAsMTkgKzYwLDE5IEBACiAvKioKICAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKICAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAotICogZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKiBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseQogICovCiAKICNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KIAogCiAvKioKLSAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBjb2RpbmdzLiAgCi0gKiBOT1RFOiAgVGhpcyBlc3NlbnRpYWxseSByZWZlcnMgdG8gZmlsZSBleHRlbnNpb25zLiBJZiB0aGUgY29kaW5nIGlzIAotICogICAgICAgIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgRU5DT0RFIHR5cGUsIHRoZW4gYWRkaXRpb25hbCB3b3JrIAotICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24gCi0gKiAgICAgICAgdG8gYmUgdXNlZC4gIEZvciBkZWNvZGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIAotICogICAgICAgIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gTVBFRy00IGFuZCBILjI2NCBiaXQgc3RyZWFtcywgaXQgaXMgCisgKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgdmlkZW8gY29tcHJlc3Npb24gY29kaW5ncy4KKyAqIE5PVEU6ICBUaGlzIGVzc2VudGlhbGx5IHJlZmVycyB0byBmaWxlIGV4dGVuc2lvbnMuIElmIHRoZSBjb2RpbmcgaXMKKyAqICAgICAgICBiZWluZyB1c2VkIHRvIHNwZWNpZnkgdGhlIEVOQ09ERSB0eXBlLCB0aGVuIGFkZGl0aW9uYWwgd29yaworICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24KKyAqICAgICAgICB0byBiZSB1c2VkLiAgRm9yIGRlY29kZSBjYXNlcyB3aGVyZSB0aGUgdXNlciBhcHBsaWNhdGlvbiBjYW4KKyAqICAgICAgICBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIE1QRUctNCBhbmQgSC4yNjQgYml0IHN0cmVhbXMsIGl0IGlzCiAgKiAgICAgICAgdXAgdG8gdGhlIGNvZGVjIHRvIGhhbmRsZSB0aGlzLgogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPRElOR1RZUEUgewpAQCAtODgsNTggKzg4LDU4IEBACiAgICAgT01YX1ZJREVPX0NvZGluZ1ZQOCwgICAgICAgIC8qKjwgR29vZ2xlIFZQOCwgZm9ybWVybHkga25vd24gYXMgT24yIFZQOCAqLwogICAgIE9NWF9WSURFT19Db2RpbmdWUDksICAgICAgICAvKio8IEdvb2dsZSBWUDkgKi8KICAgICBPTVhfVklERU9fQ29kaW5nSEVWQywgICAgICAgLyoqPCBJVFUgSC4yNjUvSEVWQyAqLwotICAgIE9NWF9WSURFT19Db2RpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9WSURFT19DT0RJTkdUWVBFOwogCiAKIC8qKgotICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYSB2aWRlbyBwYXRoLiAgVGhlIG51bWJlciBvZiBWaWRlbyBwYXRocyBmb3IgCi0gKiBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBWaWRlbyBjb21wb25lbnQuICAKLSAqIAorICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYSB2aWRlbyBwYXRoLiAgVGhlIG51bWJlciBvZiBWaWRlbyBwYXRocyBmb3IKKyAqIGlucHV0IGFuZCBvdXRwdXQgd2lsbCB2YXJ5IGJ5IHR5cGUgb2YgdGhlIFZpZGVvIGNvbXBvbmVudC4KKyAqCiAgKiAgICBJbnB1dCAoYWthIFNvdXJjZSkgOiB6ZXJvIElucHV0cywgb25lIE91dHB1dCwKICAqICAgIFNwbGl0dGVyICAgICAgICAgICA6IG9uZSBJbnB1dCwgMiBvciBtb3JlIE91dHB1dHMsCiAgKiAgICBQcm9jZXNzaW5nIEVsZW1lbnQgOiBvbmUgSW5wdXQsIG9uZSBvdXRwdXQsCiAgKiAgICBNaXhlciAgICAgICAgICAgICAgOiAyIG9yIG1vcmUgaW5wdXRzLCBvbmUgb3V0cHV0LAogICogICAgT3V0cHV0IChha2EgU2luaykgIDogb25lIElucHV0LCB6ZXJvIG91dHB1dHMuCi0gKiAKLSAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAotICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgdmlkZW8gCi0gKiBwYXRoLiAgSWYgYWRkaXRpb25hbCB2ZW5kb3Igc3BlY2lmaWMgZGF0YSBpcyByZXF1aXJlZCwgaXQgc2hvdWxkIGJlIAotICogdHJhbnNtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgQ3VzdG9tQ29tbWFuZCBmdW5jdGlvbi4gIENvbXBsaWFudCAKLSAqIGNvbXBvbmVudHMgd2lsbCBwcmVwb3B1bGF0ZSB0aGlzIHN0cnVjdHVyZSB3aXRoIG9wdGltYWwgdmFsdWVzIGR1cmluZyB0aGUgCisgKgorICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHZpZGVvCisgKiBwYXRoLiAgSWYgYWRkaXRpb25hbCB2ZW5kb3Igc3BlY2lmaWMgZGF0YSBpcyByZXF1aXJlZCwgaXQgc2hvdWxkIGJlCisgKiB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgQ29tcGxpYW50CisgKiBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsIHZhbHVlcyBkdXJpbmcgdGhlCiAgKiBHZXREZWZhdWx0SW5pdFBhcmFtcyBjb21tYW5kLgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIGNNSU1FVHlwZSAgICAgICAgICAgICA6IE1JTUUgdHlwZSBvZiBkYXRhIGZvciB0aGUgcG9ydAotICogIHBOYXRpdmVSZW5kZXIgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSBkaXNwbGF5IGlmIGEgCisgKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYQogICogICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAKLSAqICBuRnJhbWVXaWR0aCAgICAgICAgICAgOiBXaWR0aCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCisgKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiAgVXNlIDAgZm9yIHVua25vd24sCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCisgKiAgbkZyYW1lSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gY2hhbm5lbCBpZgogICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAKKyAqICBuU3RyaWRlICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNwYW4gb2YgYW4gaW1hZ2UKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKICAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcwotICogIG5CaXRyYXRlICAgICAgICAgICAgICA6IEJpdCByYXRlIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gY2hhbm5lbCBpZiAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgCisgKiAgbkJpdHJhdGUgICAgICAgICAgICAgIDogQml0IHJhdGUgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQotICogIHhGcmFtZXJhdGUgICAgICAgICAgICA6IEZyYW1lIHJhdGUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIHVuY29tcHJlc3NlZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sIGRvbid0IGNhcmUgb3IgCisgKiAgeEZyYW1lcmF0ZSAgICAgICAgICAgIDogRnJhbWUgcmF0ZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgdW5jb21wcmVzc2VkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciB1bmtub3duLCBkb24ndCBjYXJlIG9yCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBVbml0cyBhcmUgUTE2IGZyYW1lcyBwZXIgc2Vjb25kLgotICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKKyAqICBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQgOiBUdXJucyBvbiBlcnJvciBjb25jZWFsbWVudCBpZiBpdCBpcyBzdXBwb3J0ZWQgYnkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAotICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfVklERU9fQ29kaW5nVW51c2VkIGlzIAorICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIGVDb2xvckZvcm1hdCBpcyB1c2VkCiAgKiAgZUNvbG9yRm9ybWF0IDogRGVjb21wcmVzc2VkIGZvcm1hdCB1c2VkIGJ5IHRoaXMgY29tcG9uZW50Ci0gKiAgcE5hdGl2ZVdpbmRvdyA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSB3aW5kb3cgb2JqZWN0IGlmIGEgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBzaW5rICwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMHgwLiAKKyAqICBwTmF0aXZlV2luZG93IDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIHdpbmRvdyBvYmplY3QgaWYgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4KICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRSB7CiAgICAgT01YX1NUUklORyBjTUlNRVR5cGU7CkBAIC0xNTYsMTkgKzE1NiwxOSBAQAogICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OwogfSBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFOwogCi0vKiogIAotICogUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUgdGhlIHZhcmlvdXMgCisvKioKKyAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzCiAgKiBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgotICogCisgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgogICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAotICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKKyAqICBuSW5kZXggICAgICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20KICAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCi0gKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdXNlZCAKKyAqICBlQ29tcHJlc3Npb25Gb3JtYXQgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfVklERU9fQ29kaW5nVW51c2VkIGlzIHNwZWNpZmllZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdXNlZAogICogIGVDb2xvckZvcm1hdCAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAogICogIHhGcmFtZVJhdGUgICAgICAgICA6IEluZGljYXRlcyB0aGUgdmlkZW8gZnJhbWUgcmF0ZSBpbiBRMTYgZm9ybWF0CiAgKi8KQEAgLTE3NywxNCArMTc3LDE0IEBACiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsKICAgICBPTVhfVTMyIG5JbmRleDsKLSAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7IAorICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7CiAgICAgT01YX1UzMiB4RnJhbWVyYXRlOwogfSBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEU7CiAKIAogLyoqCi0gKiBUaGlzIGlzIGEgc3RydWN0dXJlIGZvciBjb25maWd1cmluZyB2aWRlbyBjb21wcmVzc2lvbiBxdWFudGl6YXRpb24gCisgKiBUaGlzIGlzIGEgc3RydWN0dXJlIGZvciBjb25maWd1cmluZyB2aWRlbyBjb21wcmVzc2lvbiBxdWFudGl6YXRpb24KICAqIHBhcmFtZXRlciB2YWx1ZXMuICBDb2RlY3MgbWF5IHN1cHBvcnQgZGlmZmVyZW50IFFQIHZhbHVlcyBmb3IgZGlmZmVyZW50CiAgKiBmcmFtZSB0eXBlcy4KICAqCkBAIC0xOTQsMTAgKzE5NCwxMCBAQAogICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwogICogIG5RcEkgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIGluZGV4IGZyYW1lcwogICogIG5RcFAgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIFAgZnJhbWVzCi0gKiAgblFwQiAgICAgICA6IFFQIHZhbHVlcyB0byB1c2UgZm9yIGJpZGlyZWN0aW9uYWwgZnJhbWVzIAorICogIG5RcEIgICAgICAgOiBRUCB2YWx1ZXMgdG8gdXNlIGZvciBiaWRpcmVjdGlvbmFsIGZyYW1lcwogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5TaXplOwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CiAgICAgT01YX1UzMiBuUXBJOwpAQCAtMjA2LDMyICsyMDYsMzIgQEAKIH0gT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEU7CiAKIAotLyoqIAotICogU3RydWN0dXJlIGZvciBjb25maWd1cmF0aW9uIG9mIHZpZGVvIGZhc3QgdXBkYXRlIHBhcmFtZXRlcnMuIAotICogIAorLyoqCisgKiBTdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gb2YgdmlkZW8gZmFzdCB1cGRhdGUgcGFyYW1ldGVycy4KKyAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvCiAgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCiAgKiAgYkVuYWJsZVZGVSA6IEVuYWJsZS9EaXNhYmxlIHZpZGVvIGZhc3QgdXBkYXRlCiAgKiAgbkZpcnN0R09CICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBtYWNyb2Jsb2NrIHJvdwogICogIG5GaXJzdE1CICAgOiBzcGVjaWZpZXMgdGhlIGZpcnN0IE1CIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgZmlyc3QgR09CCi0gKiAgbk51bU1CcyAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIE1CcyB0byBiZSByZWZyZXNoZWQgZnJvbSBuRmlyc3RHT0IgCisgKiAgbk51bU1CcyAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIE1CcyB0byBiZSByZWZyZXNoZWQgZnJvbSBuRmlyc3RHT0IKICAqICAgICAgICAgICAgICAgYW5kIG5GaXJzdE1CCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFIHsKLSAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAotICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlVkZVOyAgICAgIAotICAgIE9NWF9VMzIgbkZpcnN0R09COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5GaXJzdE1COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVTMyIG5OdW1NQnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiRW5hYmxlVkZVOworICAgIE9NWF9VMzIgbkZpcnN0R09COworICAgIE9NWF9VMzIgbkZpcnN0TUI7CisgICAgT01YX1UzMiBuTnVtTUJzOwogfSBPTVhfVklERU9fUEFSQU1fVklERU9GQVNUVVBEQVRFVFlQRTsKIAogCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBiaXRyYXRlIGNvbnRyb2wgdHlwZXMgCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGJpdHJhdGUgY29udHJvbCB0eXBlcwogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSB7CiAgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlRGlzYWJsZSwKQEAgLTIzOSwxNCArMjM5LDE0IEBACiAgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQsCiAgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGVTa2lwRnJhbWVzLAogICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50U2tpcEZyYW1lcywKLSAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9WSURFT19DT05UUk9MUkFURVRZUEU7CiAKIAotLyoqIAotICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBiaXRyYXRlIG1vZGUgb2YgYSBjb2RlYy4gCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKQEAgLTI1NiwyMyArMjU2LDIzIEBACiAgKiAgblRhcmdldEJpdHJhdGUgOiBUYXJnZXQgYml0cmF0ZSB0byBlbmNvZGUgd2l0aAogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgZUNvbnRyb2xSYXRlOyAKLSAgICBPTVhfVTMyIG5UYXJnZXRCaXRyYXRlOyAgICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgZUNvbnRyb2xSYXRlOworICAgIE9NWF9VMzIgblRhcmdldEJpdHJhdGU7CiB9IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRTsKIAogCi0vKiogCi0gKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtb3Rpb24gdmVjdG9yIChNVikgdHlwZXMgCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIG1vdGlvbiB2ZWN0b3IgKE1WKSB0eXBlcwogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX01PVElPTlZFQ1RPUlRZUEUgewogICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JQaXhlbCwKICAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9ySGFsZlBlbCwKICAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yUXVhcnRlclBlbCwKICAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yRWlnaHRoUGVsLAotICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3Rvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFOwpAQCAtMjgxLDcgKzI4MSw3IEBACiAvKioKICAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdGhlIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyB1c2VkIGFzIHdlbGwKICAqIGFzIHRoZWlyIGFjY3VyYWN5LgotICogCisgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdCBpbiBieXRlcwogICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KQEAgLTMwNCwzMiArMzA0LDMyIEBACiB9IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFOwogCiAKLS8qKiAKLSAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIG1ldGhvZHMgdG8gdXNlIGZvciBJbnRyYSBSZWZyZXNoIAorLyoqCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtZXRob2RzIHRvIHVzZSBmb3IgSW50cmEgUmVmcmVzaAogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX0lOVFJBUkVGUkVTSFRZUEUgewogICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hDeWNsaWMsCiAgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEFkYXB0aXZlLAogICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hCb3RoLAotICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFOwogCiAKIC8qKgotICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBpbnRyYSByZWZyZXNoIG1vZGUgCi0gKiAKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgaW50cmEgcmVmcmVzaCBtb2RlCisgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgogICogIG5Qb3J0SW5kZXggICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCiAgKiAgZVJlZnJlc2hNb2RlIDogQ3ljbGljLCBBZGFwdGl2ZSwgb3IgQm90aAotICogIG5BaXJNQnMgICAgICA6IE51bWJlciBvZiBpbnRyYSBtYWNyb2Jsb2NrcyB0byByZWZyZXNoIGluIGEgZnJhbWUgd2hlbiAKKyAqICBuQWlyTUJzICAgICAgOiBOdW1iZXIgb2YgaW50cmEgbWFjcm9ibG9ja3MgdG8gcmVmcmVzaCBpbiBhIGZyYW1lIHdoZW4KICAqICAgICAgICAgICAgICAgICBBSVIgaXMgZW5hYmxlZAotICogIG5BaXJSZWYgICAgICA6IE51bWJlciBvZiB0aW1lcyBhIG1vdGlvbiBtYXJrZWQgbWFjcm9ibG9jayBoYXMgdG8gYmUgIAorICogIG5BaXJSZWYgICAgICA6IE51bWJlciBvZiB0aW1lcyBhIG1vdGlvbiBtYXJrZWQgbWFjcm9ibG9jayBoYXMgdG8gYmUKICAqICAgICAgICAgICAgICAgICBpbnRyYSBjb2RlZAotICogIG5DaXJNQnMgICAgICA6IE51bWJlciBvZiBjb25zZWN1dGl2ZSBtYWNyb2Jsb2NrcyB0byBiZSBjb2RlZCBhcyAiaW50cmEiICAKKyAqICBuQ2lyTUJzICAgICAgOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbWFjcm9ibG9ja3MgdG8gYmUgY29kZWQgYXMgImludHJhIgogICogICAgICAgICAgICAgICAgIHdoZW4gQ0lSIGlzIGVuYWJsZWQKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUgewpAQCAtMzQ0LDE5ICszNDQsMTkgQEAKIAogCiAvKioKLSAqIFN0cnVjdHVyZSBmb3IgZW5hYmxpbmcgdmFyaW91cyBlcnJvciBjb3JyZWN0aW9uIG1ldGhvZHMgZm9yIHZpZGVvIAorICogU3RydWN0dXJlIGZvciBlbmFibGluZyB2YXJpb3VzIGVycm9yIGNvcnJlY3Rpb24gbWV0aG9kcyBmb3IgdmlkZW8KICAqIGNvbXByZXNzaW9uLgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAotICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCisgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwogICogIGJFbmFibGVIRUMgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgaGVhZGVyIGV4dGVuc2lvbiBjb2RlcyAoSEVDKQogICogIGJFbmFibGVSZXN5bmMgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgcmVzeW5jaHJvbml6YXRpb24gbWFya2VycwotICogIG5SZXN5bmNoTWFya2VyU3BhY2luZyAgIDogUmVzeW5jaCBtYXJrZXJzIGludGVydmFsIChpbiBiaXRzKSB0byBiZSAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgaW4gdGhlIHN0cmVhbSAKLSAqICBiRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA6IEVuYWJsZS9kaXNhYmxlIGRhdGEgcGFydGl0aW9uaW5nIAotICogIGJFbmFibGVSVkxDICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgcmV2ZXJzaWJsZSB2YXJpYWJsZSBsZW5ndGggCisgKiAgblJlc3luY2hNYXJrZXJTcGFjaW5nICAgOiBSZXN5bmNoIG1hcmtlcnMgaW50ZXJ2YWwgKGluIGJpdHMpIHRvIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIGluIHRoZSBzdHJlYW0KKyAqICBiRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA6IEVuYWJsZS9kaXNhYmxlIGRhdGEgcGFydGl0aW9uaW5nCisgKiAgYkVuYWJsZVJWTEMgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIHsKQEAgLTM3MSwxMiArMzcxLDEyIEBACiB9IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFOwogCiAKLS8qKiAKLSAqIENvbmZpZ3VyYXRpb24gb2YgdmFyaWFibGUgYmxvY2stc2l6ZSBtb3Rpb24gY29tcGVuc2F0aW9uIChWQlNNQykgCi0gKiAKKy8qKgorICogQ29uZmlndXJhdGlvbiBvZiB2YXJpYWJsZSBibG9jay1zaXplIG1vdGlvbiBjb21wZW5zYXRpb24gKFZCU01DKQorICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKLSAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgogICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwogICogIGIxNngxNiAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDE2CiAgKiAgYjE2eDggICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggMTZ4OApAQCAtMzg3LDExICszODcsMTEgQEAKICAqICBiNHg0ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA0eDQKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRSB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgCi0gICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAotICAgIE9NWF9CT09MIGIxNngxNjsgCi0gICAgT01YX0JPT0wgYjE2eDg7IAorICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiMTZ4MTY7CisgICAgT01YX0JPT0wgYjE2eDg7CiAgICAgT01YX0JPT0wgYjh4MTY7CiAgICAgT01YX0JPT0wgYjh4ODsKICAgICBPTVhfQk9PTCBiOHg0OwpAQCAtNDAwLDY3ICs0MDAsNjcgQEAKIH0gT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRTsKIAogCi0vKiogCi0gKiBILjI2MyBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCisvKioKKyAqIEguMjYzIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cwogICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KICAqCiAgKiBFTlVNUzoKLSAqICBCYXNlbGluZSAgICAgICAgICAgOiBCYXNlbGluZSBQcm9maWxlOiBILjI2MyAoVjEpLCBubyBvcHRpb25hbCBtb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqICBIMzIwIENvZGluZyAgICAgICAgOiBILjMyMCBDb2RpbmcgRWZmaWNpZW5jeSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IAorICogIEJhc2VsaW5lICAgICAgICAgICA6IEJhc2VsaW5lIFByb2ZpbGU6IEguMjYzIChWMSksIG5vIG9wdGlvbmFsIG1vZGVzCisgKiAgSDMyMCBDb2RpbmcgICAgICAgIDogSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgQmFja3dhcmQgQ29tcGF0aWJpbGl0eQogICogICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGU6IEguMjYzKyAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEwuNAogICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBUCi0gKiAgQmFja3dhcmRDb21wYXRpYmxlIDogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBQcm9maWxlOiBILjI2MyAoVjEpLCAKLSAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBhbm5leCBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgSVNXVjIgICAgICAgICAgICAgIDogSW50ZXJhY3RpdmUgU3RyZWFtaW5nIFdpcmVsZXNzIFByb2ZpbGU6IEguMjYzKyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEsgYW5kIFQgICAgICAgICAgICAgICAgIAotICogIElTV1YzICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysrICAKLSAqICAgICAgICAgICAgICAgICAgICAgICAoVjMpLCBpbmNsdWRlcyBwcm9maWxlIDMgYW5kIGFubmV4ZXMgViBhbmQgVy42LjMuOCAgIAotICogIEhpZ2hDb21wcmVzc2lvbiAgICA6IENvbnZlcnNhdGlvbmFsIEhpZ2ggQ29tcHJlc3Npb24gUHJvZmlsZTogSC4yNjMrKyAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZXMgMSAmIDIgYW5kIGFubmV4ZXMgRCBhbmQgVSAgIAotICogIEludGVybmV0ICAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybmV0IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAotICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggSyAgICAgICAgICAgICAgICAgICAgICAgCi0gKiAgSW50ZXJsYWNlICAgICAgICAgIDogQ29udmVyc2F0aW9uYWwgSW50ZXJsYWNlIFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAotICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggVy42LjMuMTEgICAgICAgICAgICAgICAKLSAqICBIaWdoTGF0ZW5jeSAgICAgICAgOiBIaWdoIExhdGVuY3kgUHJvZmlsZTogSC4yNjMrKyAoVjMpLCBpbmNsdWRlcyAgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA2IGFuZCBhbm5leGVzIE8uMSBhbmQgUC41ICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBCYWNrd2FyZENvbXBhdGlibGUgOiBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IFByb2ZpbGU6IEguMjYzIChWMSksCisgKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYW5uZXggRgorICogIElTV1YyICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysKKyAqICAgICAgICAgICAgICAgICAgICAgICAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEsgYW5kIFQKKyAqICBJU1dWMyAgICAgICAgICAgICAgOiBJbnRlcmFjdGl2ZSBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZTogSC4yNjMrKworICogICAgICAgICAgICAgICAgICAgICAgIChWMyksIGluY2x1ZGVzIHByb2ZpbGUgMyBhbmQgYW5uZXhlcyBWIGFuZCBXLjYuMy44CisgKiAgSGlnaENvbXByZXNzaW9uICAgIDogQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiBQcm9maWxlOiBILjI2MysrCisgKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZXMgMSAmIDIgYW5kIGFubmV4ZXMgRCBhbmQgVQorICogIEludGVybmV0ICAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybmV0IFByb2ZpbGU6IEguMjYzKysgKFYzKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IEsKKyAqICBJbnRlcmxhY2UgICAgICAgICAgOiBDb252ZXJzYXRpb25hbCBJbnRlcmxhY2UgUHJvZmlsZTogSC4yNjMrKyAoVjMpLAorICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggVy42LjMuMTEKKyAqICBIaWdoTGF0ZW5jeSAgICAgICAgOiBIaWdoIExhdGVuY3kgUHJvZmlsZTogSC4yNjMrKyAoVjMpLCBpbmNsdWRlcworICogICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgNiBhbmQgYW5uZXhlcyBPLjEgYW5kIFAuNQogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICA9IDB4MDEsICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgID0gMHgwMiwgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlICA9IDB4MDQsICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiAgICAgICAgICAgICAgID0gMHgwOCwgICAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMyAgICAgICAgICAgICAgID0gMHgxMCwgICAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb24gICAgID0gMHgyMCwgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybmV0ICAgICAgICAgICAgPSAweDQwLCAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUludGVybGFjZSAgICAgICAgICAgPSAweDgwLCAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaExhdGVuY3kgICAgICAgICA9IDB4MTAwLCAgICAgICAgIAotICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSAgICAgICAgICAgID0gMHgwMSwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgID0gMHgwMiwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgID0gMHgwNCwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiAgICAgICAgICAgICAgID0gMHgwOCwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMyAgICAgICAgICAgICAgID0gMHgxMCwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb24gICAgID0gMHgyMCwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcm5ldCAgICAgICAgICAgID0gMHg0MCwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2UgICAgICAgICAgID0gMHg4MCwKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgID0gMHgxMDAsCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVNYXggICAgICAgICAgICAgICAgID0gMHg3RkZGRkZGRiAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlTWF4ICAgICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYKIH0gT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRTsKIAogCi0vKiogCi0gKiBILjI2MyBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSBzaXplcywgCisvKioKKyAqIEguMjYzIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIHNpemVzLAogICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLgogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgewotICAgIE9NWF9WSURFT19IMjYzTGV2ZWwxMCAgPSAweDAxLCAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDIwICA9IDB4MDIsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDMwICA9IDB4MDQsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDQwICA9IDB4MDgsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDQ1ICA9IDB4MTAsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDUwICA9IDB4MjAsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDYwICA9IDB4NDAsICAgICAgCi0gICAgT01YX1ZJREVPX0gyNjNMZXZlbDcwICA9IDB4ODAsIAotICAgIE9NWF9WSURFT19IMjYzTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDEwICA9IDB4MDEsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDIwICA9IDB4MDIsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDMwICA9IDB4MDQsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDQwICA9IDB4MDgsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDQ1ICA9IDB4MTAsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDUwICA9IDB4MjAsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDYwICA9IDB4NDAsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDcwICA9IDB4ODAsCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19IMjYzTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19IMjYzTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKKyAgICBPTVhfVklERU9fSDI2M0xldmVsTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfVklERU9fSDI2M0xFVkVMVFlQRTsKIAogCi0vKiogCi0gKiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZS4gVGhlc2UgdmFsdWVzIHNob3VsZCBiZSBPUidkIHRvIHNpZ25hbCBhbGwgCisvKioKKyAqIFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlLiBUaGVzZSB2YWx1ZXMgc2hvdWxkIGJlIE9SJ2QgdG8gc2lnbmFsIGFsbAogICogcGljdHVyZXMgdHlwZXMgd2hpY2ggYXJlIGFsbG93ZWQuCiAgKgogICogRU5VTVM6CkBAIC00NzgsMzYgKzQ3OCwzNiBAQAogICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUVJICA9IDB4MTEsCiAgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlRVAgID0gMHgxMiwKICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVTICAgPSAweDE0LAotICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVklERU9fUGljdHVyZVR5cGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZU1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX1ZJREVPX1BJQ1RVUkVUWVBFOwogCiAKLS8qKiAKLSAqIEguMjYzIFBhcmFtcyAKKy8qKgorICogSC4yNjMgUGFyYW1zCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KICAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKICAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKICAqICBlUHJvZmlsZSAgICAgICAgICAgICAgICAgOiBILjI2MyBwcm9maWxlKHMpIHRvIHVzZQogICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICA6IEguMjYzIGxldmVsKHMpIHRvIHVzZQotICogIGJQTFVTUFRZUEVBbGxvd2VkICAgICAgICA6IEluZGljYXRpbmcgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIHVzZSBQTFVTUFRZUEUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWNpZmllZCBpbiB0aGUgMTk5OCB2ZXJzaW9uIG9mIEguMjYzKSB0byAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSBjdXN0b20gcGljdHVyZSBzaXplcyBvciBjbG9jayAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyAKLSAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCisgKiAgYlBMVVNQVFlQRUFsbG93ZWQgICAgICAgIDogSW5kaWNhdGluZyB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gdXNlIFBMVVNQVFlQRQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGVjaWZpZWQgaW4gdGhlIDE5OTggdmVyc2lvbiBvZiBILjI2MykgdG8KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSBjdXN0b20gcGljdHVyZSBzaXplcyBvciBjbG9jaworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzCisgKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgICAgIDogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGVzIGFsbG93ZWQgaW4gdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCi0gKiAgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvIDogdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCAoYml0IDYgb2YgTVBQVFlQRSkgaXMgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnN0cmFpbmVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjaGFuZ2UgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBSVFlQRSBiaXQgZm9yIGVhY2ggcmVmZXJlbmNlIAorICogIGJGb3JjZVJvdW5kaW5nVHlwZVRvWmVybyA6IHZhbHVlIG9mIHRoZSBSVFlQRSBiaXQgKGJpdCA2IG9mIE1QUFRZUEUpIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnN0cmFpbmVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjaGFuZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCBmb3IgZWFjaCByZWZlcmVuY2UKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlIGluIGVycm9yLWZyZWUgY29tbXVuaWNhdGlvbgotICogIG5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbiA6IFNwZWNpZmllcyB0aGUgZnJlcXVlbmN5IG9mIHBpY3R1cmUgaGVhZGVyIAorICogIG5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbiA6IFNwZWNpZmllcyB0aGUgZnJlcXVlbmN5IG9mIHBpY3R1cmUgaGVhZGVyCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbgotICogIG5HT0JIZWFkZXJJbnRlcnZhbCAgICAgICA6IFNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgb2Ygbm9uLWVtcHR5IEdPQiAgCisgKiAgbkdPQkhlYWRlckludGVydmFsICAgICAgIDogU3BlY2lmaWVzIHRoZSBpbnRlcnZhbCBvZiBub24tZW1wdHkgR09CCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyBpbiB1bml0cyBvZiBHT0JzCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSB7CkBAIC01MTcsNyArNTE3LDcgQEAKICAgICBPTVhfVTMyIG5QRnJhbWVzOwogICAgIE9NWF9VMzIgbkJGcmFtZXM7CiAgICAgT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLQlPTVhfVklERU9fSDI2M0xFVkVMVFlQRSBlTGV2ZWw7CisgICAgT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgZUxldmVsOwogICAgIE9NWF9CT09MIGJQTFVTUFRZUEVBbGxvd2VkOwogICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7CiAgICAgT01YX0JPT0wgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvOwpAQCAtNTI2LDggKzUyNiw4IEBACiB9IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRTsKIAogCi0vKiogCi0gKiBNUEVHLTIgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorLyoqCisgKiBNUEVHLTIgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzCiAgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgewpAQCAtNTM3LDI5ICs1MzcsMjkgQEAKICAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlU05SLCAgICAgICAgIC8qKjwgU05SIFByb2ZpbGUgKi8KICAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlU3BhdGlhbCwgICAgIC8qKjwgU3BhdGlhbCBQcm9maWxlICovCiAgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZUhpZ2gsICAgICAgICAvKio8IEhpZ2ggUHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYXggPSAweDdGRkZGRkZGICAKKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRTsKIAogCi0vKiogCi0gKiBNUEVHLTIgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgCi0gKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKKy8qKgorICogTVBFRy0yIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lCisgKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZAogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbExMID0gMCwgIC8qKjwgTG93IExldmVsICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsTUwsICAgICAgLyoqPCBNYWluIExldmVsICovIAotICAgIE9NWF9WSURFT19NUEVHMkxldmVsSDE0LCAgICAgLyoqPCBIaWdoIDE0NDAgKi8gCi0gICAgT01YX1ZJREVPX01QRUcyTGV2ZWxITCwgICAgICAvKio8IEhpZ2ggTGV2ZWwgKi8gICAKLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbExMID0gMCwgIC8qKjwgTG93IExldmVsICovCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCwgICAgICAvKio8IE1haW4gTGV2ZWwgKi8KKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbEgxNCwgICAgIC8qKjwgSGlnaCAxNDQwICovCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxITCwgICAgICAvKio8IEhpZ2ggTGV2ZWwgKi8KKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19NUEVHMkxldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzJMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsTWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEU7CiAKIAotLyoqIAotICogTVBFRy0yIHBhcmFtcyAKKy8qKgorICogTVBFRy0yIHBhcmFtcwogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKQEAgLTU3MSwyMCArNTcxLDIwIEBACiAgKiAgZUxldmVsICAgICA6IE1QRUctMiBsZXZlbHMocykgdG8gdXNlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5TaXplOwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKLSAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgCi0gICAgT01YX1UzMiBuUEZyYW1lczsgICAgICAgIAotICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUEZyYW1lczsKKyAgICBPTVhfVTMyIG5CRnJhbWVzOwogICAgIE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFIGVQcm9maWxlOwotCU9NWF9WSURFT19NUEVHMkxFVkVMVFlQRSBlTGV2ZWw7ICAgCisgICAgT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIGVMZXZlbDsKIH0gT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRTsKIAogCi0vKiogCi0gKiBNUEVHLTQgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorLyoqCisgKiBNUEVHLTQgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzCiAgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgotICogCisgKgogICogRU5VTVM6CiAgKiAgLSBTaW1wbGUgUHJvZmlsZSwgTGV2ZWxzIDEtMwogICogIC0gU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTIKQEAgLTYwMyw0OCArNjAzLDQ4IEBACiAgKiAgLSBBZHZhbmNlZCBTY2FsYWJsZSBUZXh0dXJlLCBMZXZlbHMgMi0zCiAgKi8KIHR5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSB7Ci0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSAgICAgICAgICAgPSAweDAxLCAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlICAgPSAweDAyLCAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZSAgICAgICAgICAgICA9IDB4MDQsICAgICAgICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTWFpbiAgICAgICAgICAgICA9IDB4MDgsICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVOYml0ICAgICAgICAgICAgID0gMHgxMCwgICAgICAgICAgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmUgID0gMHgyMCwgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRmFjZSAgICAgICA9IDB4NDAsICAgICAgICAKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRkJBICAgICAgICA9IDB4ODAsICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQgICAgPSAweDEwMCwgICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVIeWJyaWQgICAgICAgICAgID0gMHgyMDAsICAgICAgICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkUmVhbFRpbWUgPSAweDQwMCwgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUgICAgID0gMHg4MDAsICAgICAgCi0gICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nICAgPSAweDEwMDAsICAgIAotICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUgICAgID0gMHgyMDAwLCAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgID0gMHgwMSwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgICA9IDB4MDIsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUgICAgICAgICAgICAgPSAweDA0LAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluICAgICAgICAgICAgID0gMHgwOCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCAgICAgICAgICAgICA9IDB4MTAsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSAgPSAweDIwLAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlICAgICAgID0gMHg0MCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlRkJBICAgICAgICA9IDB4ODAsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQgICAgPSAweDEwMCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkICAgICAgICAgICA9IDB4MjAwLAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lID0gMHg0MDAsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSAgICAgPSAweDgwMCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgICA9IDB4MTAwMCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlICAgICA9IDB4MjAwMCwKICAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSA9IDB4NDAwMCwKICAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgICA9IDB4ODAwMCwKLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KLSAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTWF4ICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYXggICAgICAgICAgICAgID0gMHg3RkZGRkZGRgogfSBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRTsKIAogCi0vKiogCi0gKiBNUEVHLTQgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgCi0gKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKKy8qKgorICogTVBFRy00IGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lCisgKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZAogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFIHsKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgID0gMHgwMSwgICAvKio8IExldmVsIDAgKi8gICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDBiID0gMHgwMiwgICAvKio8IExldmVsIDBiICovICAgCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICA9IDB4MDQsICAgLyoqPCBMZXZlbCAxICovIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgPSAweDA4LCAgIC8qKjwgTGV2ZWwgMiAqLyAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgID0gMHgxMCwgICAvKio8IExldmVsIDMgKi8gCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICA9IDB4MjAsICAgLyoqPCBMZXZlbCA0ICovICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDRhID0gMHg0MCwgICAvKio8IExldmVsIDRhICovICAKLSAgICBPTVhfVklERU9fTVBFRzRMZXZlbDUgID0gMHg4MCwgICAvKio8IExldmVsIDUgKi8gIAotICAgIE9NWF9WSURFT19NUEVHNExldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsMCAgPSAweDAxLCAgIC8qKjwgTGV2ZWwgMCAqLworICAgIE9NWF9WSURFT19NUEVHNExldmVsMGIgPSAweDAyLCAgIC8qKjwgTGV2ZWwgMGIgKi8KKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDEgID0gMHgwNCwgICAvKio8IExldmVsIDEgKi8KKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgID0gMHgwOCwgICAvKio8IExldmVsIDIgKi8KKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgID0gMHgxMCwgICAvKio8IExldmVsIDMgKi8KKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDQgID0gMHgyMCwgICAvKio8IExldmVsIDQgKi8KKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDRhID0gMHg0MCwgICAvKio8IExldmVsIDRhICovCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICA9IDB4ODAsICAgLyoqPCBMZXZlbCA1ICovCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVklERU9fTVBFRzRMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCi0gICAgT01YX1ZJREVPX01QRUc0TGV2ZWxNYXggPSAweDdGRkZGRkZGICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFOwogCiAKLS8qKiAKKy8qKgogICogTVBFRy00IGNvbmZpZ3VyYXRpb24uICBUaGlzIHN0cnVjdHVyZSBoYW5kbGVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwogICogd2hpY2ggYXJlIHNwZWNpZmljIHRvIE1QRUc0IGFsZ29yaXRobXMKICAqCkBAIC02NTIsMjQgKzY1MiwyNCBAQAogICogIG5TaXplICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bwotICogIG5TbGljZUhlYWRlclNwYWNpbmcgIDogTnVtYmVyIG9mIG1hY3JvYmxvY2tzIGJldHdlZW4gc2xpY2UgaGVhZGVyIChIMjYzKyAKKyAqICBuU2xpY2VIZWFkZXJTcGFjaW5nICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciAoSDI2MysKICAqICAgICAgICAgICAgICAgICAgICAgICAgIEFubmV4IEspLiBQdXQgemVybyBpZiBub3QgdXNlZAogICogIGJTVkggICAgICAgICAgICAgICAgIDogRW5hYmxlIFNob3J0IFZpZGVvIEhlYWRlciBtb2RlCiAgKiAgYkdvdiAgICAgICAgICAgICAgICAgOiBGbGFnIHRvIGVuYWJsZSBHT1YKLSAqICBuUEZyYW1lcyAgICAgICAgICAgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZSAoYWxzbyBjYWxsZWQgCisgKiAgblBGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUgKGFsc28gY2FsbGVkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBHT1YgcGVyaW9kKQogICogIG5CRnJhbWVzICAgICAgICAgICAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCiAgKiAgbklEQ1ZMQ1RocmVzaG9sZCAgICAgOiBWYWx1ZSBvZiBpbnRyYSBEQyBWTEMgdGhyZXNob2xkCiAgKiAgYkFDUHJlZCAgICAgICAgICAgICAgOiBGbGFnIHRvIHVzZSBhYyBwcmVkaWN0aW9uCiAgKiAgbk1heFBhY2tldFNpemUgICAgICAgOiBNYXhpbXVtIHNpemUgb2YgcGFja2V0IGluIGJ5dGVzLgotICogIG5UaW1lSW5jUmVzICAgICAgICAgIDogVXNlZCB0byBwYXNzIFZPUCB0aW1lIGluY3JlbWVudCByZXNvbHV0aW9uIGZvciBNUEVHNC4gCisgKiAgblRpbWVJbmNSZXMgICAgICAgICAgOiBVc2VkIHRvIHBhc3MgVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gZm9yIE1QRUc0LgogICogICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIE1QRUc0IHN0YW5kYXJkLgogICogIGVQcm9maWxlICAgICAgICAgICAgIDogTVBFRy00IHByb2ZpbGUocykgdG8gdXNlLgogICogIGVMZXZlbCAgICAgICAgICAgICAgIDogTVBFRy00IGxldmVsKHMpIHRvIHVzZS4KICAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSBiaXRzdHJlYW0KICAqICBuSGVhZGVyRXh0ZW5zaW9uICAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHZpZGVvIHBhY2tldAogICogICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyB3aXRoaW4gYSBWT1AKLSAqICBiUmV2ZXJzaWJsZVZMQyAgICAgICA6IFNwZWNpZmllcyB3aGV0aGVyIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIGNvZGluZyAKKyAqICBiUmV2ZXJzaWJsZVZMQyAgICAgICA6IFNwZWNpZmllcyB3aGV0aGVyIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIGNvZGluZwogICogICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gdXNlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgewpAQCAtNjkzLDIyICs2OTMsMjIgQEAKIH0gT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRTsKIAogCi0vKiogCi0gKiBXTVYgVmVyc2lvbnMgCisvKioKKyAqIFdNViBWZXJzaW9ucwogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEUgewogICAgIE9NWF9WSURFT19XTVZGb3JtYXRVbnVzZWQgPSAweDAxLCAgIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCiAgICAgT01YX1ZJREVPX1dNVkZvcm1hdDcgICAgICA9IDB4MDIsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA3ICovCiAgICAgT01YX1ZJREVPX1dNVkZvcm1hdDggICAgICA9IDB4MDQsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA4ICovCiAgICAgT01YX1ZJREVPX1dNVkZvcm1hdDkgICAgICA9IDB4MDgsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA5ICovCi0gICAgT01YX1ZJREVPX1dNRkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fV01GRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1ZJREVPX1dNRkZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX1ZJREVPX1dNVkZvcm1hdE1heCAgICA9IDB4N0ZGRkZGRkYKIH0gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEU7CiAKIAotLyoqIAotICogV01WIFBhcmFtcyAKKy8qKgorICogV01WIFBhcmFtcwogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKQEAgLTcxNywzMyArNzE3LDMzIEBACiAgKiAgZUZvcm1hdCAgICA6IFZlcnNpb24gb2YgV01WIHN0cmVhbSAvIGRhdGEKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1dNVlRZUEUgewotICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9VMzIgblNpemU7CiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsKICAgICBPTVhfVklERU9fV01WRk9STUFUVFlQRSBlRm9ybWF0OwogfSBPTVhfVklERU9fUEFSQU1fV01WVFlQRTsKIAogCi0vKiogCi0gKiBSZWFsIFZpZGVvIFZlcnNpb24gCisvKioKKyAqIFJlYWwgVmlkZW8gVmVyc2lvbgogICovCiB0eXBlZGVmIGVudW0gT01YX1ZJREVPX1JWRk9STUFUVFlQRSB7CiAgICAgT01YX1ZJREVPX1JWRm9ybWF0VW51c2VkID0gMCwgLyoqPCBGb3JtYXQgdW51c2VkIG9yIHVua25vd24gKi8KICAgICBPTVhfVklERU9fUlZGb3JtYXQ4LCAgICAgICAgICAvKio8IFJlYWwgVmlkZW8gZm9ybWF0IDggKi8KICAgICBPTVhfVklERU9fUlZGb3JtYXQ5LCAgICAgICAgICAvKio8IFJlYWwgVmlkZW8gZm9ybWF0IDkgKi8KICAgICBPTVhfVklERU9fUlZGb3JtYXRHMiwgICAgICAgICAvKio8IFJlYWwgVmlkZW8gRm9ybWF0IEcyICovCi0gICAgT01YX1ZJREVPX1JWRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19SVkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19SVkZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCiAgICAgT01YX1ZJREVPX1JWRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgogfSBPTVhfVklERU9fUlZGT1JNQVRUWVBFOwogCiAKLS8qKiAKLSAqIFJlYWwgVmlkZW8gUGFyYW1zIAorLyoqCisgKiBSZWFsIFZpZGVvIFBhcmFtcwogICoKICAqIFNUVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCi0gKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KICAqICBlRm9ybWF0ICAgICAgICAgICAgOiBWZXJzaW9uIG9mIFJWIHN0cmVhbSAvIGRhdGEKICAqICBuQml0c1BlclBpeGVsICAgICAgOiBCaXRzIHBlciBwaXhlbCBjb2RlZCBpbiB0aGUgZnJhbWUKQEAgLTc1NSwxMSArNzU1LDExIEBACiAgKiAgbk1heEVuY29kZUZyYW1lU2l6ZTogTWF4IGVuY29kZWQgZnJhbWUgc2l6ZQogICogIGJFbmFibGVQb3N0RmlsdGVyICA6IFR1cm4gb24vb2ZmIHBvc3QgZmlsdGVyCiAgKiAgYkVuYWJsZVRlbXBvcmFsSW50ZXJwb2xhdGlvbiA6IFR1cm4gb24vb2ZmIHRlbXBvcmFsIGludGVycG9sYXRpb24KLSAqICBiRW5hYmxlTGF0ZW5jeU1vZGUgOiBXaGVuIGVuYWJsZWQsIHRoZSBkZWNvZGVyIGRvZXMgbm90IGRpc3BsYXkgYSBkZWNvZGVkIAotICogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIHVudGlsIGl0IGhhcyBkZXRlY3RlZCB0aGF0IG5vIGVuaGFuY2VtZW50IGxheWVyIAotICogIAkJCQkJIGZyYW1lcyBvciBkZXBlbmRlbnQgQiBmcmFtZXMgd2lsbCBiZSBjb21pbmcuIFRoaXMgCi0gKiAgCQkJCQkgZGV0ZWN0aW9uIHVzdWFsbHkgb2NjdXJzIHdoZW4gYSBzdWJzZXF1ZW50IG5vbi1CIAotICogIAkJCQkJIGZyYW1lIGlzIGVuY291bnRlcmVkIAorICogIGJFbmFibGVMYXRlbmN5TW9kZSA6IFdoZW4gZW5hYmxlZCwgdGhlIGRlY29kZXIgZG9lcyBub3QgZGlzcGxheSBhIGRlY29kZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSB1bnRpbCBpdCBoYXMgZGV0ZWN0ZWQgdGhhdCBubyBlbmhhbmNlbWVudCBsYXllcgorICogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcyBvciBkZXBlbmRlbnQgQiBmcmFtZXMgd2lsbCBiZSBjb21pbmcuIFRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gdXN1YWxseSBvY2N1cnMgd2hlbiBhIHN1YnNlcXVlbnQgbm9uLUIKKyAqICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBpcyBlbmNvdW50ZXJlZAogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUlZUWVBFIHsKICAgICBPTVhfVTMyIG5TaXplOwpAQCAtNzc5LDggKzc3OSw4IEBACiB9IE9NWF9WSURFT19QQVJBTV9SVlRZUEU7CiAKIAotLyoqIAotICogQVZDIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKKy8qKgorICogQVZDIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cwogICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KICAqLwogdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSB7CkBAIC03OTEsMTUgKzc5MSwxNSBAQAogICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwICAgPSAweDEwLCAgIC8qKjwgSGlnaCAxMCBwcm9maWxlICovCiAgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyICA9IDB4MjAsICAgLyoqPCBIaWdoIDQ6MjoyIHByb2ZpbGUgKi8KICAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQgID0gMHg0MCwgICAvKio8IEhpZ2ggNDo0OjQgcHJvZmlsZSAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19BVkNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19BVkNQcm9maWxlTWF4ICAgICAgPSAweDdGRkZGRkZGICAKKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1heCAgICAgID0gMHg3RkZGRkZGRgogfSBPTVhfVklERU9fQVZDUFJPRklMRVRZUEU7CiAKIAotLyoqIAotICogQVZDIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIHNpemVzLCAKLSAqIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4gIE5vIG5lZWQgCisvKioKKyAqIEFWQyBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSBzaXplcywKKyAqIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4gIE5vIG5lZWQKICAqLwogdHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgewogICAgIE9NWF9WSURFT19BVkNMZXZlbDEgICA9IDB4MDEsICAgICAvKio8IExldmVsIDEgKi8KQEAgLTgxOSwxNCArODE5LDE0IEBACiAgICAgT01YX1ZJREVPX0FWQ0xldmVsNSAgID0gMHg0MDAwLCAgIC8qKjwgTGV2ZWwgNSAqLwogICAgIE9NWF9WSURFT19BVkNMZXZlbDUxICA9IDB4ODAwMCwgICAvKio8IExldmVsIDUuMSAqLwogICAgIE9NWF9WSURFT19BVkNMZXZlbDUyICA9IDB4MTAwMDAsICAvKio8IExldmVsIDUuMiAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQVZDTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVklERU9fQVZDTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwotICAgIE9NWF9WSURFT19BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorICAgIE9NWF9WSURFT19BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRTsKIAogCi0vKiogCi0gKiBBVkMgbG9vcCBmaWx0ZXIgbW9kZXMgCisvKioKKyAqIEFWQyBsb29wIGZpbHRlciBtb2RlcwogICoKICAqIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRW5hYmxlICAgICAgICAgICAgICAgOiBFbmFibGUKICAqIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZSAgICAgICAgICAgICAgOiBEaXNhYmxlCkBAIC04MzYsMjAgKzgzNiwyMCBAQAogICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRW5hYmxlID0gMCwKICAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUsCiAgICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSwKLSAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KICAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlck1heCA9IDB4N0ZGRkZGRkYKIH0gT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFOwogCiAKLS8qKiAKLSAqIEFWQyBwYXJhbXMgCisvKioKKyAqIEFWQyBwYXJhbXMKICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKICAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCiAgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KICAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KLSAqICBuU2xpY2VIZWFkZXJTcGFjaW5nICAgICAgIDogTnVtYmVyIG9mIG1hY3JvYmxvY2tzIGJldHdlZW4gc2xpY2UgaGVhZGVyLCBwdXQgIAorICogIG5TbGljZUhlYWRlclNwYWNpbmcgICAgICAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIsIHB1dAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvIGlmIG5vdCB1c2VkCiAgKiAgblBGcmFtZXMgICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQogICogIG5CRnJhbWVzICAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKQEAgLTg2Miw4NSArODYyLDg1IEBACiAgKiAgblJlZklkeEZvcndhcmQgICAgICAgICAgICA6IFBpYyBwYXJhbSBzZXQgcmVmIGZyYW1lIGluZGV4IChpbmRleCBpbnRvIHJlZgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBidWZmZXIgb2YgZm9yd2FyZCBmcmFtZXMgbGlzdCksIEIgZnJhbWUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAotICogIGJFbmFibGVVRVAgICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSB1bmVxdWFsIGVycm9yIHByb3RlY3Rpb24uIFRoaXMgCisgKiAgYkVuYWJsZVVFUCAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHVuZXF1YWwgZXJyb3IgcHJvdGVjdGlvbi4gVGhpcwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbmx5IHZhbGlkIG9mIGRhdGEgcGFydGl0aW9uaW5nIGlzIGVuYWJsZWQuCiAgKiAgYkVuYWJsZUZNTyAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZsZXhpYmxlIG1hY3JvYmxvY2sgb3JkZXJpbmcKICAqICBiRW5hYmxlQVNPICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgYXJiaXRyYXJ5IHNsaWNlIG9yZGVyaW5nCiAgKiAgYkVuYWJsZVJTICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHNlbmRpbmcgb2YgcmVkdW5kYW50IHNsaWNlcwogICogIGVQcm9maWxlICAgICAgICAgICAgICAgICAgOiBBVkMgcHJvZmlsZShzKSB0byB1c2UKICAqICBlTGV2ZWwgICAgICAgICAgICAgICAgICAgIDogQVZDIGxldmVsKHMpIHRvIHVzZQotICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCisgKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KLSAqICBiRnJhbWVNQnNPbmx5ICAgICAgICAgICAgIDogc3BlY2lmaWVzIHRoYXQgZXZlcnkgY29kZWQgcGljdHVyZSBvZiB0aGUgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVkIHZpZGVvIHNlcXVlbmNlIGlzIGEgY29kZWQgZnJhbWUgCisgKiAgYkZyYW1lTUJzT25seSAgICAgICAgICAgICA6IHNwZWNpZmllcyB0aGF0IGV2ZXJ5IGNvZGVkIHBpY3R1cmUgb2YgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVkIHZpZGVvIHNlcXVlbmNlIGlzIGEgY29kZWQgZnJhbWUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyBvbmx5IGZyYW1lIG1hY3JvYmxvY2tzCi0gKiAgYk1CQUZGICAgICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHN3aXRjaGluZyBiZXR3ZWVuIGZyYW1lIGFuZCAKKyAqICBiTUJBRkYgICAgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc3dpdGNoaW5nIGJldHdlZW4gZnJhbWUgYW5kCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG1hY3JvYmxvY2tzIHdpdGhpbiBhIHBpY3R1cmUKLSAqICBiRW50cm9weUNvZGluZ0NBQkFDICAgICAgIDogRW50cm9weSBkZWNvZGluZyBtZXRob2QgdG8gYmUgYXBwbGllZCBmb3IgdGhlIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXggZWxlbWVudHMgZm9yIHdoaWNoIHR3byBkZXNjcmlwdG9ycyBhcHBlYXIgCisgKiAgYkVudHJvcHlDb2RpbmdDQUJBQyAgICAgICA6IEVudHJvcHkgZGVjb2RpbmcgbWV0aG9kIHRvIGJlIGFwcGxpZWQgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXggZWxlbWVudHMgZm9yIHdoaWNoIHR3byBkZXNjcmlwdG9ycyBhcHBlYXIKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN5bnRheCB0YWJsZXMKLSAqICBiV2VpZ2h0ZWRQUHJlZGljdGlvbiAgICAgIDogRW5hYmxlL2Rpc2FibGUgd2VpZ2h0ZWQgcHJlZGljdGlvbiBzaGFsbCBub3QgCisgKiAgYldlaWdodGVkUFByZWRpY3Rpb24gICAgICA6IEVuYWJsZS9kaXNhYmxlIHdlaWdodGVkIHByZWRpY3Rpb24gc2hhbGwgbm90CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gUCBhbmQgU1Agc2xpY2VzCi0gKiAgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZSA6IERlZmF1bHQgd2VpZ2h0ZWQgcHJlZGljdGlvbiBpcyBhcHBsaWVkIHRvIEIgCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlcyAKKyAqICBuV2VpZ2h0ZWRCaXByZWRpY2l0b25Nb2RlIDogRGVmYXVsdCB3ZWlnaHRlZCBwcmVkaWN0aW9uIGlzIGFwcGxpZWQgdG8gQgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZXMKICAqICBiY29uc3RJcHJlZCAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgaW50cmEgcHJlZGljdGlvbgotICogIGJEaXJlY3Q4eDhJbmZlcmVuY2UgICAgICAgOiBTcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIGluIHRoZSBkZXJpdmF0aW9uIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGZvciBsdW1hIG1vdGlvbiB2ZWN0b3JzIGZvciBCX1NraXAsIAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX0RpcmVjdF8xNngxNiBhbmQgQl9EaXJlY3RfOHg4IGFzIHNwZWNpZmllZCAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDguNC4xLjIgb2YgdGhlIEFWQyBzcGVjIAorICogIGJEaXJlY3Q4eDhJbmZlcmVuY2UgICAgICAgOiBTcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIGluIHRoZSBkZXJpdmF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgZm9yIGx1bWEgbW90aW9uIHZlY3RvcnMgZm9yIEJfU2tpcCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQl9EaXJlY3RfMTZ4MTYgYW5kIEJfRGlyZWN0Xzh4OCBhcyBzcGVjaWZpZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDguNC4xLjIgb2YgdGhlIEFWQyBzcGVjCiAgKiAgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbCAgICA6IEZsYWcgaW5kaWNhdGluZyBzcGF0aWFsIG9yIHRlbXBvcmFsIGRpcmVjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHVzZWQgaW4gQiBzbGljZSBjb2RpbmcgKHJlbGF0ZWQgdG8gCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXJlY3Q4eDhJbmZlcmVuY2UpIC4gU3BhdGlhbCBkaXJlY3QgbW9kZSBpcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB1c2VkIGluIEIgc2xpY2UgY29kaW5nIChyZWxhdGVkIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXJlY3Q4eDhJbmZlcmVuY2UpIC4gU3BhdGlhbCBkaXJlY3QgbW9kZSBpcwogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGNvbW1vbiBhbmQgc2hvdWxkIGJlIHRoZSBkZWZhdWx0LgogICogIG5DYWJhY0luaXRJZHggICAgICAgICAgICAgOiBJbmRleCB1c2VkIHRvIGluaXQgQ0FCQUMgY29udGV4dHMKICAqICBlTG9vcEZpbHRlck1vZGUgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgbG9vcCBmaWx0ZXIKICAqLwogdHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIAotICAgIE9NWF9VMzIgblNsaWNlSGVhZGVyU3BhY2luZzsgIAotICAgIE9NWF9VMzIgblBGcmFtZXM7ICAgICAKLSAgICBPTVhfVTMyIG5CRnJhbWVzOyAgICAgCisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblNsaWNlSGVhZGVyU3BhY2luZzsKKyAgICBPTVhfVTMyIG5QRnJhbWVzOworICAgIE9NWF9VMzIgbkJGcmFtZXM7CiAgICAgT01YX0JPT0wgYlVzZUhhZGFtYXJkOwotICAgIE9NWF9VMzIgblJlZkZyYW1lczsgIAotCU9NWF9VMzIgblJlZklkeDEwQWN0aXZlTWludXMxOwotCU9NWF9VMzIgblJlZklkeDExQWN0aXZlTWludXMxOwotICAgIE9NWF9CT09MIGJFbmFibGVVRVA7ICAKLSAgICBPTVhfQk9PTCBiRW5hYmxlRk1POyAgCi0gICAgT01YX0JPT0wgYkVuYWJsZUFTTzsgIAotICAgIE9NWF9CT09MIGJFbmFibGVSUzsgICAKKyAgICBPTVhfVTMyIG5SZWZGcmFtZXM7CisgICAgT01YX1UzMiBuUmVmSWR4MTBBY3RpdmVNaW51czE7CisgICAgT01YX1UzMiBuUmVmSWR4MTFBY3RpdmVNaW51czE7CisgICAgT01YX0JPT0wgYkVuYWJsZVVFUDsKKyAgICBPTVhfQk9PTCBiRW5hYmxlRk1POworICAgIE9NWF9CT09MIGJFbmFibGVBU087CisgICAgT01YX0JPT0wgYkVuYWJsZVJTOwogICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKLQlPTVhfVklERU9fQVZDTEVWRUxUWVBFIGVMZXZlbDsgCi0gICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsgIAotCU9NWF9CT09MIGJGcmFtZU1Cc09ubHk7ICAgICAgICAJCQkJCQkJCQkKLSAgICBPTVhfQk9PTCBiTUJBRkY7ICAgICAgICAgICAgICAgCi0gICAgT01YX0JPT0wgYkVudHJvcHlDb2RpbmdDQUJBQzsgIAotICAgIE9NWF9CT09MIGJXZWlnaHRlZFBQcmVkaWN0aW9uOyAKLSAgICBPTVhfVTMyIG5XZWlnaHRlZEJpcHJlZGljaXRvbk1vZGU7IAorICAgIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgZUxldmVsOworICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7CisgICAgT01YX0JPT0wgYkZyYW1lTUJzT25seTsKKyAgICBPTVhfQk9PTCBiTUJBRkY7CisgICAgT01YX0JPT0wgYkVudHJvcHlDb2RpbmdDQUJBQzsKKyAgICBPTVhfQk9PTCBiV2VpZ2h0ZWRQUHJlZGljdGlvbjsKKyAgICBPTVhfVTMyIG5XZWlnaHRlZEJpcHJlZGljaXRvbk1vZGU7CiAgICAgT01YX0JPT0wgYmNvbnN0SXByZWQgOwotICAgIE9NWF9CT09MIGJEaXJlY3Q4eDhJbmZlcmVuY2U7ICAKLQlPTVhfQk9PTCBiRGlyZWN0U3BhdGlhbFRlbXBvcmFsOwotCU9NWF9VMzIgbkNhYmFjSW5pdElkYzsKLQlPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgZUxvb3BGaWx0ZXJNb2RlOworICAgIE9NWF9CT09MIGJEaXJlY3Q4eDhJbmZlcmVuY2U7CisgICAgT01YX0JPT0wgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbDsKKyAgICBPTVhfVTMyIG5DYWJhY0luaXRJZGM7CisgICAgT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFIGVMb29wRmlsdGVyTW9kZTsKIH0gT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEU7CiAKIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHsKLSAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAKLSAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKLSAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKLSAgIE9NWF9VMzIgZVByb2ZpbGU7ICAgICAgLyoqPCB0eXBlIGlzIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSwgT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSwgCisgICBPTVhfVTMyIG5TaXplOworICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgT01YX1UzMiBlUHJvZmlsZTsgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFLCBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgZGVwZW5kaW5nIG9uIGNvbnRleHQgKi8KLSAgIE9NWF9VMzIgZUxldmVsOyAgICAgICAgLyoqPCB0eXBlIGlzIE9NWF9WSURFT19BVkNMRVZFTFRZUEUsIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFLCAKKyAgIE9NWF9VMzIgZUxldmVsOyAgICAgICAgLyoqPCB0eXBlIGlzIE9NWF9WSURFT19BVkNMRVZFTFRZUEUsIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgZGVwZW5kaW5nIG9uIGNvbnRleHQgKi8KICAgIE9NWF9VMzIgblByb2ZpbGVJbmRleDsgLyoqPCBVc2VkIHRvIHF1ZXJ5IGZvciBpbmRpdmlkdWFsIHByb2ZpbGUgc3VwcG9ydCBpbmZvcm1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYWxsIG90aGVyIGluZGljZXMgdGhpcyBwYXJhbWV0ZXIgaXMgdG8gYmUgaWdub3JlZC4gKi8KIH0gT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEU7CiAKLS8qKiAKLSAqIFN0cnVjdHVyZSBmb3IgZHluYW1pY2FsbHkgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAorLyoqCisgKiBTdHJ1Y3R1cmUgZm9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyaW5nIGJpdHJhdGUgbW9kZSBvZiBhIGNvZGVjLgogICoKICAqIFNUUlVDVCBNRU1CRVJTOgogICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCkBAIC05NDksMTggKzk0OSwxOCBAQAogICogIG5FbmNvZGVCaXRyYXRlIDogVGFyZ2V0IGF2ZXJhZ2UgYml0cmF0ZSB0byBiZSBnZW5lcmF0ZWQgaW4gYnBzCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgewotICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCi0gICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAotICAgIE9NWF9VMzIgbkVuY29kZUJpdHJhdGU7ICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuRW5jb2RlQml0cmF0ZTsKIH0gT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRTsKIAotLyoqIAorLyoqCiAgKiBEZWZpbmVzIEVuY29kZXIgRnJhbWUgUmF0ZSBzZXR0aW5nCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwotICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCiAgKiAgblBvcnRJbmRleCAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCiAgKiAgeEVuY29kZUZyYW1lcmF0ZSA6IEVuY29kaW5nIGZyYW1lcmF0ZSByZXByZXNlbnRlZCBpbiBRMTYgZm9ybWF0CiAgKi8KQEAgLTEwMDAsOCArMTAwMCw4IEBACiAgICAgT01YX1UzMiBuTWFjcm9ibG9ja3M7CiB9IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEU7CiAKLS8qKiAKLSAqIEFWQyBTbGljZSBNb2RlIG1vZGVzIAorLyoqCisgKiBBVkMgU2xpY2UgTW9kZSBtb2RlcwogICoKICAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDRGVmYXVsdCAgIDogTm9ybWFsIGZyYW1lIGVuY29kaW5nLCBvbmUgc2xpY2UgcGVyIGZyYW1lCiAgKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ01CU2xpY2UgICA6IE5BTCBtb2RlLCBudW1iZXIgb2YgTUJzIHBlciBmcmFtZQpAQCAtMTAxMSwxMyArMTAxMSwxMyBAQAogICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDRGVmYXVsdCA9IDAsCiAgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNNQlNsaWNlLAogICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDQnl0ZVNsaWNlLAotICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCiAgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLwogICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGCiB9IE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFOwogCi0vKiogCi0gKiBBVkMgRk1PIFNsaWNlIE1vZGUgUGFyYW1zIAorLyoqCisgKiBBVkMgRk1PIFNsaWNlIE1vZGUgUGFyYW1zCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CiAgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcwpAQCAtMTAyOCw3ICsxMDI4LDcgQEAKICAqICBlU2xpY2VNb2RlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlCiAgKi8KIHR5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyB7Ci0gICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1UzMiBuU2l6ZTsKICAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CiAgICAgT01YX1UzMiBuUG9ydEluZGV4OwogICAgIE9NWF9VOCBuTnVtU2xpY2VHcm91cHM7CkBAIC0xMDM2LDcgKzEwMzYsNyBAQAogICAgIE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFIGVTbGljZU1vZGU7CiB9IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTzsKIAotLyoqIAorLyoqCiAgKiBBVkMgSURSIFBlcmlvZCBDb25maWdzCiAgKgogICogU1RSVUNUIE1FTUJFUlM6CkBAIC0xMDQ3LDE0ICsxMDQ3LDE0IEBACiAgKiAgblBGcmFtZXMgOiBTcGVjaWZpZXMgaW50ZXJuYWwgb2YgY29kaW5nIEludHJhIGZyYW1lcwogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EIHsKLSAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVTMyIG5TaXplOwogICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKICAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CiAgICAgT01YX1UzMiBuSURSUGVyaW9kOwogICAgIE9NWF9VMzIgblBGcmFtZXM7CiB9IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0Q7CiAKLS8qKiAKKy8qKgogICogQVZDIE5BTCBTaXplIENvbmZpZ3MKICAqCiAgKiBTVFJVQ1QgTUVNQkVSUzoKQEAgLTEwNjQsNyArMTA2NCw3IEBACiAgKiAgbk5hbHVCeXRlcyA6IFNwZWNpZmllcyB0aGUgTkFMIHVuaXQgc2l6ZQogICovCiB0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgewotICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9VMzIgblNpemU7CiAgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOwogICAgIE9NWF9VMzIgblBvcnRJbmRleDsKICAgICBPTVhfVTMyIG5OYWx1Qnl0ZXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL1N0YXRpYy5oIGIvaW5jbHVkZS9wcml2YXRlL2JpbmRlci9TdGF0aWMuaAppbmRleCA2YTAzNTk0Li5kMTA0NjQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvYmluZGVyL1N0YXRpYy5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9iaW5kZXIvU3RhdGljLmgKQEAgLTM0LDcgKzM0LDcgQEAKIGV4dGVybiBNdXRleCBnUHJvY2Vzc011dGV4OwogZXh0ZXJuIHNwPFByb2Nlc3NTdGF0ZT4gZ1Byb2Nlc3M7CiAKLS8vIEZvciBTZXJ2aWNlTWFuYWdlci5jcHAKKy8vIEZvciBJU2VydmljZU1hbmFnZXIuY3BwCiBleHRlcm4gTXV0ZXggZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2s7CiBleHRlcm4gc3A8SVNlcnZpY2VNYW5hZ2VyPiBnRGVmYXVsdFNlcnZpY2VNYW5hZ2VyOwogZXh0ZXJuIHNwPElQZXJtaXNzaW9uQ29udHJvbGxlcj4gZ1Blcm1pc3Npb25Db250cm9sbGVyOwpkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvUGFyY2VsLmNwcCBiL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAKaW5kZXggODBjNWQ3ZS4uMmM1NjZmOSAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvUGFyY2VsLmNwcAorKysgYi9saWJzL2JpbmRlci9QYXJjZWwuY3BwCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8YmluZGVyL1RleHRPdXRwdXQuaD4KIAogI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dXRpbHMvQ2FsbFN0YWNrLmg+CiAjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC0zNiw4ICszNSw4IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2FzaG1lbS5oPgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9iaW5kZXIvYmluZGVyX21vZHVsZS5oPgorI2luY2x1ZGUgPHByaXZhdGUvYmluZGVyL1N0YXRpYy5oPgogCi0jaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC01MCw2ICs0OSw4IEBACiAKICNkZWZpbmUgTE9HX1JFRlMoLi4uKQogLy8jZGVmaW5lIExPR19SRUZTKC4uLikgQUxPRyhMT0dfREVCVUcsICJQYXJjZWwiLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTE9HX0FMTE9DKC4uLikKKy8vI2RlZmluZSBMT0dfQUxMT0MoLi4uKSBBTE9HKExPR19ERUJVRywgIlBhcmNlbCIsIF9fVkFfQVJHU19fKQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNzQsNiArNzUsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdQYXJjZWxHbG9iYWxBbGxvY1NpemVMb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKK3N0YXRpYyBzaXplX3QgZ1BhcmNlbEdsb2JhbEFsbG9jU2l6ZSA9IDA7CitzdGF0aWMgc2l6ZV90IGdQYXJjZWxHbG9iYWxBbGxvY0NvdW50ID0gMDsKKwogdm9pZCBhY3F1aXJlX29iamVjdChjb25zdCBzcDxQcm9jZXNzU3RhdGU+JiBwcm9jLAogICAgIGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgb2JqLCBjb25zdCB2b2lkKiB3aG8pCiB7CkBAIC0yOTMsMTIgKzI5OCwyOCBAQAogCiBQYXJjZWw6OlBhcmNlbCgpCiB7CisgICAgTE9HX0FMTE9DKCJQYXJjZWwgJXA6IGNvbnN0cnVjdGluZyIsIHRoaXMpOwogICAgIGluaXRTdGF0ZSgpOwogfQogCiBQYXJjZWw6On5QYXJjZWwoKQogewogICAgIGZyZWVEYXRhTm9Jbml0KCk7CisgICAgTE9HX0FMTE9DKCJQYXJjZWwgJXA6IGRlc3Ryb3llZCIsIHRoaXMpOworfQorCitzaXplX3QgUGFyY2VsOjpnZXRHbG9iYWxBbGxvY1NpemUoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnUGFyY2VsR2xvYmFsQWxsb2NTaXplTG9jayk7CisgICAgc2l6ZV90IHNpemUgPSBnUGFyY2VsR2xvYmFsQWxsb2NTaXplOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnUGFyY2VsR2xvYmFsQWxsb2NTaXplTG9jayk7CisgICAgcmV0dXJuIHNpemU7Cit9CisKK3NpemVfdCBQYXJjZWw6OmdldEdsb2JhbEFsbG9jQ291bnQoKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnUGFyY2VsR2xvYmFsQWxsb2NTaXplTG9jayk7CisgICAgc2l6ZV90IGNvdW50ID0gZ1BhcmNlbEdsb2JhbEFsbG9jQ291bnQ7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdQYXJjZWxHbG9iYWxBbGxvY1NpemVMb2NrKTsKKyAgICByZXR1cm4gY291bnQ7CiB9CiAKIGNvbnN0IHVpbnQ4X3QqIFBhcmNlbDo6ZGF0YSgpIGNvbnN0CkBAIC03NzQsMjkgKzc5NSw2IEBACiBzdGF0dXNfdCBQYXJjZWw6OndyaXRlRHVwRmlsZURlc2NyaXB0b3IoaW50IGZkKQogewogICAgIGludCBkdXBGZCA9IGR1cChmZCk7Ci0KLSAgICB7ICAgLy8gVGVtcG9yYXJ5IGV4dHJhIGRlYnVnIHZhbGlkYXRpb24gZm9yIGIvMTc0NzcyMTk6IGEgUGFyY2VsIHJlY2lwaWVudCBpcwotICAgICAgICAvLyBnZXR0aW5nIGEgcG9zaXRpdmUgYnV0IGludmFsaWQgZmQgdW5leHBlY3RlZGx5LiBUcnlpbmcgdG8gdHJhY2sgZG93bgotICAgICAgICAvLyB3aGVyZSBpdCdzIGNvbWluZyBmcm9tLgotICAgICAgICBpbnQgZHVwRXJybm8gPSBkdXBGZCA8IDAgPyBlcnJubyA6IDA7Ci0gICAgICAgIGludCBmZEZsYWdzID0gZmNudGwoZmQsIEZfR0VURkQpOwotICAgICAgICBpbnQgZmRGbGFnc0Vycm5vID0gZmRGbGFncyA9PSAtMSA/IGVycm5vIDogMDsKLSAgICAgICAgaW50IGR1cEZsYWdzID0gZmNudGwoZHVwRmQsIEZfR0VURkQpOwotICAgICAgICBpbnQgZHVwRmxhZ3NFcnJubyA9IGR1cEZsYWdzID09IC0xID8gZXJybm8gOiAwOwotICAgICAgICBpZiAoZHVwRmQgPCAwIHx8IGZkRmxhZ3MgPT0gLTEgfHwgZHVwRmxhZ3MgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJQYXJjZWw6OndyaXRlRHVwRmlsZURlc2NyaXB0b3IgZmFpbGVkOlxuIgotICAgICAgICAgICAgICAgICAgICAiICBmZD0lZCBmbGFncz0lZCBlcnI9JWQoJXMpXG4iCi0gICAgICAgICAgICAgICAgICAgICIgIGR1cEZkPSVkIGR1cEVycj0lZCglcykgZmxhZ3M9JWQgZXJyPSVkKCVzKSIsCi0gICAgICAgICAgICAgICAgICAgIGZkLCBmZEZsYWdzLCBmZEZsYWdzRXJybm8sIHN0cmVycm9yKGZkRmxhZ3NFcnJubyksCi0gICAgICAgICAgICAgICAgICAgIGR1cEZkLCBkdXBFcnJubywgc3RyZXJyb3IoZHVwRXJybm8pLAotICAgICAgICAgICAgICAgICAgICBkdXBGbGFncywgZHVwRmxhZ3NFcnJubywgc3RyZXJyb3IoZHVwRmxhZ3NFcnJubykpOwotICAgICAgICAgICAgaWYgKGZkIDwgMCB8fCBmZEZsYWdzID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgQ2FsbFN0YWNrKExPR19UQUcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGlmIChkdXBGZCA8IDApIHsKICAgICAgICAgcmV0dXJuIC1lcnJubzsKICAgICB9CkBAIC0xMzIwLDIzICsxMzE4LDExIEBACiAKICAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGZkX2NvdW50ICYmIGVycj09Tk9fRVJST1IgOyBpKyspIHsKLSAgICAgICAgaW50IG9sZGZkID0gdGhpcy0+cmVhZEZpbGVEZXNjcmlwdG9yKCk7Ci0gICAgICAgIGZkc1tpXSA9IGR1cChvbGRmZCk7CisgICAgICAgIGZkc1tpXSA9IGR1cCh0aGlzLT5yZWFkRmlsZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGlmIChmZHNbaV0gPCAwKSB7Ci0gICAgICAgICAgICBpbnQgZHVwRXJybm8gPSBlcnJubzsKICAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGludCBmbGFncyA9IGZjbnRsKG9sZGZkLCBGX0dFVEZEKTsKLSAgICAgICAgICAgIGludCBmY250bEVycm5vID0gZXJybm87Ci0gICAgICAgICAgICBjb25zdCBmbGF0X2JpbmRlcl9vYmplY3QqIGZsYXQgPSByZWFkT2JqZWN0KHRydWUpOwotICAgICAgICAgICAgQUxPR0UoImR1cCBmYWlsZWQgaW4gUGFyY2VsOjpyZWFkLCBmZCAlenUgb2YgJXp1XG4iCi0gICAgICAgICAgICAgICAgIiAgZHVwKCVkKSA9ICVkIFtlcnJubzogJWQgKCVzKV1cbiIKLSAgICAgICAgICAgICAgICAiICBmY250bCglZCwgRl9HRVRGRCkgPSAlZCBbZXJybm86ICVkICglcyldXG4iCi0gICAgICAgICAgICAgICAgIiAgZmxhdCAlcCB0eXBlICVkIiwKLSAgICAgICAgICAgICAgICBpLCBmZF9jb3VudCwKLSAgICAgICAgICAgICAgICBvbGRmZCwgZmRzW2ldLCBkdXBFcnJubywgc3RyZXJyb3IoZHVwRXJybm8pLAotICAgICAgICAgICAgICAgIG9sZGZkLCBmbGFncywgZmNudGxFcnJubywgc3RyZXJyb3IoZmNudGxFcnJubyksCi0gICAgICAgICAgICAgICAgZmxhdCwgZmxhdCA/IGZsYXQtPnR5cGUgOiAwKTsKLSAgICAgICAgICAgIENhbGxTdGFjayhMT0dfVEFHKTsKKyAgICAgICAgICAgIEFMT0dFKCJkdXAoKSBmYWlsZWQgaW4gUGFyY2VsOjpyZWFkLCBpIGlzICV6dSwgZmRzW2ldIGlzICVkLCBmZF9jb3VudCBpcyAlenUsIGVycm9yOiAlcyIsCisgICAgICAgICAgICAgICAgaSwgZmRzW2ldLCBmZF9jb3VudCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU0MCwxMSArMTUyNiwyMCBAQAogdm9pZCBQYXJjZWw6OmZyZWVEYXRhTm9Jbml0KCkKIHsKICAgICBpZiAobU93bmVyKSB7CisgICAgICAgIExPR19BTExPQygiUGFyY2VsICVwOiBmcmVlaW5nIG90aGVyIG93bmVyIGRhdGEiLCB0aGlzKTsKICAgICAgICAgLy9BTE9HSSgiRnJlZWluZyBkYXRhIHJlZiBvZiAlcCAocGlkPSVkKSIsIHRoaXMsIGdldHBpZCgpKTsKICAgICAgICAgbU93bmVyKHRoaXMsIG1EYXRhLCBtRGF0YVNpemUsIG1PYmplY3RzLCBtT2JqZWN0c1NpemUsIG1Pd25lckNvb2tpZSk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HX0FMTE9DKCJQYXJjZWwgJXA6IGZyZWVpbmcgYWxsb2NhdGVkIGRhdGEiLCB0aGlzKTsKICAgICAgICAgcmVsZWFzZU9iamVjdHMoKTsKLSAgICAgICAgaWYgKG1EYXRhKSBmcmVlKG1EYXRhKTsKKyAgICAgICAgaWYgKG1EYXRhKSB7CisgICAgICAgICAgICBMT0dfQUxMT0MoIlBhcmNlbCAlcDogZnJlZWluZyB3aXRoICV6dSBjYXBhY2l0eSIsIHRoaXMsIG1EYXRhQ2FwYWNpdHkpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZnUGFyY2VsR2xvYmFsQWxsb2NTaXplTG9jayk7CisgICAgICAgICAgICBnUGFyY2VsR2xvYmFsQWxsb2NTaXplIC09IG1EYXRhQ2FwYWNpdHk7CisgICAgICAgICAgICBnUGFyY2VsR2xvYmFsQWxsb2NDb3VudC0tOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmdQYXJjZWxHbG9iYWxBbGxvY1NpemVMb2NrKTsKKyAgICAgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICB9CiAgICAgICAgIGlmIChtT2JqZWN0cykgZnJlZShtT2JqZWN0cyk7CiAgICAgfQogfQpAQCAtMTU3Myw2ICsxNTY4LDExIEBACiAgICAgcmVsZWFzZU9iamVjdHMoKTsKIAogICAgIGlmIChkYXRhKSB7CisgICAgICAgIExPR19BTExPQygiUGFyY2VsICVwOiByZXN0YXJ0IGZyb20gJXp1IHRvICV6dSBjYXBhY2l0eSIsIHRoaXMsIG1EYXRhQ2FwYWNpdHksIGRlc2lyZWQpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdQYXJjZWxHbG9iYWxBbGxvY1NpemVMb2NrKTsKKyAgICAgICAgZ1BhcmNlbEdsb2JhbEFsbG9jU2l6ZSArPSBkZXNpcmVkOworICAgICAgICBnUGFyY2VsR2xvYmFsQWxsb2NTaXplIC09IG1EYXRhQ2FwYWNpdHk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnUGFyY2VsR2xvYmFsQWxsb2NTaXplTG9jayk7CiAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgbURhdGFDYXBhY2l0eSA9IGRlc2lyZWQ7CiAgICAgfQpAQCAtMTY1Miw2ICsxNjUyLDEyIEBACiAgICAgICAgIG1Pd25lcih0aGlzLCBtRGF0YSwgbURhdGFTaXplLCBtT2JqZWN0cywgbU9iamVjdHNTaXplLCBtT3duZXJDb29raWUpOwogICAgICAgICBtT3duZXIgPSBOVUxMOwogCisgICAgICAgIExPR19BTExPQygiUGFyY2VsICVwOiB0YWtpbmcgb3duZXJzaGlwIG9mICV6dSBjYXBhY2l0eSIsIHRoaXMsIGRlc2lyZWQpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdQYXJjZWxHbG9iYWxBbGxvY1NpemVMb2NrKTsKKyAgICAgICAgZ1BhcmNlbEdsb2JhbEFsbG9jU2l6ZSArPSBkZXNpcmVkOworICAgICAgICBnUGFyY2VsR2xvYmFsQWxsb2NDb3VudCsrOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BhcmNlbEdsb2JhbEFsbG9jU2l6ZUxvY2spOworCiAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgbU9iamVjdHMgPSBvYmplY3RzOwogICAgICAgICBtRGF0YVNpemUgPSAobURhdGFTaXplIDwgZGVzaXJlZCkgPyBtRGF0YVNpemUgOiBkZXNpcmVkOwpAQCAtMTY4Niw2ICsxNjkyLDEyIEBACiAgICAgICAgIGlmIChkZXNpcmVkID4gbURhdGFDYXBhY2l0eSkgewogICAgICAgICAgICAgdWludDhfdCogZGF0YSA9ICh1aW50OF90KilyZWFsbG9jKG1EYXRhLCBkZXNpcmVkKTsKICAgICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICAgICAgTE9HX0FMTE9DKCJQYXJjZWwgJXA6IGNvbnRpbnVlIGZyb20gJXp1IHRvICV6dSBjYXBhY2l0eSIsIHRoaXMsIG1EYXRhQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkKTsKKyAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdQYXJjZWxHbG9iYWxBbGxvY1NpemVMb2NrKTsKKyAgICAgICAgICAgICAgICBnUGFyY2VsR2xvYmFsQWxsb2NTaXplICs9IGRlc2lyZWQ7CisgICAgICAgICAgICAgICAgZ1BhcmNlbEdsb2JhbEFsbG9jU2l6ZSAtPSBtRGF0YUNhcGFjaXR5OworICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZnUGFyY2VsR2xvYmFsQWxsb2NTaXplTG9jayk7CiAgICAgICAgICAgICAgICAgbURhdGEgPSBkYXRhOwogICAgICAgICAgICAgICAgIG1EYXRhQ2FwYWNpdHkgPSBkZXNpcmVkOwogICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNpcmVkID4gbURhdGFDYXBhY2l0eSkgewpAQCAtMTcxNiw2ICsxNzI4LDEyIEBACiAgICAgICAgICAgICBBTE9HRSgiY29udGludWVXcml0ZTogJXp1LyVwLyV6dS8lenUiLCBtRGF0YUNhcGFjaXR5LCBtT2JqZWN0cywgbU9iamVjdHNDYXBhY2l0eSwgZGVzaXJlZCk7CiAgICAgICAgIH0KIAorICAgICAgICBMT0dfQUxMT0MoIlBhcmNlbCAlcDogYWxsb2NhdGluZyB3aXRoICV6dSBjYXBhY2l0eSIsIHRoaXMsIGRlc2lyZWQpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdQYXJjZWxHbG9iYWxBbGxvY1NpemVMb2NrKTsKKyAgICAgICAgZ1BhcmNlbEdsb2JhbEFsbG9jU2l6ZSArPSBkZXNpcmVkOworICAgICAgICBnUGFyY2VsR2xvYmFsQWxsb2NDb3VudCsrOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ1BhcmNlbEdsb2JhbEFsbG9jU2l6ZUxvY2spOworCiAgICAgICAgIG1EYXRhID0gZGF0YTsKICAgICAgICAgbURhdGFTaXplID0gbURhdGFQb3MgPSAwOwogICAgICAgICBBTE9HVigiY29udGludWVXcml0ZSBTZXR0aW5nIGRhdGEgc2l6ZSBvZiAlcCB0byAlenUiLCB0aGlzLCBtRGF0YVNpemUpOwpAQCAtMTcyOCw2ICsxNzQ2LDcgQEAKIAogdm9pZCBQYXJjZWw6OmluaXRTdGF0ZSgpCiB7CisgICAgTE9HX0FMTE9DKCJQYXJjZWwgJXA6IGluaXRTdGF0ZSIsIHRoaXMpOwogICAgIG1FcnJvciA9IE5PX0VSUk9SOwogICAgIG1EYXRhID0gMDsKICAgICBtRGF0YVNpemUgPSAwOwpkaWZmIC0tZ2l0IGEvbGlicy9iaW5kZXIvU3RhdGljLmNwcCBiL2xpYnMvYmluZGVyL1N0YXRpYy5jcHAKaW5kZXggMjA2MjY5Mi4uY2Q5NTA5ZiAxMDA2NDQKLS0tIGEvbGlicy9iaW5kZXIvU3RhdGljLmNwcAorKysgYi9saWJzL2JpbmRlci9TdGF0aWMuY3BwCkBAIC05MCw3ICs5MCw3IEBACiAKIHN0YXRpYyBMaWJCaW5kZXJJUEN0U3RhdGljcyBnSVBDU3RhdGljczsKIAotLy8gLS0tLS0tLS0tLS0tIFNlcnZpY2VNYW5hZ2VyLmNwcAorLy8gLS0tLS0tLS0tLS0tIElTZXJ2aWNlTWFuYWdlci5jcHAKIAogTXV0ZXggZ0RlZmF1bHRTZXJ2aWNlTWFuYWdlckxvY2s7CiBzcDxJU2VydmljZU1hbmFnZXI+IGdEZWZhdWx0U2VydmljZU1hbmFnZXI7CmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9UZXh0T3V0cHV0LmNwcCBiL2xpYnMvYmluZGVyL1RleHRPdXRwdXQuY3BwCmluZGV4IGRiM2U4NTguLjJlZDUxODggMTAwNjQ0Ci0tLSBhL2xpYnMvYmluZGVyL1RleHRPdXRwdXQuY3BwCisrKyBiL2xpYnMvYmluZGVyL1RleHRPdXRwdXQuY3BwCkBAIC0xMTYsOCArMTE2LDggQEAKIAogVGV4dE91dHB1dCYgb3BlcmF0b3I8PChUZXh0T3V0cHV0JiB0bywgY29uc3Qgdm9pZCogdmFsKQogewotICAgIGNoYXIgYnVmWzE2XTsKLSAgICBzcHJpbnRmKGJ1ZiwgIiVwIiwgdmFsKTsKKyAgICBjaGFyIGJ1ZlszMl07CisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVwIiwgdmFsKTsKICAgICB0by5wcmludChidWYsIHN0cmxlbihidWYpKTsKICAgICByZXR1cm4gdG87CiB9CmRpZmYgLS1naXQgYS9saWJzL2d1aS9BbmRyb2lkLm1rIGIvbGlicy9ndWkvQW5kcm9pZC5tawppbmRleCA4YTk2NWRkLi5mZmZlMjhhIDEwMDY0NAotLS0gYS9saWJzL2d1aS9BbmRyb2lkLm1rCisrKyBiL2xpYnMvZ3VpL0FuZHJvaWQubWsKQEAgLTEsNDAgKzEsOCBAQAotIyBDb3B5cmlnaHQgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfQ0xBTkcgOj0gdHJ1ZQotTE9DQUxfQ1BQRkxBR1MgOj0gLXN0ZD1jKysxeSAtV2V2ZXJ5dGhpbmcgLVdlcnJvcgotCi0jIFRoZSBzdGF0aWMgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBpbiB0aGlzIGxpYnJhcnkgaGF2ZSBub3QgYmVlbiBub3RlZCB0bwotIyBpbnRyb2R1Y2Ugc2lnbmlmaWNhbnQgb3ZlcmhlYWRzCi1MT0NBTF9DUFBGTEFHUyArPSAtV25vLWV4aXQtdGltZS1kZXN0cnVjdG9ycwotTE9DQUxfQ1BQRkxBR1MgKz0gLVduby1nbG9iYWwtY29uc3RydWN0b3JzCi0KLSMgV2Ugb25seSBjYXJlIGFib3V0IGNvbXBpbGluZyBhcyBDKysxNAotTE9DQUxfQ1BQRkxBR1MgKz0gLVduby1jKys5OC1jb21wYXQtcGVkYW50aWMKLQotIyBXZSBkb24ndCBuZWVkIHRvIGVudW1lcmF0ZSBldmVyeSBjYXNlIGluIGEgc3dpdGNoIGFzIGxvbmcgYXMgYSBkZWZhdWx0IGNhc2UKLSMgaXMgcHJlc2VudAotTE9DQUxfQ1BQRkxBR1MgKz0gLVduby1zd2l0Y2gtZW51bQotCi0jIEFsbG93IGNhbGxpbmcgdmFyaWFkaWMgbWFjcm9zIHdpdGhvdXQgYSBfX1ZBX0FSR1NfXyBsaXN0Ci1MT0NBTF9DUFBGTEFHUyArPSAtV25vLWdudS16ZXJvLXZhcmlhZGljLW1hY3JvLWFyZ3VtZW50cwotCi0jIERvbid0IHdhcm4gYWJvdXQgc3RydWN0IHBhZGRpbmcKLUxPQ0FMX0NQUEZMQUdTICs9IC1Xbm8tcGFkZGVkCitMT0NBTF9DUFBGTEFHUyA6PSAtc3RkPWMrKzExCiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJSUdyYXBoaWNCdWZmZXJDb25zdW1lci5jcHAgXApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQml0VHViZS5jcHAgYi9saWJzL2d1aS9CaXRUdWJlLmNwcAppbmRleCBiNjUzYzViLi4zZWQxZjM3IDEwMDY0NAotLS0gYS9saWJzL2d1aS9CaXRUdWJlLmNwcAorKysgYi9saWJzL2d1aS9CaXRUdWJlLmNwcApAQCAtMTQ5LDEyICsxNDksMTIgQEAKICAgICBzc2l6ZV90IHNpemUgPSB0dWJlLT53cml0ZSh2YWRkciwgY291bnQqb2JqU2l6ZSk7CiAKICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2Ugb2YgU09DS19TRVFQQUNLRVQKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplID49IDApICYmIChzaXplICUgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2JqU2l6ZSkpLAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHNpemUgPj0gMCkgJiYgKHNpemUgJSBvYmpTaXplKSwKICAgICAgICAgICAgICJCaXRUdWJlOjpzZW5kT2JqZWN0cyhjb3VudD0lenUsIHNpemU9JXp1KSwgcmVzPSV6ZCAocGFydGlhbCBldmVudHMgd2VyZSBzZW50ISkiLAogICAgICAgICAgICAgY291bnQsIG9ialNpemUsIHNpemUpOwogCiAgICAgLy9BTE9HRV9JRihzaXplPDAsICJlcnJvciAlZCBzZW5kaW5nICVkIGV2ZW50cyIsIHNpemUsIGNvdW50KTsKLSAgICByZXR1cm4gc2l6ZSA8IDAgPyBzaXplIDogc2l6ZSAvIHN0YXRpY19jYXN0PHNzaXplX3Q+KG9ialNpemUpOworICAgIHJldHVybiBzaXplIDwgMCA/IHNpemUgOiBzaXplIC8gb2JqU2l6ZTsKIH0KIAogc3NpemVfdCBCaXRUdWJlOjpyZWN2T2JqZWN0cyhjb25zdCBzcDxCaXRUdWJlPiYgdHViZSwKQEAgLTE2NCwxMiArMTY0LDEyIEBACiAgICAgc3NpemVfdCBzaXplID0gdHViZS0+cmVhZCh2YWRkciwgY291bnQqb2JqU2l6ZSk7CiAKICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuIGJlY2F1c2Ugb2YgU09DS19TRVFQQUNLRVQKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplID49IDApICYmIChzaXplICUgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2JqU2l6ZSkpLAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHNpemUgPj0gMCkgJiYgKHNpemUgJSBvYmpTaXplKSwKICAgICAgICAgICAgICJCaXRUdWJlOjpyZWN2T2JqZWN0cyhjb3VudD0lenUsIHNpemU9JXp1KSwgcmVzPSV6ZCAocGFydGlhbCBldmVudHMgd2VyZSByZWNlaXZlZCEpIiwKICAgICAgICAgICAgIGNvdW50LCBvYmpTaXplLCBzaXplKTsKIAogICAgIC8vQUxPR0VfSUYoc2l6ZTwwLCAiZXJyb3IgJWQgcmVjZWl2aW5nICVkIGV2ZW50cyIsIHNpemUsIGNvdW50KTsKLSAgICByZXR1cm4gc2l6ZSA8IDAgPyBzaXplIDogc2l6ZSAvIHN0YXRpY19jYXN0PHNzaXplX3Q+KG9ialNpemUpOworICAgIHJldHVybiBzaXplIDwgMCA/IHNpemUgOiBzaXplIC8gb2JqU2l6ZTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQnVmZmVySXRlbS5jcHAgYi9saWJzL2d1aS9CdWZmZXJJdGVtLmNwcAppbmRleCBkM2ZhNDNlLi5lNmZjNzkxIDEwMDY0NAotLS0gYS9saWJzL2d1aS9CdWZmZXJJdGVtLmNwcAorKysgYi9saWJzL2d1aS9CdWZmZXJJdGVtLmNwcApAQCAtMzYsNiArMzYsOCBAQAogICAgIG1Dcm9wLm1ha2VJbnZhbGlkKCk7CiB9CiAKK0J1ZmZlckl0ZW06On5CdWZmZXJJdGVtKCkge30KKwogQnVmZmVySXRlbTo6b3BlcmF0b3IgSUdyYXBoaWNCdWZmZXJDb25zdW1lcjo6QnVmZmVySXRlbSgpIGNvbnN0IHsKICAgICBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOjpCdWZmZXJJdGVtIGJ1ZmZlckl0ZW07CiAgICAgYnVmZmVySXRlbS5tR3JhcGhpY0J1ZmZlciA9IG1HcmFwaGljQnVmZmVyOwpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQnVmZmVySXRlbUNvbnN1bWVyLmNwcCBiL2xpYnMvZ3VpL0J1ZmZlckl0ZW1Db25zdW1lci5jcHAKaW5kZXggNjFkZTY5YS4uMmQ5NzZlNSAxMDA2NDQKLS0tIGEvbGlicy9ndWkvQnVmZmVySXRlbUNvbnN1bWVyLmNwcAorKysgYi9saWJzL2d1aS9CdWZmZXJJdGVtQ29uc3VtZXIuY3BwCkBAIC0xNiwxNSArMTYsMTUgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJCdWZmZXJJdGVtQ29uc3VtZXIiCi0vLyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19HUkFQSElDUwogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW1Db25zdW1lci5oPgogCi0vLyNkZWZpbmUgQklfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0vLyNkZWZpbmUgQklfTE9HRCh4LCAuLi4pIEFMT0dEKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0vLyNkZWZpbmUgQklfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0vLyNkZWZpbmUgQklfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIEJJX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBCSV9MT0dEKHgsIC4uLikgQUxPR0QoIlslc10gIiB4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQklfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIEJJX0xPR1coeCwgLi4uKSBBTE9HVygiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSBCSV9MT0dFKHgsIC4uLikgQUxPR0UoIlslc10gIiB4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsNyArNDQsOCBAQAogICAgIH0KIH0KIAotQnVmZmVySXRlbUNvbnN1bWVyOjp+QnVmZmVySXRlbUNvbnN1bWVyKCkge30KK0J1ZmZlckl0ZW1Db25zdW1lcjo6fkJ1ZmZlckl0ZW1Db25zdW1lcigpIHsKK30KIAogdm9pZCBCdWZmZXJJdGVtQ29uc3VtZXI6OnNldE5hbWUoY29uc3QgU3RyaW5nOCYgbmFtZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAgICAgcmV0dXJuIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUodywgaCk7CiB9CiAKLXN0YXR1c190IEJ1ZmZlckl0ZW1Db25zdW1lcjo6c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChQaXhlbEZvcm1hdCBkZWZhdWx0Rm9ybWF0KSB7CitzdGF0dXNfdCBCdWZmZXJJdGVtQ29uc3VtZXI6OnNldERlZmF1bHRCdWZmZXJGb3JtYXQodWludDMyX3QgZGVmYXVsdEZvcm1hdCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwogICAgIHJldHVybiBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoZGVmYXVsdEZvcm1hdCk7CiB9CmRpZmYgLS1naXQgYS9saWJzL2d1aS9CdWZmZXJRdWV1ZS5jcHAgYi9saWJzL2d1aS9CdWZmZXJRdWV1ZS5jcHAKaW5kZXggYzQ5YTg4Ni4uNjFmZDhjNCAxMDA2NDQKLS0tIGEvbGlicy9ndWkvQnVmZmVyUXVldWUuY3BwCisrKyBiL2xpYnMvZ3VpL0J1ZmZlclF1ZXVlLmNwcApAQCAtMzEsMTAgKzMxLDExIEBACiAKIEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI6On5Qcm94eUNvbnN1bWVyTGlzdGVuZXIoKSB7fQogCi12b2lkIEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI6Om9uRnJhbWVBdmFpbGFibGUoKSB7Cit2b2lkIEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI6Om9uRnJhbWVBdmFpbGFibGUoCisgICAgICAgIGNvbnN0IGFuZHJvaWQ6OkJ1ZmZlckl0ZW0mIGl0ZW0pIHsKICAgICBzcDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lcihtQ29uc3VtZXJMaXN0ZW5lci5wcm9tb3RlKCkpOwogICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lQXZhaWxhYmxlKCk7CisgICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lQXZhaWxhYmxlKGl0ZW0pOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQnVmZmVyUXVldWVDb25zdW1lci5jcHAgYi9saWJzL2d1aS9CdWZmZXJRdWV1ZUNvbnN1bWVyLmNwcAppbmRleCBhNzk4YjE4Li4zNmUzYzA2IDEwMDY0NAotLS0gYS9saWJzL2d1aS9CdWZmZXJRdWV1ZUNvbnN1bWVyLmNwcAorKysgYi9saWJzL2d1aS9CdWZmZXJRdWV1ZUNvbnN1bWVyLmNwcApAQCAtNDg4LDcgKzQ4OCw3IEBACiAgICAgbUNvbnN1bWVyTmFtZSA9IG5hbWU7CiB9CiAKLXN0YXR1c190IEJ1ZmZlclF1ZXVlQ29uc3VtZXI6OnNldERlZmF1bHRCdWZmZXJGb3JtYXQoUGl4ZWxGb3JtYXQgZGVmYXVsdEZvcm1hdCkgeworc3RhdHVzX3QgQnVmZmVyUXVldWVDb25zdW1lcjo6c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCh1aW50MzJfdCBkZWZhdWx0Rm9ybWF0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBCUV9MT0dWKCJzZXREZWZhdWx0QnVmZmVyRm9ybWF0OiAldSIsIGRlZmF1bHRGb3JtYXQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Db3JlLT5tTXV0ZXgpOwpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQnVmZmVyUXVldWVQcm9kdWNlci5jcHAgYi9saWJzL2d1aS9CdWZmZXJRdWV1ZVByb2R1Y2VyLmNwcAppbmRleCBlZjJhN2U4Li5iZjljODRkIDEwMDY0NAotLS0gYS9saWJzL2d1aS9CdWZmZXJRdWV1ZVByb2R1Y2VyLmNwcAorKysgYi9saWJzL2d1aS9CdWZmZXJRdWV1ZVByb2R1Y2VyLmNwcApAQCAtMzgsNyArMzgsMTIgQEAKICAgICBtQ29yZShjb3JlKSwKICAgICBtU2xvdHMoY29yZS0+bVNsb3RzKSwKICAgICBtQ29uc3VtZXJOYW1lKCksCi0gICAgbVN0aWNreVRyYW5zZm9ybSgwKSB7fQorICAgIG1TdGlja3lUcmFuc2Zvcm0oMCksCisgICAgbUxhc3RRdWV1ZUJ1ZmZlckZlbmNlKEZlbmNlOjpOT19GRU5DRSksCisgICAgbUNhbGxiYWNrTXV0ZXgoKSwKKyAgICBtTmV4dENhbGxiYWNrVGlja2V0KDApLAorICAgIG1DdXJyZW50Q2FsbGJhY2tUaWNrZXQoMCksCisgICAgbUNhbGxiYWNrQ29uZGl0aW9uKCkge30KIAogQnVmZmVyUXVldWVQcm9kdWNlcjo6fkJ1ZmZlclF1ZXVlUHJvZHVjZXIoKSB7fQogCkBAIC0yNDUsNyArMjUwLDcgQEAKIAogc3RhdHVzX3QgQnVmZmVyUXVldWVQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlcihpbnQgKm91dFNsb3QsCiAgICAgICAgIHNwPGFuZHJvaWQ6OkZlbmNlPiAqb3V0RmVuY2UsIGJvb2wgYXN5bmMsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgeyAvLyBBdXRvbG9jayBzY29wZQogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ29yZS0+bU11dGV4KTsKQEAgLTMwNiw3ICszMTEsNyBAQAogICAgICAgICBpZiAoKGJ1ZmZlciA9PSBOVUxMKSB8fAogICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oYnVmZmVyLT53aWR0aCkgIT0gd2lkdGgpIHx8CiAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXItPmhlaWdodCkgIT0gaGVpZ2h0KSB8fAotICAgICAgICAgICAgICAgIChidWZmZXItPmZvcm1hdCAhPSBmb3JtYXQpIHx8CisgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihidWZmZXItPmZvcm1hdCkgIT0gZm9ybWF0KSB8fAogICAgICAgICAgICAgICAgICgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGJ1ZmZlci0+dXNhZ2UpICYgdXNhZ2UpICE9IHVzYWdlKSkKICAgICAgICAgewogICAgICAgICAgICAgbVNsb3RzW2ZvdW5kXS5tQWNxdWlyZUNhbGxlZCA9IGZhbHNlOwpAQCAtMzM2LDcgKzM0MSw3IEBACiAgICAgICAgIHN0YXR1c190IGVycm9yOwogICAgICAgICBCUV9MT0dWKCJkZXF1ZXVlQnVmZmVyOiBhbGxvY2F0aW5nIGEgbmV3IGJ1ZmZlciBmb3Igc2xvdCAlZCIsICpvdXRTbG90KTsKICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcihtQ29yZS0+bUFsbG9jYXRvci0+Y3JlYXRlR3JhcGhpY0J1ZmZlcigKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmZXJyb3IpKTsKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmVycm9yKSk7CiAgICAgICAgIGlmIChncmFwaGljQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgIEJRX0xPR0UoImRlcXVldWVCdWZmZXI6IGNyZWF0ZUdyYXBoaWNCdWZmZXIgZmFpbGVkIik7CiAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CkBAIC01MjIsMTIgKzUyNyw3IEBACiAKICAgICBpZiAoZmVuY2UgPT0gTlVMTCkgewogICAgICAgICBCUV9MT0dFKCJxdWV1ZUJ1ZmZlcjogZmVuY2UgaXMgTlVMTCIpOwotICAgICAgICAvLyBUZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYi8xNzk0NjM0Mzogc29sZGllci1vbiBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvci4gVGhpcwotICAgICAgICAvLyBwcmV2ZW50cyB0aGUgY2xpZW50IGZyb20gZHlpbmcsIGF0IHRoZSByaXNrIG9mIHZpc2libGUgY29ycnVwdGlvbiBkdWUgdG8gaHdjb21wb3NlcgotICAgICAgICAvLyByZWFkaW5nIHRoZSBidWZmZXIgYmVmb3JlIHRoZSBwcm9kdWNlciBpcyBkb25lIHJlbmRlcmluZyBpdC4gVW5sZXNzIHRoZSBidWZmZXIgaXMgdGhlCi0gICAgICAgIC8vIGxhc3QgZnJhbWUgb2YgYW4gYW5pbWF0aW9uLCB0aGUgY29ycnVwdGlvbiB3aWxsIGJlIHRyYW5zaWVudC4KLSAgICAgICAgZmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7Ci0gICAgICAgIC8vIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgc3dpdGNoIChzY2FsaW5nTW9kZSkgewpAQCAtNTQxLDcgKzU0MSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzcDxJQ29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgc3A8SUNvbnN1bWVyTGlzdGVuZXI+IGZyYW1lQXZhaWxhYmxlTGlzdGVuZXI7CisgICAgc3A8SUNvbnN1bWVyTGlzdGVuZXI+IGZyYW1lUmVwbGFjZWRMaXN0ZW5lcjsKKyAgICBpbnQgY2FsbGJhY2tUaWNrZXQgPSAwOworICAgIEJ1ZmZlckl0ZW0gaXRlbTsKICAgICB7IC8vIEF1dG9sb2NrIHNjb3BlCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Db3JlLT5tTXV0ZXgpOwogCkBAIC01NzksOCArNTgyLDggQEAKICAgICAgICAgQlFfTE9HVigicXVldWVCdWZmZXI6IHNsb3Q9JWQvJSIgUFJJdTY0ICIgdGltZT0lIiBQUkl1NjQKICAgICAgICAgICAgICAgICAiIGNyb3A9WyVkLCVkLCVkLCVkXSB0cmFuc2Zvcm09JSN4IHNjYWxlPSVzIiwKICAgICAgICAgICAgICAgICBzbG90LCBtQ29yZS0+bUZyYW1lQ291bnRlciArIDEsIHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICBjcm9wLmxlZnQsIGNyb3AudG9wLCBjcm9wLnJpZ2h0LCBjcm9wLmJvdHRvbSwgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgIEJ1ZmZlckl0ZW06OnNjYWxpbmdNb2RlTmFtZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2NhbGluZ01vZGUpKSk7CisgICAgICAgICAgICAgICAgY3JvcC5sZWZ0LCBjcm9wLnRvcCwgY3JvcC5yaWdodCwgY3JvcC5ib3R0b20sCisgICAgICAgICAgICAgICAgdHJhbnNmb3JtLCBCdWZmZXJJdGVtOjpzY2FsaW5nTW9kZU5hbWUoc2NhbGluZ01vZGUpKTsKIAogICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlcihtU2xvdHNbc2xvdF0ubUdyYXBoaWNCdWZmZXIpOwogICAgICAgICBSZWN0IGJ1ZmZlclJlY3QoZ3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKSwgZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkpOwpAQCAtNTk3LDE1ICs2MDAsMTMgQEAKICAgICAgICAgKyttQ29yZS0+bUZyYW1lQ291bnRlcjsKICAgICAgICAgbVNsb3RzW3Nsb3RdLm1GcmFtZU51bWJlciA9IG1Db3JlLT5tRnJhbWVDb3VudGVyOwogCi0gICAgICAgIEJ1ZmZlckl0ZW0gaXRlbTsKICAgICAgICAgaXRlbS5tQWNxdWlyZUNhbGxlZCA9IG1TbG90c1tzbG90XS5tQWNxdWlyZUNhbGxlZDsKICAgICAgICAgaXRlbS5tR3JhcGhpY0J1ZmZlciA9IG1TbG90c1tzbG90XS5tR3JhcGhpY0J1ZmZlcjsKICAgICAgICAgaXRlbS5tQ3JvcCA9IGNyb3A7Ci0gICAgICAgIGl0ZW0ubVRyYW5zZm9ybSA9IHRyYW5zZm9ybSAmCi0gICAgICAgICAgICAgICAgfnN0YXRpY19jYXN0PHVpbnQzMl90PihOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9JTlZFUlNFX0RJU1BMQVkpOworICAgICAgICBpdGVtLm1UcmFuc2Zvcm0gPSB0cmFuc2Zvcm0gJiB+TkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSU5WRVJTRV9ESVNQTEFZOwogICAgICAgICBpdGVtLm1UcmFuc2Zvcm1Ub0Rpc3BsYXlJbnZlcnNlID0KLSAgICAgICAgICAgICAgICAodHJhbnNmb3JtICYgTkFUSVZFX1dJTkRPV19UUkFOU0ZPUk1fSU5WRVJTRV9ESVNQTEFZKSAhPSAwOwotICAgICAgICBpdGVtLm1TY2FsaW5nTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzY2FsaW5nTW9kZSk7CisgICAgICAgICAgICAgICAgYm9vbCh0cmFuc2Zvcm0gJiBOQVRJVkVfV0lORE9XX1RSQU5TRk9STV9JTlZFUlNFX0RJU1BMQVkpOworICAgICAgICBpdGVtLm1TY2FsaW5nTW9kZSA9IHNjYWxpbmdNb2RlOwogICAgICAgICBpdGVtLm1UaW1lc3RhbXAgPSB0aW1lc3RhbXA7CiAgICAgICAgIGl0ZW0ubUlzQXV0b1RpbWVzdGFtcCA9IGlzQXV0b1RpbWVzdGFtcDsKICAgICAgICAgaXRlbS5tRnJhbWVOdW1iZXIgPSBtQ29yZS0+bUZyYW1lQ291bnRlcjsKQEAgLTYxOSw3ICs2MjAsNyBAQAogICAgICAgICAgICAgLy8gV2hlbiB0aGUgcXVldWUgaXMgZW1wdHksIHdlIGNhbiBpZ25vcmUgbURlcXVldWVCdWZmZXJDYW5ub3RCbG9jawogICAgICAgICAgICAgLy8gYW5kIHNpbXBseSBxdWV1ZSB0aGlzIGJ1ZmZlcgogICAgICAgICAgICAgbUNvcmUtPm1RdWV1ZS5wdXNoX2JhY2soaXRlbSk7Ci0gICAgICAgICAgICBsaXN0ZW5lciA9IG1Db3JlLT5tQ29uc3VtZXJMaXN0ZW5lcjsKKyAgICAgICAgICAgIGZyYW1lQXZhaWxhYmxlTGlzdGVuZXIgPSBtQ29yZS0+bUNvbnN1bWVyTGlzdGVuZXI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBXaGVuIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUgZnJvbnQgYnVmZmVyCiAgICAgICAgICAgICAvLyBzdGF0ZSB0byBzZWUgaWYgd2UgbmVlZCB0byByZXBsYWNlIGl0CkBAIC02MzUsOSArNjM2LDEwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgZHJvcHBhYmxlIGJ1ZmZlciB3aXRoIHRoZSBpbmNvbWluZyBvbmUKICAgICAgICAgICAgICAgICAqZnJvbnQgPSBpdGVtOworICAgICAgICAgICAgICAgIGZyYW1lUmVwbGFjZWRMaXN0ZW5lciA9IG1Db3JlLT5tQ29uc3VtZXJMaXN0ZW5lcjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbUNvcmUtPm1RdWV1ZS5wdXNoX2JhY2soaXRlbSk7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBtQ29yZS0+bUNvbnN1bWVyTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgZnJhbWVBdmFpbGFibGVMaXN0ZW5lciA9IG1Db3JlLT5tQ29uc3VtZXJMaXN0ZW5lcjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02NDUsMTUgKzY0Nyw0NCBAQAogICAgICAgICBtQ29yZS0+bURlcXVldWVDb25kaXRpb24uYnJvYWRjYXN0KCk7CiAKICAgICAgICAgb3V0cHV0LT5pbmZsYXRlKG1Db3JlLT5tRGVmYXVsdFdpZHRoLCBtQ29yZS0+bURlZmF1bHRIZWlnaHQsCi0gICAgICAgICAgICAgICAgbUNvcmUtPm1UcmFuc2Zvcm1IaW50LAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihtQ29yZS0+bVF1ZXVlLnNpemUoKSkpOworICAgICAgICAgICAgICAgIG1Db3JlLT5tVHJhbnNmb3JtSGludCwgbUNvcmUtPm1RdWV1ZS5zaXplKCkpOwogCiAgICAgICAgIEFUUkFDRV9JTlQobUNvcmUtPm1Db25zdW1lck5hbWUuc3RyaW5nKCksIG1Db3JlLT5tUXVldWUuc2l6ZSgpKTsKKworICAgICAgICAvLyBUYWtlIGEgdGlja2V0IGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zCisgICAgICAgIGNhbGxiYWNrVGlja2V0ID0gbU5leHRDYWxsYmFja1RpY2tldCsrOwogICAgIH0gLy8gQXV0b2xvY2sgc2NvcGUKIAotICAgIC8vIENhbGwgYmFjayB3aXRob3V0IGxvY2sgaGVsZAotICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5vbkZyYW1lQXZhaWxhYmxlKCk7CisgICAgLy8gV2FpdCB3aXRob3V0IGxvY2sgaGVsZAorICAgIGlmIChtQ29yZS0+bUNvbm5lY3RlZEFwaSA9PSBOQVRJVkVfV0lORE9XX0FQSV9FR0wpIHsKKyAgICAgICAgLy8gV2FpdGluZyBoZXJlIGFsbG93cyBmb3IgdHdvIGZ1bGwgYnVmZmVycyB0byBiZSBxdWV1ZWQgYnV0IG5vdCBhCisgICAgICAgIC8vIHRoaXJkLiBJbiB0aGUgZXZlbnQgdGhhdCBmcmFtZXMgdGFrZSB2YXJ5aW5nIHRpbWUsIHRoaXMgbWFrZXMgYQorICAgICAgICAvLyBzbWFsbCB0cmFkZS1vZmYgaW4gZmF2b3Igb2YgbGF0ZW5jeSByYXRoZXIgdGhhbiB0aHJvdWdocHV0LgorICAgICAgICBtTGFzdFF1ZXVlQnVmZmVyRmVuY2UtPndhaXRGb3JldmVyKCJUaHJvdHRsaW5nIEVHTCBQcm9kdWN0aW9uIik7CisgICAgICAgIG1MYXN0UXVldWVCdWZmZXJGZW5jZSA9IGZlbmNlOworICAgIH0KKworICAgIC8vIERvbid0IHNlbmQgdGhlIEdyYXBoaWNCdWZmZXIgdGhyb3VnaCB0aGUgY2FsbGJhY2ssIGFuZCBkb24ndCBzZW5kCisgICAgLy8gdGhlIHNsb3QgbnVtYmVyLCBzaW5jZSB0aGUgY29uc3VtZXIgc2hvdWxkbid0IG5lZWQgaXQKKyAgICBpdGVtLm1HcmFwaGljQnVmZmVyLmNsZWFyKCk7CisgICAgaXRlbS5tU2xvdCA9IEJ1ZmZlckl0ZW06OklOVkFMSURfQlVGRkVSX1NMT1Q7CisKKyAgICAvLyBDYWxsIGJhY2sgd2l0aG91dCB0aGUgbWFpbiBCdWZmZXJRdWV1ZSBsb2NrIGhlbGQsIGJ1dCB3aXRoIHRoZSBjYWxsYmFjaworICAgIC8vIGxvY2sgaGVsZCBzbyB3ZSBjYW4gZW5zdXJlIHRoYXQgY2FsbGJhY2tzIG9jY3VyIGluIG9yZGVyCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtQ2FsbGJhY2tNdXRleCk7CisgICAgICAgIHdoaWxlIChjYWxsYmFja1RpY2tldCAhPSBtQ3VycmVudENhbGxiYWNrVGlja2V0KSB7CisgICAgICAgICAgICBtQ2FsbGJhY2tDb25kaXRpb24ud2FpdChtQ2FsbGJhY2tNdXRleCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWVBdmFpbGFibGVMaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmFtZUF2YWlsYWJsZUxpc3RlbmVyLT5vbkZyYW1lQXZhaWxhYmxlKGl0ZW0pOworICAgICAgICB9IGVsc2UgaWYgKGZyYW1lUmVwbGFjZWRMaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICBmcmFtZVJlcGxhY2VkTGlzdGVuZXItPm9uRnJhbWVSZXBsYWNlZChpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbUN1cnJlbnRDYWxsYmFja1RpY2tldDsKKyAgICAgICAgbUNhbGxiYWNrQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwogICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTcwNSwyNSArNzM2LDI1IEBACiAgICAgaW50IHZhbHVlOwogICAgIHN3aXRjaCAod2hhdCkgewogICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfV0lEVEg6Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1Db3JlLT5tRGVmYXVsdFdpZHRoKTsKKyAgICAgICAgICAgIHZhbHVlID0gbUNvcmUtPm1EZWZhdWx0V2lkdGg7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0hFSUdIVDoKLSAgICAgICAgICAgIHZhbHVlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUNvcmUtPm1EZWZhdWx0SGVpZ2h0KTsKKyAgICAgICAgICAgIHZhbHVlID0gbUNvcmUtPm1EZWZhdWx0SGVpZ2h0OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19GT1JNQVQ6Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1Db3JlLT5tRGVmYXVsdEJ1ZmZlckZvcm1hdCk7CisgICAgICAgICAgICB2YWx1ZSA9IG1Db3JlLT5tRGVmYXVsdEJ1ZmZlckZvcm1hdDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUzoKICAgICAgICAgICAgIHZhbHVlID0gbUNvcmUtPmdldE1pblVuZGVxdWV1ZWRCdWZmZXJDb3VudExvY2tlZChmYWxzZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX1NUSUNLWV9UUkFOU0ZPUk06Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdGlja3lUcmFuc2Zvcm0pOworICAgICAgICAgICAgdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ+KG1TdGlja3lUcmFuc2Zvcm0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19DT05TVU1FUl9SVU5OSU5HX0JFSElORDoKICAgICAgICAgICAgIHZhbHVlID0gKG1Db3JlLT5tUXVldWUuc2l6ZSgpID4gMSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1VTQUdFX0JJVFM6Ci0gICAgICAgICAgICB2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KG1Db3JlLT5tQ29uc3VtZXJVc2FnZUJpdHMpOworICAgICAgICAgICAgdmFsdWUgPSBtQ29yZS0+bUNvbnN1bWVyVXNhZ2VCaXRzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtNzcxLDggKzgwMiw3IEBACiAgICAgICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBOgogICAgICAgICAgICAgbUNvcmUtPm1Db25uZWN0ZWRBcGkgPSBhcGk7CiAgICAgICAgICAgICBvdXRwdXQtPmluZmxhdGUobUNvcmUtPm1EZWZhdWx0V2lkdGgsIG1Db3JlLT5tRGVmYXVsdEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgbUNvcmUtPm1UcmFuc2Zvcm1IaW50LAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUNvcmUtPm1RdWV1ZS5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvcmUtPm1UcmFuc2Zvcm1IaW50LCBtQ29yZS0+bVF1ZXVlLnNpemUoKSk7CiAKICAgICAgICAgICAgIC8vIFNldCB1cCBhIGRlYXRoIG5vdGlmaWNhdGlvbiBzbyB0aGF0IHdlIGNhbiBkaXNjb25uZWN0CiAgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGlmIHRoZSByZW1vdGUgcHJvZHVjZXIgZGllcwpAQCAtODc0LDE0ICs5MDQsMTQgQEAKIH0KIAogdm9pZCBCdWZmZXJRdWV1ZVByb2R1Y2VyOjphbGxvY2F0ZUJ1ZmZlcnMoYm9vbCBhc3luYywgdWludDMyX3Qgd2lkdGgsCi0gICAgICAgIHVpbnQzMl90IGhlaWdodCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgeworICAgICAgICB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIFZlY3RvcjxpbnQ+IGZyZWVTbG90czsKICAgICAgICAgc2l6ZV90IG5ld0J1ZmZlckNvdW50ID0gMDsKICAgICAgICAgdWludDMyX3QgYWxsb2NXaWR0aCA9IDA7CiAgICAgICAgIHVpbnQzMl90IGFsbG9jSGVpZ2h0ID0gMDsKLSAgICAgICAgUGl4ZWxGb3JtYXQgYWxsb2NGb3JtYXQgPSBQSVhFTF9GT1JNQVRfVU5LTk9XTjsKKyAgICAgICAgdWludDMyX3QgYWxsb2NGb3JtYXQgPSAwOwogICAgICAgICB1aW50MzJfdCBhbGxvY1VzYWdlID0gMDsKICAgICAgICAgeyAvLyBBdXRvbG9jayBzY29wZQogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNvcmUtPm1NdXRleCk7CkBAIC05MDcsOCArOTM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZmZlckNvdW50LCBtYXhCdWZmZXJDb3VudCk7CiAgICAgICAgICAgICBpZiAobWF4QnVmZmVyQ291bnQgPD0gY3VycmVudEJ1ZmZlckNvdW50KQogICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIG5ld0J1ZmZlckNvdW50ID0KLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXhCdWZmZXJDb3VudCAtIGN1cnJlbnRCdWZmZXJDb3VudCk7CisgICAgICAgICAgICBuZXdCdWZmZXJDb3VudCA9IG1heEJ1ZmZlckNvdW50IC0gY3VycmVudEJ1ZmZlckNvdW50OwogICAgICAgICAgICAgaWYgKGZyZWVTbG90cy5zaXplKCkgPCBuZXdCdWZmZXJDb3VudCkgewogICAgICAgICAgICAgICAgIEJRX0xPR0UoImFsbG9jYXRlQnVmZmVyczogcmFuIG91dCBvZiBmcmVlIHNsb3RzIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtOTIxLDcgKzk1MCw3IEBACiAgICAgICAgICAgICBtQ29yZS0+bUlzQWxsb2NhdGluZyA9IHRydWU7CiAgICAgICAgIH0gLy8gQXV0b2xvY2sgc2NvcGUKIAotICAgICAgICBWZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+IGJ1ZmZlcnM7CisgICAgICAgIFZlY3RvcjxzcDxHcmFwaGljQnVmZmVyPiA+IGJ1ZmZlcnM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgIG5ld0J1ZmZlckNvdW50OyArK2kpIHsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOwogICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcihtQ29yZS0+bUFsbG9jYXRvci0+Y3JlYXRlR3JhcGhpY0J1ZmZlcigKQEAgLTk0MSw4ICs5NzAsNyBAQAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNvcmUtPm1NdXRleCk7CiAgICAgICAgICAgICB1aW50MzJfdCBjaGVja1dpZHRoID0gd2lkdGggPiAwID8gd2lkdGggOiBtQ29yZS0+bURlZmF1bHRXaWR0aDsKICAgICAgICAgICAgIHVpbnQzMl90IGNoZWNrSGVpZ2h0ID0gaGVpZ2h0ID4gMCA/IGhlaWdodCA6IG1Db3JlLT5tRGVmYXVsdEhlaWdodDsKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGNoZWNrRm9ybWF0ID0gZm9ybWF0ICE9IDAgPwotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgOiBtQ29yZS0+bURlZmF1bHRCdWZmZXJGb3JtYXQ7CisgICAgICAgICAgICB1aW50MzJfdCBjaGVja0Zvcm1hdCA9IGZvcm1hdCAhPSAwID8gZm9ybWF0IDogbUNvcmUtPm1EZWZhdWx0QnVmZmVyRm9ybWF0OwogICAgICAgICAgICAgdWludDMyX3QgY2hlY2tVc2FnZSA9IHVzYWdlIHwgbUNvcmUtPm1Db25zdW1lclVzYWdlQml0czsKICAgICAgICAgICAgIGlmIChjaGVja1dpZHRoICE9IGFsbG9jV2lkdGggfHwgY2hlY2tIZWlnaHQgIT0gYWxsb2NIZWlnaHQgfHwKICAgICAgICAgICAgICAgICBjaGVja0Zvcm1hdCAhPSBhbGxvY0Zvcm1hdCB8fCBjaGVja1VzYWdlICE9IGFsbG9jVXNhZ2UpIHsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0J1ZmZlclNsb3QuY3BwIGIvbGlicy9ndWkvQnVmZmVyU2xvdC5jcHAKaW5kZXggMDE1OTVkZS4uYjg4NzdmZSAxMDA2NDQKLS0tIGEvbGlicy9ndWkvQnVmZmVyU2xvdC5jcHAKKysrIGIvbGlicy9ndWkvQnVmZmVyU2xvdC5jcHAKQEAgLTI0LDggKzI0LDggQEAKICAgICAgICAgY2FzZSBCdWZmZXJTbG90OjpRVUVVRUQ6IHJldHVybiAiUVVFVUVEIjsKICAgICAgICAgY2FzZSBCdWZmZXJTbG90OjpGUkVFOiByZXR1cm4gIkZSRUUiOwogICAgICAgICBjYXNlIEJ1ZmZlclNsb3Q6OkFDUVVJUkVEOiByZXR1cm4gIkFDUVVJUkVEIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuICJVbmtub3duIjsKICAgICB9Ci0gICAgcmV0dXJuICJVbmtub3duIjsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvQ29uc3VtZXJCYXNlLmNwcCBiL2xpYnMvZ3VpL0NvbnN1bWVyQmFzZS5jcHAKaW5kZXggNTgwZTBlNy4uOTVmNTUwNyAxMDA2NDQKLS0tIGEvbGlicy9ndWkvQ29uc3VtZXJCYXNlLmNwcAorKysgYi9saWJzL2d1aS9Db25zdW1lckJhc2UuY3BwCkBAIC00MCw5ICs0MCw5IEBACiAKIC8vIE1hY3JvcyBmb3IgaW5jbHVkaW5nIHRoZSBDb25zdW1lckJhc2UgbmFtZSBpbiBsb2cgbWVzc2FnZXMKICNkZWZpbmUgQ0JfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0vLyNkZWZpbmUgQ0JfTE9HRCh4LCAuLi4pIEFMT0dEKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0vLyNkZWZpbmUgQ0JfTE9HSSh4LCAuLi4pIEFMT0dJKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0vLyNkZWZpbmUgQ0JfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIENCX0xPR0QoeCwgLi4uKSBBTE9HRCgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBDQl9MT0dJKHgsIC4uLikgQUxPR0koIlslc10gIiB4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ0JfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIENCX0xPR0UoeCwgLi4uKSBBTE9HRSgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC05OCw3ICs5OCw3IEBACiAgICAgbVNsb3RzW3Nsb3RJbmRleF0ubUZyYW1lTnVtYmVyID0gMDsKIH0KIAotdm9pZCBDb25zdW1lckJhc2U6Om9uRnJhbWVBdmFpbGFibGUoKSB7Cit2b2lkIENvbnN1bWVyQmFzZTo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CiAgICAgQ0JfTE9HVigib25GcmFtZUF2YWlsYWJsZSIpOwogCiAgICAgc3A8RnJhbWVBdmFpbGFibGVMaXN0ZW5lcj4gbGlzdGVuZXI7CkBAIC0xMDksNyArMTA5LDcgQEAKIAogICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgIENCX0xPR1YoImFjdHVhbGx5IGNhbGxpbmcgb25GcmFtZUF2YWlsYWJsZSIpOwotICAgICAgICBsaXN0ZW5lci0+b25GcmFtZUF2YWlsYWJsZSgpOworICAgICAgICBsaXN0ZW5lci0+b25GcmFtZUF2YWlsYWJsZShpdGVtKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0NwdUNvbnN1bWVyLmNwcCBiL2xpYnMvZ3VpL0NwdUNvbnN1bWVyLmNwcAppbmRleCBkNzRkMDZjLi5jNWI2ZGZlIDEwMDY0NAotLS0gYS9saWJzL2d1aS9DcHVDb25zdW1lci5jcHAKKysrIGIvbGlicy9ndWkvQ3B1Q29uc3VtZXIuY3BwCkBAIC0xNiwyMiArMTYsMjIgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDcHVDb25zdW1lciIKLS8vI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfR1JBUEhJQ1MKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0dSQVBISUNTCiAKICNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KIAotLy8jZGVmaW5lIENDX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotLy8jZGVmaW5lIENDX0xPR0QoeCwgLi4uKSBBTE9HRCgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotLy8jZGVmaW5lIENDX0xPR0koeCwgLi4uKSBBTE9HSSgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBDQ19MT0dWKHgsIC4uLikgQUxPR1YoIlslc10gIiB4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQ0NfTE9HRCh4LCAuLi4pIEFMT0dEKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIENDX0xPR0koeCwgLi4uKSBBTE9HSSgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSBDQ19MT0dXKHgsIC4uLikgQUxPR1coIlslc10gIiB4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgQ0NfTE9HRSh4LCAuLi4pIEFMT0dFKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQ3B1Q29uc3VtZXI6OkNwdUNvbnN1bWVyKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBicSwKLSAgICAgICAgc2l6ZV90IG1heExvY2tlZEJ1ZmZlcnMsIGJvb2wgY29udHJvbGxlZEJ5QXBwKSA6CisgICAgICAgIHVpbnQzMl90IG1heExvY2tlZEJ1ZmZlcnMsIGJvb2wgY29udHJvbGxlZEJ5QXBwKSA6CiAgICAgQ29uc3VtZXJCYXNlKGJxLCBjb250cm9sbGVkQnlBcHApLAogICAgIG1NYXhMb2NrZWRCdWZmZXJzKG1heExvY2tlZEJ1ZmZlcnMpLAogICAgIG1DdXJyZW50TG9ja2VkQnVmZmVycygwKQpAQCAtNDAsNyArNDAsNyBAQAogICAgIG1BY3F1aXJlZEJ1ZmZlcnMuaW5zZXJ0QXQoMCwgbWF4TG9ja2VkQnVmZmVycyk7CiAKICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTik7Ci0gICAgbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KHN0YXRpY19jYXN0PGludDMyX3Q+KG1heExvY2tlZEJ1ZmZlcnMpKTsKKyAgICBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobWF4TG9ja2VkQnVmZmVycyk7CiB9CiAKIENwdUNvbnN1bWVyOjp+Q3B1Q29uc3VtZXIoKSB7CkBAIC02MSwxOCArNjEsNDYgQEAKICAgICByZXR1cm4gbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKIH0KIAotc3RhdHVzX3QgQ3B1Q29uc3VtZXI6OnNldERlZmF1bHRCdWZmZXJGb3JtYXQoUGl4ZWxGb3JtYXQgZGVmYXVsdEZvcm1hdCkKK3N0YXR1c190IENwdUNvbnN1bWVyOjpzZXREZWZhdWx0QnVmZmVyRm9ybWF0KHVpbnQzMl90IGRlZmF1bHRGb3JtYXQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CiAgICAgcmV0dXJuIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChkZWZhdWx0Rm9ybWF0KTsKIH0KIAorc3RhdGljIGJvb2wgaXNQb3NzaWJseVlVVihQaXhlbEZvcm1hdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKChpbnQpZm9ybWF0KSB7CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NToKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX3NSR0JfQV84ODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfc1JHQl9YXzg4ODg6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZODoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1kxNjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JBVzE2OiAvLyBzYW1lIGFzIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTA6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfT1BBUVVFOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkxPQjoKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4OgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX0k6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CisKIHN0YXR1c190IENwdUNvbnN1bWVyOjpsb2NrTmV4dEJ1ZmZlcihMb2NrZWRCdWZmZXIgKm5hdGl2ZUJ1ZmZlcikgewogICAgIHN0YXR1c190IGVycjsKIAogICAgIGlmICghbmF0aXZlQnVmZmVyKSByZXR1cm4gQkFEX1ZBTFVFOwogICAgIGlmIChtQ3VycmVudExvY2tlZEJ1ZmZlcnMgPT0gbU1heExvY2tlZEJ1ZmZlcnMpIHsKLSAgICAgICAgQ0NfTE9HVygiTWF4IGJ1ZmZlcnMgaGF2ZSBiZWVuIGxvY2tlZCAoJXpkKSwgY2Fubm90IGxvY2sgYW55bW9yZS4iLAorICAgICAgICBDQ19MT0dXKCJNYXggYnVmZmVycyBoYXZlIGJlZW4gbG9ja2VkICglZCksIGNhbm5vdCBsb2NrIGFueW1vcmUuIiwKICAgICAgICAgICAgICAgICBtTWF4TG9ja2VkQnVmZmVycyk7CiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQpAQCAtOTYsNjQgKzEyNCw1NiBAQAogICAgIHZvaWQgKmJ1ZmZlclBvaW50ZXIgPSBOVUxMOwogICAgIGFuZHJvaWRfeWNiY3IgeWNiY3IgPSBhbmRyb2lkX3ljYmNyKCk7CiAKLSAgICBpZiAoYi5tRmVuY2UuZ2V0KCkpIHsKLSAgICAgICAgaWYgKG1TbG90c1tidWZdLm1HcmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpID09Ci0gICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7CisgICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gbVNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXItPmdldFBpeGVsRm9ybWF0KCk7CisgICAgUGl4ZWxGb3JtYXQgZmxleEZvcm1hdCA9IGZvcm1hdDsKKyAgICBpZiAoaXNQb3NzaWJseVlVVihmb3JtYXQpKSB7CisgICAgICAgIGlmIChiLm1GZW5jZS5nZXQoKSkgewogICAgICAgICAgICAgZXJyID0gbVNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXItPmxvY2tBc3luY1lDYkNyKAogICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfT0ZURU4sCiAgICAgICAgICAgICAgICAgYi5tQ3JvcCwKICAgICAgICAgICAgICAgICAmeWNiY3IsCiAgICAgICAgICAgICAgICAgYi5tRmVuY2UtPmR1cCgpKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIENDX0xPR0UoIlVuYWJsZSB0byBsb2NrIFlDYkNyIGJ1ZmZlciBmb3IgQ1BVIHJlYWRpbmc6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlclBvaW50ZXIgPSB5Y2Jjci55OwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gbVNsb3RzW2J1Zl0ubUdyYXBoaWNCdWZmZXItPmxvY2tZQ2JDcigKKyAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX09GVEVOLAorICAgICAgICAgICAgICAgIGIubUNyb3AsCisgICAgICAgICAgICAgICAgJnljYmNyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBidWZmZXJQb2ludGVyID0geWNiY3IueTsKKyAgICAgICAgICAgIGZsZXhGb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODg7CisgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCkgeworICAgICAgICAgICAgICAgIENDX0xPR1YoImxvY2tpbmcgYnVmZmVyIG9mIGZvcm1hdCAlI3ggYXMgZmxleCBZVVYiLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF84ODgpIHsKKyAgICAgICAgICAgIENDX0xPR0UoIlVuYWJsZSB0byBsb2NrIFlDYkNyIGJ1ZmZlciBmb3IgQ1BVIHJlYWRpbmc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnVmZmVyUG9pbnRlciA9PSBOVUxMKSB7IC8vIG5vdCBmbGV4aWJsZSBZVVYKKyAgICAgICAgaWYgKGIubUZlbmNlLmdldCgpKSB7CiAgICAgICAgICAgICBlcnIgPSBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlci0+bG9ja0FzeW5jKAogICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfT0ZURU4sCiAgICAgICAgICAgICAgICAgYi5tQ3JvcCwKICAgICAgICAgICAgICAgICAmYnVmZmVyUG9pbnRlciwKICAgICAgICAgICAgICAgICBiLm1GZW5jZS0+ZHVwKCkpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0NfTE9HRSgiVW5hYmxlIHRvIGxvY2sgYnVmZmVyIGZvciBDUFUgcmVhZGluZzogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1TbG90c1tidWZdLm1HcmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpID09Ci0gICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4KSB7Ci0gICAgICAgICAgICBlcnIgPSBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlci0+bG9ja1lDYkNyKAotICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1JFQURfT0ZURU4sCi0gICAgICAgICAgICAgICAgYi5tQ3JvcCwKLSAgICAgICAgICAgICAgICAmeWNiY3IpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0NfTE9HRSgiVW5hYmxlIHRvIGxvY2sgWUNiQ3IgYnVmZmVyIGZvciBDUFUgcmVhZGluZzogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyUG9pbnRlciA9IHljYmNyLnk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlci0+bG9jaygKICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX09GVEVOLAogICAgICAgICAgICAgICAgIGIubUNyb3AsCiAgICAgICAgICAgICAgICAgJmJ1ZmZlclBvaW50ZXIpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQ0NfTE9HRSgiVW5hYmxlIHRvIGxvY2sgYnVmZmVyIGZvciBDUFUgcmVhZGluZzogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIENDX0xPR0UoIlVuYWJsZSB0byBsb2NrIGJ1ZmZlciBmb3IgQ1BVIHJlYWRpbmc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBzaXplX3QgbG9ja2VkSWR4ID0gMDsKLSAgICBmb3IgKDsgbG9ja2VkSWR4IDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtTWF4TG9ja2VkQnVmZmVycyk7IGxvY2tlZElkeCsrKSB7CisgICAgZm9yICg7IGxvY2tlZElkeCA8IG1NYXhMb2NrZWRCdWZmZXJzOyBsb2NrZWRJZHgrKykgewogICAgICAgICBpZiAobUFjcXVpcmVkQnVmZmVyc1tsb2NrZWRJZHhdLm1TbG90ID09CiAgICAgICAgICAgICAgICAgQnVmZmVyUXVldWU6OklOVkFMSURfQlVGRkVSX1NMT1QpIHsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTcwLDkgKzE5MCwxMCBAQAogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmZmVyUG9pbnRlcik7CiAgICAgbmF0aXZlQnVmZmVyLT53aWR0aCAgPSBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlci0+Z2V0V2lkdGgoKTsKICAgICBuYXRpdmVCdWZmZXItPmhlaWdodCA9IG1TbG90c1tidWZdLm1HcmFwaGljQnVmZmVyLT5nZXRIZWlnaHQoKTsKLSAgICBuYXRpdmVCdWZmZXItPmZvcm1hdCA9IG1TbG90c1tidWZdLm1HcmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpOworICAgIG5hdGl2ZUJ1ZmZlci0+Zm9ybWF0ID0gZm9ybWF0OworICAgIG5hdGl2ZUJ1ZmZlci0+ZmxleEZvcm1hdCA9IGZsZXhGb3JtYXQ7CiAgICAgbmF0aXZlQnVmZmVyLT5zdHJpZGUgPSAoeWNiY3IueSAhPSBOVUxMKSA/Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oeWNiY3IueXN0cmlkZSkgOgorICAgICAgICAgICAgeWNiY3IueXN0cmlkZSA6CiAgICAgICAgICAgICBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlci0+Z2V0U3RyaWRlKCk7CiAKICAgICBuYXRpdmVCdWZmZXItPmNyb3AgICAgICAgID0gYi5tQ3JvcDsKQEAgLTE4Myw4ICsyMDQsOCBAQAogCiAgICAgbmF0aXZlQnVmZmVyLT5kYXRhQ2IgICAgICAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPih5Y2Jjci5jYik7CiAgICAgbmF0aXZlQnVmZmVyLT5kYXRhQ3IgICAgICAgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPih5Y2Jjci5jcik7Ci0gICAgbmF0aXZlQnVmZmVyLT5jaHJvbWFTdHJpZGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oeWNiY3IuY3N0cmlkZSk7Ci0gICAgbmF0aXZlQnVmZmVyLT5jaHJvbWFTdGVwICAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oeWNiY3IuY2hyb21hX3N0ZXApOworICAgIG5hdGl2ZUJ1ZmZlci0+Y2hyb21hU3RyaWRlID0geWNiY3IuY3N0cmlkZTsKKyAgICBuYXRpdmVCdWZmZXItPmNocm9tYVN0ZXAgICA9IHljYmNyLmNocm9tYV9zdGVwOwogCiAgICAgbUN1cnJlbnRMb2NrZWRCdWZmZXJzKys7CiAKQEAgLTE5Niw3ICsyMTcsNyBAQAogICAgIHNpemVfdCBsb2NrZWRJZHggPSAwOwogCiAgICAgdm9pZCAqYnVmUHRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KG5hdGl2ZUJ1ZmZlci5kYXRhKTsKLSAgICBmb3IgKDsgbG9ja2VkSWR4IDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtTWF4TG9ja2VkQnVmZmVycyk7IGxvY2tlZElkeCsrKSB7CisgICAgZm9yICg7IGxvY2tlZElkeCA8IG1NYXhMb2NrZWRCdWZmZXJzOyBsb2NrZWRJZHgrKykgewogICAgICAgICBpZiAoYnVmUHRyID09IG1BY3F1aXJlZEJ1ZmZlcnNbbG9ja2VkSWR4XS5tQnVmZmVyUG9pbnRlcikgYnJlYWs7CiAgICAgfQogICAgIGlmIChsb2NrZWRJZHggPT0gbU1heExvY2tlZEJ1ZmZlcnMpIHsKQEAgLTIwNywxMyArMjI4LDEzIEBACiAgICAgcmV0dXJuIHJlbGVhc2VBY3F1aXJlZEJ1ZmZlckxvY2tlZChsb2NrZWRJZHgpOwogfQogCi1zdGF0dXNfdCBDcHVDb25zdW1lcjo6cmVsZWFzZUFjcXVpcmVkQnVmZmVyTG9ja2VkKHNpemVfdCBsb2NrZWRJZHgpIHsKK3N0YXR1c190IENwdUNvbnN1bWVyOjpyZWxlYXNlQWNxdWlyZWRCdWZmZXJMb2NrZWQoaW50IGxvY2tlZElkeCkgewogICAgIHN0YXR1c190IGVycjsKICAgICBpbnQgZmQgPSAtMTsKIAogICAgIGVyciA9IG1BY3F1aXJlZEJ1ZmZlcnNbbG9ja2VkSWR4XS5tR3JhcGhpY0J1ZmZlci0+dW5sb2NrQXN5bmMoJmZkKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIENDX0xPR0UoIiVzOiBVbmFibGUgdG8gdW5sb2NrIGdyYXBoaWMgYnVmZmVyICV6ZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgQ0NfTE9HRSgiJXM6IFVuYWJsZSB0byB1bmxvY2sgZ3JhcGhpYyBidWZmZXIgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgbG9ja2VkSWR4KTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL2d1aS9HTENvbnN1bWVyLmNwcCBiL2xpYnMvZ3VpL0dMQ29uc3VtZXIuY3BwCmluZGV4IDkzNmFkNTMuLmI4ODZjNWIgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0dMQ29uc3VtZXIuY3BwCisrKyBiL2xpYnMvZ3VpL0dMQ29uc3VtZXIuY3BwCkBAIC00NywyOCArNDcsMTggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gTWFjcm9zIGZvciBpbmNsdWRpbmcgdGhlIEdMQ29uc3VtZXIgbmFtZSBpbiBsb2cgbWVzc2FnZXMKLSNkZWZpbmUgR0xDX0xPR1YoeCwgLi4uKSBBTE9HVigiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBHTENfTE9HRCh4LCAuLi4pIEFMT0dEKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0vLyNkZWZpbmUgR0xDX0xPR0koeCwgLi4uKSBBTE9HSSgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQotI2RlZmluZSBHTENfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCi0jZGVmaW5lIEdMQ19MT0dFKHgsIC4uLikgQUxPR0UoIlslc10gIiB4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfTE9HVih4LCAuLi4pIEFMT0dWKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX0xPR0QoeCwgLi4uKSBBTE9HRCgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBTVF9MT0dJKHgsIC4uLikgQUxPR0koIlslc10gIiB4LCBtTmFtZS5zdHJpbmcoKSwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfTE9HVyh4LCAuLi4pIEFMT0dXKCJbJXNdICIgeCwgbU5hbWUuc3RyaW5nKCksICMjX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX0xPR0UoeCwgLi4uKSBBTE9HRSgiWyVzXSAiIHgsIG1OYW1lLnN0cmluZygpLCAjI19fVkFfQVJHU19fKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIHNpemVfdCB3aWR0aCwgaGVpZ2h0OwogICAgIGNoYXIgY29uc3QqIGJpdHM7CiB9IGtEZWJ1Z0RhdGEgPSB7IDE1LCAxMiwKLSAgICAiX19fX19fX19fX19fX19fIgotICAgICJfX19fX19fX19fX19fX18iCi0gICAgIl9fX19fWFhfWFhfX19fXyIKLSAgICAiX19YX1hfX19fX1hfWF9fIgotICAgICJfX1hfWFhYWFhYWF9YX18iCi0gICAgIl9fWFhYWFhYWFhYWFhfXyIKLSAgICAiX19fWFhfWFhYX1hYX19fIgotICAgICJfX19fWFhYWFhYWF9fX18iCi0gICAgIl9fX19fWF9fX1hfX19fXyIKLSAgICAiX19fX1hfX19fX1hfX19fIgotICAgICJfX19fX19fX19fX19fX18iCi0gICAgIl9fX19fX19fX19fX19fXyIKKyAgICAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19YWF9YWF9fX19fX19YX1hfX19fX1hfWF9fX19YX1hYWFhYWFhfWF9fX19YWFhYWFhYWFhYWF9fIgorICAgICJfX19YWF9YWFhfWFhfX19fX19fWFhYWFhYWF9fX19fX19fX1hfX19YX19fX19fX19fWF9fX19fWF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18iCiB9OwogCiAvLyBUcmFuc2Zvcm0gbWF0cmljZXMKQEAgLTE0NSw3ICsxMzUsNyBAQAogICAgIG1DdXJyZW50VGV4dHVyZShCdWZmZXJRdWV1ZTo6SU5WQUxJRF9CVUZGRVJfU0xPVCksCiAgICAgbUF0dGFjaGVkKHRydWUpCiB7Ci0gICAgR0xDX0xPR1YoIkdMQ29uc3VtZXIiKTsKKyAgICBTVF9MT0dWKCJHTENvbnN1bWVyIik7CiAKICAgICBtZW1jcHkobUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXgsIG10eElkZW50aXR5LAogICAgICAgICAgICAgc2l6ZW9mKG1DdXJyZW50VHJhbnNmb3JtTWF0cml4KSk7CkBAIC0xNjQsNyArMTU0LDcgQEAKICAgICBtRGVmYXVsdFdpZHRoKDEpLAogICAgIG1EZWZhdWx0SGVpZ2h0KDEpLAogICAgIG1GaWx0ZXJpbmdFbmFibGVkKHRydWUpLAotICAgIG1UZXhOYW1lKDApLAorICAgIG1UZXhOYW1lKC0xKSwKICAgICBtVXNlRmVuY2VTeW5jKHVzZUZlbmNlU3luYyksCiAgICAgbVRleFRhcmdldCh0ZXhUYXJnZXQpLAogICAgIG1FZ2xEaXNwbGF5KEVHTF9OT19ESVNQTEFZKSwKQEAgLTE3Miw3ICsxNjIsNyBAQAogICAgIG1DdXJyZW50VGV4dHVyZShCdWZmZXJRdWV1ZTo6SU5WQUxJRF9CVUZGRVJfU0xPVCksCiAgICAgbUF0dGFjaGVkKGZhbHNlKQogewotICAgIEdMQ19MT0dWKCJHTENvbnN1bWVyIik7CisgICAgU1RfTE9HVigiR0xDb25zdW1lciIpOwogCiAgICAgbWVtY3B5KG1DdXJyZW50VHJhbnNmb3JtTWF0cml4LCBtdHhJZGVudGl0eSwKICAgICAgICAgICAgIHNpemVvZihtQ3VycmVudFRyYW5zZm9ybU1hdHJpeCkpOwpAQCAtMTk2LDExICsxODYsMTEgQEAKIAogc3RhdHVzX3QgR0xDb25zdW1lcjo6dXBkYXRlVGV4SW1hZ2UoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBHTENfTE9HVigidXBkYXRlVGV4SW1hZ2UiKTsKKyAgICBTVF9MT0dWKCJ1cGRhdGVUZXhJbWFnZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKICAgICBpZiAobUFiYW5kb25lZCkgewotICAgICAgICBHTENfTE9HRSgidXBkYXRlVGV4SW1hZ2U6IEdMQ29uc3VtZXIgaXMgYWJhbmRvbmVkISIpOworICAgICAgICBTVF9MT0dFKCJ1cGRhdGVUZXhJbWFnZTogR0xDb25zdW1lciBpcyBhYmFuZG9uZWQhIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIApAQCAtMjE5LDExICsyMDksMTEgQEAKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChlcnIgPT0gQnVmZmVyUXVldWU6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpIHsKICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBiaW5kIHRoZSB0ZXh0dXJlIGV2ZW4gaWYgd2UgZG9uJ3QgdXBkYXRlIGl0cyBjb250ZW50cy4KLSAgICAgICAgICAgIEdMQ19MT0dWKCJ1cGRhdGVUZXhJbWFnZTogbm8gYnVmZmVycyB3ZXJlIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgU1RfTE9HVigidXBkYXRlVGV4SW1hZ2U6IG5vIGJ1ZmZlcnMgd2VyZSBhdmFpbGFibGUiKTsKICAgICAgICAgICAgIGdsQmluZFRleHR1cmUobVRleFRhcmdldCwgbVRleE5hbWUpOwogICAgICAgICAgICAgZXJyID0gTk9fRVJST1I7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHTENfTE9HRSgidXBkYXRlVGV4SW1hZ2U6IGFjcXVpcmUgZmFpbGVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIFNUX0xPR0UoInVwZGF0ZVRleEltYWdlOiBhY3F1aXJlIGZhaWxlZDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTI0NCwxMSArMjM0LDExIEBACiAKIHN0YXR1c190IEdMQ29uc3VtZXI6OnJlbGVhc2VUZXhJbWFnZSgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEdMQ19MT0dWKCJyZWxlYXNlVGV4SW1hZ2UiKTsKKyAgICBTVF9MT0dWKCJyZWxlYXNlVGV4SW1hZ2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCiAgICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgR0xDX0xPR0UoInJlbGVhc2VUZXhJbWFnZTogR0xDb25zdW1lciBpcyBhYmFuZG9uZWQhIik7CisgICAgICAgIFNUX0xPR0UoInJlbGVhc2VUZXhJbWFnZTogR0xDb25zdW1lciBpcyBhYmFuZG9uZWQhIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIApAQCAtMjY4LDEzICsyNTgsMTMgQEAKICAgICBpbnQgYnVmID0gbUN1cnJlbnRUZXh0dXJlOwogICAgIGlmIChidWYgIT0gQnVmZmVyUXVldWU6OklOVkFMSURfQlVGRkVSX1NMT1QpIHsKIAotICAgICAgICBHTENfTE9HVigicmVsZWFzZVRleEltYWdlOiAoc2xvdD0lZCwgbUF0dGFjaGVkPSVkKSIsIGJ1ZiwgbUF0dGFjaGVkKTsKKyAgICAgICAgU1RfTE9HVigicmVsZWFzZVRleEltYWdlOiAoc2xvdD0lZCwgbUF0dGFjaGVkPSVkKSIsIGJ1ZiwgbUF0dGFjaGVkKTsKIAogICAgICAgICBpZiAobUF0dGFjaGVkKSB7CiAgICAgICAgICAgICAvLyBEbyB3aGF0ZXZlciBzeW5jIG9wcyB3ZSBuZWVkIHRvIGRvIGJlZm9yZSByZWxlYXNpbmcgdGhlIHNsb3QuCiAgICAgICAgICAgICBlcnIgPSBzeW5jRm9yUmVsZWFzZUxvY2tlZChtRWdsRGlzcGxheSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgR0xDX0xPR0UoInN5bmNGb3JSZWxlYXNlTG9ja2VkIGZhaWxlZCAoc2xvdD0lZCksIGVycj0lZCIsIGJ1ZiwgZXJyKTsKKyAgICAgICAgICAgICAgICBTVF9MT0dFKCJzeW5jRm9yUmVsZWFzZUxvY2tlZCBmYWlsZWQgKHNsb3Q9JWQpLCBlcnI9JWQiLCBidWYsIGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTI4NCw3ICsyNzQsNyBAQAogCiAgICAgICAgIGVyciA9IHJlbGVhc2VCdWZmZXJMb2NrZWQoYnVmLCBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlciwgbUVnbERpc3BsYXksIEVHTF9OT19TWU5DX0tIUik7CiAgICAgICAgIGlmIChlcnIgPCBOT19FUlJPUikgewotICAgICAgICAgICAgR0xDX0xPR0UoInJlbGVhc2VUZXhJbWFnZTogZmFpbGVkIHRvIHJlbGVhc2UgYnVmZmVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIFNUX0xPR0UoInJlbGVhc2VUZXhJbWFnZTogZmFpbGVkIHRvIHJlbGVhc2UgYnVmZmVyOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CkBAIC0zMDMsOSArMjkzLDkgQEAKIAogICAgICAgICBpZiAobUF0dGFjaGVkKSB7CiAgICAgICAgICAgICAvLyBUaGlzIGJpbmRzIGEgZHVtbXkgYnVmZmVyIChtUmVsZWFzZWRUZXhJbWFnZSkuCi0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBiaW5kVGV4dHVyZUltYWdlTG9ja2VkKCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9ICBiaW5kVGV4dHVyZUltYWdlTG9ja2VkKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIGRldGFjaGVkLCBkb24ndCB0b3VjaCB0aGUgdGV4dHVyZSAoYW5kIHdlIG1heSBub3QgZXZlbiBoYXZlIGFuCkBAIC0zMjYsMTUgKzMxNiwxNCBAQAogICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OlVTQUdFX1NXX1dSSVRFX1JBUkVMWSk7CiAgICAgICAgIHVpbnQzMl90KiBiaXRzOwogICAgICAgICBidWZmZXItPmxvY2soR3JhcGhpY0J1ZmZlcjo6VVNBR0VfU1dfV1JJVEVfUkFSRUxZLCByZWludGVycHJldF9jYXN0PHZvaWQqKj4oJmJpdHMpKTsKLSAgICAgICAgdWludDMyX3Qgc3RyaWRlID0gYnVmZmVyLT5nZXRTdHJpZGUoKTsKLSAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5nZXRIZWlnaHQoKTsKLSAgICAgICAgbWVtc2V0KGJpdHMsIDAsIHN0cmlkZSAqIGhlaWdodCAqIDQpOwotICAgICAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwga0RlYnVnRGF0YS5oZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGtEZWJ1Z0RhdGEud2lkdGg7IHgrKykgewotICAgICAgICAgICAgICAgIGJpdHNbeF0gPSAoa0RlYnVnRGF0YS5iaXRzW3kgKyBrRGVidWdEYXRhLndpZHRoICsgeF0gPT0gJ1gnKSA/Ci0gICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDAgOiAweEZGRkZGRkZGOworICAgICAgICBzaXplX3QgdyA9IGJ1ZmZlci0+Z2V0U3RyaWRlKCk7CisgICAgICAgIHNpemVfdCBoID0gYnVmZmVyLT5nZXRIZWlnaHQoKTsKKyAgICAgICAgbWVtc2V0KGJpdHMsIDAsIHcqaCo0KTsKKyAgICAgICAgZm9yIChzaXplX3QgeT0wIDsgeTxrRGVidWdEYXRhLmhlaWdodCA7IHkrKykgeworICAgICAgICAgICAgZm9yIChzaXplX3QgeD0wIDsgeDxrRGVidWdEYXRhLndpZHRoIDsgeCsrKSB7CisgICAgICAgICAgICAgICAgYml0c1t4XSA9IChrRGVidWdEYXRhLmJpdHNbeSprRGVidWdEYXRhLndpZHRoK3hdID09ICdYJykgPyAweEZGMDAwMDAwIDogMHhGRkZGRkZGRjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpdHMgKz0gc3RyaWRlOworICAgICAgICAgICAgYml0cyArPSB3OwogICAgICAgICB9CiAgICAgICAgIGJ1ZmZlci0+dW5sb2NrKCk7CiAgICAgICAgIHNSZWxlYXNlZFRleEltYWdlQnVmZmVyID0gYnVmZmVyOwpAQCAtMzgwLDcgKzM2OSw3IEBACiAgICAgaW50IGJ1ZiA9IGl0ZW0ubUJ1ZjsKIAogICAgIGlmICghbUF0dGFjaGVkKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJ1cGRhdGVBbmRSZWxlYXNlOiBHTENvbnN1bWVyIGlzIG5vdCBhdHRhY2hlZCB0byBhbiBPcGVuR0wgIgorICAgICAgICBTVF9MT0dFKCJ1cGRhdGVBbmRSZWxlYXNlOiBHTENvbnN1bWVyIGlzIG5vdCBhdHRhY2hlZCB0byBhbiBPcGVuR0wgIgogICAgICAgICAgICAgICAgICJFUyBjb250ZXh0Iik7CiAgICAgICAgIHJlbGVhc2VCdWZmZXJMb2NrZWQoYnVmLCBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlciwKICAgICAgICAgICAgICAgICBtRWdsRGlzcGxheSwgRUdMX05PX1NZTkNfS0hSKTsKQEAgLTQwMiw3ICszOTEsNyBAQAogICAgIC8vIG1lYW5zIHRoZSBidWZmZXIgd2FzIHByZXZpb3VzbHkgYWNxdWlyZWQpLgogICAgIGVyciA9IG1FZ2xTbG90c1tidWZdLm1FZ2xJbWFnZS0+Y3JlYXRlSWZOZWVkZWQobUVnbERpc3BsYXksIGl0ZW0ubUNyb3ApOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgR0xDX0xPR1coInVwZGF0ZUFuZFJlbGVhc2U6IHVuYWJsZSB0byBjcmVhdGVJbWFnZSBvbiBkaXNwbGF5PSVwIHNsb3Q9JWQiLAorICAgICAgICBTVF9MT0dXKCJ1cGRhdGVBbmRSZWxlYXNlOiB1bmFibGUgdG8gY3JlYXRlSW1hZ2Ugb24gZGlzcGxheT0lcCBzbG90PSVkIiwKICAgICAgICAgICAgICAgICBtRWdsRGlzcGxheSwgYnVmKTsKICAgICAgICAgcmVsZWFzZUJ1ZmZlckxvY2tlZChidWYsIG1TbG90c1tidWZdLm1HcmFwaGljQnVmZmVyLAogICAgICAgICAgICAgICAgIG1FZ2xEaXNwbGF5LCBFR0xfTk9fU1lOQ19LSFIpOwpAQCAtNDIxLDcgKzQxMCw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgR0xDX0xPR1YoInVwZGF0ZUFuZFJlbGVhc2U6IChzbG90PSVkIGJ1Zj0lcCkgLT4gKHNsb3Q9JWQgYnVmPSVwKSIsCisgICAgU1RfTE9HVigidXBkYXRlQW5kUmVsZWFzZTogKHNsb3Q9JWQgYnVmPSVwKSAtPiAoc2xvdD0lZCBidWY9JXApIiwKICAgICAgICAgICAgIG1DdXJyZW50VGV4dHVyZSwgbUN1cnJlbnRUZXh0dXJlSW1hZ2UgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGV4dHVyZUltYWdlLT5ncmFwaGljQnVmZmVySGFuZGxlKCkgOiAwLAogICAgICAgICAgICAgYnVmLCBtU2xvdHNbYnVmXS5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKQEAgLTQzMiw3ICs0MjEsNyBAQAogICAgICAgICAgICAgICAgIG1DdXJyZW50VGV4dHVyZSwgbUN1cnJlbnRUZXh0dXJlSW1hZ2UtPmdyYXBoaWNCdWZmZXIoKSwKICAgICAgICAgICAgICAgICBtRWdsRGlzcGxheSwgbUVnbFNsb3RzW21DdXJyZW50VGV4dHVyZV0ubUVnbEZlbmNlKTsKICAgICAgICAgaWYgKHN0YXR1cyA8IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBHTENfTE9HRSgidXBkYXRlQW5kUmVsZWFzZTogZmFpbGVkIHRvIHJlbGVhc2UgYnVmZmVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgIFNUX0xPR0UoInVwZGF0ZUFuZFJlbGVhc2U6IGZhaWxlZCB0byByZWxlYXNlIGJ1ZmZlcjogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXN0YXR1cyksIHN0YXR1cyk7CiAgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CiAgICAgICAgICAgICAvLyBrZWVwIGdvaW5nLCB3aXRoIGVycm9yIHJhaXNlZCBbP10KQEAgLTQ2MCwyMiArNDQ5LDIyIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBHTGVudW0gZXJyb3I7CisgICAgR0xpbnQgZXJyb3I7CiAgICAgd2hpbGUgKChlcnJvciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgR0xDX0xPR1coImJpbmRUZXh0dXJlSW1hZ2U6IGNsZWFyaW5nIEdMIGVycm9yOiAlIzA0eCIsIGVycm9yKTsKKyAgICAgICAgU1RfTE9HVygiYmluZFRleHR1cmVJbWFnZTogY2xlYXJpbmcgR0wgZXJyb3I6ICUjMDR4IiwgZXJyb3IpOwogICAgIH0KIAogICAgIGdsQmluZFRleHR1cmUobVRleFRhcmdldCwgbVRleE5hbWUpOwogICAgIGlmIChtQ3VycmVudFRleHR1cmUgPT0gQnVmZmVyUXVldWU6OklOVkFMSURfQlVGRkVSX1NMT1QgJiYKICAgICAgICAgICAgIG1DdXJyZW50VGV4dHVyZUltYWdlID09IE5VTEwpIHsKLSAgICAgICAgR0xDX0xPR0UoImJpbmRUZXh0dXJlSW1hZ2U6IG5vIGN1cnJlbnRseS1ib3VuZCB0ZXh0dXJlIik7CisgICAgICAgIFNUX0xPR0UoImJpbmRUZXh0dXJlSW1hZ2U6IG5vIGN1cnJlbnRseS1ib3VuZCB0ZXh0dXJlIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAogICAgIHN0YXR1c190IGVyciA9IG1DdXJyZW50VGV4dHVyZUltYWdlLT5jcmVhdGVJZk5lZWRlZChtRWdsRGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDcm9wKTsKICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEdMQ19MT0dXKCJiaW5kVGV4dHVyZUltYWdlOiBjYW4ndCBjcmVhdGUgaW1hZ2Ugb24gZGlzcGxheT0lcCBzbG90PSVkIiwKKyAgICAgICAgU1RfTE9HVygiYmluZFRleHR1cmVJbWFnZTogY2FuJ3QgY3JlYXRlIGltYWdlIG9uIGRpc3BsYXk9JXAgc2xvdD0lZCIsCiAgICAgICAgICAgICAgICAgbUVnbERpc3BsYXksIG1DdXJyZW50VGV4dHVyZSk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTQ4NywxNyArNDc2LDE3IEBACiAgICAgLy8gZm9yY2luZyB0aGUgY3JlYXRpb24gb2YgYSBuZXcgaW1hZ2UuCiAgICAgaWYgKChlcnJvciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKICAgICAgICAgZ2xCaW5kVGV4dHVyZShtVGV4VGFyZ2V0LCBtVGV4TmFtZSk7Ci0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1DdXJyZW50VGV4dHVyZUltYWdlLT5jcmVhdGVJZk5lZWRlZChtRWdsRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q3JvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBHTENfTE9HVygiYmluZFRleHR1cmVJbWFnZTogY2FuJ3QgY3JlYXRlIGltYWdlIG9uIGRpc3BsYXk9JXAgc2xvdD0lZCIsCisgICAgICAgIHN0YXR1c190IGVyciA9IG1DdXJyZW50VGV4dHVyZUltYWdlLT5jcmVhdGVJZk5lZWRlZChtRWdsRGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50Q3JvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBTVF9MT0dXKCJiaW5kVGV4dHVyZUltYWdlOiBjYW4ndCBjcmVhdGUgaW1hZ2Ugb24gZGlzcGxheT0lcCBzbG90PSVkIiwKICAgICAgICAgICAgICAgICAgICAgbUVnbERpc3BsYXksIG1DdXJyZW50VGV4dHVyZSk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFRleHR1cmVJbWFnZS0+YmluZFRvVGV4dHVyZVRhcmdldChtVGV4VGFyZ2V0KTsKICAgICAgICAgaWYgKChlcnJvciA9IGdsR2V0RXJyb3IoKSkgIT0gR0xfTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEdMQ19MT0dFKCJiaW5kVGV4dHVyZUltYWdlOiBlcnJvciBiaW5kaW5nIGV4dGVybmFsIGltYWdlOiAlIzA0eCIsIGVycm9yKTsKKyAgICAgICAgICAgIFNUX0xPR0UoImJpbmRUZXh0dXJlSW1hZ2U6IGVycm9yIGJpbmRpbmcgZXh0ZXJuYWwgaW1hZ2U6ICUjMDR4IiwgZXJyb3IpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICB9CkBAIC01MTYsMTggKzUwNSwxOCBAQAogICAgICAgICBpZiAobUVnbERpc3BsYXkgPT0gRUdMX05PX0RJU1BMQVkpIHsKICAgICAgICAgICAgIG1FZ2xEaXNwbGF5ID0gZHB5OwogICAgICAgICB9Ci0gICAgICAgIGlmIChtRWdsQ29udGV4dCA9PSBFR0xfTk9fRElTUExBWSkgeworICAgICAgICBpZiAobUVnbENvbnRleHQgPT0gRUdMX05PX0NPTlRFWFQpIHsKICAgICAgICAgICAgIG1FZ2xDb250ZXh0ID0gY3R4OwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1FZ2xEaXNwbGF5ICE9IGRweSB8fCBkcHkgPT0gRUdMX05PX0RJU1BMQVkpIHsKLSAgICAgICAgR0xDX0xPR0UoImNoZWNrQW5kVXBkYXRlRWdsU3RhdGU6IGludmFsaWQgY3VycmVudCBFR0xEaXNwbGF5Iik7CisgICAgICAgIFNUX0xPR0UoImNoZWNrQW5kVXBkYXRlRWdsU3RhdGU6IGludmFsaWQgY3VycmVudCBFR0xEaXNwbGF5Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBpZiAobUVnbENvbnRleHQgIT0gY3R4IHx8IGN0eCA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICBHTENfTE9HRSgiY2hlY2tBbmRVcGRhdGVFZ2xTdGF0ZTogaW52YWxpZCBjdXJyZW50IEVHTENvbnRleHQiKTsKKyAgICAgICAgU1RfTE9HRSgiY2hlY2tBbmRVcGRhdGVFZ2xTdGF0ZTogaW52YWxpZCBjdXJyZW50IEVHTENvbnRleHQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtNTQyLDcgKzUzMSw3IEBACiAgICAgICAgIHN0YXR1c190IGVyciA9IGFkZFJlbGVhc2VGZW5jZShtQ3VycmVudFRleHR1cmUsCiAgICAgICAgICAgICAgICAgbUN1cnJlbnRUZXh0dXJlSW1hZ2UtPmdyYXBoaWNCdWZmZXIoKSwgZmVuY2UpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBHTENfTE9HRSgic2V0UmVsZWFzZUZlbmNlOiBmYWlsZWQgdG8gYWRkIHRoZSBmZW5jZTogJXMgKCVkKSIsCisgICAgICAgICAgICBTVF9MT0dFKCJzZXRSZWxlYXNlRmVuY2U6IGZhaWxlZCB0byBhZGQgdGhlIGZlbmNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIH0KICAgICB9CkBAIC01NTAsMTYgKzUzOSwxNiBAQAogCiBzdGF0dXNfdCBHTENvbnN1bWVyOjpkZXRhY2hGcm9tQ29udGV4dCgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEdMQ19MT0dWKCJkZXRhY2hGcm9tQ29udGV4dCIpOworICAgIFNUX0xPR1YoImRldGFjaEZyb21Db250ZXh0Iik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIAogICAgIGlmIChtQWJhbmRvbmVkKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJkZXRhY2hGcm9tQ29udGV4dDogYWJhbmRvbmVkIEdMQ29uc3VtZXIiKTsKKyAgICAgICAgU1RfTE9HRSgiZGV0YWNoRnJvbUNvbnRleHQ6IGFiYW5kb25lZCBHTENvbnN1bWVyIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAogICAgIGlmICghbUF0dGFjaGVkKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJkZXRhY2hGcm9tQ29udGV4dDogR0xDb25zdW1lciBpcyBub3QgYXR0YWNoZWQgdG8gYSAiCisgICAgICAgIFNUX0xPR0UoImRldGFjaEZyb21Db250ZXh0OiBHTENvbnN1bWVyIGlzIG5vdCBhdHRhY2hlZCB0byBhICIKICAgICAgICAgICAgICAgICAiY29udGV4dCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtNTY4LDEyICs1NTcsMTIgQEAKICAgICBFR0xDb250ZXh0IGN0eCA9IGVnbEdldEN1cnJlbnRDb250ZXh0KCk7CiAKICAgICBpZiAobUVnbERpc3BsYXkgIT0gZHB5ICYmIG1FZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJkZXRhY2hGcm9tQ29udGV4dDogaW52YWxpZCBjdXJyZW50IEVHTERpc3BsYXkiKTsKKyAgICAgICAgU1RfTE9HRSgiZGV0YWNoRnJvbUNvbnRleHQ6IGludmFsaWQgY3VycmVudCBFR0xEaXNwbGF5Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBpZiAobUVnbENvbnRleHQgIT0gY3R4ICYmIG1FZ2xDb250ZXh0ICE9IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJkZXRhY2hGcm9tQ29udGV4dDogaW52YWxpZCBjdXJyZW50IEVHTENvbnRleHQiKTsKKyAgICAgICAgU1RfTE9HRSgiZGV0YWNoRnJvbUNvbnRleHQ6IGludmFsaWQgY3VycmVudCBFR0xDb250ZXh0Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTU5NSwxNiArNTg0LDE2IEBACiAKIHN0YXR1c190IEdMQ29uc3VtZXI6OmF0dGFjaFRvQ29udGV4dCh1aW50MzJfdCB0ZXgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEdMQ19MT0dWKCJhdHRhY2hUb0NvbnRleHQiKTsKKyAgICBTVF9MT0dWKCJhdHRhY2hUb0NvbnRleHQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogCiAgICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgR0xDX0xPR0UoImF0dGFjaFRvQ29udGV4dDogYWJhbmRvbmVkIEdMQ29uc3VtZXIiKTsKKyAgICAgICAgU1RfTE9HRSgiYXR0YWNoVG9Db250ZXh0OiBhYmFuZG9uZWQgR0xDb25zdW1lciIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAKICAgICBpZiAobUF0dGFjaGVkKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJhdHRhY2hUb0NvbnRleHQ6IEdMQ29uc3VtZXIgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhICIKKyAgICAgICAgU1RfTE9HRSgiYXR0YWNoVG9Db250ZXh0OiBHTENvbnN1bWVyIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSAiCiAgICAgICAgICAgICAgICAgImNvbnRleHQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KQEAgLTYxMywxMiArNjAyLDEyIEBACiAgICAgRUdMQ29udGV4dCBjdHggPSBlZ2xHZXRDdXJyZW50Q29udGV4dCgpOwogCiAgICAgaWYgKGRweSA9PSBFR0xfTk9fRElTUExBWSkgewotICAgICAgICBHTENfTE9HRSgiYXR0YWNoVG9Db250ZXh0OiBpbnZhbGlkIGN1cnJlbnQgRUdMRGlzcGxheSIpOworICAgICAgICBTVF9MT0dFKCJhdHRhY2hUb0NvbnRleHQ6IGludmFsaWQgY3VycmVudCBFR0xEaXNwbGF5Iik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKICAgICBpZiAoY3R4ID09IEVHTF9OT19DT05URVhUKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJhdHRhY2hUb0NvbnRleHQ6IGludmFsaWQgY3VycmVudCBFR0xDb250ZXh0Iik7CisgICAgICAgIFNUX0xPR0UoImF0dGFjaFRvQ29udGV4dDogaW52YWxpZCBjdXJyZW50IEVHTENvbnRleHQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtNjQ3LDE0ICs2MzYsMTQgQEAKIAogCiBzdGF0dXNfdCBHTENvbnN1bWVyOjpzeW5jRm9yUmVsZWFzZUxvY2tlZChFR0xEaXNwbGF5IGRweSkgewotICAgIEdMQ19MT0dWKCJzeW5jRm9yUmVsZWFzZUxvY2tlZCIpOworICAgIFNUX0xPR1YoInN5bmNGb3JSZWxlYXNlTG9ja2VkIik7CiAKICAgICBpZiAobUN1cnJlbnRUZXh0dXJlICE9IEJ1ZmZlclF1ZXVlOjpJTlZBTElEX0JVRkZFUl9TTE9UKSB7CiAgICAgICAgIGlmIChTeW5jRmVhdHVyZXM6OmdldEluc3RhbmNlKCkudXNlTmF0aXZlRmVuY2VTeW5jKCkpIHsKICAgICAgICAgICAgIEVHTFN5bmNLSFIgc3luYyA9IGVnbENyZWF0ZVN5bmNLSFIoZHB5LAogICAgICAgICAgICAgICAgICAgICBFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfQU5EUk9JRCwgTlVMTCk7CiAgICAgICAgICAgICBpZiAoc3luYyA9PSBFR0xfTk9fU1lOQ19LSFIpIHsKLSAgICAgICAgICAgICAgICBHTENfTE9HRSgic3luY0ZvclJlbGVhc2VMb2NrZWQ6IGVycm9yIGNyZWF0aW5nIEVHTCBmZW5jZTogJSN4IiwKKyAgICAgICAgICAgICAgICBTVF9MT0dFKCJzeW5jRm9yUmVsZWFzZUxvY2tlZDogZXJyb3IgY3JlYXRpbmcgRUdMIGZlbmNlOiAlI3giLAogICAgICAgICAgICAgICAgICAgICAgICAgZWdsR2V0RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CkBAIC02NjIsNyArNjUxLDcgQEAKICAgICAgICAgICAgIGludCBmZW5jZUZkID0gZWdsRHVwTmF0aXZlRmVuY2VGREFORFJPSUQoZHB5LCBzeW5jKTsKICAgICAgICAgICAgIGVnbERlc3Ryb3lTeW5jS0hSKGRweSwgc3luYyk7CiAgICAgICAgICAgICBpZiAoZmVuY2VGZCA9PSBFR0xfTk9fTkFUSVZFX0ZFTkNFX0ZEX0FORFJPSUQpIHsKLSAgICAgICAgICAgICAgICBHTENfTE9HRSgic3luY0ZvclJlbGVhc2VMb2NrZWQ6IGVycm9yIGR1cCdpbmcgbmF0aXZlIGZlbmNlICIKKyAgICAgICAgICAgICAgICBTVF9MT0dFKCJzeW5jRm9yUmVsZWFzZUxvY2tlZDogZXJyb3IgZHVwJ2luZyBuYXRpdmUgZmVuY2UgIgogICAgICAgICAgICAgICAgICAgICAgICAgImZkOiAlI3giLCBlZ2xHZXRFcnJvcigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KQEAgLTY3MCw3ICs2NTksNyBAQAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYWRkUmVsZWFzZUZlbmNlTG9ja2VkKG1DdXJyZW50VGV4dHVyZSwKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUZXh0dXJlSW1hZ2UtPmdyYXBoaWNCdWZmZXIoKSwgZmVuY2UpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIEdMQ19MT0dFKCJzeW5jRm9yUmVsZWFzZUxvY2tlZDogZXJyb3IgYWRkaW5nIHJlbGVhc2UgZmVuY2U6ICIKKyAgICAgICAgICAgICAgICBTVF9MT0dFKCJzeW5jRm9yUmVsZWFzZUxvY2tlZDogZXJyb3IgYWRkaW5nIHJlbGVhc2UgZmVuY2U6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KQEAgLTY4MywxMSArNjcyLDExIEBACiAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBwcm9kdWNlciBhY2Nlc3NlcyBpdC4KICAgICAgICAgICAgICAgICBFR0xpbnQgcmVzdWx0ID0gZWdsQ2xpZW50V2FpdFN5bmNLSFIoZHB5LCBmZW5jZSwgMCwgMTAwMDAwMDAwMCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgR0xDX0xPR0UoInN5bmNGb3JSZWxlYXNlTG9ja2VkOiBlcnJvciB3YWl0aW5nIGZvciBwcmV2aW91cyAiCisgICAgICAgICAgICAgICAgICAgIFNUX0xPR0UoInN5bmNGb3JSZWxlYXNlTG9ja2VkOiBlcnJvciB3YWl0aW5nIGZvciBwcmV2aW91cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbmNlOiAlI3giLCBlZ2xHZXRFcnJvcigpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gRUdMX1RJTUVPVVRfRVhQSVJFRF9LSFIpIHsKLSAgICAgICAgICAgICAgICAgICAgR0xDX0xPR0UoInN5bmNGb3JSZWxlYXNlTG9ja2VkOiB0aW1lb3V0IHdhaXRpbmcgZm9yIHByZXZpb3VzICIKKyAgICAgICAgICAgICAgICAgICAgU1RfTE9HRSgic3luY0ZvclJlbGVhc2VMb2NrZWQ6IHRpbWVvdXQgd2FpdGluZyBmb3IgcHJldmlvdXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW5jZSIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOwogICAgICAgICAgICAgICAgIH0KQEAgLTY5OCw3ICs2ODcsNyBAQAogICAgICAgICAgICAgLy8gT3BlbkdMIEVTIGNvbnRleHQuCiAgICAgICAgICAgICBmZW5jZSA9IGVnbENyZWF0ZVN5bmNLSFIoZHB5LCBFR0xfU1lOQ19GRU5DRV9LSFIsIE5VTEwpOwogICAgICAgICAgICAgaWYgKGZlbmNlID09IEVHTF9OT19TWU5DX0tIUikgewotICAgICAgICAgICAgICAgIEdMQ19MT0dFKCJzeW5jRm9yUmVsZWFzZUxvY2tlZDogZXJyb3IgY3JlYXRpbmcgZmVuY2U6ICUjeCIsCisgICAgICAgICAgICAgICAgU1RfTE9HRSgic3luY0ZvclJlbGVhc2VMb2NrZWQ6IGVycm9yIGNyZWF0aW5nIGZlbmNlOiAlI3giLAogICAgICAgICAgICAgICAgICAgICAgICAgZWdsR2V0RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CkBAIC03MTAsNyArNjk5LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWJvb2wgR0xDb25zdW1lcjo6aXNFeHRlcm5hbEZvcm1hdChQaXhlbEZvcm1hdCBmb3JtYXQpCitib29sIEdMQ29uc3VtZXI6OmlzRXh0ZXJuYWxGb3JtYXQodWludDMyX3QgZm9ybWF0KQogewogICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgLy8gc3VwcG9ydGVkIFlVViBmb3JtYXRzCkBAIC03NDEsMTQgKzczMCwxNCBAQAogdm9pZCBHTENvbnN1bWVyOjpzZXRGaWx0ZXJpbmdFbmFibGVkKGJvb2wgZW5hYmxlZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAgICAgaWYgKG1BYmFuZG9uZWQpIHsKLSAgICAgICAgR0xDX0xPR0UoInNldEZpbHRlcmluZ0VuYWJsZWQ6IEdMQ29uc3VtZXIgaXMgYWJhbmRvbmVkISIpOworICAgICAgICBTVF9MT0dFKCJzZXRGaWx0ZXJpbmdFbmFibGVkOiBHTENvbnN1bWVyIGlzIGFiYW5kb25lZCEiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBib29sIG5lZWRzUmVjb21wdXRlID0gbUZpbHRlcmluZ0VuYWJsZWQgIT0gZW5hYmxlZDsKICAgICBtRmlsdGVyaW5nRW5hYmxlZCA9IGVuYWJsZWQ7CiAKICAgICBpZiAobmVlZHNSZWNvbXB1dGUgJiYgbUN1cnJlbnRUZXh0dXJlSW1hZ2U9PU5VTEwpIHsKLSAgICAgICAgR0xDX0xPR0QoInNldEZpbHRlcmluZ0VuYWJsZWQgY2FsbGVkIHdpdGggbUN1cnJlbnRUZXh0dXJlSW1hZ2UgPT0gTlVMTCIpOworICAgICAgICBTVF9MT0dEKCJzZXRGaWx0ZXJpbmdFbmFibGVkIGNhbGxlZCB3aXRoIG1DdXJyZW50VGV4dHVyZUltYWdlID09IE5VTEwiKTsKICAgICB9CiAKICAgICBpZiAobmVlZHNSZWNvbXB1dGUgJiYgbUN1cnJlbnRUZXh0dXJlSW1hZ2UgIT0gTlVMTCkgewpAQCAtNzU3LDcgKzc0Niw3IEBACiB9CiAKIHZvaWQgR0xDb25zdW1lcjo6Y29tcHV0ZUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXhMb2NrZWQoKSB7Ci0gICAgR0xDX0xPR1YoImNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4TG9ja2VkIik7CisgICAgU1RfTE9HVigiY29tcHV0ZUN1cnJlbnRUcmFuc2Zvcm1NYXRyaXhMb2NrZWQiKTsKIAogICAgIGZsb2F0IHhmb3JtWzE2XTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKQEAgLTc4OSw3ICs3NzgsNyBAQAogICAgICAgICAgICAgTlVMTCA6IG1DdXJyZW50VGV4dHVyZUltYWdlLT5ncmFwaGljQnVmZmVyKCk7CiAKICAgICBpZiAoYnVmID09IE5VTEwpIHsKLSAgICAgICAgR0xDX0xPR0QoImNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4TG9ja2VkOiBtQ3VycmVudFRleHR1cmVJbWFnZSBpcyBOVUxMIik7CisgICAgICAgIFNUX0xPR0QoImNvbXB1dGVDdXJyZW50VHJhbnNmb3JtTWF0cml4TG9ja2VkOiBtQ3VycmVudFRleHR1cmVJbWFnZSBpcyBOVUxMIik7CiAgICAgfQogCiAgICAgZmxvYXQgbXR4QmVmb3JlRmxpcFZbMTZdOwpAQCAtODYxLDEzICs4NTAsMTMgQEAKIH0KIAogbnNlY3NfdCBHTENvbnN1bWVyOjpnZXRUaW1lc3RhbXAoKSB7Ci0gICAgR0xDX0xPR1YoImdldFRpbWVzdGFtcCIpOworICAgIFNUX0xPR1YoImdldFRpbWVzdGFtcCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAgICAgcmV0dXJuIG1DdXJyZW50VGltZXN0YW1wOwogfQogCi11aW50NjRfdCBHTENvbnN1bWVyOjpnZXRGcmFtZU51bWJlcigpIHsKLSAgICBHTENfTE9HVigiZ2V0RnJhbWVOdW1iZXIiKTsKK25zZWNzX3QgR0xDb25zdW1lcjo6Z2V0RnJhbWVOdW1iZXIoKSB7CisgICAgU1RfTE9HVigiZ2V0RnJhbWVOdW1iZXIiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogICAgIHJldHVybiBtQ3VycmVudEZyYW1lTnVtYmVyOwogfQpAQCAtODgzLDMzICs4NzIsMzAgQEAKIAogICAgIFJlY3Qgb3V0Q3JvcCA9IG1DdXJyZW50Q3JvcDsKICAgICBpZiAobUN1cnJlbnRTY2FsaW5nTW9kZSA9PSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9DUk9QKSB7Ci0gICAgICAgIHVpbnQzMl90IG5ld1dpZHRoID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1DdXJyZW50Q3JvcC53aWR0aCgpKTsKLSAgICAgICAgdWludDMyX3QgbmV3SGVpZ2h0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1DdXJyZW50Q3JvcC5oZWlnaHQoKSk7CisgICAgICAgIGludDMyX3QgbmV3V2lkdGggPSBtQ3VycmVudENyb3Aud2lkdGgoKTsKKyAgICAgICAgaW50MzJfdCBuZXdIZWlnaHQgPSBtQ3VycmVudENyb3AuaGVpZ2h0KCk7CiAKICAgICAgICAgaWYgKG5ld1dpZHRoICogbURlZmF1bHRIZWlnaHQgPiBuZXdIZWlnaHQgKiBtRGVmYXVsdFdpZHRoKSB7CiAgICAgICAgICAgICBuZXdXaWR0aCA9IG5ld0hlaWdodCAqIG1EZWZhdWx0V2lkdGggLyBtRGVmYXVsdEhlaWdodDsKLSAgICAgICAgICAgIEdMQ19MT0dWKCJ0b28gd2lkZTogbmV3V2lkdGggPSAlZCIsIG5ld1dpZHRoKTsKKyAgICAgICAgICAgIFNUX0xPR1YoInRvbyB3aWRlOiBuZXdXaWR0aCA9ICVkIiwgbmV3V2lkdGgpOwogICAgICAgICB9IGVsc2UgaWYgKG5ld1dpZHRoICogbURlZmF1bHRIZWlnaHQgPCBuZXdIZWlnaHQgKiBtRGVmYXVsdFdpZHRoKSB7CiAgICAgICAgICAgICBuZXdIZWlnaHQgPSBuZXdXaWR0aCAqIG1EZWZhdWx0SGVpZ2h0IC8gbURlZmF1bHRXaWR0aDsKLSAgICAgICAgICAgIEdMQ19MT0dWKCJ0b28gdGFsbDogbmV3SGVpZ2h0ID0gJWQiLCBuZXdIZWlnaHQpOworICAgICAgICAgICAgU1RfTE9HVigidG9vIHRhbGw6IG5ld0hlaWdodCA9ICVkIiwgbmV3SGVpZ2h0KTsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihtQ3VycmVudENyb3Aud2lkdGgoKSk7Ci0gICAgICAgIHVpbnQzMl90IGN1cnJlbnRIZWlnaHQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUN1cnJlbnRDcm9wLmhlaWdodCgpKTsKLQogICAgICAgICAvLyBUaGUgY3JvcCBpcyB0b28gd2lkZQotICAgICAgICBpZiAobmV3V2lkdGggPCBjdXJyZW50V2lkdGgpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGR3ID0gKG5ld1dpZHRoIC0gY3VycmVudFdpZHRoKSAvIDI7CisgICAgICAgIGlmIChuZXdXaWR0aCA8IG1DdXJyZW50Q3JvcC53aWR0aCgpKSB7CisgICAgICAgICAgICBpbnQzMl90IGR3ID0gKG5ld1dpZHRoIC0gbUN1cnJlbnRDcm9wLndpZHRoKCkpLzI7CiAgICAgICAgICAgICBvdXRDcm9wLmxlZnQgLT1kdzsKICAgICAgICAgICAgIG91dENyb3AucmlnaHQgKz0gZHc7CiAgICAgICAgIC8vIFRoZSBjcm9wIGlzIHRvbyB0YWxsCi0gICAgICAgIH0gZWxzZSBpZiAobmV3SGVpZ2h0IDwgY3VycmVudEhlaWdodCkgewotICAgICAgICAgICAgdWludDMyX3QgZGggPSAobmV3SGVpZ2h0IC0gY3VycmVudEhlaWdodCkgLyAyOworICAgICAgICB9IGVsc2UgaWYgKG5ld0hlaWdodCA8IG1DdXJyZW50Q3JvcC5oZWlnaHQoKSkgeworICAgICAgICAgICAgaW50MzJfdCBkaCA9IChuZXdIZWlnaHQgLSBtQ3VycmVudENyb3AuaGVpZ2h0KCkpLzI7CiAgICAgICAgICAgICBvdXRDcm9wLnRvcCAtPSBkaDsKICAgICAgICAgICAgIG91dENyb3AuYm90dG9tICs9IGRoOwogICAgICAgICB9CiAKLSAgICAgICAgR0xDX0xPR1YoImdldEN1cnJlbnRDcm9wIGZpbmFsIGNyb3AgWyVkLCVkLCVkLCVkXSIsCisgICAgICAgIFNUX0xPR1YoImdldEN1cnJlbnRDcm9wIGZpbmFsIGNyb3AgWyVkLCVkLCVkLCVkXSIsCiAgICAgICAgICAgICBvdXRDcm9wLmxlZnQsIG91dENyb3AudG9wLAogICAgICAgICAgICAgb3V0Q3JvcC5yaWdodCxvdXRDcm9wLmJvdHRvbSk7CiAgICAgfQpAQCAtOTQzLDEyICs5MjksMTIgQEAKICAgICBFR0xDb250ZXh0IGN0eCA9IGVnbEdldEN1cnJlbnRDb250ZXh0KCk7CiAKICAgICBpZiAobUVnbERpc3BsYXkgIT0gZHB5IHx8IG1FZ2xEaXNwbGF5ID09IEVHTF9OT19ESVNQTEFZKSB7Ci0gICAgICAgIEdMQ19MT0dFKCJkb0dMRmVuY2VXYWl0OiBpbnZhbGlkIGN1cnJlbnQgRUdMRGlzcGxheSIpOworICAgICAgICBTVF9MT0dFKCJkb0dMRmVuY2VXYWl0OiBpbnZhbGlkIGN1cnJlbnQgRUdMRGlzcGxheSIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCiAgICAgaWYgKG1FZ2xDb250ZXh0ICE9IGN0eCB8fCBtRWdsQ29udGV4dCA9PSBFR0xfTk9fQ09OVEVYVCkgewotICAgICAgICBHTENfTE9HRSgiZG9HTEZlbmNlV2FpdDogaW52YWxpZCBjdXJyZW50IEVHTENvbnRleHQiKTsKKyAgICAgICAgU1RfTE9HRSgiZG9HTEZlbmNlV2FpdDogaW52YWxpZCBjdXJyZW50IEVHTENvbnRleHQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtOTU3LDcgKzk0Myw3IEBACiAgICAgICAgICAgICAvLyBDcmVhdGUgYW4gRUdMU3luY0tIUiBmcm9tIHRoZSBjdXJyZW50IGZlbmNlLgogICAgICAgICAgICAgaW50IGZlbmNlRmQgPSBtQ3VycmVudEZlbmNlLT5kdXAoKTsKICAgICAgICAgICAgIGlmIChmZW5jZUZkID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgR0xDX0xPR0UoImRvR0xGZW5jZVdhaXQ6IGVycm9yIGR1cCdpbmcgZmVuY2UgZmQ6ICVkIiwgZXJybm8pOworICAgICAgICAgICAgICAgIFNUX0xPR0UoImRvR0xGZW5jZVdhaXQ6IGVycm9yIGR1cCdpbmcgZmVuY2UgZmQ6ICVkIiwgZXJybm8pOwogICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBFR0xpbnQgYXR0cmlic1tdID0gewpAQCAtOTY4LDcgKzk1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIEVHTF9TWU5DX05BVElWRV9GRU5DRV9BTkRST0lELCBhdHRyaWJzKTsKICAgICAgICAgICAgIGlmIChzeW5jID09IEVHTF9OT19TWU5DX0tIUikgewogICAgICAgICAgICAgICAgIGNsb3NlKGZlbmNlRmQpOwotICAgICAgICAgICAgICAgIEdMQ19MT0dFKCJkb0dMRmVuY2VXYWl0OiBlcnJvciBjcmVhdGluZyBFR0wgZmVuY2U6ICUjeCIsCisgICAgICAgICAgICAgICAgU1RfTE9HRSgiZG9HTEZlbmNlV2FpdDogZXJyb3IgY3JlYXRpbmcgRUdMIGZlbmNlOiAlI3giLAogICAgICAgICAgICAgICAgICAgICAgICAgZWdsR2V0RXJyb3IoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CkBAIC05ODAsNyArOTY2LDcgQEAKICAgICAgICAgICAgIEVHTGludCBlZ2xFcnIgPSBlZ2xHZXRFcnJvcigpOwogICAgICAgICAgICAgZWdsRGVzdHJveVN5bmNLSFIoZHB5LCBzeW5jKTsKICAgICAgICAgICAgIGlmIChlZ2xFcnIgIT0gRUdMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBHTENfTE9HRSgiZG9HTEZlbmNlV2FpdDogZXJyb3Igd2FpdGluZyBmb3IgRUdMIGZlbmNlOiAlI3giLAorICAgICAgICAgICAgICAgIFNUX0xPR0UoImRvR0xGZW5jZVdhaXQ6IGVycm9yIHdhaXRpbmcgZm9yIEVHTCBmZW5jZTogJSN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgIGVnbEVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CkBAIC05ODgsNyArOTc0LDcgQEAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1DdXJyZW50RmVuY2UtPndhaXRGb3JldmVyKAogICAgICAgICAgICAgICAgICAgICAiR0xDb25zdW1lcjo6ZG9HTEZlbmNlV2FpdExvY2tlZCIpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIEdMQ19MT0dFKCJkb0dMRmVuY2VXYWl0OiBlcnJvciB3YWl0aW5nIGZvciBmZW5jZTogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIFNUX0xPR0UoImRvR0xGZW5jZVdhaXQ6IGVycm9yIHdhaXRpbmcgZm9yIGZlbmNlOiAlZCIsIGVycik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTk4LDcgKzk4NCw3IEBACiB9CiAKIHZvaWQgR0xDb25zdW1lcjo6ZnJlZUJ1ZmZlckxvY2tlZChpbnQgc2xvdEluZGV4KSB7Ci0gICAgR0xDX0xPR1YoImZyZWVCdWZmZXJMb2NrZWQ6IHNsb3RJbmRleD0lZCIsIHNsb3RJbmRleCk7CisgICAgU1RfTE9HVigiZnJlZUJ1ZmZlckxvY2tlZDogc2xvdEluZGV4PSVkIiwgc2xvdEluZGV4KTsKICAgICBpZiAoc2xvdEluZGV4ID09IG1DdXJyZW50VGV4dHVyZSkgewogICAgICAgICBtQ3VycmVudFRleHR1cmUgPSBCdWZmZXJRdWV1ZTo6SU5WQUxJRF9CVUZGRVJfU0xPVDsKICAgICB9CkBAIC0xMDA3LDcgKzk5Myw3IEBACiB9CiAKIHZvaWQgR0xDb25zdW1lcjo6YWJhbmRvbkxvY2tlZCgpIHsKLSAgICBHTENfTE9HVigiYWJhbmRvbkxvY2tlZCIpOworICAgIFNUX0xPR1YoImFiYW5kb25Mb2NrZWQiKTsKICAgICBtQ3VycmVudFRleHR1cmVJbWFnZS5jbGVhcigpOwogICAgIENvbnN1bWVyQmFzZTo6YWJhbmRvbkxvY2tlZCgpOwogfQpAQCAtMTAxOCw3ICsxMDA0LDcgQEAKICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKIH0KIAotc3RhdHVzX3QgR0xDb25zdW1lcjo6c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChQaXhlbEZvcm1hdCBkZWZhdWx0Rm9ybWF0KSB7CitzdGF0dXNfdCBHTENvbnN1bWVyOjpzZXREZWZhdWx0QnVmZmVyRm9ybWF0KHVpbnQzMl90IGRlZmF1bHRGb3JtYXQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogICAgIHJldHVybiBtQ29uc3VtZXItPnNldERlZmF1bHRCdWZmZXJGb3JtYXQoZGVmYXVsdEZvcm1hdCk7CiB9CkBAIC0xMDc5LDYgKzEwNjUsNyBAQAogICAgICAgICBpZiAoIWVnbERlc3Ryb3lJbWFnZUtIUihtRWdsRGlzcGxheSwgbUVnbEltYWdlKSkgewogICAgICAgICAgICBBTE9HRSgifkVnbEltYWdlOiBlZ2xEZXN0cm95SW1hZ2VLSFIgZmFpbGVkIik7CiAgICAgICAgIH0KKyAgICAgICAgZWdsVGVybWluYXRlKG1FZ2xEaXNwbGF5KTsKICAgICB9CiB9CiAKQEAgLTEwOTMsNiArMTA4MCw3IEBACiAgICAgICAgIGlmICghZWdsRGVzdHJveUltYWdlS0hSKG1FZ2xEaXNwbGF5LCBtRWdsSW1hZ2UpKSB7CiAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVJZk5lZWRlZDogZWdsRGVzdHJveUltYWdlS0hSIGZhaWxlZCIpOwogICAgICAgICB9CisgICAgICAgIGVnbFRlcm1pbmF0ZShtRWdsRGlzcGxheSk7CiAgICAgICAgIG1FZ2xJbWFnZSA9IEVHTF9OT19JTUFHRV9LSFI7CiAgICAgICAgIG1FZ2xEaXNwbGF5ID0gRUdMX05PX0RJU1BMQVk7CiAgICAgfQpAQCAtMTExOSwxNCArMTEwNywxMiBAQAogfQogCiB2b2lkIEdMQ29uc3VtZXI6OkVnbEltYWdlOjpiaW5kVG9UZXh0dXJlVGFyZ2V0KHVpbnQzMl90IHRleFRhcmdldCkgewotICAgIGdsRUdMSW1hZ2VUYXJnZXRUZXh0dXJlMkRPRVModGV4VGFyZ2V0LAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8R0xlZ2xJbWFnZU9FUz4obUVnbEltYWdlKSk7CisgICAgZ2xFR0xJbWFnZVRhcmdldFRleHR1cmUyRE9FUyh0ZXhUYXJnZXQsIChHTGVnbEltYWdlT0VTKW1FZ2xJbWFnZSk7CiB9CiAKIEVHTEltYWdlS0hSIEdMQ29uc3VtZXI6OkVnbEltYWdlOjpjcmVhdGVJbWFnZShFR0xEaXNwbGF5IGRweSwKICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGdyYXBoaWNCdWZmZXIsIGNvbnN0IFJlY3QmIGNyb3ApIHsKLSAgICBFR0xDbGllbnRCdWZmZXIgY2J1ZiA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFR0xDbGllbnRCdWZmZXI+KGdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpKTsKKyAgICBFR0xDbGllbnRCdWZmZXIgY2J1ZiA9IChFR0xDbGllbnRCdWZmZXIpZ3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCk7CiAgICAgRUdMaW50IGF0dHJzW10gPSB7CiAgICAgICAgIEVHTF9JTUFHRV9QUkVTRVJWRURfS0hSLCAgICAgICAgRUdMX1RSVUUsCiAgICAgICAgIEVHTF9JTUFHRV9DUk9QX0xFRlRfQU5EUk9JRCwgICAgY3JvcC5sZWZ0LApAQCAtMTE0NSwxMSArMTEzMSwxMyBAQAogICAgICAgICAvLyByZW1vdmVzIHRoaXMgcmVzdHJpY3Rpb24gaWYgdGhlcmUgaXMgaGFyZHdhcmUgdGhhdCBjYW4gc3VwcG9ydCBpdC4KICAgICAgICAgYXR0cnNbMl0gPSBFR0xfTk9ORTsKICAgICB9CisgICAgZWdsSW5pdGlhbGl6ZShkcHksIDAsIDApOwogICAgIEVHTEltYWdlS0hSIGltYWdlID0gZWdsQ3JlYXRlSW1hZ2VLSFIoZHB5LCBFR0xfTk9fQ09OVEVYVCwKICAgICAgICAgICAgIEVHTF9OQVRJVkVfQlVGRkVSX0FORFJPSUQsIGNidWYsIGF0dHJzKTsKICAgICBpZiAoaW1hZ2UgPT0gRUdMX05PX0lNQUdFX0tIUikgewogICAgICAgICBFR0xpbnQgZXJyb3IgPSBlZ2xHZXRFcnJvcigpOwogICAgICAgICBBTE9HRSgiZXJyb3IgY3JlYXRpbmcgRUdMSW1hZ2U6ICUjeCIsIGVycm9yKTsKKyAgICAgICAgZWdsVGVybWluYXRlKGRweSk7CiAgICAgfQogICAgIHJldHVybiBpbWFnZTsKIH0KZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0dyYXBoaWNCdWZmZXJBbGxvYy5jcHAgYi9saWJzL2d1aS9HcmFwaGljQnVmZmVyQWxsb2MuY3BwCmluZGV4IDk2NDM0MDIuLmIzNjBlODEgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0dyYXBoaWNCdWZmZXJBbGxvYy5jcHAKKysrIGIvbGlicy9ndWkvR3JhcGhpY0J1ZmZlckFsbG9jLmNwcApAQCAtMzEsMTAgKzMxLDkgQEAKIEdyYXBoaWNCdWZmZXJBbGxvYzo6fkdyYXBoaWNCdWZmZXJBbGxvYygpIHsKIH0KIAotc3A8R3JhcGhpY0J1ZmZlcj4gR3JhcGhpY0J1ZmZlckFsbG9jOjpjcmVhdGVHcmFwaGljQnVmZmVyKHVpbnQzMl90IHdpZHRoLAotICAgICAgICB1aW50MzJfdCBoZWlnaHQsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsIHN0YXR1c190KiBlcnJvcikgewotICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIoCi0gICAgICAgICAgICBuZXcgR3JhcGhpY0J1ZmZlcih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlKSk7CitzcDxHcmFwaGljQnVmZmVyPiBHcmFwaGljQnVmZmVyQWxsb2M6OmNyZWF0ZUdyYXBoaWNCdWZmZXIodWludDMyX3QgdywgdWludDMyX3QgaCwKKyAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwgc3RhdHVzX3QqIGVycm9yKSB7CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcihuZXcgR3JhcGhpY0J1ZmZlcih3LCBoLCBmb3JtYXQsIHVzYWdlKSk7CiAgICAgc3RhdHVzX3QgZXJyID0gZ3JhcGhpY0J1ZmZlci0+aW5pdENoZWNrKCk7CiAgICAgKmVycm9yID0gZXJyOwogICAgIGlmIChlcnIgIT0gMCB8fCBncmFwaGljQnVmZmVyLT5oYW5kbGUgPT0gMCkgewpAQCAtNDMsNyArNDIsNyBAQAogICAgICAgICB9CiAgICAgICAgIEFMT0dFKCJHcmFwaGljQnVmZmVyQWxsb2M6OmNyZWF0ZUdyYXBoaWNCdWZmZXIodz0lZCwgaD0lZCkgIgogICAgICAgICAgICAgICJmYWlsZWQgKCVzKSwgaGFuZGxlPSVwIiwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJlcnJvcigtZXJyKSwgZ3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKKyAgICAgICAgICAgICAgICB3LCBoLCBzdHJlcnJvcigtZXJyKSwgZ3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiBncmFwaGljQnVmZmVyOwpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvSUNvbnN1bWVyTGlzdGVuZXIuY3BwIGIvbGlicy9ndWkvSUNvbnN1bWVyTGlzdGVuZXIuY3BwCmluZGV4IDMyZDc5MjAuLjQwOWRmZTQgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0lDb25zdW1lckxpc3RlbmVyLmNwcAorKysgYi9saWJzL2d1aS9JQ29uc3VtZXJMaXN0ZW5lci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAKICNpbmNsdWRlIDxndWkvSUNvbnN1bWVyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM5LDExICs0MCwxMCBAQAogICAgICAgICA6IEJwSW50ZXJmYWNlPElDb25zdW1lckxpc3RlbmVyPihpbXBsKSB7CiAgICAgfQogCi0gICAgdmlydHVhbCB+QnBDb25zdW1lckxpc3RlbmVyKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpIHsKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb25zdW1lckxpc3RlbmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKGl0ZW0pOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT05fRlJBTUVfQVZBSUxBQkxFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiAKQEAgLTYwLDEwICs2MCw2IEBACiAgICAgfQogfTsKIAotLy8gT3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgZGVmaW5pdGlvbiB0byB0cmlnZ2VyIHZ0YWJsZSBlbWlzc2lvbiBpbiB0aGlzCi0vLyB0cmFuc2xhdGlvbiB1bml0IChzZWUgY2xhbmcgd2FybmluZyAtV3dlYWstdnRhYmxlcykKLUJwQ29uc3VtZXJMaXN0ZW5lcjo6fkJwQ29uc3VtZXJMaXN0ZW5lcigpIHt9Ci0KIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDb25zdW1lckxpc3RlbmVyLCAiYW5kcm9pZC5ndWkuSUNvbnN1bWVyTGlzdGVuZXIiKTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzIsMTggKzY4LDIwIEBACiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKIHsKICAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIE9OX0ZSQU1FX0FWQUlMQUJMRToKKyAgICAgICAgY2FzZSBPTl9GUkFNRV9BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29uc3VtZXJMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgb25GcmFtZUF2YWlsYWJsZSgpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICBjYXNlIE9OX0JVRkZFUl9SRUxFQVNFRDoKKyAgICAgICAgICAgIEJ1ZmZlckl0ZW0gaXRlbTsKKyAgICAgICAgICAgIGRhdGEucmVhZChpdGVtKTsKKyAgICAgICAgICAgIG9uRnJhbWVBdmFpbGFibGUoaXRlbSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7IH0KKyAgICAgICAgY2FzZSBPTl9CVUZGRVJfUkVMRUFTRUQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29uc3VtZXJMaXN0ZW5lciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgb25CdWZmZXJzUmVsZWFzZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSBPTl9TSURFQkFORF9TVFJFQU1fQ0hBTkdFRDoKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsgfQorICAgICAgICBjYXNlIE9OX1NJREVCQU5EX1NUUkVBTV9DSEFOR0VEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbnN1bWVyTGlzdGVuZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7IH0KICAgICB9CiAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmNwcCBiL2xpYnMvZ3VpL0lEaXNwbGF5RXZlbnRDb25uZWN0aW9uLmNwcAppbmRleCA5ODkwZjQ0Li44ODdkMTc2IDEwMDY0NAotLS0gYS9saWJzL2d1aS9JRGlzcGxheUV2ZW50Q29ubmVjdGlvbi5jcHAKKysrIGIvbGlicy9ndWkvSURpc3BsYXlFdmVudENvbm5lY3Rpb24uY3BwCkBAIC00NCw4ICs0NCw2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgfkJwRGlzcGxheUV2ZW50Q29ubmVjdGlvbigpOwotCiAgICAgdmlydHVhbCBzcDxCaXRUdWJlPiBnZXREYXRhQ2hhbm5lbCgpIGNvbnN0CiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC01Nyw3ICs1NSw3IEBACiAgICAgdmlydHVhbCB2b2lkIHNldFZzeW5jUmF0ZSh1aW50MzJfdCBjb3VudCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihjb3VudCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihjb3VudCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVlNZTkNfUkFURSwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKQEAgLTY4LDEwICs2Niw2IEBACiAgICAgfQogfTsKIAotLy8gT3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgZGVmaW5pdGlvbiB0byB0cmlnZ2VyIHZ0YWJsZSBlbWlzc2lvbiBpbiB0aGlzCi0vLyB0cmFuc2xhdGlvbiB1bml0IChzZWUgY2xhbmcgd2FybmluZyAtV3dlYWstdnRhYmxlcykKLUJwRGlzcGxheUV2ZW50Q29ubmVjdGlvbjo6fkJwRGlzcGxheUV2ZW50Q29ubmVjdGlvbigpIHt9Ci0KIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShEaXNwbGF5RXZlbnRDb25uZWN0aW9uLCAiYW5kcm9pZC5ndWkuRGlzcGxheUV2ZW50Q29ubmVjdGlvbiIpOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04NSwxNyArNzksMTcgQEAKICAgICAgICAgICAgIHNwPEJpdFR1YmU+IGNoYW5uZWwoZ2V0RGF0YUNoYW5uZWwoKSk7CiAgICAgICAgICAgICBjaGFubmVsLT53cml0ZVRvUGFyY2VsKHJlcGx5KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9WU1lOQ19SQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURpc3BsYXlFdmVudENvbm5lY3Rpb24sIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHNldFZzeW5jUmF0ZShkYXRhLnJlYWRVaW50MzIoKSk7CisgICAgICAgICAgICBzZXRWc3luY1JhdGUoZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBSRVFVRVNUX05FWFRfVlNZTkM6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRGlzcGxheUV2ZW50Q29ubmVjdGlvbiwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVxdWVzdE5leHRWc3luYygpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9saWJzL2d1aS9JR3JhcGhpY0J1ZmZlckFsbG9jLmNwcCBiL2xpYnMvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuY3BwCmluZGV4IDA5YjYzYTEuLjEzOWYyMTkgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuY3BwCisrKyBiL2xpYnMvZ3VpL0lHcmFwaGljQnVmZmVyQWxsb2MuY3BwCkBAIC00MiwxNyArNDIsMTQgQEAKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCB+QnBHcmFwaGljQnVmZmVyQWxsb2MoKTsKLQotICAgIHZpcnR1YWwgc3A8R3JhcGhpY0J1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwKLSAgICAgICAgICAgIHN0YXR1c190KiBlcnJvcikgeworICAgIHZpcnR1YWwgc3A8R3JhcGhpY0J1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcih1aW50MzJfdCB3LCB1aW50MzJfdCBoLAorICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwgc3RhdHVzX3QqIGVycm9yKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElHcmFwaGljQnVmZmVyQWxsb2M6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIod2lkdGgpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKGhlaWdodCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90Pihmb3JtYXQpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMih1c2FnZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih3KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGgpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVzYWdlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9HUkFQSElDX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlcjsKICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC02OCwxMCArNjUsNiBAQAogICAgIH0KIH07CiAKLS8vIE91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIGRlZmluaXRpb24gdG8gdHJpZ2dlciB2dGFibGUgZW1pc3Npb24gaW4gdGhpcwotLy8gdHJhbnNsYXRpb24gdW5pdCAoc2VlIGNsYW5nIHdhcm5pbmcgLVd3ZWFrLXZ0YWJsZXMpCi1CcEdyYXBoaWNCdWZmZXJBbGxvYzo6fkJwR3JhcGhpY0J1ZmZlckFsbG9jKCkge30KLQogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEdyYXBoaWNCdWZmZXJBbGxvYywgImFuZHJvaWQudWkuSUdyYXBoaWNCdWZmZXJBbGxvYyIpOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04MSwyNiArNzQsMjcgQEAKIHsKICAgICAvLyBjb2RlcyB0aGF0IGRvbid0IHJlcXVpcmUgcGVybWlzc2lvbiBjaGVjawogCi0gICAgLy8gQnVmZmVyUmVmZXJlbmNlIGp1c3Qga2VlcHMgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIGEgR3JhcGhpY0J1ZmZlciB1bnRpbCBpdAotICAgIC8vIGlzIGRlc3Ryb3llZCAodGhhdCBpcywgdW50aWwgbm8gbG9jYWwgb3IgcmVtb3RlIHByb2Nlc3MgaGF2ZSBhIHJlZmVyZW5jZQotICAgIC8vIHRvIGl0KS4KKyAgICAvKiBCdWZmZXJSZWZlcmVuY2UganVzdCBrZWVwcyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gYQorICAgICAqIEdyYXBoaWNCdWZmZXIgdW50aWwgaXQgaXMgZGVzdHJveWVkICh0aGF0IGlzLCB1bnRpbAorICAgICAqIG5vIGxvY2FsIG9yIHJlbW90ZSBwcm9jZXNzIGhhdmUgYSByZWZlcmVuY2UgdG8gaXQpLgorICAgICAqLwogICAgIGNsYXNzIEJ1ZmZlclJlZmVyZW5jZSA6IHB1YmxpYyBCQmluZGVyIHsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlcjsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyOwogICAgIHB1YmxpYzoKLSAgICAgICAgQnVmZmVyUmVmZXJlbmNlKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIpIDogbUJ1ZmZlcihidWZmZXIpIHt9CisgICAgICAgIEJ1ZmZlclJlZmVyZW5jZShjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgYnVmZmVyKSA6IGJ1ZmZlcihidWZmZXIpIHsgfQogICAgIH07CiAKIAotICAgIHN3aXRjaCAoY29kZSkgeworICAgIHN3aXRjaChjb2RlKSB7CiAgICAgICAgIGNhc2UgQ1JFQVRFX0dSQVBISUNfQlVGRkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJBbGxvYywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8UGl4ZWxGb3JtYXQ+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UgPSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHcgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgaCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyb3I7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICBjcmVhdGVHcmFwaGljQnVmZmVyKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZlcnJvcik7CisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUdyYXBoaWNCdWZmZXIodywgaCwgZm9ybWF0LCB1c2FnZSwgJmVycm9yKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycm9yKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgqcmVzdWx0KTsKQEAgLTExMyw3ICsxMDcsNyBAQAogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlciggbmV3IEJ1ZmZlclJlZmVyZW5jZShyZXN1bHQpICk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvSUdyYXBoaWNCdWZmZXJDb25zdW1lci5jcHAgYi9saWJzL2d1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmNwcAppbmRleCAyNjAyODg0Li5jYzU4MWEzIDEwMDY0NAotLS0gYS9saWJzL2d1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmNwcAorKysgYi9saWJzL2d1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmNwcApAQCAtMjE1LDggKzIxNSw2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgfkJwR3JhcGhpY0J1ZmZlckNvbnN1bWVyKCk7Ci0KICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVCdWZmZXIoQnVmZmVySXRlbSAqYnVmZmVyLCBuc2Vjc190IHByZXNlbnRXaGVuKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElHcmFwaGljQnVmZmVyQ29uc3VtZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yNjMsNyArMjYxLDcgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUdyYXBoaWNCdWZmZXJDb25zdW1lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1Zik7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChzdGF0aWNfY2FzdDxpbnQ2NF90PihmcmFtZU51bWJlcikpOworICAgICAgICBkYXRhLndyaXRlSW50NjQoZnJhbWVOdW1iZXIpOwogICAgICAgICBkYXRhLndyaXRlKCpyZWxlYXNlRmVuY2UpOwogICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKQEAgLTMwNSwxNSArMzAzLDE1IEBACiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KLSAgICAgICAgKnNsb3RNYXNrID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlcGx5LnJlYWRJbnQ2NCgpKTsKKyAgICAgICAgKnNsb3RNYXNrID0gcmVwbHkucmVhZEludDY0KCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJTaXplKHVpbnQzMl90IHcsIHVpbnQzMl90IGgpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUdyYXBoaWNCdWZmZXJDb25zdW1lcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMih3aWR0aCk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoaGVpZ2h0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7CiAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREVGQVVMVF9CVUZGRVJfU0laRSwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTM2MCwxMCArMzU4LDEwIEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ09OU1VNRVJfTkFNRSwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERlZmF1bHRCdWZmZXJGb3JtYXQoUGl4ZWxGb3JtYXQgZGVmYXVsdEZvcm1hdCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdCh1aW50MzJfdCBkZWZhdWx0Rm9ybWF0KSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElHcmFwaGljQnVmZmVyQ29uc3VtZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihkZWZhdWx0Rm9ybWF0KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZWZhdWx0Rm9ybWF0KTsKICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9ERUZBVUxUX0JVRkZFUl9GT1JNQVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0zNzQsNyArMzcyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbnN1bWVyVXNhZ2VCaXRzKHVpbnQzMl90IHVzYWdlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElHcmFwaGljQnVmZmVyQ29uc3VtZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIodXNhZ2UpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodXNhZ2UpOwogICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NPTlNVTUVSX1VTQUdFX0JJVFMsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0zODUsNyArMzgzLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRyYW5zZm9ybUhpbnQodWludDMyX3QgaGludCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKGhpbnQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaGludCk7CiAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfVFJBTlNGT1JNX0hJTlQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC00MTcsMTAgKzQxNSw2IEBACiAgICAgfQogfTsKIAotLy8gT3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgZGVmaW5pdGlvbiB0byB0cmlnZ2VyIHZ0YWJsZSBlbWlzc2lvbiBpbiB0aGlzCi0vLyB0cmFuc2xhdGlvbiB1bml0IChzZWUgY2xhbmcgd2FybmluZyAtV3dlYWstdnRhYmxlcykKLUJwR3JhcGhpY0J1ZmZlckNvbnN1bWVyOjp+QnBHcmFwaGljQnVmZmVyQ29uc3VtZXIoKSB7fQotCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoR3JhcGhpY0J1ZmZlckNvbnN1bWVyLCAiYW5kcm9pZC5ndWkuSUdyYXBoaWNCdWZmZXJDb25zdW1lciIpOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MzgsMTQgKzQzMiwxNCBAQAogICAgICAgICAgICAgaWYgKGVycikgcmV0dXJuIGVycjsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBERVRBQ0hfQlVGRkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJDb25zdW1lciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHNsb3QgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHJlc3VsdCA9IGRldGFjaEJ1ZmZlcihzbG90KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVFRBQ0hfQlVGRkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJDb25zdW1lciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKQEAgLTQ1NSwxMSArNDQ5LDExIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzbG90KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBSRUxFQVNFX0JVRkZFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyQ29uc3VtZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBidWYgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZGF0YS5yZWFkSW50NjQoKSk7CisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlciA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgICAgICBzcDxGZW5jZT4gcmVsZWFzZUZlbmNlID0gbmV3IEZlbmNlKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkYXRhLnJlYWQoKnJlbGVhc2VGZW5jZSk7CiAgICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gZXJyOwpAQCAtNDY3LDcgKzQ2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIHJlbGVhc2VGZW5jZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ09OU1VNRVJfQ09OTkVDVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyQ29uc3VtZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElDb25zdW1lckxpc3RlbmVyPiBjb25zdW1lciA9IElDb25zdW1lckxpc3RlbmVyOjphc0ludGVyZmFjZSggZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkgKTsKQEAgLTQ3NSw3NSArNDY5LDc1IEBACiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBjb25zdW1lckNvbm5lY3QoY29uc3VtZXIsIGNvbnRyb2xsZWRCeUFwcCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ09OU1VNRVJfRElTQ09OTkVDVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyQ29uc3VtZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGNvbnN1bWVyRGlzY29ubmVjdCgpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9SRUxFQVNFRF9CVUZGRVJTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJDb25zdW1lciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgdWludDY0X3Qgc2xvdE1hc2s7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRSZWxlYXNlZEJ1ZmZlcnMoJnNsb3RNYXNrKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KHN0YXRpY19jYXN0PGludDY0X3Q+KHNsb3RNYXNrKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChzbG90TWFzayk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0RFRkFVTFRfQlVGRkVSX1NJWkU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJR3JhcGhpY0J1ZmZlckNvbnN1bWVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBzZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHcgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgaCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBzZXREZWZhdWx0QnVmZmVyU2l6ZSh3LCBoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREVGQVVMVF9NQVhfQlVGRkVSX0NPVU5UOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJDb25zdW1lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGJ1ZmZlckNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckNvdW50ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHNldERlZmF1bHRNYXhCdWZmZXJDb3VudChidWZmZXJDb3VudCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRElTQUJMRV9BU1lOQ19CVUZGRVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJR3JhcGhpY0J1ZmZlckNvbnN1bWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBkaXNhYmxlQXN5bmNCdWZmZXIoKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfTUFYX0FDUVVJUkVEX0JVRkZFUl9DT1VOVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyQ29uc3VtZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBtYXhBY3F1aXJlZEJ1ZmZlcnMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgbWF4QWNxdWlyZWRCdWZmZXJzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobWF4QWNxdWlyZWRCdWZmZXJzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfQ09OU1VNRVJfTkFNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyQ29uc3VtZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNldENvbnN1bWVyTmFtZSggZGF0YS5yZWFkU3RyaW5nOCgpICk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfREVGQVVMVF9CVUZGRVJfRk9STUFUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJDb25zdW1lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZGVmYXVsdEZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGRlZmF1bHRGb3JtYXQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChkZWZhdWx0Rm9ybWF0KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfQ09OU1VNRVJfVVNBR0VfQklUUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyQ29uc3VtZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlID0gZGF0YS5yZWFkVWludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCB1c2FnZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBzZXRDb25zdW1lclVzYWdlQml0cyh1c2FnZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX1RSQU5TRk9STV9ISU5UOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJDb25zdW1lciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDMyX3QgaGludCA9IGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgaGludCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBzZXRUcmFuc2Zvcm1IaW50KGhpbnQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERVTVA6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJR3JhcGhpY0J1ZmZlckNvbnN1bWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBTdHJpbmc4IHJlc3VsdCA9IGRhdGEucmVhZFN0cmluZzgoKTsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwIGIvbGlicy9ndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKaW5kZXggNjNkODgxZS4uYmNkZjM2OCAxMDA2NDQKLS0tIGEvbGlicy9ndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKKysrIGIvbGlicy9ndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHAKQEAgLTU2LDggKzU2LDYgQEAKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCB+QnBHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVxdWVzdEJ1ZmZlcihpbnQgYnVmZmVySWR4LCBzcDxHcmFwaGljQnVmZmVyPiogYnVmKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC05MywxNSArOTEsMTQgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVCdWZmZXIoaW50ICpidWYsIHNwPEZlbmNlPiogZmVuY2UsIGJvb2wgYXN5bmMsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCB1c2FnZSkgeworICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXN5bmMpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMih3aWR0aCk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoaGVpZ2h0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGZvcm1hdCkpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKHVzYWdlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGFzeW5jKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodXNhZ2UpOwogICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoREVRVUVVRV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0yNTgsMTQgKzI1NSwxNCBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoYm9vbCBhc3luYywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGFzeW5jKSk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIod2lkdGgpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKGhlaWdodCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90Pih3aWR0aCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGVpZ2h0KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90Pihmb3JtYXQpKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMih1c2FnZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90Pih1c2FnZSkpOwogICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUxMT0NBVEVfQlVGRkVSUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRlQnVmZmVycyBmYWlsZWQgdG8gdHJhbnNhY3Q6ICVkIiwgcmVzdWx0KTsKQEAgLTI3MywxMCArMjcwLDYgQEAKICAgICB9CiB9OwogCi0vLyBPdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCBkZWZpbml0aW9uIHRvIHRyaWdnZXIgdnRhYmxlIGVtaXNzaW9uIGluIHRoaXMKLS8vIHRyYW5zbGF0aW9uIHVuaXQgKHNlZSBjbGFuZyB3YXJuaW5nIC1Xd2Vhay12dGFibGVzKQotQnBHcmFwaGljQnVmZmVyUHJvZHVjZXI6On5CcEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIHt9Ci0KIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShHcmFwaGljQnVmZmVyUHJvZHVjZXIsICJhbmRyb2lkLmd1aS5JR3JhcGhpY0J1ZmZlclByb2R1Y2VyIik7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI5NiwyNSArMjg5LDI0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgU0VUX0JVRkZFUl9DT1VOVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBidWZmZXJDb3VudCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc2V0QnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERFUVVFVUVfQlVGRkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYm9vbCBhc3luYyA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8UGl4ZWxGb3JtYXQ+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgdWludDMyX3QgdXNhZ2UgPSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIGJvb2wgYXN5bmMgICAgICA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCB3ICAgICAgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgaCAgICAgID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCB1c2FnZSAgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IGJ1ZjsKICAgICAgICAgICAgIHNwPEZlbmNlPiBmZW5jZTsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSBkZXF1ZXVlQnVmZmVyKCZidWYsICZmZW5jZSwgYXN5bmMsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdXNhZ2UpOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IGRlcXVldWVCdWZmZXIoJmJ1ZiwgJmZlbmNlLCBhc3luYywgdywgaCwgZm9ybWF0LCB1c2FnZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWYpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmVuY2UgIT0gTlVMTCk7CiAgICAgICAgICAgICBpZiAoZmVuY2UgIT0gTlVMTCkgewpAQCAtMzIyLDE0ICszMTQsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBERVRBQ0hfQlVGRkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHNsb3QgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHJlc3VsdCA9IGRldGFjaEJ1ZmZlcihzbG90KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBERVRBQ0hfTkVYVF9CVUZGRVI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXI7CkBAIC0zNDcsNyArMzM5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVFRBQ0hfQlVGRkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKQEAgLTM1Nyw3ICszNDksNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2xvdCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgUVVFVUVfQlVGRkVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IGJ1ZiA9IGRhdGEucmVhZEludDMyKCk7CkBAIC0zNjgsNyArMzYwLDcgQEAKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHF1ZXVlQnVmZmVyKGJ1ZiwgaW5wdXQsIG91dHB1dCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0FOQ0VMX0JVRkZFUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBidWYgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMzc2LDcgKzM2OCw3IEBACiAgICAgICAgICAgICBkYXRhLnJlYWQoKmZlbmNlLmdldCgpKTsKICAgICAgICAgICAgIGNhbmNlbEJ1ZmZlcihidWYsIGZlbmNlKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFFVRVJZOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHZhbHVlOwpAQCAtMzg1LDcgKzM3Nyw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih2YWx1ZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ09OTkVDVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElQcm9kdWNlckxpc3RlbmVyPiBsaXN0ZW5lcjsKQEAgLTQwMCwxNCArMzkyLDE0IEBACiAgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBjb25uZWN0KGxpc3RlbmVyLCBhcGksIHByb2R1Y2VyQ29udHJvbGxlZEJ5QXBwLCBvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIERJU0NPTk5FQ1Q6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJR3JhcGhpY0J1ZmZlclByb2R1Y2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgYXBpID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRpc2Nvbm5lY3QoYXBpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfU0lERUJBTkRfU1RSRUFNOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8TmF0aXZlSGFuZGxlPiBzdHJlYW07CkBAIC00MTcsMTQgKzQwOSwxNCBAQAogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2V0U2lkZWJhbmRTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBTExPQ0FURV9CVUZGRVJTOgogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElHcmFwaGljQnVmZmVyUHJvZHVjZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGJvb2wgYXN5bmMgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlID0gZGF0YS5yZWFkVWludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgYWxsb2NhdGVCdWZmZXJzKGFzeW5jLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9saWJzL2d1aS9JUHJvZHVjZXJMaXN0ZW5lci5jcHAgYi9saWJzL2d1aS9JUHJvZHVjZXJMaXN0ZW5lci5jcHAKaW5kZXggODFhZGM5NS4uZWZlNDA2OSAxMDA2NDQKLS0tIGEvbGlicy9ndWkvSVByb2R1Y2VyTGlzdGVuZXIuY3BwCisrKyBiL2xpYnMvZ3VpL0lQcm9kdWNlckxpc3RlbmVyLmNwcApAQCAtMzAsOCArMzAsNiBAQAogICAgIEJwUHJvZHVjZXJMaXN0ZW5lcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKICAgICAgICAgOiBCcEludGVyZmFjZTxJUHJvZHVjZXJMaXN0ZW5lcj4oaW1wbCkge30KIAotICAgIHZpcnR1YWwgfkJwUHJvZHVjZXJMaXN0ZW5lcigpOwotCiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElQcm9kdWNlckxpc3RlbmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMzksMTAgKzM3LDYgQEAKICAgICB9CiB9OwogCi0vLyBPdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCBkZWZpbml0aW9uIHRvIHRyaWdnZXIgdnRhYmxlIGVtaXNzaW9uIGluIHRoaXMKLS8vIHRyYW5zbGF0aW9uIHVuaXQgKHNlZSBjbGFuZyB3YXJuaW5nIC1Xd2Vhay12dGFibGVzKQotQnBQcm9kdWNlckxpc3RlbmVyOjp+QnBQcm9kdWNlckxpc3RlbmVyKCkge30KLQogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFByb2R1Y2VyTGlzdGVuZXIsICJhbmRyb2lkLmd1aS5JUHJvZHVjZXJMaXN0ZW5lciIpCiAKIHN0YXR1c190IEJuUHJvZHVjZXJMaXN0ZW5lcjo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU2Vuc29yRXZlbnRDb25uZWN0aW9uLmNwcCBiL2xpYnMvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uY3BwCmluZGV4IGRjN2EzNWMuLjI4ZmNiNTMgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uY3BwCisrKyBiL2xpYnMvZ3VpL0lTZW5zb3JFdmVudENvbm5lY3Rpb24uY3BwCkBAIC00NSw4ICs0NSw2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgfkJwU2Vuc29yRXZlbnRDb25uZWN0aW9uKCk7Ci0KICAgICB2aXJ0dWFsIHNwPEJpdFR1YmU+IGdldFNlbnNvckNoYW5uZWwoKSBjb25zdAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtODcsMTAgKzg1LDYgQEAKICAgICB9CiB9OwogCi0vLyBPdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCBkZWZpbml0aW9uIHRvIHRyaWdnZXIgdnRhYmxlIGVtaXNzaW9uIGluIHRoaXMKLS8vIHRyYW5zbGF0aW9uIHVuaXQgKHNlZSBjbGFuZyB3YXJuaW5nIC1Xd2Vhay12dGFibGVzKQotQnBTZW5zb3JFdmVudENvbm5lY3Rpb246On5CcFNlbnNvckV2ZW50Q29ubmVjdGlvbigpIHt9Ci0KIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTZW5zb3JFdmVudENvbm5lY3Rpb24sICJhbmRyb2lkLmd1aS5TZW5zb3JFdmVudENvbm5lY3Rpb24iKTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTA0LDcgKzk4LDcgQEAKICAgICAgICAgICAgIHNwPEJpdFR1YmU+IGNoYW5uZWwoZ2V0U2Vuc29yQ2hhbm5lbCgpKTsKICAgICAgICAgICAgIGNoYW5uZWwtPndyaXRlVG9QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgRU5BQkxFX0RJU0FCTEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2Vuc29yRXZlbnRDb25uZWN0aW9uLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgaGFuZGxlID0gZGF0YS5yZWFkSW50MzIoKTsKQEAgLTExNiwyMSArMTEwLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEJhdGNoUmVwb3J0TGF0ZW5jeU5zLCByZXNlcnZlZEZsYWdzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfRVZFTlRfUkFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTZW5zb3JFdmVudENvbm5lY3Rpb24sIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBoYW5kbGUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgbnNlY3NfdCBucyA9IGRhdGEucmVhZEludDY0KCk7CisgICAgICAgICAgICBpbnQgbnMgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc2V0RXZlbnRSYXRlKGhhbmRsZSwgbnMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEZMVVNIX1NFTlNPUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTZW5zb3JFdmVudENvbm5lY3Rpb24sIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGZsdXNoKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU2Vuc29yU2VydmVyLmNwcCBiL2xpYnMvZ3VpL0lTZW5zb3JTZXJ2ZXIuY3BwCmluZGV4IDhlMDllN2MuLmE4NDY0YTIgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0lTZW5zb3JTZXJ2ZXIuY3BwCisrKyBiL2xpYnMvZ3VpL0lTZW5zb3JTZXJ2ZXIuY3BwCkBAIC00NSw4ICs0NSw2IEBACiAgICAgewogICAgIH0KIAotICAgIHZpcnR1YWwgfkJwU2Vuc29yU2VydmVyKCk7Ci0KICAgICB2aXJ0dWFsIFZlY3RvcjxTZW5zb3I+IGdldFNlbnNvckxpc3QoKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNTQsNyArNTIsNyBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NFTlNPUl9MSVNULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBTZW5zb3IgczsKICAgICAgICAgVmVjdG9yPFNlbnNvcj4gdjsKLSAgICAgICAgdWludDMyX3QgbiA9IHJlcGx5LnJlYWRVaW50MzIoKTsKKyAgICAgICAgaW50MzJfdCBuID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIHYuc2V0Q2FwYWNpdHkobik7CiAgICAgICAgIHdoaWxlIChuLS0pIHsKICAgICAgICAgICAgIHJlcGx5LnJlYWQocyk7CkBAIC03MiwxMCArNzAsNiBAQAogICAgIH0KIH07CiAKLS8vIE91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIGRlZmluaXRpb24gdG8gdHJpZ2dlciB2dGFibGUgZW1pc3Npb24gaW4gdGhpcwotLy8gdHJhbnNsYXRpb24gdW5pdCAoc2VlIGNsYW5nIHdhcm5pbmcgLVd3ZWFrLXZ0YWJsZXMpCi1CcFNlbnNvclNlcnZlcjo6fkJwU2Vuc29yU2VydmVyKCkge30KLQogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNlbnNvclNlcnZlciwgImFuZHJvaWQuZ3VpLlNlbnNvclNlcnZlciIpOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04OCwxOCArODIsMTggQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2Vuc29yU2VydmVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBWZWN0b3I8U2Vuc29yPiB2KGdldFNlbnNvckxpc3QoKSk7CiAgICAgICAgICAgICBzaXplX3QgbiA9IHYuc2l6ZSgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihuKSk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobik7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPG4gOyBpKyspIHsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUodltpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDUkVBVEVfU0VOU09SX0VWRU5UX0NPTk5FQ1RJT046IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU2Vuc29yU2VydmVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJU2Vuc29yRXZlbnRDb25uZWN0aW9uPiBjb25uZWN0aW9uKGNyZWF0ZVNlbnNvckV2ZW50Q29ubmVjdGlvbigpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjb25uZWN0aW9uKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXIuY3BwIGIvbGlicy9ndWkvSVN1cmZhY2VDb21wb3Nlci5jcHAKaW5kZXggNzg4ODZkNS4uMDAxNzNjNyAxMDA2NDQKLS0tIGEvbGlicy9ndWkvSVN1cmZhY2VDb21wb3Nlci5jcHAKKysrIGIvbGlicy9ndWkvSVN1cmZhY2VDb21wb3Nlci5jcHAKQEAgLTUxLDggKzUxLDYgQEAKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCB+QnBTdXJmYWNlQ29tcG9zZXIoKTsKLQogICAgIHZpcnR1YWwgc3A8SVN1cmZhY2VDb21wb3NlckNsaWVudD4gY3JlYXRlQ29ubmVjdGlvbigpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC03NiwxOCArNzQsMjMgQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTdXJmYWNlQ29tcG9zZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0KLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RhdGUuc2l6ZSgpKSk7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgcyA6IHN0YXRlKSB7Ci0gICAgICAgICAgICBzLndyaXRlKGRhdGEpOworICAgICAgICB7CisgICAgICAgICAgICBWZWN0b3I8Q29tcG9zZXJTdGF0ZT46OmNvbnN0X2l0ZXJhdG9yIGIoc3RhdGUuYmVnaW4oKSk7CisgICAgICAgICAgICBWZWN0b3I8Q29tcG9zZXJTdGF0ZT46OmNvbnN0X2l0ZXJhdG9yIGUoc3RhdGUuZW5kKCkpOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRlLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKCA7IGIgIT0gZSA7ICsrYiApIHsKKyAgICAgICAgICAgICAgICBiLT53cml0ZShkYXRhKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRpc3BsYXlzLnNpemUoKSkpOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGQgOiBkaXNwbGF5cykgewotICAgICAgICAgICAgZC53cml0ZShkYXRhKTsKKyAgICAgICAgeworICAgICAgICAgICAgVmVjdG9yPERpc3BsYXlTdGF0ZT46OmNvbnN0X2l0ZXJhdG9yIGIoZGlzcGxheXMuYmVnaW4oKSk7CisgICAgICAgICAgICBWZWN0b3I8RGlzcGxheVN0YXRlPjo6Y29uc3RfaXRlcmF0b3IgZShkaXNwbGF5cy5lbmQoKSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlzcGxheXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoIDsgYiAhPSBlIDsgKytiICkgeworICAgICAgICAgICAgICAgIGItPndyaXRlKGRhdGEpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihmbGFncyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6U0VUX1RSQU5TQUNUSU9OX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIApAQCAtMTEwLDEwICsxMTMsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihkaXNwbGF5KTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihwcm9kdWNlcikpOwogICAgICAgICBkYXRhLndyaXRlKHNvdXJjZUNyb3ApOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKHJlcVdpZHRoKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMihyZXFIZWlnaHQpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKG1pbkxheWVyWik7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIobWF4TGF5ZXJaKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcVdpZHRoKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHJlcUhlaWdodCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihtaW5MYXllclopOworICAgICAgICBkYXRhLndyaXRlSW50MzIobWF4TGF5ZXJaKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KHVzZUlkZW50aXR5VHJhbnNmb3JtKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90Pihyb3RhdGlvbikpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQm5TdXJmYWNlQ29tcG9zZXI6OkNBUFRVUkVfU0NSRUVOLCBkYXRhLCAmcmVwbHkpOwpAQCAtMjIxLDcgKzIyNCw3IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChCblN1cmZhY2VDb21wb3Nlcjo6R0VUX0RJU1BMQVlfQ09ORklHUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHNpemVfdCBudW1Db25maWdzID0gcmVwbHkucmVhZFVpbnQzMigpOworICAgICAgICAgICAgc2l6ZV90IG51bUNvbmZpZ3MgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbmZpZ3MtPmNsZWFyKCk7CiAgICAgICAgICAgICBjb25maWdzLT5yZXNpemUobnVtQ29uZmlncyk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IG51bUNvbmZpZ3M7ICsrYykgewpAQCAtMjg0LDEwICsyODcsNiBAQAogICAgIH0KIH07CiAKLS8vIE91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIGRlZmluaXRpb24gdG8gdHJpZ2dlciB2dGFibGUgZW1pc3Npb24gaW4gdGhpcwotLy8gdHJhbnNsYXRpb24gdW5pdCAoc2VlIGNsYW5nIHdhcm5pbmcgLVd3ZWFrLXZ0YWJsZXMpCi1CcFN1cmZhY2VDb21wb3Nlcjo6fkJwU3VyZmFjZUNvbXBvc2VyKCkge30KLQogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFN1cmZhY2VDb21wb3NlciwgImFuZHJvaWQudWkuSVN1cmZhY2VDb21wb3NlciIpOwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMTAsMzcgKzMwOSwzNCBAQAogICAgICAgICB9CiAgICAgICAgIGNhc2UgU0VUX1RSQU5TQUNUSU9OX1NUQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlciwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBzaXplX3QgY291bnQgPSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAoY291bnQgPiBkYXRhLmRhdGFTaXplKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQ29tcG9zZXJTdGF0ZSBzOwogICAgICAgICAgICAgVmVjdG9yPENvbXBvc2VyU3RhdGU+IHN0YXRlOwogICAgICAgICAgICAgc3RhdGUuc2V0Q2FwYWNpdHkoY291bnQpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHMucmVhZChkYXRhKSA9PSBCQURfVkFMVUUpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RhdGUuYWRkKHMpOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb3VudCA9IGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgY291bnQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKGNvdW50ID4gZGF0YS5kYXRhU2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIERpc3BsYXlTdGF0ZSBkOwogICAgICAgICAgICAgVmVjdG9yPERpc3BsYXlTdGF0ZT4gZGlzcGxheXM7CiAgICAgICAgICAgICBkaXNwbGF5cy5zZXRDYXBhY2l0eShjb3VudCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoZC5yZWFkKGRhdGEpID09IEJBRF9WQUxVRSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkaXNwbGF5cy5hZGQoZCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHN0YXRlRmxhZ3MgPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uU3RhdGUoc3RhdGUsIGRpc3BsYXlzLCBzdGF0ZUZsYWdzKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNldFRyYW5zYWN0aW9uU3RhdGUoc3RhdGUsIGRpc3BsYXlzLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBCT09UX0ZJTklTSEVEOiB7CkBAIC0zNTUsMTIgKzM1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICBSZWN0IHNvdXJjZUNyb3A7CiAgICAgICAgICAgICBkYXRhLnJlYWQoc291cmNlQ3JvcCk7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXFXaWR0aCA9IGRhdGEucmVhZFVpbnQzMigpOwotICAgICAgICAgICAgdWludDMyX3QgcmVxSGVpZ2h0ID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBtaW5MYXllclogPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG1heExheWVyWiA9IGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgcmVxV2lkdGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgdWludDMyX3QgcmVxSGVpZ2h0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1pbkxheWVyWiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCBtYXhMYXllclogPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYm9vbCB1c2VJZGVudGl0eVRyYW5zZm9ybSA9IHN0YXRpY19jYXN0PGJvb2w+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgaW50MzJfdCByb3RhdGlvbiA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCByb3RhdGlvbiA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGNhcHR1cmVTY3JlZW4oZGlzcGxheSwgcHJvZHVjZXIsCiAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNyb3AsIHJlcVdpZHRoLCByZXFIZWlnaHQsIG1pbkxheWVyWiwgbWF4TGF5ZXJaLApAQCAtNDExLDcgKzQwNyw3IEBACiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXREaXNwbGF5Q29uZmlncyhkaXNwbGF5LCAmY29uZmlncyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlncy5zaXplKCkpKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90Pihjb25maWdzLnNpemUoKSkpOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgY29uZmlncy5zaXplKCk7ICsrYykgewogICAgICAgICAgICAgICAgICAgICBtZW1jcHkocmVwbHktPndyaXRlSW5wbGFjZShzaXplb2YoRGlzcGxheUluZm8pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnc1tjXSwgc2l6ZW9mKERpc3BsYXlJbmZvKSk7CkBAIC00NzEsNiArNDY3LDggQEAKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gc2hvdWxkIGJlIHVucmVhY2hhYmxlCisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWJzL2d1aS9JU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmNwcCBiL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwCmluZGV4IDJlY2I5MDguLmRlNGQ4YzEgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwCisrKyBiL2xpYnMvZ3VpL0lTdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwCkBAIC01MSwxOSArNTEsMTcgQEAKICAgICAgICAgOiBCcEludGVyZmFjZTxJU3VyZmFjZUNvbXBvc2VyQ2xpZW50PihpbXBsKSB7CiAgICAgfQogCi0gICAgdmlydHVhbCB+QnBTdXJmYWNlQ29tcG9zZXJDbGllbnQoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3VyZmFjZShjb25zdCBTdHJpbmc4JiBuYW1lLCB1aW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCBmbGFncywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN1cmZhY2UoY29uc3QgU3RyaW5nOCYgbmFtZSwgdWludDMyX3QgdywKKyAgICAgICAgICAgIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICBzcDxJQmluZGVyPiogaGFuZGxlLAogICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4qIGdicCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChuYW1lKTsKLSAgICAgICAgZGF0YS53cml0ZVVpbnQzMih3aWR0aCk7Ci0gICAgICAgIGRhdGEud3JpdGVVaW50MzIoaGVpZ2h0KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGZvcm1hdCkpOwotICAgICAgICBkYXRhLndyaXRlVWludDMyKGZsYWdzKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHcpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmb3JtYXQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgICpoYW5kbGUgPSByZXBseS5yZWFkU3Ryb25nQmluZGVyKCk7CiAgICAgICAgICpnYnAgPSBpbnRlcmZhY2VfY2FzdDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwpAQCAtOTYsMTAgKzk0LDYgQEAKICAgICB9CiB9OwogCi0vLyBPdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCBkZWZpbml0aW9uIHRvIHRyaWdnZXIgdnRhYmxlIGVtaXNzaW9uIGluIHRoaXMKLS8vIHRyYW5zbGF0aW9uIHVuaXQgKHNlZSBjbGFuZyB3YXJuaW5nIC1Xd2Vhay12dGFibGVzKQotQnBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6On5CcFN1cmZhY2VDb21wb3NlckNsaWVudCgpIHt9Ci0KIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShTdXJmYWNlQ29tcG9zZXJDbGllbnQsICJhbmRyb2lkLnVpLklTdXJmYWNlQ29tcG9zZXJDbGllbnQiKTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExLDMxICsxMDUsMzEgQEAKICAgICAgICAgY2FzZSBDUkVBVEVfU1VSRkFDRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTdXJmYWNlQ29tcG9zZXJDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIFN0cmluZzggbmFtZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gZGF0YS5yZWFkVWludDMyKCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBkYXRhLnJlYWRVaW50MzIoKTsKLSAgICAgICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IGNyZWF0ZUZsYWdzID0gZGF0YS5yZWFkVWludDMyKCk7CisgICAgICAgICAgICB1aW50MzJfdCB3ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGggPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHNwPElCaW5kZXI+IGhhbmRsZTsKICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicDsKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGNyZWF0ZVN1cmZhY2UobmFtZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBjcmVhdGVGbGFncywgJmhhbmRsZSwgJmdicCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVTdXJmYWNlKG5hbWUsIHcsIGgsIGZvcm1hdCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICZoYW5kbGUsICZnYnApOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKGhhbmRsZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgREVTVFJPWV9TVVJGQUNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlckNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGVzdHJveVN1cmZhY2UoIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpICkgKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQorICAgICAgICB9IGJyZWFrOwogICAgICAgIGNhc2UgQ0xFQVJfTEFZRVJfRlJBTUVfU1RBVFM6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU3VyZmFjZUNvbXBvc2VyQ2xpZW50LCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJQmluZGVyPiBoYW5kbGUgPSBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKTsKICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGNsZWFyTGF5ZXJGcmFtZVN0YXRzKGhhbmRsZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX0xBWUVSX0ZSQU1FX1NUQVRTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVN1cmZhY2VDb21wb3NlckNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUJpbmRlcj4gaGFuZGxlID0gZGF0YS5yZWFkU3Ryb25nQmluZGVyKCk7CkBAIC0xNDQsNyArMTM4LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZShzdGF0cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL0xheWVyU3RhdGUuY3BwIGIvbGlicy9ndWkvTGF5ZXJTdGF0ZS5jcHAKaW5kZXggMDAzMjNkYy4uY2NmOGI3OCAxMDA2NDQKLS0tIGEvbGlicy9ndWkvTGF5ZXJTdGF0ZS5jcHAKKysrIGIvbGlicy9ndWkvTGF5ZXJTdGF0ZS5jcHAKQEAgLTI1LDE2ICsyNSwxNiBAQAogc3RhdHVzX3QgbGF5ZXJfc3RhdGVfdDo6d3JpdGUoUGFyY2VsJiBvdXRwdXQpIGNvbnN0CiB7CiAgICAgb3V0cHV0LndyaXRlU3Ryb25nQmluZGVyKHN1cmZhY2UpOwotICAgIG91dHB1dC53cml0ZVVpbnQzMih3aGF0KTsKKyAgICBvdXRwdXQud3JpdGVJbnQzMih3aGF0KTsKICAgICBvdXRwdXQud3JpdGVGbG9hdCh4KTsKICAgICBvdXRwdXQud3JpdGVGbG9hdCh5KTsKLSAgICBvdXRwdXQud3JpdGVVaW50MzIoeik7Ci0gICAgb3V0cHV0LndyaXRlVWludDMyKHcpOwotICAgIG91dHB1dC53cml0ZVVpbnQzMihoKTsKLSAgICBvdXRwdXQud3JpdGVVaW50MzIobGF5ZXJTdGFjayk7CisgICAgb3V0cHV0LndyaXRlSW50MzIoeik7CisgICAgb3V0cHV0LndyaXRlSW50MzIodyk7CisgICAgb3V0cHV0LndyaXRlSW50MzIoaCk7CisgICAgb3V0cHV0LndyaXRlSW50MzIobGF5ZXJTdGFjayk7CiAgICAgb3V0cHV0LndyaXRlRmxvYXQoYWxwaGEpOwotICAgIG91dHB1dC53cml0ZVVpbnQzMihmbGFncyk7Ci0gICAgb3V0cHV0LndyaXRlVWludDMyKG1hc2spOworICAgIG91dHB1dC53cml0ZUludDMyKGZsYWdzKTsKKyAgICBvdXRwdXQud3JpdGVJbnQzMihtYXNrKTsKICAgICAqcmVpbnRlcnByZXRfY2FzdDxsYXllcl9zdGF0ZV90OjptYXRyaXgyMl90ICo+KAogICAgICAgICAgICAgb3V0cHV0LndyaXRlSW5wbGFjZShzaXplb2YobGF5ZXJfc3RhdGVfdDo6bWF0cml4MjJfdCkpKSA9IG1hdHJpeDsKICAgICBvdXRwdXQud3JpdGUoY3JvcCk7CkBAIC00NSwxNiArNDUsMTYgQEAKIHN0YXR1c190IGxheWVyX3N0YXRlX3Q6OnJlYWQoY29uc3QgUGFyY2VsJiBpbnB1dCkKIHsKICAgICBzdXJmYWNlID0gaW5wdXQucmVhZFN0cm9uZ0JpbmRlcigpOwotICAgIHdoYXQgPSBpbnB1dC5yZWFkVWludDMyKCk7CisgICAgd2hhdCA9IGlucHV0LnJlYWRJbnQzMigpOwogICAgIHggPSBpbnB1dC5yZWFkRmxvYXQoKTsKICAgICB5ID0gaW5wdXQucmVhZEZsb2F0KCk7Ci0gICAgeiA9IGlucHV0LnJlYWRVaW50MzIoKTsKLSAgICB3ID0gaW5wdXQucmVhZFVpbnQzMigpOwotICAgIGggPSBpbnB1dC5yZWFkVWludDMyKCk7Ci0gICAgbGF5ZXJTdGFjayA9IGlucHV0LnJlYWRVaW50MzIoKTsKKyAgICB6ID0gaW5wdXQucmVhZEludDMyKCk7CisgICAgdyA9IGlucHV0LnJlYWRJbnQzMigpOworICAgIGggPSBpbnB1dC5yZWFkSW50MzIoKTsKKyAgICBsYXllclN0YWNrID0gaW5wdXQucmVhZEludDMyKCk7CiAgICAgYWxwaGEgPSBpbnB1dC5yZWFkRmxvYXQoKTsKLSAgICBmbGFncyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlucHV0LnJlYWRVaW50MzIoKSk7Ci0gICAgbWFzayA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlucHV0LnJlYWRVaW50MzIoKSk7CisgICAgZmxhZ3MgPSBpbnB1dC5yZWFkSW50MzIoKTsKKyAgICBtYXNrID0gaW5wdXQucmVhZEludDMyKCk7CiAgICAgY29uc3Qgdm9pZCogbWF0cml4X2RhdGEgPSBpbnB1dC5yZWFkSW5wbGFjZShzaXplb2YobGF5ZXJfc3RhdGVfdDo6bWF0cml4MjJfdCkpOwogICAgIGlmIChtYXRyaXhfZGF0YSkgewogICAgICAgICBtYXRyaXggPSAqcmVpbnRlcnByZXRfY2FzdDxsYXllcl9zdGF0ZV90OjptYXRyaXgyMl90IGNvbnN0ICo+KG1hdHJpeF9kYXRhKTsKQEAgLTgwLDI2ICs4MCwyNiBAQAogc3RhdHVzX3QgRGlzcGxheVN0YXRlOjp3cml0ZShQYXJjZWwmIG91dHB1dCkgY29uc3QgewogICAgIG91dHB1dC53cml0ZVN0cm9uZ0JpbmRlcih0b2tlbik7CiAgICAgb3V0cHV0LndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHN1cmZhY2UpKTsKLSAgICBvdXRwdXQud3JpdGVVaW50MzIod2hhdCk7Ci0gICAgb3V0cHV0LndyaXRlVWludDMyKGxheWVyU3RhY2spOwotICAgIG91dHB1dC53cml0ZVVpbnQzMihvcmllbnRhdGlvbik7CisgICAgb3V0cHV0LndyaXRlSW50MzIod2hhdCk7CisgICAgb3V0cHV0LndyaXRlSW50MzIobGF5ZXJTdGFjayk7CisgICAgb3V0cHV0LndyaXRlSW50MzIob3JpZW50YXRpb24pOwogICAgIG91dHB1dC53cml0ZSh2aWV3cG9ydCk7CiAgICAgb3V0cHV0LndyaXRlKGZyYW1lKTsKLSAgICBvdXRwdXQud3JpdGVVaW50MzIod2lkdGgpOwotICAgIG91dHB1dC53cml0ZVVpbnQzMihoZWlnaHQpOworICAgIG91dHB1dC53cml0ZUludDMyKHdpZHRoKTsKKyAgICBvdXRwdXQud3JpdGVJbnQzMihoZWlnaHQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRGlzcGxheVN0YXRlOjpyZWFkKGNvbnN0IFBhcmNlbCYgaW5wdXQpIHsKICAgICB0b2tlbiA9IGlucHV0LnJlYWRTdHJvbmdCaW5kZXIoKTsKICAgICBzdXJmYWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oaW5wdXQucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICB3aGF0ID0gaW5wdXQucmVhZFVpbnQzMigpOwotICAgIGxheWVyU3RhY2sgPSBpbnB1dC5yZWFkVWludDMyKCk7Ci0gICAgb3JpZW50YXRpb24gPSBpbnB1dC5yZWFkVWludDMyKCk7CisgICAgd2hhdCA9IGlucHV0LnJlYWRJbnQzMigpOworICAgIGxheWVyU3RhY2sgPSBpbnB1dC5yZWFkSW50MzIoKTsKKyAgICBvcmllbnRhdGlvbiA9IGlucHV0LnJlYWRJbnQzMigpOwogICAgIGlucHV0LnJlYWQodmlld3BvcnQpOwogICAgIGlucHV0LnJlYWQoZnJhbWUpOwotICAgIHdpZHRoID0gaW5wdXQucmVhZFVpbnQzMigpOwotICAgIGhlaWdodCA9IGlucHV0LnJlYWRVaW50MzIoKTsKKyAgICB3aWR0aCA9IGlucHV0LnJlYWRJbnQzMigpOworICAgIGhlaWdodCA9IGlucHV0LnJlYWRJbnQzMigpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvU2Vuc29yLmNwcCBiL2xpYnMvZ3VpL1NlbnNvci5jcHAKaW5kZXggOGQzOGVlZi4uNDFhNDVmYyAxMDA2NDQKLS0tIGEvbGlicy9ndWkvU2Vuc29yLmNwcAorKysgYi9saWJzL2d1aS9TZW5zb3IuY3BwCkBAIC03Miw3ICs3Miw3IEBACiAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90Pihod1NlbnNvci0+bWF4RGVsYXkpKTsKICAgICAgICAgICAgIG1NYXhEZWxheSA9IElOVF9NQVg7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWF4RGVsYXkgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pihod1NlbnNvci0+bWF4RGVsYXkpOworICAgICAgICAgICAgbU1heERlbGF5ID0gKGludDMyX3QpIGh3U2Vuc29yLT5tYXhEZWxheTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEZvciBvbGRlciBoYWxzIHNldCBtYXhEZWxheSB0byAwLgpAQCAtMjA0LDYgKzIwNCwxMyBAQAogICAgICAgICAgICAgbUZsYWdzIHw9IFNFTlNPUl9GTEFHX1dBS0VfVVA7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRU5TT1JfVFlQRV9XUklTVF9USUxUX0dFU1RVUkU6CisgICAgICAgIG1TdHJpbmdUeXBlID0gU0VOU09SX1NUUklOR19UWVBFX1dSSVNUX1RJTFRfR0VTVFVSRTsKKyAgICAgICAgbUZsYWdzIHw9IFNFTlNPUl9GTEFHX1NQRUNJQUxfUkVQT1JUSU5HX01PREU7CisgICAgICAgIGlmIChoYWxWZXJzaW9uIDwgU0VOU09SU19ERVZJQ0VfQVBJX1ZFUlNJT05fMV8zKSB7CisgICAgICAgICAgICBtRmxhZ3MgfD0gU0VOU09SX0ZMQUdfV0FLRV9VUDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICAvLyBPbmx5IHBpcGUgdGhlIHN0cmluZ1R5cGUsIHJlcXVpcmVkUGVybWlzc2lvbiBhbmQgZmxhZ3MgZm9yIGN1c3RvbSBzZW5zb3JzLgogICAgICAgICBpZiAoaGFsVmVyc2lvbiA+IFNFTlNPUlNfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCAmJiBod1NlbnNvci0+c3RyaW5nVHlwZSkgewpAQCAtMjE0LDcgKzIyMSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaGFsVmVyc2lvbiA+PSBTRU5TT1JTX0RFVklDRV9BUElfVkVSU0lPTl8xXzMpIHsKLSAgICAgICAgICAgIG1GbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihod1NlbnNvci0+ZmxhZ3MpOworICAgICAgICAgICAgbUZsYWdzID0gKGludDMyX3QpIGh3U2Vuc29yLT5mbGFnczsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gT0VNIGRlZmluZWQgc2Vuc29yIG9uIGFuIG9sZGVyIEhBTC4gVXNlIG1pbkRlbGF5IHRvIGRldGVybWluZSB0aGUKICAgICAgICAgICAgIC8vIHJlcG9ydGluZyBtb2RlIG9mIHRoZSBzZW5zb3IuCkBAIC0yOTUsMTEgKzMwMiwxMSBAQAogICAgIHJldHVybiBtVmVyc2lvbjsKIH0KIAotdWludDMyX3QgU2Vuc29yOjpnZXRGaWZvUmVzZXJ2ZWRFdmVudENvdW50KCkgY29uc3QgeworaW50MzJfdCBTZW5zb3I6OmdldEZpZm9SZXNlcnZlZEV2ZW50Q291bnQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1GaWZvUmVzZXJ2ZWRFdmVudENvdW50OwogfQogCi11aW50MzJfdCBTZW5zb3I6OmdldEZpZm9NYXhFdmVudENvdW50KCkgY29uc3QgeworaW50MzJfdCBTZW5zb3I6OmdldEZpZm9NYXhFdmVudENvdW50KCkgY29uc3QgewogICAgIHJldHVybiBtRmlmb01heEV2ZW50Q291bnQ7CiB9CiAKQEAgLTMxNSw3ICszMjIsNyBAQAogICAgIHJldHVybiBtTWF4RGVsYXk7CiB9CiAKLXVpbnQzMl90IFNlbnNvcjo6Z2V0RmxhZ3MoKSBjb25zdCB7CitpbnQzMl90IFNlbnNvcjo6Z2V0RmxhZ3MoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1GbGFnczsKIH0KIApAQCAtNDA3LDcgKzQxNCw3IEBACiAKIHZvaWQgU2Vuc29yOjpmbGF0dGVuU3RyaW5nOCh2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHN0cmluZzgpIHsKLSAgICB1aW50MzJfdCBsZW4gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyaW5nOC5sZW5ndGgoKSk7CisgICAgdWludDMyX3QgbGVuID0gc3RyaW5nOC5sZW5ndGgoKTsKICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIGxlbik7CiAgICAgbWVtY3B5KHN0YXRpY19jYXN0PGNoYXIqPihidWZmZXIpLCBzdHJpbmc4LnN0cmluZygpLCBsZW4pOwogICAgIEZsYXR0ZW5hYmxlVXRpbHM6OmFkdmFuY2UoYnVmZmVyLCBzaXplLCBGbGF0dGVuYWJsZVV0aWxzOjphbGlnbjw0PihsZW4pKTsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1NlbnNvckV2ZW50UXVldWUuY3BwIGIvbGlicy9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5jcHAKaW5kZXggNzZhZTQ3MC4uNmY1ZjIwNCAxMDA2NDQKLS0tIGEvbGlicy9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5jcHAKKysrIGIvbGlicy9ndWkvU2Vuc29yRXZlbnRRdWV1ZS5jcHAKQEAgLTE2LDcgKzE2LDYgQEAKIAogI2RlZmluZSBMT0dfVEFHICJTZW5zb3JzIgogCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KQEAgLTMyLDggKzMxLDYgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvc2Vuc29yLmg+CiAKLXVzaW5nIHN0ZDo6bWluOwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MSwxNCArNjgsMTQgQEAKICAgICAgICAgaWYgKGVyciA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KLSAgICAgICAgbUF2YWlsYWJsZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oZXJyKTsKKyAgICAgICAgbUF2YWlsYWJsZSA9IGVycjsKICAgICAgICAgbUNvbnN1bWVkID0gMDsKICAgICB9Ci0gICAgc2l6ZV90IGNvdW50ID0gbWluKG51bUV2ZW50cywgbUF2YWlsYWJsZSk7Ci0gICAgbWVtY3B5KGV2ZW50cywgbVJlY0J1ZmZlciArIG1Db25zdW1lZCwgY291bnQgKiBzaXplb2YoQVNlbnNvckV2ZW50KSk7CisgICAgc2l6ZV90IGNvdW50ID0gbnVtRXZlbnRzIDwgbUF2YWlsYWJsZSA/IG51bUV2ZW50cyA6IG1BdmFpbGFibGU7CisgICAgbWVtY3B5KGV2ZW50cywgbVJlY0J1ZmZlciArIG1Db25zdW1lZCwgY291bnQqc2l6ZW9mKEFTZW5zb3JFdmVudCkpOwogICAgIG1BdmFpbGFibGUgLT0gY291bnQ7CiAgICAgbUNvbnN1bWVkICs9IGNvdW50OwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90Pihjb3VudCk7CisgICAgcmV0dXJuIGNvdW50OwogfQogCiBzcDxMb29wZXI+IFNlbnNvckV2ZW50UXVldWU6OmdldExvb3BlcigpIGNvbnN0CmRpZmYgLS1naXQgYS9saWJzL2d1aS9TZW5zb3JNYW5hZ2VyLmNwcCBiL2xpYnMvZ3VpL1NlbnNvck1hbmFnZXIuY3BwCmluZGV4IGQ2ZGY0MDQuLjE3OTYwZmYgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL1NlbnNvck1hbmFnZXIuY3BwCisrKyBiL2xpYnMvZ3VpL1NlbnNvck1hbmFnZXIuY3BwCkBAIC05MCw4ICs5MCw3IEBACiAKICAgICAgICAgbVNlbnNvcnMgPSBtU2Vuc29yU2VydmVyLT5nZXRTZW5zb3JMaXN0KCk7CiAgICAgICAgIHNpemVfdCBjb3VudCA9IG1TZW5zb3JzLnNpemUoKTsKLSAgICAgICAgbVNlbnNvckxpc3QgPQotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFNlbnNvciBjb25zdCoqPihtYWxsb2MoY291bnQgKiBzaXplb2YoU2Vuc29yKikpKTsKKyAgICAgICAgbVNlbnNvckxpc3QgPSAoU2Vuc29yIGNvbnN0KiopbWFsbG9jKGNvdW50ICogc2l6ZW9mKFNlbnNvciopKTsKICAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewogICAgICAgICAgICAgbVNlbnNvckxpc3RbaV0gPSBtU2Vuc29ycy5hcnJheSgpICsgaTsKICAgICAgICAgfQpAQCAtMTA3LDEwICsxMDYsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHN0YXR1c190IGVyciA9IGFzc2VydFN0YXRlTG9ja2VkKCk7CiAgICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KGVycik7CisgICAgICAgIHJldHVybiBzc2l6ZV90KGVycik7CiAgICAgfQogICAgICpsaXN0ID0gbVNlbnNvckxpc3Q7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHNzaXplX3Q+KG1TZW5zb3JzLnNpemUoKSk7CisgICAgcmV0dXJuIG1TZW5zb3JzLnNpemUoKTsKIH0KIAogU2Vuc29yIGNvbnN0KiBTZW5zb3JNYW5hZ2VyOjpnZXREZWZhdWx0U2Vuc29yKGludCB0eXBlKQpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvU3RyZWFtU3BsaXR0ZXIuY3BwIGIvbGlicy9ndWkvU3RyZWFtU3BsaXR0ZXIuY3BwCmluZGV4IDRhMWY5ZTAuLjI1ZTZjYWIgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL1N0cmVhbVNwbGl0dGVyLmNwcAorKysgYi9saWJzL2d1aS9TdHJlYW1TcGxpdHRlci5jcHAKQEAgLTk4LDcgKzk4LDcgQEAKICAgICBtSW5wdXQtPnNldENvbnN1bWVyTmFtZShuYW1lKTsKIH0KIAotdm9pZCBTdHJlYW1TcGxpdHRlcjo6b25GcmFtZUF2YWlsYWJsZSgpIHsKK3ZvaWQgU3RyZWFtU3BsaXR0ZXI6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKIApAQCAtMTQxLDcgKzE0MSw3IEBACiAKICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IHF1ZXVlSW5wdXQoCiAgICAgICAgICAgICBidWZmZXJJdGVtLm1UaW1lc3RhbXAsIGJ1ZmZlckl0ZW0ubUlzQXV0b1RpbWVzdGFtcCwKLSAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUNyb3AsIHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlckl0ZW0ubVNjYWxpbmdNb2RlKSwKKyAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUNyb3AsIGJ1ZmZlckl0ZW0ubVNjYWxpbmdNb2RlLAogICAgICAgICAgICAgYnVmZmVySXRlbS5tVHJhbnNmb3JtLCBidWZmZXJJdGVtLm1Jc0Ryb3BwYWJsZSwKICAgICAgICAgICAgIGJ1ZmZlckl0ZW0ubUZlbmNlKTsKIApkaWZmIC0tZ2l0IGEvbGlicy9ndWkvU3VyZmFjZS5jcHAgYi9saWJzL2d1aS9TdXJmYWNlLmNwcAppbmRleCBhYTRhZWU0Li5hYjk4NGRlIDEwMDY0NAotLS0gYS9saWJzL2d1aS9TdXJmYWNlLmNwcAorKysgYi9saWJzL2d1aS9TdXJmYWNlLmNwcApAQCAtMTkzLDE3ICsxOTMsMTcgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCJTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyIik7CiAKLSAgICB1aW50MzJfdCByZXFXaWR0aDsKLSAgICB1aW50MzJfdCByZXFIZWlnaHQ7CisgICAgaW50IHJlcVc7CisgICAgaW50IHJlcUg7CiAgICAgYm9vbCBzd2FwSW50ZXJ2YWxaZXJvOwotICAgIFBpeGVsRm9ybWF0IHJlcUZvcm1hdDsKKyAgICB1aW50MzJfdCByZXFGb3JtYXQ7CiAgICAgdWludDMyX3QgcmVxVXNhZ2U7CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAKLSAgICAgICAgcmVxV2lkdGggPSBtUmVxV2lkdGggPyBtUmVxV2lkdGggOiBtVXNlcldpZHRoOwotICAgICAgICByZXFIZWlnaHQgPSBtUmVxSGVpZ2h0ID8gbVJlcUhlaWdodCA6IG1Vc2VySGVpZ2h0OworICAgICAgICByZXFXID0gbVJlcVdpZHRoID8gbVJlcVdpZHRoIDogbVVzZXJXaWR0aDsKKyAgICAgICAgcmVxSCA9IG1SZXFIZWlnaHQgPyBtUmVxSGVpZ2h0IDogbVVzZXJIZWlnaHQ7CiAKICAgICAgICAgc3dhcEludGVydmFsWmVybyA9IG1Td2FwSW50ZXJ2YWxaZXJvOwogICAgICAgICByZXFGb3JtYXQgPSBtUmVxRm9ybWF0OwpAQCAtMjEzLDEyICsyMTMsMTIgQEAKICAgICBpbnQgYnVmID0gLTE7CiAgICAgc3A8RmVuY2U+IGZlbmNlOwogICAgIHN0YXR1c190IHJlc3VsdCA9IG1HcmFwaGljQnVmZmVyUHJvZHVjZXItPmRlcXVldWVCdWZmZXIoJmJ1ZiwgJmZlbmNlLCBzd2FwSW50ZXJ2YWxaZXJvLAotICAgICAgICAgICAgcmVxV2lkdGgsIHJlcUhlaWdodCwgcmVxRm9ybWF0LCByZXFVc2FnZSk7CisgICAgICAgICAgICByZXFXLCByZXFILCByZXFGb3JtYXQsIHJlcVVzYWdlKTsKIAogICAgIGlmIChyZXN1bHQgPCAwKSB7CiAgICAgICAgIEFMT0dWKCJkZXF1ZXVlQnVmZmVyOiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXF1ZXVlQnVmZmVyKCVkLCAlZCwgJWQsICVkLCAlZCkiCi0gICAgICAgICAgICAgImZhaWxlZDogJWQiLCBzd2FwSW50ZXJ2YWxaZXJvLCByZXFXaWR0aCwgcmVxSGVpZ2h0LCByZXFGb3JtYXQsCi0gICAgICAgICAgICAgcmVxVXNhZ2UsIHJlc3VsdCk7CisgICAgICAgICAgICAgImZhaWxlZDogJWQiLCBzd2FwSW50ZXJ2YWxaZXJvLCByZXFXLCByZXFILCByZXFGb3JtYXQsIHJlcVVzYWdlLAorICAgICAgICAgICAgIHJlc3VsdCk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCkBAIC0zNDYsNyArMzQ2LDcgQEAKICAgICAgICAgc3dpdGNoICh3aGF0KSB7CiAgICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfRk9STUFUOgogICAgICAgICAgICAgICAgIGlmIChtUmVxRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludD4obVJlcUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICp2YWx1ZSA9IG1SZXFGb3JtYXQ7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNjQsMTUgKzM2NCwxMyBAQAogICAgICAgICAgICAgICAgICp2YWx1ZSA9IE5BVElWRV9XSU5ET1dfU1VSRkFDRTsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfREVGQVVMVF9XSURUSDoKLSAgICAgICAgICAgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgbVVzZXJXaWR0aCA/IG1Vc2VyV2lkdGggOiBtRGVmYXVsdFdpZHRoKTsKKyAgICAgICAgICAgICAgICAqdmFsdWUgPSBtVXNlcldpZHRoID8gbVVzZXJXaWR0aCA6IG1EZWZhdWx0V2lkdGg7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0RFRkFVTFRfSEVJR0hUOgotICAgICAgICAgICAgICAgICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludD4oCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXNlckhlaWdodCA/IG1Vc2VySGVpZ2h0IDogbURlZmF1bHRIZWlnaHQpOworICAgICAgICAgICAgICAgICp2YWx1ZSA9IG1Vc2VySGVpZ2h0ID8gbVVzZXJIZWlnaHQgOiBtRGVmYXVsdEhlaWdodDsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICBjYXNlIE5BVElWRV9XSU5ET1dfVFJBTlNGT1JNX0hJTlQ6Ci0gICAgICAgICAgICAgICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50PihtVHJhbnNmb3JtSGludCk7CisgICAgICAgICAgICAgICAgKnZhbHVlID0gbVRyYW5zZm9ybUhpbnQ7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICAgICAgY2FzZSBOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1JVTk5JTkdfQkVISU5EOiB7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CkBAIC00NjgsNyArNDY2LDcgQEAKIAogaW50IFN1cmZhY2U6OmRpc3BhdGNoU2V0VXNhZ2UodmFfbGlzdCBhcmdzKSB7CiAgICAgaW50IHVzYWdlID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgcmV0dXJuIHNldFVzYWdlKHN0YXRpY19jYXN0PHVpbnQzMl90Pih1c2FnZSkpOworICAgIHJldHVybiBzZXRVc2FnZSh1c2FnZSk7CiB9CiAKIGludCBTdXJmYWNlOjpkaXNwYXRjaFNldENyb3AodmFfbGlzdCBhcmdzKSB7CkBAIC00NzgsNDkgKzQ3Niw0OSBAQAogCiBpbnQgU3VyZmFjZTo6ZGlzcGF0Y2hTZXRCdWZmZXJDb3VudCh2YV9saXN0IGFyZ3MpIHsKICAgICBzaXplX3QgYnVmZmVyQ291bnQgPSB2YV9hcmcoYXJncywgc2l6ZV90KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyQ291bnQoc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnVmZmVyQ291bnQpKTsKKyAgICByZXR1cm4gc2V0QnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOwogfQogCiBpbnQgU3VyZmFjZTo6ZGlzcGF0Y2hTZXRCdWZmZXJzR2VvbWV0cnkodmFfbGlzdCBhcmdzKSB7Ci0gICAgdWludDMyX3Qgd2lkdGggPSB2YV9hcmcoYXJncywgdWludDMyX3QpOwotICAgIHVpbnQzMl90IGhlaWdodCA9IHZhX2FyZyhhcmdzLCB1aW50MzJfdCk7Ci0gICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gdmFfYXJnKGFyZ3MsIFBpeGVsRm9ybWF0KTsKLSAgICBpbnQgZXJyID0gc2V0QnVmZmVyc0RpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CisgICAgaW50IHcgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICBpbnQgaCA9IHZhX2FyZyhhcmdzLCBpbnQpOworICAgIGludCBmID0gdmFfYXJnKGFyZ3MsIGludCk7CisgICAgaW50IGVyciA9IHNldEJ1ZmZlcnNEaW1lbnNpb25zKHcsIGgpOwogICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gc2V0QnVmZmVyc0Zvcm1hdChmb3JtYXQpOworICAgIHJldHVybiBzZXRCdWZmZXJzRm9ybWF0KGYpOwogfQogCiBpbnQgU3VyZmFjZTo6ZGlzcGF0Y2hTZXRCdWZmZXJzRGltZW5zaW9ucyh2YV9saXN0IGFyZ3MpIHsKLSAgICB1aW50MzJfdCB3aWR0aCA9IHZhX2FyZyhhcmdzLCB1aW50MzJfdCk7Ci0gICAgdWludDMyX3QgaGVpZ2h0ID0gdmFfYXJnKGFyZ3MsIHVpbnQzMl90KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyc0RpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CisgICAgaW50IHcgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICBpbnQgaCA9IHZhX2FyZyhhcmdzLCBpbnQpOworICAgIHJldHVybiBzZXRCdWZmZXJzRGltZW5zaW9ucyh3LCBoKTsKIH0KIAogaW50IFN1cmZhY2U6OmRpc3BhdGNoU2V0QnVmZmVyc1VzZXJEaW1lbnNpb25zKHZhX2xpc3QgYXJncykgewotICAgIHVpbnQzMl90IHdpZHRoID0gdmFfYXJnKGFyZ3MsIHVpbnQzMl90KTsKLSAgICB1aW50MzJfdCBoZWlnaHQgPSB2YV9hcmcoYXJncywgdWludDMyX3QpOwotICAgIHJldHVybiBzZXRCdWZmZXJzVXNlckRpbWVuc2lvbnMod2lkdGgsIGhlaWdodCk7CisgICAgaW50IHcgPSB2YV9hcmcoYXJncywgaW50KTsKKyAgICBpbnQgaCA9IHZhX2FyZyhhcmdzLCBpbnQpOworICAgIHJldHVybiBzZXRCdWZmZXJzVXNlckRpbWVuc2lvbnModywgaCk7CiB9CiAKIGludCBTdXJmYWNlOjpkaXNwYXRjaFNldEJ1ZmZlcnNGb3JtYXQodmFfbGlzdCBhcmdzKSB7Ci0gICAgUGl4ZWxGb3JtYXQgZm9ybWF0ID0gdmFfYXJnKGFyZ3MsIFBpeGVsRm9ybWF0KTsKLSAgICByZXR1cm4gc2V0QnVmZmVyc0Zvcm1hdChmb3JtYXQpOworICAgIGludCBmID0gdmFfYXJnKGFyZ3MsIGludCk7CisgICAgcmV0dXJuIHNldEJ1ZmZlcnNGb3JtYXQoZik7CiB9CiAKIGludCBTdXJmYWNlOjpkaXNwYXRjaFNldFNjYWxpbmdNb2RlKHZhX2xpc3QgYXJncykgewotICAgIGludCBtb2RlID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0gICAgcmV0dXJuIHNldFNjYWxpbmdNb2RlKG1vZGUpOworICAgIGludCBtID0gdmFfYXJnKGFyZ3MsIGludCk7CisgICAgcmV0dXJuIHNldFNjYWxpbmdNb2RlKG0pOwogfQogCiBpbnQgU3VyZmFjZTo6ZGlzcGF0Y2hTZXRCdWZmZXJzVHJhbnNmb3JtKHZhX2xpc3QgYXJncykgewotICAgIHVpbnQzMl90IHRyYW5zZm9ybSA9IHZhX2FyZyhhcmdzLCB1aW50MzJfdCk7CisgICAgaW50IHRyYW5zZm9ybSA9IHZhX2FyZyhhcmdzLCBpbnQpOwogICAgIHJldHVybiBzZXRCdWZmZXJzVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiB9CiAKIGludCBTdXJmYWNlOjpkaXNwYXRjaFNldEJ1ZmZlcnNTdGlja3lUcmFuc2Zvcm0odmFfbGlzdCBhcmdzKSB7Ci0gICAgdWludDMyX3QgdHJhbnNmb3JtID0gdmFfYXJnKGFyZ3MsIHVpbnQzMl90KTsKKyAgICBpbnQgdHJhbnNmb3JtID0gdmFfYXJnKGFyZ3MsIGludCk7CiAgICAgcmV0dXJuIHNldEJ1ZmZlcnNTdGlja3lUcmFuc2Zvcm0odHJhbnNmb3JtKTsKIH0KIApAQCAtNjQwLDM4ICs2MzgsNDcgQEAKICAgICByZXR1cm4gZXJyOwogfQogCi1pbnQgU3VyZmFjZTo6c2V0QnVmZmVyc0RpbWVuc2lvbnModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKK2ludCBTdXJmYWNlOjpzZXRCdWZmZXJzRGltZW5zaW9ucyhpbnQgdywgaW50IGgpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiU3VyZmFjZTo6c2V0QnVmZmVyc0RpbWVuc2lvbnMiKTsKIAotICAgIGlmICgod2lkdGggJiYgIWhlaWdodCkgfHwgKCF3aWR0aCAmJiBoZWlnaHQpKQorICAgIGlmICh3PDAgfHwgaDwwKQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgaWYgKCh3ICYmICFoKSB8fCAoIXcgJiYgaCkpCiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIG1SZXFXaWR0aCA9IHdpZHRoOwotICAgIG1SZXFIZWlnaHQgPSBoZWlnaHQ7CisgICAgbVJlcVdpZHRoID0gdzsKKyAgICBtUmVxSGVpZ2h0ID0gaDsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWludCBTdXJmYWNlOjpzZXRCdWZmZXJzVXNlckRpbWVuc2lvbnModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKK2ludCBTdXJmYWNlOjpzZXRCdWZmZXJzVXNlckRpbWVuc2lvbnMoaW50IHcsIGludCBoKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIlN1cmZhY2U6OnNldEJ1ZmZlcnNVc2VyRGltZW5zaW9ucyIpOwogCi0gICAgaWYgKCh3aWR0aCAmJiAhaGVpZ2h0KSB8fCAoIXdpZHRoICYmIGhlaWdodCkpCisgICAgaWYgKHc8MCB8fCBoPDApCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBpZiAoKHcgJiYgIWgpIHx8ICghdyAmJiBoKSkKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbVVzZXJXaWR0aCA9IHdpZHRoOwotICAgIG1Vc2VySGVpZ2h0ID0gaGVpZ2h0OworICAgIG1Vc2VyV2lkdGggPSB3OworICAgIG1Vc2VySGVpZ2h0ID0gaDsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWludCBTdXJmYWNlOjpzZXRCdWZmZXJzRm9ybWF0KFBpeGVsRm9ybWF0IGZvcm1hdCkKK2ludCBTdXJmYWNlOjpzZXRCdWZmZXJzRm9ybWF0KGludCBmb3JtYXQpCiB7CiAgICAgQUxPR1YoIlN1cmZhY2U6OnNldEJ1ZmZlcnNGb3JtYXQiKTsKIAorICAgIGlmIChmb3JtYXQ8MCkKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CiAgICAgbVJlcUZvcm1hdCA9IGZvcm1hdDsKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC02OTcsNyArNzA0LDcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWludCBTdXJmYWNlOjpzZXRCdWZmZXJzVHJhbnNmb3JtKHVpbnQzMl90IHRyYW5zZm9ybSkKK2ludCBTdXJmYWNlOjpzZXRCdWZmZXJzVHJhbnNmb3JtKGludCB0cmFuc2Zvcm0pCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiU3VyZmFjZTo6c2V0QnVmZmVyc1RyYW5zZm9ybSIpOwpAQCAtNzA2LDcgKzcxMyw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1pbnQgU3VyZmFjZTo6c2V0QnVmZmVyc1N0aWNreVRyYW5zZm9ybSh1aW50MzJfdCB0cmFuc2Zvcm0pCitpbnQgU3VyZmFjZTo6c2V0QnVmZmVyc1N0aWNreVRyYW5zZm9ybShpbnQgdHJhbnNmb3JtKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIlN1cmZhY2U6OnNldEJ1ZmZlcnNTdGlja3lUcmFuc2Zvcm0iKTsKQEAgLTc0MCwzNCArNzQ3LDMwIEBACiAgICAgLy8gc3JjIGFuZCBkc3Qgd2l0aCwgaGVpZ2h0IGFuZCBmb3JtYXQgbXVzdCBiZSBpZGVudGljYWwuIG5vIHZlcmlmaWNhdGlvbgogICAgIC8vIGlzIGRvbmUgaGVyZS4KICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgdWludDhfdCogc3JjX2JpdHMgPSBOVUxMOwotICAgIGVyciA9IHNyYy0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4sIHJlZy5ib3VuZHMoKSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmc3JjX2JpdHMpKTsKKyAgICB1aW50OF90IGNvbnN0ICogc3JjX2JpdHMgPSBOVUxMOworICAgIGVyciA9IHNyYy0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4sIHJlZy5ib3VuZHMoKSwgKHZvaWQqKikmc3JjX2JpdHMpOwogICAgIEFMT0dFX0lGKGVyciwgImVycm9yIGxvY2tpbmcgc3JjIGJ1ZmZlciAlcyIsIHN0cmVycm9yKC1lcnIpKTsKIAogICAgIHVpbnQ4X3QqIGRzdF9iaXRzID0gTlVMTDsKLSAgICBlcnIgPSBkc3QtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgcmVnLmJvdW5kcygpLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkc3RfYml0cykpOworICAgIGVyciA9IGRzdC0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCByZWcuYm91bmRzKCksICh2b2lkKiopJmRzdF9iaXRzKTsKICAgICBBTE9HRV9JRihlcnIsICJlcnJvciBsb2NraW5nIGRzdCBidWZmZXIgJXMiLCBzdHJlcnJvcigtZXJyKSk7CiAKICAgICBSZWdpb246OmNvbnN0X2l0ZXJhdG9yIGhlYWQocmVnLmJlZ2luKCkpOwogICAgIFJlZ2lvbjo6Y29uc3RfaXRlcmF0b3IgdGFpbChyZWcuZW5kKCkpOwogICAgIGlmIChoZWFkICE9IHRhaWwgJiYgc3JjX2JpdHMgJiYgZHN0X2JpdHMpIHsKICAgICAgICAgY29uc3Qgc2l6ZV90IGJwcCA9IGJ5dGVzUGVyUGl4ZWwoc3JjLT5mb3JtYXQpOwotICAgICAgICBjb25zdCBzaXplX3QgZGJwciA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihkc3QtPnN0cmlkZSkgKiBicHA7Ci0gICAgICAgIGNvbnN0IHNpemVfdCBzYnByID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNyYy0+c3RyaWRlKSAqIGJwcDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGRicHIgPSBkc3QtPnN0cmlkZSAqIGJwcDsKKyAgICAgICAgY29uc3Qgc2l6ZV90IHNicHIgPSBzcmMtPnN0cmlkZSAqIGJwcDsKIAogICAgICAgICB3aGlsZSAoaGVhZCAhPSB0YWlsKSB7CiAgICAgICAgICAgICBjb25zdCBSZWN0JiByKCpoZWFkKyspOwotICAgICAgICAgICAgaW50MzJfdCBoID0gci5oZWlnaHQoKTsKKyAgICAgICAgICAgIHNzaXplX3QgaCA9IHIuaGVpZ2h0KCk7CiAgICAgICAgICAgICBpZiAoaCA8PSAwKSBjb250aW51ZTsKLSAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHIud2lkdGgoKSkgKiBicHA7Ci0gICAgICAgICAgICB1aW50OF90IGNvbnN0ICogcyA9IHNyY19iaXRzICsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHIubGVmdCArIHNyYy0+c3RyaWRlICogci50b3ApICogYnBwOwotICAgICAgICAgICAgdWludDhfdCAgICAgICAqIGQgPSBkc3RfYml0cyArCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihyLmxlZnQgKyBkc3QtPnN0cmlkZSAqIHIudG9wKSAqIGJwcDsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gci53aWR0aCgpICogYnBwOworICAgICAgICAgICAgdWludDhfdCBjb25zdCAqIHMgPSBzcmNfYml0cyArIChyLmxlZnQgKyBzcmMtPnN0cmlkZSAqIHIudG9wKSAqIGJwcDsKKyAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgKiBkID0gZHN0X2JpdHMgKyAoci5sZWZ0ICsgZHN0LT5zdHJpZGUgKiByLnRvcCkgKiBicHA7CiAgICAgICAgICAgICBpZiAoZGJwcj09c2JwciAmJiBzaXplPT1zYnByKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZSAqPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGgpOworICAgICAgICAgICAgICAgIHNpemUgKj0gaDsKICAgICAgICAgICAgICAgICBoID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRvIHsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5jcHAgYi9saWJzL2d1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuY3BwCmluZGV4IDcwN2EzMjEuLjFiZTc4OTUgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL1N1cmZhY2VDb21wb3NlckNsaWVudC5jcHAKKysrIGIvbGlicy9ndWkvU3VyZmFjZUNvbXBvc2VyQ2xpZW50LmNwcApAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgc3RhdHVzX3Qgc2V0U2l6ZShjb25zdCBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+JiBjbGllbnQsIGNvbnN0IHNwPElCaW5kZXI+JiBpZCwKICAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgpOwogICAgIHN0YXR1c190IHNldExheWVyKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwgY29uc3Qgc3A8SUJpbmRlcj4mIGlkLAotICAgICAgICAgICAgdWludDMyX3Qgeik7CisgICAgICAgICAgICBpbnQzMl90IHopOwogICAgIHN0YXR1c190IHNldEZsYWdzKGNvbnN0IHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4mIGNsaWVudCwgY29uc3Qgc3A8SUJpbmRlcj4mIGlkLAogICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsIHVpbnQzMl90IG1hc2spOwogICAgIHN0YXR1c190IHNldFRyYW5zcGFyZW50UmVnaW9uSGludCgKQEAgLTI5Myw3ICsyOTMsNyBAQAogfQogCiBzdGF0dXNfdCBDb21wb3Nlcjo6c2V0TGF5ZXIoY29uc3Qgc3A8U3VyZmFjZUNvbXBvc2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgaWQsIHVpbnQzMl90IHopIHsKKyAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGlkLCBpbnQzMl90IHopIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGxheWVyX3N0YXRlX3QqIHMgPSBnZXRMYXllclN0YXRlTG9ja2VkKGNsaWVudCwgaWQpOwogICAgIGlmICghcykKQEAgLTM5NSw3ICszOTUsNyBAQAogICAgICAgICBzLndoYXQgPSAwOwogICAgICAgICBpbmRleCA9IG1EaXNwbGF5U3RhdGVzLmFkZChzKTsKICAgICB9Ci0gICAgcmV0dXJuIG1EaXNwbGF5U3RhdGVzLmVkaXRJdGVtQXQoc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleCkpOworICAgIHJldHVybiBtRGlzcGxheVN0YXRlcy5lZGl0SXRlbUF0KGluZGV4KTsKIH0KIAogdm9pZCBDb21wb3Nlcjo6c2V0RGlzcGxheVN1cmZhY2UoY29uc3Qgc3A8SUJpbmRlcj4mIHRva2VuLApAQCAtNTcxLDcgKzU3MSw3IEBACiAgICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0U2l6ZSh0aGlzLCBpZCwgdywgaCk7CiB9CiAKLXN0YXR1c190IFN1cmZhY2VDb21wb3NlckNsaWVudDo6c2V0TGF5ZXIoY29uc3Qgc3A8SUJpbmRlcj4mIGlkLCB1aW50MzJfdCB6KSB7CitzdGF0dXNfdCBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OnNldExheWVyKGNvbnN0IHNwPElCaW5kZXI+JiBpZCwgaW50MzJfdCB6KSB7CiAgICAgcmV0dXJuIGdldENvbXBvc2VyKCkuc2V0TGF5ZXIodGhpcywgaWQsIHopOwogfQogCkBAIC02NTcsNyArNjU3LDcgQEAKICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogICAgIH0KIAotICAgICppbmZvID0gY29uZmlnc1tzdGF0aWNfY2FzdDxzaXplX3Q+KGFjdGl2ZUlkKV07CisgICAgKmluZm8gPSBjb25maWdzW2FjdGl2ZUlkXTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL1N1cmZhY2VDb250cm9sLmNwcCBiL2xpYnMvZ3VpL1N1cmZhY2VDb250cm9sLmNwcAppbmRleCAxOTgzMDI3Li42MTAxMWI5IDEwMDY0NAotLS0gYS9saWJzL2d1aS9TdXJmYWNlQ29udHJvbC5jcHAKKysrIGIvbGlicy9ndWkvU3VyZmFjZUNvbnRyb2wuY3BwCkBAIC04OSwxMiArODksMTIgQEAKICAgICByZXR1cm4gbGhzLT5tSGFuZGxlID09IHJocy0+bUhhbmRsZTsKIH0KIAotc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldExheWVyU3RhY2sodWludDMyX3QgbGF5ZXJTdGFjaykgeworc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldExheWVyU3RhY2soaW50MzJfdCBsYXllclN0YWNrKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gdmFsaWRhdGUoKTsKICAgICBpZiAoZXJyIDwgMCkgcmV0dXJuIGVycjsKICAgICByZXR1cm4gbUNsaWVudC0+c2V0TGF5ZXJTdGFjayhtSGFuZGxlLCBsYXllclN0YWNrKTsKIH0KLXN0YXR1c190IFN1cmZhY2VDb250cm9sOjpzZXRMYXllcih1aW50MzJfdCBsYXllcikgeworc3RhdHVzX3QgU3VyZmFjZUNvbnRyb2w6OnNldExheWVyKGludDMyX3QgbGF5ZXIpIHsKICAgICBzdGF0dXNfdCBlcnIgPSB2YWxpZGF0ZSgpOwogICAgIGlmIChlcnIgPCAwKSByZXR1cm4gZXJyOwogICAgIHJldHVybiBtQ2xpZW50LT5zZXRMYXllcihtSGFuZGxlLCBsYXllcik7CmRpZmYgLS1naXQgYS9saWJzL2d1aS9TeW5jRmVhdHVyZXMuY3BwIGIvbGlicy9ndWkvU3luY0ZlYXR1cmVzLmNwcAppbmRleCAxODdiMjExLi5lNTgwNGE3IDEwMDY0NAotLS0gYS9saWJzL2d1aS9TeW5jRmVhdHVyZXMuY3BwCisrKyBiL2xpYnMvZ3VpL1N5bmNGZWF0dXJlcy5jcHAKQEAgLTE2LDYgKzE2LDcgQEAKIAogI2RlZmluZSBMT0dfVEFHICJHTENvbnN1bWVyIgogCisjZGVmaW5lIEdMX0dMRVhUX1BST1RPVFlQRVMKICNkZWZpbmUgRUdMX0VHTEVYVF9QUk9UT1RZUEVTCiAKICNpbmNsdWRlIDxFR0wvZWdsLmg+CkBAIC03NywxMSArNzgsMTAgQEAKICAgICAvLyBvbiBzb21lIGRldmljZXMgaXQncyBiZXR0ZXIgdG8gbm90IHVzZSBFR0xfS0hSX2ZlbmNlX3N5bmMKICAgICAvLyBldmVuIGlmIHRoZXkgaGF2ZSBpdAogICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCisjZW5kaWYKICAgICAvLyBjdXJyZW50bHkgd2Ugc2hhbGwgb25seSBhdHRlbXB0IHRvIHVzZSBFR0xfS0hSX2ZlbmNlX3N5bmMgaWYKICAgICAvLyBVU0VfRkVOQ0VfU1lOQyBpcyBzZXQgaW4gb3VyIG1ha2VmaWxlCiAgICAgcmV0dXJuICFtSGFzTmF0aXZlRmVuY2VTeW5jICYmIG1IYXNGZW5jZVN5bmM7Ci0jZW5kaWYKIH0KIGJvb2wgU3luY0ZlYXR1cmVzOjp1c2VXYWl0U3luYygpIGNvbnN0IHsKICAgICByZXR1cm4gKHVzZU5hdGl2ZUZlbmNlU3luYygpIHx8IHVzZUZlbmNlU3luYygpKSAmJiBtSGFzV2FpdFN5bmM7CmRpZmYgLS1naXQgYS9saWJzL2d1aS90ZXN0cy9CdWZmZXJRdWV1ZV90ZXN0LmNwcCBiL2xpYnMvZ3VpL3Rlc3RzL0J1ZmZlclF1ZXVlX3Rlc3QuY3BwCmluZGV4IDVjY2NjOWIuLjgzOGFkOTAgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL3Rlc3RzL0J1ZmZlclF1ZXVlX3Rlc3QuY3BwCisrKyBiL2xpYnMvZ3VpL3Rlc3RzL0J1ZmZlclF1ZXVlX3Rlc3QuY3BwCkBAIC02Nyw3ICs2Nyw3IEBACiB9OwogCiBzdHJ1Y3QgRHVtbXlDb25zdW1lciA6IHB1YmxpYyBCbkNvbnN1bWVyTGlzdGVuZXIgewotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiAvKiBpdGVtICovKSB7fQogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpIHt9CiAgICAgdmlydHVhbCB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkge30KIH07CmRpZmYgLS1naXQgYS9saWJzL2d1aS90ZXN0cy9EaXNjb25uZWN0V2FpdGVyLmggYi9saWJzL2d1aS90ZXN0cy9EaXNjb25uZWN0V2FpdGVyLmgKaW5kZXggNTZlOTZjMi4uNmU2OTE1YiAxMDA2NDQKLS0tIGEvbGlicy9ndWkvdGVzdHMvRGlzY29ubmVjdFdhaXRlci5oCisrKyBiL2xpYnMvZ3VpL3Rlc3RzL0Rpc2Nvbm5lY3RXYWl0ZXIuaApAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICBtUGVuZGluZ0ZyYW1lcy0tOwogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCkgeworICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIC8qIGl0ZW0gKi8pIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKICAgICAgICAgbVBlbmRpbmdGcmFtZXMrKzsKICAgICAgICAgbUZyYW1lQ29uZGl0aW9uLnNpZ25hbCgpOwpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvdGVzdHMvRnJhbWVXYWl0ZXIuaCBiL2xpYnMvZ3VpL3Rlc3RzL0ZyYW1lV2FpdGVyLmgKaW5kZXggYmRlZGJhNi4uZjc4ZmEwMCAxMDA2NDQKLS0tIGEvbGlicy9ndWkvdGVzdHMvRnJhbWVXYWl0ZXIuaAorKysgYi9saWJzL2d1aS90ZXN0cy9GcmFtZVdhaXRlci5oCkBAIC0zNSw3ICszNSw3IEBACiAgICAgICAgIG1QZW5kaW5nRnJhbWVzLS07CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKSB7CisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwogICAgICAgICBtUGVuZGluZ0ZyYW1lcysrOwogICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwpkaWZmIC0tZ2l0IGEvbGlicy9ndWkvdGVzdHMvSUdyYXBoaWNCdWZmZXJQcm9kdWNlcl90ZXN0LmNwcCBiL2xpYnMvZ3VpL3Rlc3RzL0lHcmFwaGljQnVmZmVyUHJvZHVjZXJfdGVzdC5jcHAKaW5kZXggYWFkZmU2MS4uOGQ1ZmQ4ZiAxMDA2NDQKLS0tIGEvbGlicy9ndWkvdGVzdHMvSUdyYXBoaWNCdWZmZXJQcm9kdWNlcl90ZXN0LmNwcAorKysgYi9saWJzL2d1aS90ZXN0cy9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyX3Rlc3QuY3BwCkBAIC02NSw3ICs2NSw3IEBACiB9OyAvLyBuYW1lc3BhY2UgYW5vbnltb3VzCiAKIHN0cnVjdCBEdW1teUNvbnN1bWVyIDogcHVibGljIEJuQ29uc3VtZXJMaXN0ZW5lciB7Ci0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIC8qIGl0ZW0gKi8pIHt9CiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkge30KICAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7fQogfTsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL3Rlc3RzL1N0cmVhbVNwbGl0dGVyX3Rlc3QuY3BwIGIvbGlicy9ndWkvdGVzdHMvU3RyZWFtU3BsaXR0ZXJfdGVzdC5jcHAKaW5kZXggMzJlYzkwZC4uNGU2M2E2ZiAxMDA2NDQKLS0tIGEvbGlicy9ndWkvdGVzdHMvU3RyZWFtU3BsaXR0ZXJfdGVzdC5jcHAKKysrIGIvbGlicy9ndWkvdGVzdHMvU3RyZWFtU3BsaXR0ZXJfdGVzdC5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAKIH07CiAKIHN0cnVjdCBEdW1teUxpc3RlbmVyIDogcHVibGljIEJuQ29uc3VtZXJMaXN0ZW5lciB7Ci0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKSB7fQorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIC8qIGl0ZW0gKi8pIHt9CiAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkge30KICAgICB2aXJ0dWFsIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSB7fQogfTsKZGlmZiAtLWdpdCBhL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlR0xUaHJlYWRUb0dMLmggYi9saWJzL2d1aS90ZXN0cy9TdXJmYWNlVGV4dHVyZUdMVGhyZWFkVG9HTC5oCmluZGV4IDY0MTA1MTYuLjE0ZTQyYWMgMTAwNjQ0Ci0tLSBhL2xpYnMvZ3VpL3Rlc3RzL1N1cmZhY2VUZXh0dXJlR0xUaHJlYWRUb0dMLmgKKysrIGIvbGlicy9ndWkvdGVzdHMvU3VyZmFjZVRleHR1cmVHTFRocmVhZFRvR0wuaApAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgR0xDb25zdW1lciBvbiB0aGUgcHJvZHVjZXIgdGhyZWFkLgotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpIHsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyogaXRlbSAqLykgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKICAgICAgICAgICAgIEFMT0dWKCIrb25GcmFtZUF2YWlsYWJsZSIpOwogICAgICAgICAgICAgbUZyYW1lQXZhaWxhYmxlID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlck1hcHBlci5jcHAgYi9saWJzL3VpL0dyYXBoaWNCdWZmZXJNYXBwZXIuY3BwCmluZGV4IDAxYWNkYzguLjMxYmZiMmQgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvR3JhcGhpY0J1ZmZlck1hcHBlci5jcHAKKysrIGIvbGlicy91aS9HcmFwaGljQnVmZmVyTWFwcGVyLmNwcApAQCAtOTcsNiArOTcsMTAgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IGVycjsKIAorICAgIGlmIChtQWxsb2NNb2QtPmxvY2tfeWNiY3IgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsgLy8gZG8gbm90IGxvZyBmYWlsdXJlCisgICAgfQorCiAgICAgZXJyID0gbUFsbG9jTW9kLT5sb2NrX3ljYmNyKG1BbGxvY01vZCwgaGFuZGxlLCBzdGF0aWNfY2FzdDxpbnQ+KHVzYWdlKSwKICAgICAgICAgICAgIGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLCBib3VuZHMud2lkdGgoKSwgYm91bmRzLmhlaWdodCgpLAogICAgICAgICAgICAgeWNiY3IpOwpAQCAtMTQ0LDE2ICsxNDgsMTkgQEAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IGVycjsKIAotICAgIGlmIChtQWxsb2NNb2QtPmNvbW1vbi5tb2R1bGVfYXBpX3ZlcnNpb24gPj0gR1JBTExPQ19NT0RVTEVfQVBJX1ZFUlNJT05fMF8zKSB7CisgICAgaWYgKG1BbGxvY01vZC0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBHUkFMTE9DX01PRFVMRV9BUElfVkVSU0lPTl8wXzMKKyAgICAgICAgICAgICYmIG1BbGxvY01vZC0+bG9ja0FzeW5jX3ljYmNyICE9IE5VTEwpIHsKICAgICAgICAgZXJyID0gbUFsbG9jTW9kLT5sb2NrQXN5bmNfeWNiY3IobUFsbG9jTW9kLCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih1c2FnZSksIGJvdW5kcy5sZWZ0LCBib3VuZHMudG9wLAogICAgICAgICAgICAgICAgIGJvdW5kcy53aWR0aCgpLCBib3VuZHMuaGVpZ2h0KCksIHljYmNyLCBmZW5jZUZkKTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAobUFsbG9jTW9kLT5sb2NrX3ljYmNyICE9IE5VTEwpIHsKICAgICAgICAgc3luY193YWl0KGZlbmNlRmQsIC0xKTsKICAgICAgICAgY2xvc2UoZmVuY2VGZCk7CiAgICAgICAgIGVyciA9IG1BbGxvY01vZC0+bG9ja195Y2JjcihtQWxsb2NNb2QsIGhhbmRsZSwgc3RhdGljX2Nhc3Q8aW50Pih1c2FnZSksCiAgICAgICAgICAgICAgICAgYm91bmRzLmxlZnQsIGJvdW5kcy50b3AsIGJvdW5kcy53aWR0aCgpLCBib3VuZHMuaGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgeWNiY3IpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOyAvLyBkbyBub3QgbG9nIGZhaWx1cmUKICAgICB9CiAKICAgICBBTE9HV19JRihlcnIsICJsb2NrKC4uLikgZmFpbGVkICVkICglcykiLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKZGlmZiAtLWdpdCBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZGlzcGxheS5jcHAgYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2Rpc3BsYXkuY3BwCmluZGV4IDc3ODRjYTYuLmVjNTkyMzUgMTAwNjQ0Ci0tLSBhL29wZW5nbC9saWJzL0VHTC9lZ2xfZGlzcGxheS5jcHAKKysrIGIvb3BlbmdsL2xpYnMvRUdML2VnbF9kaXNwbGF5LmNwcApAQCAtNTcsNyArNTcsNyBAQAogZWdsX2Rpc3BsYXlfdCBlZ2xfZGlzcGxheV90OjpzRGlzcGxheVtOVU1fRElTUExBWVNdOwogCiBlZ2xfZGlzcGxheV90OjplZ2xfZGlzcGxheV90KCkgOgotICAgIG1hZ2ljKCdfZHB5JyksIGZpbmlzaE9uU3dhcChmYWxzZSksIHRyYWNlR3B1Q29tcGxldGlvbihmYWxzZSksIHJlZnMoMCkgeworICAgIG1hZ2ljKCdfZHB5JyksIGZpbmlzaE9uU3dhcChmYWxzZSksIHRyYWNlR3B1Q29tcGxldGlvbihmYWxzZSksIHJlZnMoMCksIGVnbElzSW5pdGlhbGl6ZWQoZmFsc2UpIHsKIH0KIAogZWdsX2Rpc3BsYXlfdDo6fmVnbF9kaXNwbGF5X3QoKSB7CkBAIC0xMjAsMTYzICsxMjAsMTg4IEBACiAKIEVHTEJvb2xlYW4gZWdsX2Rpc3BsYXlfdDo6aW5pdGlhbGl6ZShFR0xpbnQgKm1ham9yLCBFR0xpbnQgKm1pbm9yKSB7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3JmKHJlZkxvY2spOwogCi0gICAgaWYgKHJlZnMgPiAwKSB7CisgICAgICAgIHJlZnMrKzsKKyAgICAgICAgaWYgKHJlZnMgPiAxKSB7CisgICAgICAgICAgICBpZiAobWFqb3IgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAqbWFqb3IgPSBWRVJTSU9OX01BSk9SOworICAgICAgICAgICAgaWYgKG1pbm9yICE9IE5VTEwpCisgICAgICAgICAgICAgICAgKm1pbm9yID0gVkVSU0lPTl9NSU5PUjsKKyAgICAgICAgICAgIHdoaWxlKCFlZ2xJc0luaXRpYWxpemVkKSByZWZDb25kLndhaXQocmVmTG9jayk7CisgICAgICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZShlZ2xJc0luaXRpYWxpemVkKSByZWZDb25kLndhaXQocmVmTG9jayk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobG9jayk7CisKKyNpZiBFR0xfVFJBQ0UKKworICAgICAgICAvLyBDYWxsZWQgYm90aCBhdCBlYXJseV9pbml0IHRpbWUgYW5kIGF0IHRoaXMgdGltZS4gKEVhcmx5X2luaXQgaXMgcHJlLXp5Z290ZSwgc28KKyAgICAgICAgLy8gdGhlIGluZm9ybWF0aW9uIGZyb20gdGhhdCBjYWxsIG1heSBiZSBzdGFsZS4pCisgICAgICAgIGluaXRFZ2xUcmFjZUxldmVsKCk7CisgICAgICAgIGluaXRFZ2xEZWJ1Z0xldmVsKCk7CisKKyNlbmRpZgorCisgICAgICAgIHNldEdMSG9va3NUaHJlYWRTcGVjaWZpYygmZ0hvb2tzTm9Db250ZXh0KTsKKworICAgICAgICAvLyBpbml0aWFsaXplIGVhY2ggRUdMIGFuZAorICAgICAgICAvLyBidWlsZCBvdXIgb3duIGV4dGVuc2lvbiBzdHJpbmcgZmlyc3QsIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gd2Uga25vdworICAgICAgICAvLyBhbmQgdGhlIGV4dGVuc2lvbiBzdXBwb3J0ZWQgYnkgb3VyIGNsaWVudCBpbXBsZW1lbnRhdGlvbgorCisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKKyAgICAgICAgY254LT5tYWpvciA9IC0xOworICAgICAgICBjbngtPm1pbm9yID0gLTE7CisgICAgICAgIGlmIChjbngtPmRzbykgeworICAgICAgICAgICAgRUdMRGlzcGxheSBpZHB5ID0gZGlzcC5kcHk7CisgICAgICAgICAgICBpZiAoY254LT5lZ2wuZWdsSW5pdGlhbGl6ZShpZHB5LCAmY254LT5tYWpvciwgJmNueC0+bWlub3IpKSB7CisgICAgICAgICAgICAgICAgLy9BTE9HRCgiaW5pdGlhbGl6ZWQgZHB5PSVwLCB2ZXI9JWQuJWQsIGNueD0lcCIsCisgICAgICAgICAgICAgICAgLy8gICAgICAgIGlkcHksIGNueC0+bWFqb3IsIGNueC0+bWlub3IsIGNueCk7CisKKyAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IGlzIG5vdyBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgIGRpc3Auc3RhdGUgPSBlZ2xfZGlzcGxheV90OjpJTklUSUFMSVpFRDsKKworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgcXVlcnktc3RyaW5ncyBmb3IgdGhpcyBkaXNwbGF5IGZvciBlYWNoIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy52ZW5kb3IgPSBjbngtPmVnbC5lZ2xRdWVyeVN0cmluZyhpZHB5LAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1ZFTkRPUik7CisgICAgICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy52ZXJzaW9uID0gY254LT5lZ2wuZWdsUXVlcnlTdHJpbmcoaWRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICBkaXNwLnF1ZXJ5U3RyaW5nLmV4dGVuc2lvbnMgPSBjbngtPmVnbC5lZ2xRdWVyeVN0cmluZyhpZHB5LAorICAgICAgICAgICAgICAgICAgICAgICAgRUdMX0VYVEVOU0lPTlMpOworICAgICAgICAgICAgICAgIGRpc3AucXVlcnlTdHJpbmcuY2xpZW50QXBpID0gY254LT5lZ2wuZWdsUXVlcnlTdHJpbmcoaWRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVHTF9DTElFTlRfQVBJUyk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImVnbEluaXRpYWxpemUoJXApIGZhaWxlZCAoJXMpIiwgaWRweSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVnbF90bHNfdDo6ZWdsX3N0cmVycm9yKGNueC0+ZWdsLmVnbEdldEVycm9yKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoZSBxdWVyeSBzdHJpbmdzIGFyZSBwZXItZGlzcGxheQorICAgICAgICBtVmVuZG9yU3RyaW5nLnNldFRvKHNWZW5kb3JTdHJpbmcpOworICAgICAgICBtVmVyc2lvblN0cmluZy5zZXRUbyhzVmVyc2lvblN0cmluZyk7CisgICAgICAgIG1DbGllbnRBcGlTdHJpbmcuc2V0VG8oc0NsaWVudEFwaVN0cmluZyk7CisKKyAgICAgICAgbUV4dGVuc2lvblN0cmluZy5zZXRUbyhnQnVpbHRpbkV4dGVuc2lvblN0cmluZyk7CisgICAgICAgIGNoYXIgY29uc3QqIHN0YXJ0ID0gZ0V4dGVuc2lvblN0cmluZzsKKyAgICAgICAgY2hhciBjb25zdCogZW5kOworICAgICAgICBkbyB7CisgICAgICAgICAgICAvLyBmaW5kIHRoZSBzcGFjZSBzZXBhcmF0aW5nIHRoaXMgZXh0ZW5zaW9uIGZvciB0aGUgbmV4dCBvbmUKKyAgICAgICAgICAgIGVuZCA9IHN0cmNocihzdGFydCwgJyAnKTsKKyAgICAgICAgICAgIGlmIChlbmQpIHsKKyAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgdGhlIGV4dGVuc2lvbiBzdHJpbmcKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgbGVuID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICAgICAgaWYgKGxlbikgeworICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBjb3VsZCBhdm9pZCB0aGUgY29weSBpZiB3ZSBoYWQgc3RybnN0ci4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBleHQoc3RhcnQsIGxlbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kRXh0ZW5zaW9uKGRpc3AucXVlcnlTdHJpbmcuZXh0ZW5zaW9ucywgZXh0LnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FeHRlbnNpb25TdHJpbmcuYXBwZW5kKHN0YXJ0LCBsZW4rMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbmV4dCBleHRlbnNpb24gc3RyaW5nLCBhbmQgc2tpcCB0aGUgc3BhY2UuCisgICAgICAgICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChlbmQpOworCisgICAgICAgIGVnbF9jYWNoZV90OjpnZXQoKS0+aW5pdGlhbGl6ZSh0aGlzKTsKKworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLmZpbmlzaCIsIHZhbHVlLCAiMCIpOworICAgICAgICBpZiAoYXRvaSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZpbmlzaE9uU3dhcCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcm9wZXJ0eV9nZXQoImRlYnVnLmVnbC50cmFjZUdwdUNvbXBsZXRpb24iLCB2YWx1ZSwgIjAiKTsKKyAgICAgICAgaWYgKGF0b2kodmFsdWUpKSB7CisgICAgICAgICAgICB0cmFjZUdwdUNvbXBsZXRpb24gPSB0cnVlOworICAgICAgICB9CisKICAgICAgICAgaWYgKG1ham9yICE9IE5VTEwpCiAgICAgICAgICAgICAqbWFqb3IgPSBWRVJTSU9OX01BSk9SOwogICAgICAgICBpZiAobWlub3IgIT0gTlVMTCkKICAgICAgICAgICAgICptaW5vciA9IFZFUlNJT05fTUlOT1I7Ci0gICAgICAgIHJlZnMrKzsKLSAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworCisgICAgICAgIG1IaWJlcm5hdGlvbi5zZXREaXNwbGF5VmFsaWQodHJ1ZSk7CiAgICAgfQogCi0jaWYgRUdMX1RSQUNFCi0KLSAgICAvLyBDYWxsZWQgYm90aCBhdCBlYXJseV9pbml0IHRpbWUgYW5kIGF0IHRoaXMgdGltZS4gKEVhcmx5X2luaXQgaXMgcHJlLXp5Z290ZSwgc28KLSAgICAvLyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGF0IGNhbGwgbWF5IGJlIHN0YWxlLikKLSAgICBpbml0RWdsVHJhY2VMZXZlbCgpOwotICAgIGluaXRFZ2xEZWJ1Z0xldmVsKCk7Ci0KLSNlbmRpZgotCi0gICAgc2V0R0xIb29rc1RocmVhZFNwZWNpZmljKCZnSG9va3NOb0NvbnRleHQpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBlYWNoIEVHTCBhbmQKLSAgICAvLyBidWlsZCBvdXIgb3duIGV4dGVuc2lvbiBzdHJpbmcgZmlyc3QsIGJhc2VkIG9uIHRoZSBleHRlbnNpb24gd2Uga25vdwotICAgIC8vIGFuZCB0aGUgZXh0ZW5zaW9uIHN1cHBvcnRlZCBieSBvdXIgY2xpZW50IGltcGxlbWVudGF0aW9uCi0KLSAgICBlZ2xfY29ubmVjdGlvbl90KiBjb25zdCBjbnggPSAmZ0VHTEltcGw7Ci0gICAgY254LT5tYWpvciA9IC0xOwotICAgIGNueC0+bWlub3IgPSAtMTsKLSAgICBpZiAoY254LT5kc28pIHsKLSAgICAgICAgRUdMRGlzcGxheSBpZHB5ID0gZGlzcC5kcHk7Ci0gICAgICAgIGlmIChjbngtPmVnbC5lZ2xJbml0aWFsaXplKGlkcHksICZjbngtPm1ham9yLCAmY254LT5taW5vcikpIHsKLSAgICAgICAgICAgIC8vQUxPR0QoImluaXRpYWxpemVkIGRweT0lcCwgdmVyPSVkLiVkLCBjbng9JXAiLAotICAgICAgICAgICAgLy8gICAgICAgIGlkcHksIGNueC0+bWFqb3IsIGNueC0+bWlub3IsIGNueCk7Ci0KLSAgICAgICAgICAgIC8vIGRpc3BsYXkgaXMgbm93IGluaXRpYWxpemVkCi0gICAgICAgICAgICBkaXNwLnN0YXRlID0gZWdsX2Rpc3BsYXlfdDo6SU5JVElBTElaRUQ7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgcXVlcnktc3RyaW5ncyBmb3IgdGhpcyBkaXNwbGF5IGZvciBlYWNoIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICBkaXNwLnF1ZXJ5U3RyaW5nLnZlbmRvciA9IGNueC0+ZWdsLmVnbFF1ZXJ5U3RyaW5nKGlkcHksCi0gICAgICAgICAgICAgICAgICAgIEVHTF9WRU5ET1IpOwotICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy52ZXJzaW9uID0gY254LT5lZ2wuZWdsUXVlcnlTdHJpbmcoaWRweSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX1ZFUlNJT04pOwotICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy5leHRlbnNpb25zID0gY254LT5lZ2wuZWdsUXVlcnlTdHJpbmcoaWRweSwKLSAgICAgICAgICAgICAgICAgICAgRUdMX0VYVEVOU0lPTlMpOwotICAgICAgICAgICAgZGlzcC5xdWVyeVN0cmluZy5jbGllbnRBcGkgPSBjbngtPmVnbC5lZ2xRdWVyeVN0cmluZyhpZHB5LAotICAgICAgICAgICAgICAgICAgICBFR0xfQ0xJRU5UX0FQSVMpOwotCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiZWdsSW5pdGlhbGl6ZSglcCkgZmFpbGVkICglcykiLCBpZHB5LAotICAgICAgICAgICAgICAgICAgICBlZ2xfdGxzX3Q6OmVnbF9zdHJlcnJvcihjbngtPmVnbC5lZ2xHZXRFcnJvcigpKSk7Ci0gICAgICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfcmYocmVmTG9jayk7CisgICAgICAgIGVnbElzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICByZWZDb25kLmJyb2FkY2FzdCgpOwogICAgIH0KIAotICAgIC8vIHRoZSBxdWVyeSBzdHJpbmdzIGFyZSBwZXItZGlzcGxheQotICAgIG1WZW5kb3JTdHJpbmcuc2V0VG8oc1ZlbmRvclN0cmluZyk7Ci0gICAgbVZlcnNpb25TdHJpbmcuc2V0VG8oc1ZlcnNpb25TdHJpbmcpOwotICAgIG1DbGllbnRBcGlTdHJpbmcuc2V0VG8oc0NsaWVudEFwaVN0cmluZyk7Ci0KLSAgICBtRXh0ZW5zaW9uU3RyaW5nLnNldFRvKGdCdWlsdGluRXh0ZW5zaW9uU3RyaW5nKTsKLSAgICBjaGFyIGNvbnN0KiBzdGFydCA9IGdFeHRlbnNpb25TdHJpbmc7Ci0gICAgY2hhciBjb25zdCogZW5kOwotICAgIGRvIHsKLSAgICAgICAgLy8gZmluZCB0aGUgc3BhY2Ugc2VwYXJhdGluZyB0aGlzIGV4dGVuc2lvbiBmb3IgdGhlIG5leHQgb25lCi0gICAgICAgIGVuZCA9IHN0cmNocihzdGFydCwgJyAnKTsKLSAgICAgICAgaWYgKGVuZCkgewotICAgICAgICAgICAgLy8gbGVuZ3RoIG9mIHRoZSBleHRlbnNpb24gc3RyaW5nCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgbGVuID0gZW5kIC0gc3RhcnQ7Ci0gICAgICAgICAgICBpZiAobGVuKSB7Ci0gICAgICAgICAgICAgICAgLy8gTk9URTogd2UgY291bGQgYXZvaWQgdGhlIGNvcHkgaWYgd2UgaGFkIHN0cm5zdHIuCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBleHQoc3RhcnQsIGxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRFeHRlbnNpb24oZGlzcC5xdWVyeVN0cmluZy5leHRlbnNpb25zLCBleHQuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRlbnNpb25TdHJpbmcuYXBwZW5kKHN0YXJ0LCBsZW4rMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgbmV4dCBleHRlbnNpb24gc3RyaW5nLCBhbmQgc2tpcCB0aGUgc3BhY2UuCi0gICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChlbmQpOwotCi0gICAgZWdsX2NhY2hlX3Q6OmdldCgpLT5pbml0aWFsaXplKHRoaXMpOwotCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLmZpbmlzaCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChhdG9pKHZhbHVlKSkgewotICAgICAgICBmaW5pc2hPblN3YXAgPSB0cnVlOwotICAgIH0KLQotICAgIHByb3BlcnR5X2dldCgiZGVidWcuZWdsLnRyYWNlR3B1Q29tcGxldGlvbiIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChhdG9pKHZhbHVlKSkgewotICAgICAgICB0cmFjZUdwdUNvbXBsZXRpb24gPSB0cnVlOwotICAgIH0KLQotICAgIHJlZnMrKzsKLSAgICBpZiAobWFqb3IgIT0gTlVMTCkKLSAgICAgICAgKm1ham9yID0gVkVSU0lPTl9NQUpPUjsKLSAgICBpZiAobWlub3IgIT0gTlVMTCkKLSAgICAgICAgKm1pbm9yID0gVkVSU0lPTl9NSU5PUjsKLQotICAgIG1IaWJlcm5hdGlvbi5zZXREaXNwbGF5VmFsaWQodHJ1ZSk7Ci0KICAgICByZXR1cm4gRUdMX1RSVUU7CiB9CiAKIEVHTEJvb2xlYW4gZWdsX2Rpc3BsYXlfdDo6dGVybWluYXRlKCkgewogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGxvY2spOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9ybChyZWZMb2NrKTsKKyAgICAgICAgaWYgKHJlZnMgPT0gMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEZyb20gdGhlIEVHTCBzcGVjICgzLjIpOgorICAgICAgICAgICAgICogIlRlcm1pbmF0aW9uIG9mIGEgZGlzcGxheSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gdGVybWluYXRlZCwKKyAgICAgICAgICAgICAqICAoLi4uKSwgaXMgYWxsb3dlZCwgYnV0IHRoZSBvbmx5IGVmZmVjdCBvZiBzdWNoIGEgY2FsbCBpcworICAgICAgICAgICAgICogIHRvIHJldHVybiBFR0xfVFJVRSAoLi4uKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gRUdMX1RSVUU7CisgICAgICAgIH0KIAotICAgIGlmIChyZWZzID09IDApIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogRnJvbSB0aGUgRUdMIHNwZWMgKDMuMik6Ci0gICAgICAgICAqICJUZXJtaW5hdGlvbiBvZiBhIGRpc3BsYXkgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHRlcm1pbmF0ZWQsCi0gICAgICAgICAqICAoLi4uKSwgaXMgYWxsb3dlZCwgYnV0IHRoZSBvbmx5IGVmZmVjdCBvZiBzdWNoIGEgY2FsbCBpcwotICAgICAgICAgKiAgdG8gcmV0dXJuIEVHTF9UUlVFICguLi4pCi0gICAgICAgICAqLwotICAgICAgICByZXR1cm4gRUdMX1RSVUU7Ci0gICAgfQotCi0gICAgLy8gdGhpcyBpcyBzcGVjaWZpYyB0byBBbmRyb2lkLCBkaXNwbGF5IHRlcm1pbmF0aW9uIGlzIHJlZi1jb3VudGVkLgotICAgIGlmIChyZWZzID4gMSkgeworICAgICAgICAvLyB0aGlzIGlzIHNwZWNpZmljIHRvIEFuZHJvaWQsIGRpc3BsYXkgdGVybWluYXRpb24gaXMgcmVmLWNvdW50ZWQuCiAgICAgICAgIHJlZnMtLTsKLSAgICAgICAgcmV0dXJuIEVHTF9UUlVFOworICAgICAgICBpZiAocmVmcyA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFR0xfVFJVRTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEVHTEJvb2xlYW4gcmVzID0gRUdMX0ZBTFNFOwotICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKLSAgICBpZiAoY254LT5kc28gJiYgZGlzcC5zdGF0ZSA9PSBlZ2xfZGlzcGxheV90OjpJTklUSUFMSVpFRCkgewotICAgICAgICBpZiAoY254LT5lZ2wuZWdsVGVybWluYXRlKGRpc3AuZHB5KSA9PSBFR0xfRkFMU0UpIHsKLSAgICAgICAgICAgIEFMT0dXKCJlZ2xUZXJtaW5hdGUoJXApIGZhaWxlZCAoJXMpIiwgZGlzcC5kcHksCi0gICAgICAgICAgICAgICAgICAgIGVnbF90bHNfdDo6ZWdsX3N0cmVycm9yKGNueC0+ZWdsLmVnbEdldEVycm9yKCkpKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGxvY2spOworCisgICAgICAgIGVnbF9jb25uZWN0aW9uX3QqIGNvbnN0IGNueCA9ICZnRUdMSW1wbDsKKyAgICAgICAgaWYgKGNueC0+ZHNvICYmIGRpc3Auc3RhdGUgPT0gZWdsX2Rpc3BsYXlfdDo6SU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIGlmIChjbngtPmVnbC5lZ2xUZXJtaW5hdGUoZGlzcC5kcHkpID09IEVHTF9GQUxTRSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJlZ2xUZXJtaW5hdGUoJXApIGZhaWxlZCAoJXMpIiwgZGlzcC5kcHksCisgICAgICAgICAgICAgICAgICAgICAgICBlZ2xfdGxzX3Q6OmVnbF9zdHJlcnJvcihjbngtPmVnbC5lZ2xHZXRFcnJvcigpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSRVZJU0lUOiBpdCdzIHVuY2xlYXIgd2hhdCB0byBkbyBpZiBlZ2xUZXJtaW5hdGUoKSBmYWlscworICAgICAgICAgICAgZGlzcC5zdGF0ZSA9IGVnbF9kaXNwbGF5X3Q6OlRFUk1JTkFURUQ7CisgICAgICAgICAgICByZXMgPSBFR0xfVFJVRTsKICAgICAgICAgfQotICAgICAgICAvLyBSRVZJU0lUOiBpdCdzIHVuY2xlYXIgd2hhdCB0byBkbyBpZiBlZ2xUZXJtaW5hdGUoKSBmYWlscwotICAgICAgICBkaXNwLnN0YXRlID0gZWdsX2Rpc3BsYXlfdDo6VEVSTUlOQVRFRDsKLSAgICAgICAgcmVzID0gRUdMX1RSVUU7CisKKyAgICAgICAgbUhpYmVybmF0aW9uLnNldERpc3BsYXlWYWxpZChmYWxzZSk7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIGV4dGVuc2lvbiBzdHJpbmcgc2luY2UgaXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB3ZSBnZXQKKyAgICAgICAgLy8gcmVpbml0aWFsaXplZC4KKyAgICAgICAgbUV4dGVuc2lvblN0cmluZy5zZXRUbygiIik7CisKKyAgICAgICAgLy8gTWFyayBhbGwgb2JqZWN0cyByZW1haW5pbmcgaW4gdGhlIGxpc3QgYXMgdGVybWluYXRlZCwgdW5sZXNzCisgICAgICAgIC8vIHRoZXJlIGFyZSBubyByZWZlcmVuY2UgdG8gdGhlbSwgaXQgd2hpY2ggY2FzZSwgd2UncmUgZnJlZSB0bworICAgICAgICAvLyBkZWxldGUgdGhlbS4KKyAgICAgICAgc2l6ZV90IGNvdW50ID0gb2JqZWN0cy5zaXplKCk7CisgICAgICAgIEFMT0dXX0lGKGNvdW50LCAiZWdsVGVybWluYXRlKCkgY2FsbGVkIHcvICVkIG9iamVjdHMgcmVtYWluaW5nIiwgY291bnQpOworICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICBlZ2xfb2JqZWN0X3QqIG8gPSBvYmplY3RzLml0ZW1BdChpKTsKKyAgICAgICAgICAgIG8tPmRlc3Ryb3koKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHRoaXMgbWFya3MgYWxsIG9iamVjdCBoYW5kbGVzIGFyZSAidGVybWluYXRlZCIKKyAgICAgICAgb2JqZWN0cy5jbGVhcigpOwogICAgIH0KIAotICAgIG1IaWJlcm5hdGlvbi5zZXREaXNwbGF5VmFsaWQoZmFsc2UpOwotCi0gICAgLy8gUmVzZXQgdGhlIGV4dGVuc2lvbiBzdHJpbmcgc2luY2UgaXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB3ZSBnZXQKLSAgICAvLyByZWluaXRpYWxpemVkLgotICAgIG1FeHRlbnNpb25TdHJpbmcuc2V0VG8oIiIpOwotCi0gICAgLy8gTWFyayBhbGwgb2JqZWN0cyByZW1haW5pbmcgaW4gdGhlIGxpc3QgYXMgdGVybWluYXRlZCwgdW5sZXNzCi0gICAgLy8gdGhlcmUgYXJlIG5vIHJlZmVyZW5jZSB0byB0aGVtLCBpdCB3aGljaCBjYXNlLCB3ZSdyZSBmcmVlIHRvCi0gICAgLy8gZGVsZXRlIHRoZW0uCi0gICAgc2l6ZV90IGNvdW50ID0gb2JqZWN0cy5zaXplKCk7Ci0gICAgQUxPR1dfSUYoY291bnQsICJlZ2xUZXJtaW5hdGUoKSBjYWxsZWQgdy8gJWQgb2JqZWN0cyByZW1haW5pbmciLCBjb3VudCk7Ci0gICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICBlZ2xfb2JqZWN0X3QqIG8gPSBvYmplY3RzLml0ZW1BdChpKTsKLSAgICAgICAgby0+ZGVzdHJveSgpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9ybChyZWZMb2NrKTsKKyAgICAgICAgZWdsSXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICByZWZDb25kLmJyb2FkY2FzdCgpOwogICAgIH0KIAotICAgIC8vIHRoaXMgbWFya3MgYWxsIG9iamVjdCBoYW5kbGVzIGFyZSAidGVybWluYXRlZCIKLSAgICBvYmplY3RzLmNsZWFyKCk7Ci0KLSAgICByZWZzLS07CiAgICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvb3BlbmdsL2xpYnMvRUdML2VnbF9kaXNwbGF5LmggYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2Rpc3BsYXkuaAppbmRleCAwYTZlNDI1Li4yZDg2Mjk1IDEwMDY0NAotLS0gYS9vcGVuZ2wvbGlicy9FR0wvZWdsX2Rpc3BsYXkuaAorKysgYi9vcGVuZ2wvbGlicy9FR0wvZWdsX2Rpc3BsYXkuaApAQCAtMTMxLDcgKzEzMSw5IEBACiAgICAgdm9pZCBsZWF2ZSgpIHsgcmV0dXJuIG1IaWJlcm5hdGlvbi5kZWNXYWtlQ291bnQoSGliZXJuYXRpb25NYWNoaW5lOjpXRUFLKTsgfQogCiAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgcmVmczsKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBsb2NrOworICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIGVnbElzSW5pdGlhbGl6ZWQ7CisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbG9jaywgcmVmTG9jazsKKyAgICBtdXRhYmxlIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICByZWZDb25kOwogICAgICAgICAgICAgU29ydGVkVmVjdG9yPGVnbF9vYmplY3RfdCo+IG9iamVjdHM7CiAgICAgICAgICAgICBTdHJpbmc4IG1WZW5kb3JTdHJpbmc7CiAgICAgICAgICAgICBTdHJpbmc4IG1WZXJzaW9uU3RyaW5nOwpkaWZmIC0tZ2l0IGEvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvRUdMX3Rlc3QuY3BwIGIvb3BlbmdsL3Rlc3RzL0VHTFRlc3QvRUdMX3Rlc3QuY3BwCmluZGV4IGE0MzY0YzYuLmQ2OWEyNzUgMTAwNjQ0Ci0tLSBhL29wZW5nbC90ZXN0cy9FR0xUZXN0L0VHTF90ZXN0LmNwcAorKysgYi9vcGVuZ2wvdGVzdHMvRUdMVGVzdC9FR0xfdGVzdC5jcHAKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgIEVYUEVDVF9UUlVFKGVnbENob29zZUNvbmZpZyhtRWdsRGlzcGxheSwgYXR0cnMsICZjb25maWcsIDEsICZudW1Db25maWdzKSk7CiAKICAgICBzdHJ1Y3QgRHVtbXlDb25zdW1lciA6IHB1YmxpYyBCbkNvbnN1bWVyTGlzdGVuZXIgewotICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZSgpIHt9CisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIC8qIGl0ZW0gKi8pIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpIHt9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHt9CiAgICAgfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2lucHV0Zmxpbmdlci9JbnB1dERpc3BhdGNoZXIuY3BwIGIvc2VydmljZXMvaW5wdXRmbGluZ2VyL0lucHV0RGlzcGF0Y2hlci5jcHAKaW5kZXggMWE2ZmYzMy4uOTE1N2JjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvaW5wdXRmbGluZ2VyL0lucHV0RGlzcGF0Y2hlci5jcHAKKysrIGIvc2VydmljZXMvaW5wdXRmbGluZ2VyL0lucHV0RGlzcGF0Y2hlci5jcHAKQEAgLTQ3Nyw3ICs0NzcsNiBAQAogICAgICAgICBjb25zdCBJbnB1dFdpbmRvd0luZm8qIHdpbmRvd0luZm8gPSB3aW5kb3dIYW5kbGUtPmdldEluZm8oKTsKICAgICAgICAgaWYgKHdpbmRvd0luZm8tPmRpc3BsYXlJZCA9PSBkaXNwbGF5SWQpIHsKICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MgPSB3aW5kb3dJbmZvLT5sYXlvdXRQYXJhbXNGbGFnczsKLSAgICAgICAgICAgIGludDMyX3QgcHJpdmF0ZUZsYWdzID0gd2luZG93SW5mby0+bGF5b3V0UGFyYW1zUHJpdmF0ZUZsYWdzOwogCiAgICAgICAgICAgICBpZiAod2luZG93SW5mby0+dmlzaWJsZSkgewogICAgICAgICAgICAgICAgIGlmICghKGZsYWdzICYgSW5wdXRXaW5kb3dJbmZvOjpGTEFHX05PVF9UT1VDSEFCTEUpKSB7CkBAIC00ODksMTEgKzQ4OCw2IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwcml2YXRlRmxhZ3MgJiBJbnB1dFdpbmRvd0luZm86OlBSSVZBVEVfRkxBR19TWVNURU1fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAvLyBFcnJvciB3aW5kb3cgaXMgb24gdG9wIGJ1dCBub3QgdmlzaWJsZSwgc28gdG91Y2ggaXMgZHJvcHBlZC4KLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTlVMTDsKQEAgLTExOTAsNyArMTE4NCw2IEBACiAgICAgICAgIGludDMyX3QgeSA9IGludDMyX3QoZW50cnktPnBvaW50ZXJDb29yZHNbcG9pbnRlckluZGV4XS4KICAgICAgICAgICAgICAgICBnZXRBeGlzVmFsdWUoQU1PVElPTl9FVkVOVF9BWElTX1kpKTsKICAgICAgICAgc3A8SW5wdXRXaW5kb3dIYW5kbGU+IG5ld1RvdWNoZWRXaW5kb3dIYW5kbGU7Ci0gICAgICAgIHNwPElucHV0V2luZG93SGFuZGxlPiB0b3BFcnJvcldpbmRvd0hhbmRsZTsKICAgICAgICAgYm9vbCBpc1RvdWNoTW9kYWwgPSBmYWxzZTsKIAogICAgICAgICAvLyBUcmF2ZXJzZSB3aW5kb3dzIGZyb20gZnJvbnQgdG8gYmFjayB0byBmaW5kIHRvdWNoZWQgd2luZG93IGFuZCBvdXRzaWRlIHRhcmdldHMuCkBAIC0xMjAyLDEzICsxMTk1LDYgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gd3JvbmcgZGlzcGxheQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQzMl90IHByaXZhdGVGbGFncyA9IHdpbmRvd0luZm8tPmxheW91dFBhcmFtc1ByaXZhdGVGbGFnczsKLSAgICAgICAgICAgIGlmIChwcml2YXRlRmxhZ3MgJiBJbnB1dFdpbmRvd0luZm86OlBSSVZBVEVfRkxBR19TWVNURU1fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAodG9wRXJyb3JXaW5kb3dIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICB0b3BFcnJvcldpbmRvd0hhbmRsZSA9IHdpbmRvd0hhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MgPSB3aW5kb3dJbmZvLT5sYXlvdXRQYXJhbXNGbGFnczsKICAgICAgICAgICAgIGlmICh3aW5kb3dJbmZvLT52aXNpYmxlKSB7CiAgICAgICAgICAgICAgICAgaWYgKCEgKGZsYWdzICYgSW5wdXRXaW5kb3dJbmZvOjpGTEFHX05PVF9UT1VDSEFCTEUpKSB7CkBAIC0xMjMzLDE3ICsxMjE5LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHdpbmRvdyBidXQgaXQgaXMgbm90IHRha2luZyBmb2N1cyAodHlwaWNhbGx5IGJlY2F1c2UKLSAgICAgICAgLy8gaXQgaXMgaW52aXNpYmxlKSB0aGVuIHdhaXQgZm9yIGl0LiAgQW55IG90aGVyIGZvY3VzZWQgd2luZG93IG1heSBpbgotICAgICAgICAvLyBmYWN0IGJlIGluIEFOUiBzdGF0ZS4KLSAgICAgICAgaWYgKHRvcEVycm9yV2luZG93SGFuZGxlICE9IE5VTEwgJiYgbmV3VG91Y2hlZFdpbmRvd0hhbmRsZSAhPSB0b3BFcnJvcldpbmRvd0hhbmRsZSkgewotICAgICAgICAgICAgaW5qZWN0aW9uUmVzdWx0ID0gaGFuZGxlVGFyZ2V0c05vdFJlYWR5TG9ja2VkKGN1cnJlbnRUaW1lLCBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgbmV4dFdha2V1cFRpbWUsCi0gICAgICAgICAgICAgICAgICAgICJXYWl0aW5nIGJlY2F1c2UgYSBzeXN0ZW0gZXJyb3Igd2luZG93IGlzIGFib3V0IHRvIGJlIGRpc3BsYXllZC4iKTsKLSAgICAgICAgICAgIGluamVjdGlvblBlcm1pc3Npb24gPSBJTkpFQ1RJT05fUEVSTUlTU0lPTl9VTktOT1dOOwotICAgICAgICAgICAgZ290byBVbnJlc3BvbnNpdmU7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBGaWd1cmUgb3V0IHdoZXRoZXIgc3BsaXR0aW5nIHdpbGwgYmUgYWxsb3dlZCBmb3IgdGhpcyB3aW5kb3cuCiAgICAgICAgIGlmIChuZXdUb3VjaGVkV2luZG93SGFuZGxlICE9IE5VTEwKICAgICAgICAgICAgICAgICAmJiBuZXdUb3VjaGVkV2luZG93SGFuZGxlLT5nZXRJbmZvKCktPnN1cHBvcnRzU3BsaXRUb3VjaCgpKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9pbnB1dGZsaW5nZXIvSW5wdXRXaW5kb3cuaCBiL3NlcnZpY2VzL2lucHV0Zmxpbmdlci9JbnB1dFdpbmRvdy5oCmluZGV4IDU4NzljODQuLjQyNDU3Y2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2lucHV0Zmxpbmdlci9JbnB1dFdpbmRvdy5oCisrKyBiL3NlcnZpY2VzL2lucHV0Zmxpbmdlci9JbnB1dFdpbmRvdy5oCkBAIC02NCwxMSArNjQsNiBAQAogICAgICAgICBGTEFHX05FRURTX01FTlVfS0VZID0gMHg0MDAwMDAwMCwKICAgICB9OwogCi0gICAgLy8gUHJpdmF0ZSBXaW5kb3cgZmxhZ3MgZnJvbSBXaW5kb3dNYW5hZ2VyLkxheW91dFBhcmFtcwotICAgIGVudW0gewotICAgICAgICBQUklWQVRFX0ZMQUdfU1lTVEVNX0VSUk9SID0gMHgwMDAwMDEwMCwKLSAgICB9OwotCiAgICAgLy8gV2luZG93IHR5cGVzIGZyb20gV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMKICAgICBlbnVtIHsKICAgICAgICAgRklSU1RfQVBQTElDQVRJT05fV0lORE9XID0gMSwKQEAgLTExOSw3ICsxMTQsNiBAQAogICAgIHNwPElucHV0Q2hhbm5lbD4gaW5wdXRDaGFubmVsOwogICAgIFN0cmluZzggbmFtZTsKICAgICBpbnQzMl90IGxheW91dFBhcmFtc0ZsYWdzOwotICAgIGludDMyX3QgbGF5b3V0UGFyYW1zUHJpdmF0ZUZsYWdzOwogICAgIGludDMyX3QgbGF5b3V0UGFyYW1zVHlwZTsKICAgICBuc2Vjc190IGRpc3BhdGNoaW5nVGltZW91dDsKICAgICBpbnQzMl90IGZyYW1lTGVmdDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvclNlcnZpY2UuY3BwCmluZGV4IDliMmFjZWEuLmE4NTczNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvc2Vuc29yc2VydmljZS9TZW5zb3JTZXJ2aWNlLmNwcApAQCAtMTkxLDYgKzE5MSw4IEBACiAgICAgICAgICAgICBtU2Vuc29yRXZlbnRTY3JhdGNoID0gbmV3IHNlbnNvcnNfZXZlbnRfdFttaW5CdWZmZXJTaXplXTsKICAgICAgICAgICAgIG1NYXBGbHVzaEV2ZW50c1RvQ29ubmVjdGlvbnMgPSBuZXcgU2Vuc29yRXZlbnRDb25uZWN0aW9uIGNvbnN0ICogW21pbkJ1ZmZlclNpemVdOwogCisgICAgICAgICAgICBtQWNrUmVjZWl2ZXIgPSBuZXcgU2Vuc29yRXZlbnRBY2tSZWNlaXZlcih0aGlzKTsKKyAgICAgICAgICAgIG1BY2tSZWNlaXZlci0+cnVuKCJTZW5zb3JFdmVudEFja1JlY2VpdmVyIiwgUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVkpOwogICAgICAgICAgICAgbUluaXRDaGVjayA9IE5PX0VSUk9SOwogICAgICAgICAgICAgcnVuKCJTZW5zb3JTZXJ2aWNlIiwgUFJJT1JJVFlfVVJHRU5UX0RJU1BMQVkpOwogICAgICAgICB9CkBAIC0zODYsOCArMzg4LDYgQEAKICAgICBTZW5zb3JEZXZpY2UmIGRldmljZShTZW5zb3JEZXZpY2U6OmdldEluc3RhbmNlKCkpOwogICAgIGNvbnN0IHNpemVfdCB2Y291bnQgPSBtVmlydHVhbFNlbnNvckxpc3Quc2l6ZSgpOwogCi0gICAgU2Vuc29yRXZlbnRBY2tSZWNlaXZlciBzZW5kZXIodGhpcyk7Ci0gICAgc2VuZGVyLnJ1bigiU2Vuc29yRXZlbnRBY2tSZWNlaXZlciIsIFBSSU9SSVRZX1VSR0VOVF9ESVNQTEFZKTsKICAgICBjb25zdCBpbnQgaGFsVmVyc2lvbiA9IGRldmljZS5nZXRIYWxEZXZpY2VWZXJzaW9uKCk7CiAgICAgZG8gewogICAgICAgICBzc2l6ZV90IGNvdW50ID0gZGV2aWNlLnBvbGwobVNlbnNvckV2ZW50QnVmZmVyLCBudW1FdmVudE1heCk7CkBAIC00MDgsMTYgKzQwOCw3IEBACiAgICAgICAgIC8vIHJlc3VsdCBpbiBhIGRlYWRsb2NrIGFzIH5TZW5zb3JFdmVudENvbm5lY3Rpb24oKSBuZWVkcyB0byBhY3F1aXJlIG1Mb2NrIGFnYWluIGZvcgogICAgICAgICAvLyBjbGVhbnVwLiBTbyBjb3B5IGFsbCB0aGUgc3Ryb25nUG9pbnRlcnMgdG8gYSB2ZWN0b3IgYmVmb3JlIHRoZSBsb2NrIGlzIGFjcXVpcmVkLgogICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPFNlbnNvckV2ZW50Q29ubmVjdGlvbj4gPiBhY3RpdmVDb25uZWN0aW9uczsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGkgPCBtQWN0aXZlQ29ubmVjdGlvbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzcDxTZW5zb3JFdmVudENvbm5lY3Rpb24+IGNvbm5lY3Rpb24obUFjdGl2ZUNvbm5lY3Rpb25zW2ldLnByb21vdGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBhY3RpdmVDb25uZWN0aW9ucy5hZGQoY29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICAgICAgcG9wdWxhdGVBY3RpdmVDb25uZWN0aW9ucygmYWN0aXZlQ29ubmVjdGlvbnMpOwogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICAvLyBQb2xsIGhhcyByZXR1cm5lZC4gSG9sZCBhIHdha2Vsb2NrIGlmIG9uZSBvZiB0aGUgZXZlbnRzIGlzIGZyb20gYSB3YWtlIHVwIHNlbnNvci4gVGhlCiAgICAgICAgIC8vIHJlc3Qgb2YgdGhpcyBsb29wIGlzIHVuZGVyIGEgY3JpdGljYWwgc2VjdGlvbiBwcm90ZWN0ZWQgYnkgbUxvY2suIEFjcXVpcmluZyBhIHdha2VMb2NrLApAQCAtNDMzLDggKzQyNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYnVmZmVySGFzV2FrZVVwRXZlbnQgJiYgIW1XYWtlTG9ja0FjcXVpcmVkKSB7Ci0gICAgICAgICAgICBhY3F1aXJlX3dha2VfbG9jayhQQVJUSUFMX1dBS0VfTE9DSywgV0FLRV9MT0NLX05BTUUpOwotICAgICAgICAgICAgbVdha2VMb2NrQWNxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgc2V0V2FrZUxvY2tBY3F1aXJlZExvY2tlZCh0cnVlKTsKICAgICAgICAgfQogICAgICAgICByZWNvcmRMYXN0VmFsdWVMb2NrZWQobVNlbnNvckV2ZW50QnVmZmVyLCBjb3VudCk7CiAKQEAgLTUyMiw4ICs1MTIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1XYWtlTG9ja0FjcXVpcmVkICYmICFuZWVkc1dha2VMb2NrKSB7Ci0gICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhXQUtFX0xPQ0tfTkFNRSk7Ci0gICAgICAgICAgICBtV2FrZUxvY2tBY3F1aXJlZCA9IGZhbHNlOworICAgICAgICAgICAgc2V0V2FrZUxvY2tBY3F1aXJlZExvY2tlZChmYWxzZSk7CiAgICAgICAgIH0KICAgICB9IHdoaWxlICghVGhyZWFkOjpleGl0UGVuZGluZygpKTsKIApAQCAtNTM2LDExICs1MjUsNTIgQEAKICAgICByZXR1cm4gbUxvb3BlcjsKIH0KIAordm9pZCBTZW5zb3JTZXJ2aWNlOjpyZXNldEFsbFdha2VMb2NrUmVmQ291bnRzKCkgeworICAgIFNvcnRlZFZlY3Rvcjwgc3A8U2Vuc29yRXZlbnRDb25uZWN0aW9uPiA+IGFjdGl2ZUNvbm5lY3Rpb25zOworICAgIHBvcHVsYXRlQWN0aXZlQ29ubmVjdGlvbnMoJmFjdGl2ZUNvbm5lY3Rpb25zKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGZvciAoc2l6ZV90IGk9MCA7IGkgPCBhY3RpdmVDb25uZWN0aW9ucy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZUNvbm5lY3Rpb25zW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVDb25uZWN0aW9uc1tpXS0+cmVzZXRXYWtlTG9ja1JlZkNvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0V2FrZUxvY2tBY3F1aXJlZExvY2tlZChmYWxzZSk7CisgICAgfQorfQorCit2b2lkIFNlbnNvclNlcnZpY2U6OnNldFdha2VMb2NrQWNxdWlyZWRMb2NrZWQoYm9vbCBhY3F1aXJlKSB7CisgICAgaWYgKGFjcXVpcmUpIHsKKyAgICAgICAgaWYgKCFtV2FrZUxvY2tBY3F1aXJlZCkgeworICAgICAgICAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIFdBS0VfTE9DS19OQU1FKTsKKyAgICAgICAgICAgIG1XYWtlTG9ja0FjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtTG9vcGVyLT53YWtlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1XYWtlTG9ja0FjcXVpcmVkKSB7CisgICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhXQUtFX0xPQ0tfTkFNRSk7CisgICAgICAgICAgICBtV2FrZUxvY2tBY3F1aXJlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfQorCisKK2Jvb2wgU2Vuc29yU2VydmljZTo6aXNXYWtlTG9ja0FjcXVpcmVkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1XYWtlTG9ja0FjcXVpcmVkOworfQorCiBib29sIFNlbnNvclNlcnZpY2U6OlNlbnNvckV2ZW50QWNrUmVjZWl2ZXI6OnRocmVhZExvb3AoKSB7CiAgICAgQUxPR0QoIm5ldyB0aHJlYWQgU2Vuc29yRXZlbnRBY2tSZWNlaXZlciIpOworICAgIHNwPExvb3Blcj4gbG9vcGVyID0gbVNlcnZpY2UtPmdldExvb3BlcigpOwogICAgIGRvIHsKLSAgICAgICAgc3A8TG9vcGVyPiBsb29wZXIgPSBtU2VydmljZS0+Z2V0TG9vcGVyKCk7Ci0gICAgICAgIGxvb3Blci0+cG9sbE9uY2UoLTEpOworICAgICAgICBib29sIHdha2VMb2NrQWNxdWlyZWQgPSBtU2VydmljZS0+aXNXYWtlTG9ja0FjcXVpcmVkKCk7CisgICAgICAgIGludCB0aW1lb3V0ID0gLTE7CisgICAgICAgIGlmICh3YWtlTG9ja0FjcXVpcmVkKSB0aW1lb3V0ID0gNTAwMDsKKyAgICAgICAgaW50IHJldCA9IGxvb3Blci0+cG9sbE9uY2UodGltZW91dCk7CisgICAgICAgIGlmIChyZXQgPT0gQUxPT1BFUl9QT0xMX1RJTUVPVVQpIHsKKyAgICAgICAgICAgbVNlcnZpY2UtPnJlc2V0QWxsV2FrZUxvY2tSZWZDb3VudHMoKTsKKyAgICAgICAgfQogICAgIH0gd2hpbGUoIVRocmVhZDo6ZXhpdFBlbmRpbmcoKSk7CiAgICAgcmV0dXJuIGZhbHNlOwogfQpAQCAtNzExLDEwICs3NDEsNyBAQAogICAgICAgICAgICAgICAgIHNlbnNvcnNfZXZlbnRfdCYgZXZlbnQobUxhc3RFdmVudFNlZW4uZWRpdFZhbHVlRm9yKGhhbmRsZSkpOwogICAgICAgICAgICAgICAgIGlmIChldmVudC52ZXJzaW9uID09IHNpemVvZihzZW5zb3JzX2V2ZW50X3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1dha2VVcFNlbnNvckV2ZW50KGV2ZW50KSAmJiAhbVdha2VMb2NrQWNxdWlyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVfd2FrZV9sb2NrKFBBUlRJQUxfV0FLRV9MT0NLLCBXQUtFX0xPQ0tfTkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtV2FrZUxvY2tBY3F1aXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRF9JRihERUJVR19DT05ORUNUSU9OUywgImFjcXVpcmVkIHdha2Vsb2NrIGZvciBvbl9jaGFuZ2Ugc2Vuc29yICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FLRV9MT0NLX05BTUUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0V2FrZUxvY2tBY3F1aXJlZExvY2tlZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLT5zZW5kRXZlbnRzKCZldmVudCwgMSwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghY29ubmVjdGlvbi0+bmVlZHNXYWtlTG9jaygpICYmIG1XYWtlTG9ja0FjcXVpcmVkKSB7CkBAIC05MTksOCArOTQ2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlbGVhc2VMb2NrKSB7Ci0gICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKFdBS0VfTE9DS19OQU1FKTsKLSAgICAgICAgbVdha2VMb2NrQWNxdWlyZWQgPSBmYWxzZTsKKyAgICAgICAgc2V0V2FrZUxvY2tBY3F1aXJlZExvY2tlZChmYWxzZSk7CisgICAgfQorfQorCit2b2lkIFNlbnNvclNlcnZpY2U6OnNlbmRFdmVudHNGcm9tQ2FjaGUoY29uc3Qgc3A8U2Vuc29yRXZlbnRDb25uZWN0aW9uPiYgY29ubmVjdGlvbikgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgY29ubmVjdGlvbi0+d3JpdGVUb1NvY2tldEZyb21DYWNoZSgpOworICAgIGlmIChjb25uZWN0aW9uLT5uZWVkc1dha2VMb2NrKCkpIHsKKyAgICAgICAgc2V0V2FrZUxvY2tBY3F1aXJlZExvY2tlZCh0cnVlKTsKKyAgICB9Cit9CisKK3ZvaWQgU2Vuc29yU2VydmljZTo6cG9wdWxhdGVBY3RpdmVDb25uZWN0aW9ucygKKyAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxTZW5zb3JFdmVudENvbm5lY3Rpb24+ID4qIGFjdGl2ZUNvbm5lY3Rpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpPTAgOyBpIDwgbUFjdGl2ZUNvbm5lY3Rpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPFNlbnNvckV2ZW50Q29ubmVjdGlvbj4gY29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbnNbaV0ucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gMCkgeworICAgICAgICAgICAgYWN0aXZlQ29ubmVjdGlvbnMtPmFkZChjb25uZWN0aW9uKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMTAxMCw2ICsxMDU1LDExIEBACiAgICAgcmV0dXJuICFtRGVhZCAmJiBtV2FrZUxvY2tSZWZDb3VudCA+IDA7CiB9CiAKK3ZvaWQgU2Vuc29yU2VydmljZTo6U2Vuc29yRXZlbnRDb25uZWN0aW9uOjpyZXNldFdha2VMb2NrUmVmQ291bnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db25uZWN0aW9uTG9jayk7CisgICAgbVdha2VMb2NrUmVmQ291bnQgPSAwOworfQorCiB2b2lkIFNlbnNvclNlcnZpY2U6OlNlbnNvckV2ZW50Q29ubmVjdGlvbjo6ZHVtcChTdHJpbmc4JiByZXN1bHQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNvbm5lY3Rpb25Mb2NrKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdCBXYWtlTG9ja1JlZkNvdW50ICVkIHwgdWlkICVkIHwgY2FjaGUgc2l6ZSAlZCB8IG1heCBjYWNoZSBzaXplICVkXG4iLApAQCAtMTMzMSwxMSArMTM4MSwxNCBAQAogICAgICAgICB3aGlsZSAoZmx1c2hJbmZvLm1QZW5kaW5nRmx1c2hFdmVudHNUb1NlbmQgPiAwKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQgc2Vuc29yX2hhbmRsZSA9IG1TZW5zb3JJbmZvLmtleUF0KGkpOwogICAgICAgICAgICAgZmx1c2hDb21wbGV0ZUV2ZW50Lm1ldGFfZGF0YS5zZW5zb3IgPSBzZW5zb3JfaGFuZGxlOwotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlLT5nZXRTZW5zb3JGcm9tSGFuZGxlKHNlbnNvcl9oYW5kbGUpLmlzV2FrZVVwU2Vuc29yKCkpIHsKKyAgICAgICAgICAgIGJvb2wgd2FrZVVwU2Vuc29yID0gbVNlcnZpY2UtPmdldFNlbnNvckZyb21IYW5kbGUoc2Vuc29yX2hhbmRsZSkuaXNXYWtlVXBTZW5zb3IoKTsKKyAgICAgICAgICAgIGlmICh3YWtlVXBTZW5zb3IpIHsKKyAgICAgICAgICAgICAgICsrbVdha2VMb2NrUmVmQ291bnQ7CiAgICAgICAgICAgICAgICBmbHVzaENvbXBsZXRlRXZlbnQuZmxhZ3MgfD0gV0FLRV9VUF9TRU5TT1JfRVZFTlRfTkVFRFNfQUNLOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3NpemVfdCBzaXplID0gU2Vuc29yRXZlbnRRdWV1ZTo6d3JpdGUobUNoYW5uZWwsICZmbHVzaENvbXBsZXRlRXZlbnQsIDEpOwogICAgICAgICAgICAgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHdha2VVcFNlbnNvcikgLS1tV2FrZUxvY2tSZWZDb3VudDsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HRF9JRihERUJVR19DT05ORUNUSU9OUywgInNlbnQgZHJvcHBlZCBmbHVzaCBjb21wbGV0ZSBldmVudD09JWQgIiwKQEAgLTEzNDUsMTEgKzEzOTgsMTIgQEAKICAgICB9CiB9CiAKLXZvaWQgU2Vuc29yU2VydmljZTo6U2Vuc29yRXZlbnRDb25uZWN0aW9uOjp3cml0ZVRvU29ja2V0RnJvbUNhY2hlTG9ja2VkKCkgewordm9pZCBTZW5zb3JTZXJ2aWNlOjpTZW5zb3JFdmVudENvbm5lY3Rpb246OndyaXRlVG9Tb2NrZXRGcm9tQ2FjaGUoKSB7CiAgICAgLy8gQXQgYSB0aW1lIHdyaXRlIGF0IG1vc3QgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZXIgYnVmZmVyIGluIFNlbnNvckV2ZW50UXVldWUgT1IKICAgICAvLyBoYWxmIHRoZSBzaXplIG9mIHRoZSBzb2NrZXQgYnVmZmVyIGFsbG9jYXRlZCBpbiBCaXRUdWJlIHdoaWNoZXZlciBpcyBzbWFsbGVyLgogICAgIGNvbnN0IGludCBtYXhXcml0ZVNpemUgPSBoZWxwZXJzOjptaW4oU2Vuc29yRXZlbnRRdWV1ZTo6TUFYX1JFQ0VJVkVfQlVGRkVSX0VWRU5UX0NPVU5ULzIsCiAgICAgICAgICAgICBpbnQobVNlcnZpY2UtPm1Tb2NrZXRCdWZmZXJTaXplLyhzaXplb2Yoc2Vuc29yc19ldmVudF90KSoyKSkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ29ubmVjdGlvbkxvY2spOwogICAgIC8vIFNlbmQgcGVuZGluZyBmbHVzaCBjb21wbGV0ZSBldmVudHMgKGlmIGFueSkKICAgICBzZW5kUGVuZGluZ0ZsdXNoRXZlbnRzTG9ja2VkKCk7CiAgICAgZm9yIChpbnQgbnVtRXZlbnRzU2VudCA9IDA7IG51bUV2ZW50c1NlbnQgPCBtQ2FjaGVTaXplOykgewpAQCAtMTUwMCw5ICsxNTU0LDggQEAKICAgICB9CiAKICAgICBpZiAoZXZlbnRzICYgQUxPT1BFUl9FVkVOVF9PVVRQVVQpIHsKLSAgICAgICAgLy8gc2VuZCBzZW5zb3IgZGF0YSB0aGF0IGlzIHN0b3JlZCBpbiBtRXZlbnRDYWNoZS4KLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db25uZWN0aW9uTG9jayk7Ci0gICAgICAgIHdyaXRlVG9Tb2NrZXRGcm9tQ2FjaGVMb2NrZWQoKTsKKyAgICAgICAgLy8gc2VuZCBzZW5zb3IgZGF0YSB0aGF0IGlzIHN0b3JlZCBpbiBtRXZlbnRDYWNoZSBmb3IgdGhpcyBjb25uZWN0aW9uLgorICAgICAgICBtU2VydmljZS0+c2VuZEV2ZW50c0Zyb21DYWNoZSh0aGlzKTsKICAgICB9CiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zZW5zb3JzZXJ2aWNlL1NlbnNvclNlcnZpY2UuaCBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCmluZGV4IDJlMTY2NzcuLmU5Y2EzYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL3NlbnNvcnNlcnZpY2UvU2Vuc29yU2VydmljZS5oCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgdm9pZCBzZW5kUGVuZGluZ0ZsdXNoRXZlbnRzTG9ja2VkKCk7CiAKICAgICAgICAgLy8gV3JpdGVzIGV2ZW50cyBmcm9tIG1FdmVudENhY2hlIHRvIHRoZSBzb2NrZXQuCi0gICAgICAgIHZvaWQgd3JpdGVUb1NvY2tldEZyb21DYWNoZUxvY2tlZCgpOworICAgICAgICB2b2lkIHdyaXRlVG9Tb2NrZXRGcm9tQ2FjaGUoKTsKIAogICAgICAgICAvLyBDb21wdXRlIHRoZSBhcHByb3hpbWF0ZSBjYWNoZSBzaXplIGZyb20gdGhlIEZJRk8gc2l6ZXMgb2YgdmFyaW91cyBzZW5zb3JzIHJlZ2lzdGVyZWQgZm9yCiAgICAgICAgIC8vIHRoaXMgY29ubmVjdGlvbi4gV2FrZSB1cCBhbmQgbm9uLXdha2UgdXAgc2Vuc29ycyBoYXZlIHNlcGFyYXRlIEZJRk9zIGJ1dCBGSUZPIG1heSBiZQpAQCAtMTg5LDYgKzE4OSw3IEBACiAgICAgICAgIHZvaWQgc2V0Rmlyc3RGbHVzaFBlbmRpbmcoaW50MzJfdCBoYW5kbGUsIGJvb2wgdmFsdWUpOwogICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgYm9vbCBuZWVkc1dha2VMb2NrKCk7CisgICAgICAgIHZvaWQgcmVzZXRXYWtlTG9ja1JlZkNvdW50KCk7CiAKICAgICAgICAgdWlkX3QgZ2V0VWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQogICAgIH07CkBAIC0yMzcsMTIgKzIzOCwyOSBAQAogICAgIC8vIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb25zLCBpZiB5ZXMgdGhlIHdha2Vsb2NrIGlzIHJlbGVhc2VkLgogICAgIHZvaWQgY2hlY2tXYWtlTG9ja1N0YXRlKCk7CiAgICAgdm9pZCBjaGVja1dha2VMb2NrU3RhdGVMb2NrZWQoKTsKKyAgICBib29sIGlzV2FrZUxvY2tBY3F1aXJlZCgpOwogICAgIGJvb2wgaXNXYWtlVXBTZW5zb3JFdmVudChjb25zdCBzZW5zb3JzX2V2ZW50X3QmIGV2ZW50KSBjb25zdDsKIAogICAgIFNlbnNvclJlY29yZCAqIGdldFNlbnNvclJlY29yZChpbnQgaGFuZGxlKTsKIAogICAgIHNwPExvb3Blcj4gZ2V0TG9vcGVyKCkgY29uc3Q7CiAKKyAgICAvLyBSZXNldCBtV2FrZUxvY2tSZWZDb3VudHMgZm9yIGFsbCBTZW5zb3JFdmVudENvbm5lY3Rpb25zIHRvIHplcm8uIFRoaXMgbWF5IGhhcHBlbiBpZgorICAgIC8vIFNlbnNvclNlcnZpY2UgZGlkIG5vdCByZWNlaXZlIGFueSBhY2tub3dsZWRnZW1lbnRzIGZyb20gYXBwcyB3aGljaCBoYXZlIHJlZ2lzdGVyZWQgZm9yCisgICAgLy8gd2FrZV91cCBzZW5zb3JzLgorICAgIHZvaWQgcmVzZXRBbGxXYWtlTG9ja1JlZkNvdW50cygpOworCisgICAgLy8gQWNxdWlyZSBvciByZWxlYXNlIHdha2VfbG9jay4gSWYgd2FrZV9sb2NrIGlzIGFjcXVpcmVkLCBzZXQgdGhlIHRpbWVvdXQgaW4gdGhlIGxvb3BlciB0bworICAgIC8vIDUgc2Vjb25kcyBhbmQgd2FrZSB0aGUgbG9vcGVyLgorICAgIHZvaWQgc2V0V2FrZUxvY2tBY3F1aXJlZExvY2tlZChib29sIGFjcXVpcmUpOworCisgICAgLy8gU2VuZCBldmVudHMgZnJvbSB0aGUgZXZlbnQgY2FjaGUgZm9yIHRoaXMgcGFydGljdWxhciBjb25uZWN0aW9uLgorICAgIHZvaWQgc2VuZEV2ZW50c0Zyb21DYWNoZShjb25zdCBzcDxTZW5zb3JFdmVudENvbm5lY3Rpb24+JiBjb25uZWN0aW9uKTsKKworICAgIC8vIFByb21vdGUgYWxsIHdlYWsgcmVmZXJlY2VuY2VzIGluIG1BY3RpdmVDb25uZWN0aW9ucyB2ZWN0b3IgdG8gc3Ryb25nIHJlZmVyZW5jZXMgYW5kIGFkZCB0aGVtCisgICAgLy8gdG8gdGhlIG91dHB1dCB2ZWN0b3IuCisgICAgdm9pZCBwb3B1bGF0ZUFjdGl2ZUNvbm5lY3Rpb25zKFNvcnRlZFZlY3Rvcjwgc3A8U2Vuc29yRXZlbnRDb25uZWN0aW9uPiA+KiBhY3RpdmVDb25uZWN0aW9ucyk7CisKICAgICAvLyBjb25zdGFudHMKICAgICBWZWN0b3I8U2Vuc29yPiBtU2Vuc29yTGlzdDsKICAgICBWZWN0b3I8U2Vuc29yPiBtVXNlclNlbnNvckxpc3REZWJ1ZzsKQEAgLTI1NCw2ICsyNzIsNyBAQAogICAgIC8vIHN1cHBvcnRlZCBvciBub3QuCiAgICAgdWludDMyX3QgbVNvY2tldEJ1ZmZlclNpemU7CiAgICAgc3A8TG9vcGVyPiBtTG9vcGVyOworICAgIHNwPFNlbnNvckV2ZW50QWNrUmVjZWl2ZXI+IG1BY2tSZWNlaXZlcjsKIAogICAgIC8vIHByb3RlY3RlZCBieSBtTG9jawogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvQW5kcm9pZC5tawppbmRleCAzNDJkNjg1Li4xZWIyMzYxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0FuZHJvaWQubWsKQEAgLTgzLDggKzgzLDE0IEBACiAgICAgTE9DQUxfQ0ZMQUdTICs9IC1EUFJFU0VOVF9USU1FX09GRlNFVF9GUk9NX1ZTWU5DX05TPTAKIGVuZGlmCiAKK2lmbmVxICgkKE1BWF9WSVJUVUFMX0RJU1BMQVlfRElNRU5TSU9OKSwpCisgICAgTE9DQUxfQ0ZMQUdTICs9IC1ETUFYX1ZJUlRVQUxfRElTUExBWV9ESU1FTlNJT049JChNQVhfVklSVFVBTF9ESVNQTEFZX0RJTUVOU0lPTikKK2Vsc2UKKyAgICBMT0NBTF9DRkxBR1MgKz0gLURNQVhfVklSVFVBTF9ESVNQTEFZX0RJTUVOU0lPTj0wCitlbmRpZgorCiBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtV2Vycm9yPWZvcm1hdAotTE9DQUxfQ1BQRkxBR1MgOj0gLXN0ZD1jKysxMQorTE9DQUxfQ0ZMQUdTICs9IC1zdGQ9YysrMTEKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgbGliY3V0aWxzIFwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9GcmFtZWJ1ZmZlclN1cmZhY2UuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0ZyYW1lYnVmZmVyU3VyZmFjZS5jcHAKaW5kZXggZjlkNzZkMS4uNDg4NWM1ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0ZyYW1lYnVmZmVyU3VyZmFjZS5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0ZyYW1lYnVmZmVyU3VyZmFjZS5jcHAKQEAgLTY4LDcgKzY4LDcgQEAKICAgICBtQ29uc3VtZXItPnNldERlZmF1bHRNYXhCdWZmZXJDb3VudChOVU1fRlJBTUVCVUZGRVJfU1VSRkFDRV9CVUZGRVJTKTsKIH0KIAotc3RhdHVzX3QgRnJhbWVidWZmZXJTdXJmYWNlOjpiZWdpbkZyYW1lKGJvb2wgLyogbXVzdFJlY29tcG9zZSAqLykgeworc3RhdHVzX3QgRnJhbWVidWZmZXJTdXJmYWNlOjpiZWdpbkZyYW1lKGJvb2wgLyptdXN0UmVjb21wb3NlKi8pIHsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTEyMiw3ICsxMjIsNyBAQAogfQogCiAvLyBPdmVycmlkZXMgQ29uc3VtZXJCYXNlOjpvbkZyYW1lQXZhaWxhYmxlKCksIGRvZXMgbm90IGNhbGwgYmFzZSBjbGFzcyBpbXBsLgotdm9pZCBGcmFtZWJ1ZmZlclN1cmZhY2U6Om9uRnJhbWVBdmFpbGFibGUoKSB7Cit2b2lkIEZyYW1lYnVmZmVyU3VyZmFjZTo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiAvKiBpdGVtICovKSB7CiAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOwogICAgIHNwPEZlbmNlPiBhY3F1aXJlRmVuY2U7CiAgICAgc3RhdHVzX3QgZXJyID0gbmV4dEJ1ZmZlcihidWYsIGFjcXVpcmVGZW5jZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRnJhbWVidWZmZXJTdXJmYWNlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvRnJhbWVidWZmZXJTdXJmYWNlLmgKaW5kZXggNmZmYzUyZC4uM2QxNzg0MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL0ZyYW1lYnVmZmVyU3VyZmFjZS5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9GcmFtZWJ1ZmZlclN1cmZhY2UuaApAQCAtNTMsNyArNTMsNyBAQAogcHJpdmF0ZToKICAgICB2aXJ0dWFsIH5GcmFtZWJ1ZmZlclN1cmZhY2UoKSB7IH07IC8vIHRoaXMgY2xhc3MgY2Fubm90IGJlIG92ZXJsb2FkZWQKIAotICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKCk7CisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7CiAgICAgdmlydHVhbCB2b2lkIGZyZWVCdWZmZXJMb2NrZWQoaW50IHNsb3RJbmRleCk7CiAKICAgICB2aXJ0dWFsIHZvaWQgZHVtcExvY2tlZChTdHJpbmc4JiByZXN1bHQsIGNvbnN0IGNoYXIqIHByZWZpeCkgY29uc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvVmlydHVhbERpc3BsYXlTdXJmYWNlLmNwcCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WaXJ0dWFsRGlzcGxheVN1cmZhY2UuY3BwCmluZGV4IGVmMTBmYTcuLmUwZjMyZTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WaXJ0dWFsRGlzcGxheVN1cmZhY2UuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WaXJ0dWFsRGlzcGxheVN1cmZhY2UuY3BwCkBAIC0yODQsNyArMjg0LDcgQEAKIH0KIAogc3RhdHVzX3QgVmlydHVhbERpc3BsYXlTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyKFNvdXJjZSBzb3VyY2UsCi0gICAgICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsIGludCogc3Nsb3QsIHNwPEZlbmNlPiogZmVuY2UpIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwgaW50KiBzc2xvdCwgc3A8RmVuY2U+KiBmZW5jZSkgewogICAgIExPR19GQVRBTF9JRihtRGlzcGxheUlkIDwgMCwgIm1EaXNwbGF5SWQ9JWQgYnV0IHNob3VsZCBub3QgYmUgPCAwLiIsIG1EaXNwbGF5SWQpOwogICAgIC8vIERvbid0IGxldCBhIHNsb3cgY29uc3VtZXIgYmxvY2sgdXMKICAgICBib29sIGFzeW5jID0gKHNvdXJjZSA9PSBTT1VSQ0VfU0lOSyk7CkBAIC0zMjksNyArMzI5LDcgQEAKIH0KIAogc3RhdHVzX3QgVmlydHVhbERpc3BsYXlTdXJmYWNlOjpkZXF1ZXVlQnVmZmVyKGludCogcHNsb3QsIHNwPEZlbmNlPiogZmVuY2UsIGJvb2wgYXN5bmMsCi0gICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKKyAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgewogICAgIGlmIChtRGlzcGxheUlkIDwgMCkKICAgICAgICAgcmV0dXJuIG1Tb3VyY2VbU09VUkNFX1NJTktdLT5kZXF1ZXVlQnVmZmVyKHBzbG90LCBmZW5jZSwgYXN5bmMsIHcsIGgsIGZvcm1hdCwgdXNhZ2UpOwogCkBAIC0zNjQsNyArMzY0LDcgQEAKICAgICAgICAgdXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUjsKICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4mIGJ1ZiA9IG1Qcm9kdWNlckJ1ZmZlcnNbbU91dHB1dFByb2R1Y2VyU2xvdF07CiAgICAgICAgIGlmICgodXNhZ2UgJiB+YnVmLT5nZXRVc2FnZSgpKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgKGZvcm1hdCAhPSAwICYmIGZvcm1hdCAhPSBidWYtPmdldFBpeGVsRm9ybWF0KCkpIHx8CisgICAgICAgICAgICAgICAgKGZvcm1hdCAhPSAwICYmIGZvcm1hdCAhPSAodWludDMyX3QpYnVmLT5nZXRQaXhlbEZvcm1hdCgpKSB8fAogICAgICAgICAgICAgICAgICh3ICE9IDAgJiYgdyAhPSBtU2lua0J1ZmZlcldpZHRoKSB8fAogICAgICAgICAgICAgICAgIChoICE9IDAgJiYgaCAhPSBtU2lua0J1ZmZlckhlaWdodCkpIHsKICAgICAgICAgICAgIFZEU19MT0dWKCJkZXF1ZXVlQnVmZmVyOiBkZXF1ZXVlaW5nIG5ldyBvdXRwdXQgYnVmZmVyOiAiCkBAIC01MTcsNyArNTE3LDcgQEAKIH0KIAogdm9pZCBWaXJ0dWFsRGlzcGxheVN1cmZhY2U6OmFsbG9jYXRlQnVmZmVycyhib29sIC8qIGFzeW5jICovLAotICAgICAgICB1aW50MzJfdCAvKiB3aWR0aCAqLywgdWludDMyX3QgLyogaGVpZ2h0ICovLCBQaXhlbEZvcm1hdCAvKiBmb3JtYXQgKi8sCisgICAgICAgIHVpbnQzMl90IC8qIHdpZHRoICovLCB1aW50MzJfdCAvKiBoZWlnaHQgKi8sIHVpbnQzMl90IC8qIGZvcm1hdCAqLywKICAgICAgICAgdWludDMyX3QgLyogdXNhZ2UgKi8pIHsKICAgICAvLyBUT0RPOiBTaG91bGQgd2UgYWN0dWFsbHkgYWxsb2NhdGUgYnVmZmVycyBmb3IgYSB2aXJ0dWFsIGRpc3BsYXk/CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvVmlydHVhbERpc3BsYXlTdXJmYWNlLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9EaXNwbGF5SGFyZHdhcmUvVmlydHVhbERpc3BsYXlTdXJmYWNlLmgKaW5kZXggMGEzZjRhMS4uMmMxNGQ2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvRGlzcGxheUhhcmR3YXJlL1ZpcnR1YWxEaXNwbGF5U3VyZmFjZS5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0Rpc3BsYXlIYXJkd2FyZS9WaXJ0dWFsRGlzcGxheVN1cmZhY2UuaApAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1ZXN0QnVmZmVyKGludCBwc2xvdCwgc3A8R3JhcGhpY0J1ZmZlcj4qIG91dEJ1Zik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJDb3VudChpbnQgYnVmZmVyQ291bnQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVxdWV1ZUJ1ZmZlcihpbnQqIHBzbG90LCBzcDxGZW5jZT4qIGZlbmNlLCBib29sIGFzeW5jLAotICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSk7CisgICAgICAgICAgICB1aW50MzJfdCB3LCB1aW50MzJfdCBoLCB1aW50MzJfdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRldGFjaEJ1ZmZlcihpbnQgc2xvdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hOZXh0QnVmZmVyKHNwPEdyYXBoaWNCdWZmZXI+KiBvdXRCdWZmZXIsCiAgICAgICAgICAgICBzcDxGZW5jZT4qIG91dEZlbmNlKTsKQEAgLTExNCwxMyArMTE0LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KGludCBhcGkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U2lkZWJhbmRTdHJlYW0oY29uc3Qgc3A8TmF0aXZlSGFuZGxlPiYgc3RyZWFtKTsKICAgICB2aXJ0dWFsIHZvaWQgYWxsb2NhdGVCdWZmZXJzKGJvb2wgYXN5bmMsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOwogCiAgICAgLy8KICAgICAvLyBVdGlsaXR5IG1ldGhvZHMKICAgICAvLwogICAgIHN0YXRpYyBTb3VyY2UgZmJTb3VyY2VGb3JDb21wb3NpdGlvblR5cGUoQ29tcG9zaXRpb25UeXBlIHR5cGUpOwotICAgIHN0YXR1c190IGRlcXVldWVCdWZmZXIoU291cmNlIHNvdXJjZSwgUGl4ZWxGb3JtYXQgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSwKKyAgICBzdGF0dXNfdCBkZXF1ZXVlQnVmZmVyKFNvdXJjZSBzb3VyY2UsIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsCiAgICAgICAgICAgICBpbnQqIHNzbG90LCBzcDxGZW5jZT4qIGZlbmNlKTsKICAgICB2b2lkIHVwZGF0ZVF1ZXVlQnVmZmVyT3V0cHV0KGNvbnN0IFF1ZXVlQnVmZmVyT3V0cHV0JiBxYm8pOwogICAgIHZvaWQgcmVzZXRQZXJGcmFtZVN0YXRlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5jcHAKaW5kZXggOTFlOWEwMi4uOWRhMWVmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmNwcApAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDx1aS9QaXhlbEZvcm1hdC5oPgogCisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSAiY2x6LmgiCkBAIC0xNTgsMTEgKzE1OSwyNiBAQAogICAgIH0KIH0KIAotdm9pZCBMYXllcjo6b25GcmFtZUF2YWlsYWJsZSgpIHsKK3ZvaWQgTGF5ZXI6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIC8vIEFkZCB0aGlzIGJ1ZmZlciBmcm9tIG91ciBpbnRlcm5hbCBxdWV1ZSB0cmFja2VyCisgICAgeyAvLyBBdXRvbG9jayBzY29wZQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtUXVldWVJdGVtTG9jayk7CisgICAgICAgIG1RdWV1ZUl0ZW1zLnB1c2hfYmFjayhpdGVtKTsKKyAgICB9CisKICAgICBhbmRyb2lkX2F0b21pY19pbmMoJm1RdWV1ZWRGcmFtZXMpOwogICAgIG1GbGluZ2VyLT5zaWduYWxMYXllclVwZGF0ZSgpOwogfQogCit2b2lkIExheWVyOjpvbkZyYW1lUmVwbGFjZWQoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1RdWV1ZUl0ZW1Mb2NrKTsKKyAgICBpZiAobVF1ZXVlSXRlbXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiQ2FuJ3QgcmVwbGFjZSBhIGZyYW1lIG9uIGFuIGVtcHR5IHF1ZXVlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVF1ZXVlSXRlbXMuZWRpdEl0ZW1BdCgwKSA9IGl0ZW07Cit9CisKIHZvaWQgTGF5ZXI6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgewogICAgIGlmIChhbmRyb2lkX2F0b21pY19yZWxlYXNlX2NhcyhmYWxzZSwgdHJ1ZSwgJm1TaWRlYmFuZFN0cmVhbUNoYW5nZWQpID09IDApIHsKICAgICAgICAgLy8gbVNpZGViYW5kU3RyZWFtQ2hhbmdlZCB3YXMgZmFsc2UKQEAgLTI3NywxMiArMjkzLDE3IEBACiAKIFJlY3QgTGF5ZXI6OmNvbXB1dGVCb3VuZHMoKSBjb25zdCB7CiAgICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBzKGdldERyYXdpbmdTdGF0ZSgpKTsKKyAgICByZXR1cm4gY29tcHV0ZUJvdW5kcyhzLmFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uKTsKK30KKworUmVjdCBMYXllcjo6Y29tcHV0ZUJvdW5kcyhjb25zdCBSZWdpb24mIGFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uKSBjb25zdCB7CisgICAgY29uc3QgTGF5ZXI6OlN0YXRlJiBzKGdldERyYXdpbmdTdGF0ZSgpKTsKICAgICBSZWN0IHdpbihzLmFjdGl2ZS53LCBzLmFjdGl2ZS5oKTsKICAgICBpZiAoIXMuYWN0aXZlLmNyb3AuaXNFbXB0eSgpKSB7CiAgICAgICAgIHdpbi5pbnRlcnNlY3Qocy5hY3RpdmUuY3JvcCwgJndpbik7CiAgICAgfQogICAgIC8vIHN1YnRyYWN0IHRoZSB0cmFuc3BhcmVudCByZWdpb24gYW5kIHNuYXAgdG8gdGhlIGJvdW5kcwotICAgIHJldHVybiByZWR1Y2Uod2luLCBzLmFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uKTsKKyAgICByZXR1cm4gcmVkdWNlKHdpbiwgYWN0aXZlVHJhbnNwYXJlbnRSZWdpb24pOwogfQogCiBGbG9hdFJlY3QgTGF5ZXI6OmNvbXB1dGVDcm9wKGNvbnN0IHNwPGNvbnN0IERpc3BsYXlEZXZpY2U+JiBodykgY29uc3QgewpAQCAtMzEwLDggKzMzMSwxMiBAQAogICAgIGFjdGl2ZUNyb3AuaW50ZXJzZWN0KGh3LT5nZXRWaWV3cG9ydCgpLCAmYWN0aXZlQ3JvcCk7CiAgICAgYWN0aXZlQ3JvcCA9IHMudHJhbnNmb3JtLmludmVyc2UoKS50cmFuc2Zvcm0oYWN0aXZlQ3JvcCk7CiAKLSAgICAvLyBwYXJhbm9pYTogbWFrZSBzdXJlIHRoZSB3aW5kb3ctY3JvcCBpcyBjb25zdHJhaW5lZCBpbiB0aGUKLSAgICAvLyB3aW5kb3cncyBib3VuZHMKKyAgICAvLyBUaGlzIG5lZWRzIHRvIGJlIGhlcmUgYXMgdHJhbnNmb3JtLnRyYW5zZm9ybShSZWN0KSBjb21wdXRlcyB0aGUKKyAgICAvLyB0cmFuc2Zvcm1lZCByZWN0IGFuZCB0aGVuIHRha2VzIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHJlc3VsdCBiZWZvcmUKKyAgICAvLyByZXR1cm5pbmcuIFRoaXMgbWVhbnMKKyAgICAvLyB0cmFuc2Zvcm0uaW52ZXJzZSgpLnRyYW5zZm9ybSh0cmFuc2Zvcm0udHJhbnNmb3JtKFJlY3QpKSAhPSBSZWN0CisgICAgLy8gaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZmluYWwgcmVjdCBpcyBjbGlwcGVkIHRvIHRoZQorICAgIC8vIGRpc3BsYXkgYm91bmRzLgogICAgIGFjdGl2ZUNyb3AuaW50ZXJzZWN0KFJlY3Qocy5hY3RpdmUudywgcy5hY3RpdmUuaCksICZhY3RpdmVDcm9wKTsKIAogICAgIC8vIHN1YnRyYWN0IHRoZSB0cmFuc3BhcmVudCByZWdpb24gYW5kIHNuYXAgdG8gdGhlIGJvdW5kcwpAQCAtNDA0LDcgKzQyOSwyOSBAQAogCiAgICAgLy8gYXBwbHkgdGhlIGxheWVyJ3MgdHJhbnNmb3JtLCBmb2xsb3dlZCBieSB0aGUgZGlzcGxheSdzIGdsb2JhbCB0cmFuc2Zvcm0KICAgICAvLyBoZXJlIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCB0aGUgbGF5ZXIncyB0cmFuc2Zvcm0gcHJlc2VydmVzIHJlY3RzCi0gICAgUmVjdCBmcmFtZShzLnRyYW5zZm9ybS50cmFuc2Zvcm0oY29tcHV0ZUJvdW5kcygpKSk7CisgICAgUmVnaW9uIGFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uKHMuYWN0aXZlVHJhbnNwYXJlbnRSZWdpb24pOworICAgIGlmICghcy5hY3RpdmUuY3JvcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgUmVjdCBhY3RpdmVDcm9wKHMuYWN0aXZlLmNyb3ApOworICAgICAgICBhY3RpdmVDcm9wID0gcy50cmFuc2Zvcm0udHJhbnNmb3JtKGFjdGl2ZUNyb3ApOworICAgICAgICBhY3RpdmVDcm9wLmludGVyc2VjdChody0+Z2V0Vmlld3BvcnQoKSwgJmFjdGl2ZUNyb3ApOworICAgICAgICBhY3RpdmVDcm9wID0gcy50cmFuc2Zvcm0uaW52ZXJzZSgpLnRyYW5zZm9ybShhY3RpdmVDcm9wKTsKKyAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBoZXJlIGFzIHRyYW5zZm9ybS50cmFuc2Zvcm0oUmVjdCkgY29tcHV0ZXMgdGhlCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIHJlY3QgYW5kIHRoZW4gdGFrZXMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgcmVzdWx0IGJlZm9yZQorICAgICAgICAvLyByZXR1cm5pbmcuIFRoaXMgbWVhbnMKKyAgICAgICAgLy8gdHJhbnNmb3JtLmludmVyc2UoKS50cmFuc2Zvcm0odHJhbnNmb3JtLnRyYW5zZm9ybShSZWN0KSkgIT0gUmVjdAorICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBmaW5hbCByZWN0IGlzIGNsaXBwZWQgdG8gdGhlCisgICAgICAgIC8vIGRpc3BsYXkgYm91bmRzLgorICAgICAgICBhY3RpdmVDcm9wLmludGVyc2VjdChSZWN0KHMuYWN0aXZlLncsIHMuYWN0aXZlLmgpLCAmYWN0aXZlQ3JvcCk7CisgICAgICAgIC8vIG1hcmsgcmVnaW9ucyBvdXRzaWRlIHRoZSBjcm9wIGFzIHRyYW5zcGFyZW50CisgICAgICAgIGFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uLm9yU2VsZihSZWN0KDAsIDAsIHMuYWN0aXZlLncsIGFjdGl2ZUNyb3AudG9wKSk7CisgICAgICAgIGFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uLm9yU2VsZihSZWN0KDAsIGFjdGl2ZUNyb3AuYm90dG9tLAorICAgICAgICAgICAgICAgIHMuYWN0aXZlLncsIHMuYWN0aXZlLmgpKTsKKyAgICAgICAgYWN0aXZlVHJhbnNwYXJlbnRSZWdpb24ub3JTZWxmKFJlY3QoMCwgYWN0aXZlQ3JvcC50b3AsCisgICAgICAgICAgICAgICAgYWN0aXZlQ3JvcC5sZWZ0LCBhY3RpdmVDcm9wLmJvdHRvbSkpOworICAgICAgICBhY3RpdmVUcmFuc3BhcmVudFJlZ2lvbi5vclNlbGYoUmVjdChhY3RpdmVDcm9wLnJpZ2h0LCBhY3RpdmVDcm9wLnRvcCwKKyAgICAgICAgICAgICAgICBzLmFjdGl2ZS53LCBhY3RpdmVDcm9wLmJvdHRvbSkpOworICAgIH0KKyAgICBSZWN0IGZyYW1lKHMudHJhbnNmb3JtLnRyYW5zZm9ybShjb21wdXRlQm91bmRzKGFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uKSkpOwogICAgIGZyYW1lLmludGVyc2VjdChody0+Z2V0Vmlld3BvcnQoKSwgJmZyYW1lKTsKICAgICBjb25zdCBUcmFuc2Zvcm0mIHRyKGh3LT5nZXRUcmFuc2Zvcm0oKSk7CiAgICAgbGF5ZXIuc2V0RnJhbWUodHIudHJhbnNmb3JtKGZyYW1lKSk7CkBAIC05OTIsNiArMTAzOSwxNCBAQAogLy8gcGFnZWZsaXAgaGFuZGxpbmcuLi4KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorYm9vbCBMYXllcjo6c2hvdWxkUHJlc2VudE5vdyhjb25zdCBEaXNwU3luYyYgZGlzcFN5bmMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtUXVldWVJdGVtTG9jayk7CisgICAgbnNlY3NfdCBleHBlY3RlZFByZXNlbnQgPQorICAgICAgICAgICAgbVN1cmZhY2VGbGluZ2VyQ29uc3VtZXItPmNvbXB1dGVFeHBlY3RlZFByZXNlbnQoZGlzcFN5bmMpOworICAgIHJldHVybiBtUXVldWVJdGVtcy5lbXB0eSgpID8KKyAgICAgICAgICAgIGZhbHNlIDogbVF1ZXVlSXRlbXNbMF0ubVRpbWVzdGFtcCA8IGV4cGVjdGVkUHJlc2VudDsKK30KKwogYm9vbCBMYXllcjo6b25QcmVDb21wb3NpdGlvbigpIHsKICAgICBtUmVmcmVzaFBlbmRpbmcgPSBmYWxzZTsKICAgICByZXR1cm4gbVF1ZXVlZEZyYW1lcyA+IDAgfHwgbVNpZGViYW5kU3RyZWFtQ2hhbmdlZDsKQEAgLTExODEsNiArMTIzNiwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIG91dERpcnR5UmVnaW9uOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gUmVtb3ZlIHRoaXMgYnVmZmVyIGZyb20gb3VyIGludGVybmFsIHF1ZXVlIHRyYWNrZXIKKyAgICAgICAgeyAvLyBBdXRvbG9jayBzY29wZQorICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVF1ZXVlSXRlbUxvY2spOworICAgICAgICAgICAgbVF1ZXVlSXRlbXMucmVtb3ZlQXQoMCk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBEZWNyZW1lbnQgdGhlIHF1ZXVlZC1mcmFtZXMgY291bnQuICBTaWduYWwgYW5vdGhlciBldmVudCBpZiB3ZQogICAgICAgICAvLyBoYXZlIG1vcmUgZnJhbWVzIHBlbmRpbmcuCiAgICAgICAgIGlmIChhbmRyb2lkX2F0b21pY19kZWMoJm1RdWV1ZWRGcmFtZXMpID4gMSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyLmgKaW5kZXggMmVmMzllOC4uNDI0YzAzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXIuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllci5oCkBAIC0xNDIsNiArMTQyLDcgQEAKIAogICAgIHZvaWQgY29tcHV0ZUdlb21ldHJ5KGNvbnN0IHNwPGNvbnN0IERpc3BsYXlEZXZpY2U+JiBodywgTWVzaCYgbWVzaCwKICAgICAgICAgICAgIGJvb2wgdXNlSWRlbnRpdHlUcmFuc2Zvcm0pIGNvbnN0OworICAgIFJlY3QgY29tcHV0ZUJvdW5kcyhjb25zdCBSZWdpb24mIGFjdGl2ZVRyYW5zcGFyZW50UmVnaW9uKSBjb25zdDsKICAgICBSZWN0IGNvbXB1dGVCb3VuZHMoKSBjb25zdDsKIAogICAgIHNwPElCaW5kZXI+IGdldEhhbmRsZSgpOwpAQCAtMjA5LDYgKzIxMCw4IEBACiAgICAgdm9pZCBvbkxheWVyRGlzcGxheWVkKGNvbnN0IHNwPGNvbnN0IERpc3BsYXlEZXZpY2U+JiBodywKICAgICAgICAgICAgIEhXQ29tcG9zZXI6OkhXQ0xheWVySW50ZXJmYWNlKiBsYXllcik7CiAKKyAgICBib29sIHNob3VsZFByZXNlbnROb3coY29uc3QgRGlzcFN5bmMmIGRpc3BTeW5jKSBjb25zdDsKKwogICAgIC8qCiAgICAgICogY2FsbGVkIGJlZm9yZSBjb21wb3NpdGlvbi4KICAgICAgKiByZXR1cm5zIHRydWUgaWYgdGhlIGxheWVyIGhhcyBwZW5kaW5nIHVwZGF0ZXMuCkBAIC0zMjksNyArMzMyLDggQEAKIAogcHJpdmF0ZToKICAgICAvLyBJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIFN1cmZhY2VGbGluZ2VyQ29uc3VtZXI6OkNvbnRlbnRzQ2hhbmdlZExpc3RlbmVyCi0gICAgdmlydHVhbCB2b2lkIG9uRnJhbWVBdmFpbGFibGUoKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlcGxhY2VkKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOwogICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOwogCiAgICAgdm9pZCBjb21taXRUcmFuc2FjdGlvbigpOwpAQCAtNDAyLDYgKzQwNiwxMCBAQAogCiAgICAgLy8gVGhpcyBsYXllciBjYW4gYmUgYSBjdXJzb3Igb24gc29tZSBkaXNwbGF5cy4KICAgICBib29sIG1Qb3RlbnRpYWxDdXJzb3I7CisKKyAgICAvLyBMb2NhbCBjb3B5IG9mIHRoZSBxdWV1ZWQgY29udGVudHMgb2YgdGhlIGluY29taW5nIEJ1ZmZlclF1ZXVlCisgICAgbXV0YWJsZSBNdXRleCBtUXVldWVJdGVtTG9jazsKKyAgICBWZWN0b3I8QnVmZmVySXRlbT4gbVF1ZXVlSXRlbXM7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9MYXllckRpbS5oCmluZGV4IDYwZWRkOTEuLmEwY2ZjYTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL0xheWVyRGltLmgKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTGF5ZXJEaW0uaApAQCAtMjgsNyArMjgsNyBAQAogCiBjbGFzcyBMYXllckRpbSA6IHB1YmxpYyBMYXllcgogewotcHVibGljOiAgICAKK3B1YmxpYzoKICAgICAgICAgICAgICAgICBMYXllckRpbShTdXJmYWNlRmxpbmdlciogZmxpbmdlciwgY29uc3Qgc3A8Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZmxhZ3MpOwogICAgICAgICB2aXJ0dWFsIH5MYXllckRpbSgpOwpAQCAtMzYsOCArMzYsNyBAQAogICAgIHZpcnR1YWwgY29uc3QgY2hhciogZ2V0VHlwZUlkKCkgY29uc3QgeyByZXR1cm4gIkxheWVyRGltIjsgfQogICAgIHZpcnR1YWwgdm9pZCBvbkRyYXcoY29uc3Qgc3A8Y29uc3QgRGlzcGxheURldmljZT4mIGh3LCBjb25zdCBSZWdpb24mIGNsaXAsCiAgICAgICAgICAgICBib29sIHVzZUlkZW50aXR5VHJhbnNmb3JtKSBjb25zdDsKLSAgICB1c2luZyBMYXllcjo6aXNPcGFxdWU7Ci0gICAgdmlydHVhbCBib29sIGlzT3BhcXVlKCkgY29uc3QgICAgICAgICB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc09wYXF1ZShjb25zdCBMYXllcjo6U3RhdGUmKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1NlY3VyZSgpIGNvbnN0ICAgICAgICAgeyByZXR1cm4gZmFsc2U7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFNpemUoKSBjb25zdCAgICAgIHsgcmV0dXJuIHRydWU7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNWaXNpYmxlKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9Nb25pdG9yZWRQcm9kdWNlci5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9Nb25pdG9yZWRQcm9kdWNlci5jcHAKaW5kZXggZTRlN2Q0Mi4uMzdhMDQ0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTW9uaXRvcmVkUHJvZHVjZXIuY3BwCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01vbml0b3JlZFByb2R1Y2VyLmNwcApAQCAtNjEsNyArNjEsNyBAQAogfQogCiBzdGF0dXNfdCBNb25pdG9yZWRQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlcihpbnQqIHNsb3QsIHNwPEZlbmNlPiogZmVuY2UsCi0gICAgICAgIGJvb2wgYXN5bmMsIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpIHsKKyAgICAgICAgYm9vbCBhc3luYywgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgewogICAgIHJldHVybiBtUHJvZHVjZXItPmRlcXVldWVCdWZmZXIoc2xvdCwgZmVuY2UsIGFzeW5jLCB3LCBoLCBmb3JtYXQsIHVzYWdlKTsKIH0KIApAQCAtMTA2LDcgKzEwNiw3IEBACiB9CiAKIHZvaWQgTW9uaXRvcmVkUHJvZHVjZXI6OmFsbG9jYXRlQnVmZmVycyhib29sIGFzeW5jLCB1aW50MzJfdCB3aWR0aCwKLSAgICAgICAgdWludDMyX3QgaGVpZ2h0LCBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKSB7CisgICAgICAgIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSkgewogICAgIG1Qcm9kdWNlci0+YWxsb2NhdGVCdWZmZXJzKGFzeW5jLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTW9uaXRvcmVkUHJvZHVjZXIuaCBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL01vbml0b3JlZFByb2R1Y2VyLmgKaW5kZXggYWVjM2U4NS4uZjZjY2M1MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvTW9uaXRvcmVkUHJvZHVjZXIuaAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9Nb25pdG9yZWRQcm9kdWNlci5oCkBAIC0zNyw3ICszNyw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXF1ZXN0QnVmZmVyKGludCBzbG90LCBzcDxHcmFwaGljQnVmZmVyPiogYnVmKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlckNvdW50KGludCBidWZmZXJDb3VudCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQnVmZmVyKGludCogc2xvdCwgc3A8RmVuY2U+KiBmZW5jZSwgYm9vbCBhc3luYywKLSAgICAgICAgICAgIHVpbnQzMl90IHcsIHVpbnQzMl90IGgsIFBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOworICAgICAgICAgICAgdWludDMyX3QgdywgdWludDMyX3QgaCwgdWludDMyX3QgZm9ybWF0LCB1aW50MzJfdCB1c2FnZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoaW50IHNsb3QpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGV0YWNoTmV4dEJ1ZmZlcihzcDxHcmFwaGljQnVmZmVyPiogb3V0QnVmZmVyLAogICAgICAgICAgICAgc3A8RmVuY2U+KiBvdXRGZW5jZSk7CkBAIC01Miw3ICs1Miw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KGludCBhcGkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U2lkZWJhbmRTdHJlYW0oY29uc3Qgc3A8TmF0aXZlSGFuZGxlPiYgc3RyZWFtKTsKICAgICB2aXJ0dWFsIHZvaWQgYWxsb2NhdGVCdWZmZXJzKGJvb2wgYXN5bmMsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICBQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UpOwogICAgIHZpcnR1YWwgSUJpbmRlciogb25Bc0JpbmRlcigpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvUmVuZGVyRW5naW5lL1JlbmRlckVuZ2luZS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9SZW5kZXJFbmdpbmUvUmVuZGVyRW5naW5lLmNwcAppbmRleCA3NjdiNzE0Li43Y2Q0MmU0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9SZW5kZXJFbmdpbmUvUmVuZGVyRW5naW5lLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9SZW5kZXJFbmdpbmUvUmVuZGVyRW5naW5lLmNwcApAQCAtMjE5LDYgKzIxOSwxMCBAQAogICAgIGRyYXdNZXNoKG1lc2gpOwogfQogCit2b2lkIFJlbmRlckVuZ2luZTo6Zmx1c2goKSB7CisgICAgZ2xGbHVzaCgpOworfQorCiB2b2lkIFJlbmRlckVuZ2luZTo6Y2xlYXJXaXRoQ29sb3IoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpIHsKICAgICBnbENsZWFyQ29sb3IocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9SZW5kZXJFbmdpbmUvUmVuZGVyRW5naW5lLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9SZW5kZXJFbmdpbmUvUmVuZGVyRW5naW5lLmgKaW5kZXggYWNiZmY5Yi4uOGQ3NTI5YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvUmVuZGVyRW5naW5lL1JlbmRlckVuZ2luZS5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1JlbmRlckVuZ2luZS9SZW5kZXJFbmdpbmUuaApAQCAtNjcsNiArNjcsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzgmIHJlc3VsdCk7CiAKICAgICAvLyBoZWxwZXJzCisgICAgdm9pZCBmbHVzaCgpOwogICAgIHZvaWQgY2xlYXJXaXRoQ29sb3IoZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpOwogICAgIHZvaWQgZmlsbFJlZ2lvbldpdGhDb2xvcihjb25zdCBSZWdpb24mIHJlZ2lvbiwgdWludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgZmxvYXQgcmVkLCBmbG9hdCBncmVlbiwgZmxvYXQgYmx1ZSwgZmxvYXQgYWxwaGEpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuY3BwCmluZGV4IDZhNWEzOWUuLjM0MTkyOTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5jcHAKQEAgLTUwNiw2ICs1MDYsOSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmICghZGlzcGxheS5nZXQoKSkKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworCiAgICAgaW50MzJfdCB0eXBlID0gTkFNRV9OT1RfRk9VTkQ7CiAgICAgZm9yIChpbnQgaT0wIDsgaTxEaXNwbGF5RGV2aWNlOjpOVU1fQlVJTFRJTl9ESVNQTEFZX1RZUEVTIDsgaSsrKSB7CiAgICAgICAgIGlmIChkaXNwbGF5ID09IG1CdWlsdGluRGlzcGxheXNbaV0pIHsKQEAgLTY1Miw3ICs2NTUsNyBAQAogICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlcigpIHsKICAgICAgICAgICAgIFZlY3RvcjxEaXNwbGF5SW5mbz4gY29uZmlnczsKICAgICAgICAgICAgIG1GbGluZ2VyLmdldERpc3BsYXlDb25maWdzKG1EaXNwbGF5LCAmY29uZmlncyk7Ci0gICAgICAgICAgICBpZihtTW9kZSA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtTW9kZSkgPj0gY29uZmlncy5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmIChtTW9kZSA8IDAgfHwgbU1vZGUgPj0gc3RhdGljX2Nhc3Q8aW50Pihjb25maWdzLnNpemUoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBzZXQgYWN0aXZlIGNvbmZpZyA9ICVkIGZvciBkaXNwbGF5IHdpdGggJXp1IGNvbmZpZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgbU1vZGUsIGNvbmZpZ3Muc2l6ZSgpKTsKICAgICAgICAgICAgIH0KQEAgLTgyNSwzMCArODI4LDQxIEBACiB2b2lkIFN1cmZhY2VGbGluZ2VyOjpvbk1lc3NhZ2VSZWNlaXZlZChpbnQzMl90IHdoYXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN3aXRjaCAod2hhdCkgewotICAgIGNhc2UgTWVzc2FnZVF1ZXVlOjpUUkFOU0FDVElPTjoKLSAgICAgICAgaGFuZGxlTWVzc2FnZVRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTWVzc2FnZVF1ZXVlOjpJTlZBTElEQVRFOgotICAgICAgICBoYW5kbGVNZXNzYWdlVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgaGFuZGxlTWVzc2FnZUludmFsaWRhdGUoKTsKLSAgICAgICAgc2lnbmFsUmVmcmVzaCgpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1lc3NhZ2VRdWV1ZTo6UkVGUkVTSDoKLSAgICAgICAgaGFuZGxlTWVzc2FnZVJlZnJlc2goKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTWVzc2FnZVF1ZXVlOjpUUkFOU0FDVElPTjogeworICAgICAgICAgICAgaGFuZGxlTWVzc2FnZVRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIE1lc3NhZ2VRdWV1ZTo6SU5WQUxJREFURTogeworICAgICAgICAgICAgYm9vbCByZWZyZXNoTmVlZGVkID0gaGFuZGxlTWVzc2FnZVRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICByZWZyZXNoTmVlZGVkIHw9IGhhbmRsZU1lc3NhZ2VJbnZhbGlkYXRlKCk7CisgICAgICAgICAgICByZWZyZXNoTmVlZGVkIHw9IG1SZXBhaW50RXZlcnl0aGluZzsKKyAgICAgICAgICAgIGlmIChyZWZyZXNoTmVlZGVkKSB7CisgICAgICAgICAgICAgICAgLy8gU2lnbmFsIGEgcmVmcmVzaCBpZiBhIHRyYW5zYWN0aW9uIG1vZGlmaWVkIHRoZSB3aW5kb3cgc3RhdGUsCisgICAgICAgICAgICAgICAgLy8gYSBuZXcgYnVmZmVyIHdhcyBsYXRjaGVkLCBvciBpZiBIV0MgaGFzIHJlcXVlc3RlZCBhIGZ1bGwKKyAgICAgICAgICAgICAgICAvLyByZXBhaW50CisgICAgICAgICAgICAgICAgc2lnbmFsUmVmcmVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBNZXNzYWdlUXVldWU6OlJFRlJFU0g6IHsKKyAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2VSZWZyZXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlTWVzc2FnZVRyYW5zYWN0aW9uKCkgeworYm9vbCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlTWVzc2FnZVRyYW5zYWN0aW9uKCkgewogICAgIHVpbnQzMl90IHRyYW5zYWN0aW9uRmxhZ3MgPSBwZWVrVHJhbnNhY3Rpb25GbGFncyhlVHJhbnNhY3Rpb25NYXNrKTsKICAgICBpZiAodHJhbnNhY3Rpb25GbGFncykgewogICAgICAgICBoYW5kbGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbkZsYWdzKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBTdXJmYWNlRmxpbmdlcjo6aGFuZGxlTWVzc2FnZUludmFsaWRhdGUoKSB7Citib29sIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVNZXNzYWdlSW52YWxpZGF0ZSgpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGhhbmRsZVBhZ2VGbGlwKCk7CisgICAgcmV0dXJuIGhhbmRsZVBhZ2VGbGlwKCk7CiB9CiAKIHZvaWQgU3VyZmFjZUZsaW5nZXI6OmhhbmRsZU1lc3NhZ2VSZWZyZXNoKCkgewpAQCAtMTMyOSw3ICsxMzQzLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBldGMuKSBidXQgbm8gaW50ZXJuYWwgc3RhdGUgKGkuZS4gYSBEaXNwbGF5RGV2aWNlKS4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zdXJmYWNlICE9IE5VTEwpIHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3Y0Rpc3BsYXlJZCA9IGFsbG9jYXRlSHdjRGlzcGxheUlkKHN0YXRlLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IHN0YXRlLnN1cmZhY2UtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19XSURUSCwgJndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHF1ZXJ5IHdpZHRoICglZCkiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRlLnN1cmZhY2UtPnF1ZXJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19IRUlHSFQsICZoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcXVlcnkgaGVpZ2h0ICglZCkiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNQVhfVklSVFVBTF9ESVNQTEFZX0RJTUVOU0lPTiA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2lkdGggPD0gTUFYX1ZJUlRVQUxfRElTUExBWV9ESU1FTlNJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPD0gTUFYX1ZJUlRVQUxfRElTUExBWV9ESU1FTlNJT04pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3Y0Rpc3BsYXlJZCA9IGFsbG9jYXRlSHdjRGlzcGxheUlkKHN0YXRlLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFZpcnR1YWxEaXNwbGF5U3VyZmFjZT4gdmRzID0gbmV3IFZpcnR1YWxEaXNwbGF5U3VyZmFjZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptSHdjLCBod2NEaXNwbGF5SWQsIHN0YXRlLnN1cmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicVByb2R1Y2VyLCBicUNvbnN1bWVyLCBzdGF0ZS5kaXNwbGF5TmFtZSk7CkBAIC0xNjY4LDEyICsxNjk3LDEzIEBACiAgICAgfQogfQogCi12b2lkIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVQYWdlRmxpcCgpCitib29sIFN1cmZhY2VGbGluZ2VyOjpoYW5kbGVQYWdlRmxpcCgpCiB7CiAgICAgUmVnaW9uIGRpcnR5UmVnaW9uOwogCiAgICAgYm9vbCB2aXNpYmxlUmVnaW9ucyA9IGZhbHNlOwogICAgIGNvbnN0IExheWVyVmVjdG9yJiBsYXllcnMobURyYXdpbmdTdGF0ZS5sYXllcnNTb3J0ZWRCeVopOworICAgIGJvb2wgZnJhbWVRdWV1ZWQgPSBmYWxzZTsKIAogICAgIC8vIFN0b3JlIHRoZSBzZXQgb2YgbGF5ZXJzIHRoYXQgbmVlZCB1cGRhdGVzLiBUaGlzIHNldCBtdXN0IG5vdCBjaGFuZ2UgYXMKICAgICAvLyBidWZmZXJzIGFyZSBiZWluZyBsYXRjaGVkLCBhcyB0aGlzIGNvdWxkIHJlc3VsdCBpbiBhIGRlYWRsb2NrLgpAQCAtMTY4Nyw4ICsxNzE3LDEyIEBACiAgICAgVmVjdG9yPExheWVyKj4gbGF5ZXJzV2l0aFF1ZXVlZEZyYW1lczsKICAgICBmb3IgKHNpemVfdCBpID0gMCwgY291bnQgPSBsYXllcnMuc2l6ZSgpOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPExheWVyPiYgbGF5ZXIobGF5ZXJzW2ldKTsKLSAgICAgICAgaWYgKGxheWVyLT5oYXNRdWV1ZWRGcmFtZSgpKQotICAgICAgICAgICAgbGF5ZXJzV2l0aFF1ZXVlZEZyYW1lcy5wdXNoX2JhY2sobGF5ZXIuZ2V0KCkpOworICAgICAgICBpZiAobGF5ZXItPmhhc1F1ZXVlZEZyYW1lKCkpIHsKKyAgICAgICAgICAgIGZyYW1lUXVldWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChsYXllci0+c2hvdWxkUHJlc2VudE5vdyhtUHJpbWFyeURpc3BTeW5jKSkgeworICAgICAgICAgICAgICAgIGxheWVyc1dpdGhRdWV1ZWRGcmFtZXMucHVzaF9iYWNrKGxheWVyLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMCwgY291bnQgPSBsYXllcnNXaXRoUXVldWVkRnJhbWVzLnNpemUoKSA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgTGF5ZXIqIGxheWVyID0gbGF5ZXJzV2l0aFF1ZXVlZEZyYW1lc1tpXTsKQEAgLTE2OTgsNiArMTczMiwxNiBAQAogICAgIH0KIAogICAgIG1WaXNpYmxlUmVnaW9uc0RpcnR5IHw9IHZpc2libGVSZWdpb25zOworCisgICAgLy8gSWYgd2Ugd2lsbCBuZWVkIHRvIHdha2UgdXAgYXQgc29tZSB0aW1lIGluIHRoZSBmdXR1cmUgdG8gZGVhbCB3aXRoIGEKKyAgICAvLyBxdWV1ZWQgZnJhbWUgdGhhdCBzaG91bGRuJ3QgYmUgZGlzcGxheWVkIGR1cmluZyB0aGlzIHZzeW5jIHBlcmlvZCwgd2FrZQorICAgIC8vIHVwIGR1cmluZyB0aGUgbmV4dCB2c3luYyBwZXJpb2QgdG8gY2hlY2sgYWdhaW4uCisgICAgaWYgKGZyYW1lUXVldWVkICYmIGxheWVyc1dpdGhRdWV1ZWRGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICBzaWduYWxMYXllclVwZGF0ZSgpOworICAgIH0KKworICAgIC8vIE9ubHkgY29udGludWUgd2l0aCB0aGUgcmVmcmVzaCBpZiB0aGVyZSBpcyBhY3R1YWxseSBuZXcgd29yayB0byBkbworICAgIHJldHVybiAhbGF5ZXJzV2l0aFF1ZXVlZEZyYW1lcy5lbXB0eSgpOwogfQogCiB2b2lkIFN1cmZhY2VGbGluZ2VyOjppbnZhbGlkYXRlSHdjR2VvbWV0cnkoKQpAQCAtMzIwMCw2ICszMjQ0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEVHTFN5bmNLSFIgc3luYzsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghREVCVUdfU0NSRUVOU0hPVFMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMgPSBlZ2xDcmVhdGVTeW5jS0hSKG1FR0xEaXNwbGF5LCBFR0xfU1lOQ19OQVRJVkVfRkVOQ0VfQU5EUk9JRCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXRpdmUgZmVuY2UgZmQgd2lsbCBub3QgYmUgcG9wdWxhdGVkIHVudGlsIGZsdXNoKCkgaXMgZG9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbmRlckVuZ2luZSgpLmZsdXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMgPSBFR0xfTk9fU1lOQ19LSFI7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0zMjQ2LDEwICszMjkyLDggQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHF1ZXVlQnVmZmVyIHRha2VzIG93bmVyc2hpcCBvZiBzeW5jRmQKICAgICAgICAgICAgICAgICB3aW5kb3ctPnF1ZXVlQnVmZmVyKHdpbmRvdywgYnVmZmVyLCBzeW5jRmQpOwotICAgICAgICAgICAgICAgIGlmIChzeW5jRmQgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2Uoc3luY0ZkKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXIuaAppbmRleCA3MTBkYWM3Li40ZGViODE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyLmgKQEAgLTI0Nyw4ICsyNDcsMTIgQEAKICAgICAvLyBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkIGluIHJlc3BvbnNlIHRvIHNldFBvd2VyTW9kZSgpCiAgICAgdm9pZCBzZXRQb3dlck1vZGVJbnRlcm5hbChjb25zdCBzcDxEaXNwbGF5RGV2aWNlPiYgaHcsIGludCBtb2RlKTsKIAotICAgIHZvaWQgaGFuZGxlTWVzc2FnZVRyYW5zYWN0aW9uKCk7Ci0gICAgdm9pZCBoYW5kbGVNZXNzYWdlSW52YWxpZGF0ZSgpOworICAgIC8vIFJldHVybnMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gYWN0dWFsbHkgbW9kaWZpZWQgYW55IHN0YXRlCisgICAgYm9vbCBoYW5kbGVNZXNzYWdlVHJhbnNhY3Rpb24oKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBhIG5ldyBidWZmZXIgaGFzIGJlZW4gbGF0Y2hlZCAoc2VlIGhhbmRsZVBhZ2VGbGlwKCkpCisgICAgYm9vbCBoYW5kbGVNZXNzYWdlSW52YWxpZGF0ZSgpOworCiAgICAgdm9pZCBoYW5kbGVNZXNzYWdlUmVmcmVzaCgpOwogCiAgICAgdm9pZCBoYW5kbGVUcmFuc2FjdGlvbih1aW50MzJfdCB0cmFuc2FjdGlvbkZsYWdzKTsKQEAgLTI1NiwxMCArMjYwLDExIEBACiAKICAgICB2b2lkIHVwZGF0ZUN1cnNvckFzeW5jKCk7CiAKLSAgICAvKiBoYW5kbGVQYWdlRmlscDogdGhpcyBpcyB3ZXJlIHdlIGxhdGNoIGEgbmV3IGJ1ZmZlcgotICAgICAqIGlmIGF2YWlsYWJsZSBhbmQgY29tcHV0ZSB0aGUgZGlydHkgcmVnaW9uLgorICAgIC8qIGhhbmRsZVBhZ2VGbGlwIC0gbGF0Y2ggYSBuZXcgYnVmZmVyIGlmIGF2YWlsYWJsZSBhbmQgY29tcHV0ZSB0aGUgZGlydHkKKyAgICAgKiByZWdpb24uIFJldHVybnMgd2hldGhlciBhIG5ldyBidWZmZXIgaGFzIGJlZW4gbGF0Y2hlZCwgaS5lLiwgd2hldGhlciBpdAorICAgICAqIGlzIG5lY2Vzc2FyeSB0byBwZXJmb3JtIGEgcmVmcmVzaCBkdXJpbmcgdGhpcyB2c3luYy4KICAgICAgKi8KLSAgICB2b2lkIGhhbmRsZVBhZ2VGbGlwKCk7CisgICAgYm9vbCBoYW5kbGVQYWdlRmxpcCgpOwogCiAgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICogVHJhbnNhY3Rpb25zCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlckNvbnN1bWVyLmggYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9TdXJmYWNlRmxpbmdlckNvbnN1bWVyLmgKaW5kZXggNTYzMzk4MC4uMjhmMmY2YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvU3VyZmFjZUZsaW5nZXJDb25zdW1lci5oCisrKyBiL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1N1cmZhY2VGbGluZ2VyQ29uc3VtZXIuaApAQCAtNjcsOSArNjcsOSBAQAogCiAgICAgc3A8TmF0aXZlSGFuZGxlPiBnZXRTaWRlYmFuZFN0cmVhbSgpIGNvbnN0OwogCi1wcml2YXRlOgogICAgIG5zZWNzX3QgY29tcHV0ZUV4cGVjdGVkUHJlc2VudChjb25zdCBEaXNwU3luYyYgZGlzcFN5bmMpOwogCitwcml2YXRlOgogICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOwogCiAgICAgd3A8Q29udGVudHNDaGFuZ2VkTGlzdGVuZXI+IG1Db250ZW50c0NoYW5nZWRMaXN0ZW5lcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5jcHAgYi9zZXJ2aWNlcy9zdXJmYWNlZmxpbmdlci9UcmFuc2Zvcm0uY3BwCmluZGV4IDM0NTZhYmYuLjM1ZTdlN2QgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3N1cmZhY2VmbGluZ2VyL1RyYW5zZm9ybS5jcHAKKysrIGIvc2VydmljZXMvc3VyZmFjZWZsaW5nZXIvVHJhbnNmb3JtLmNwcApAQCAtMzAxLDE2ICszMDEsMTYgQEAKICAgICAvLyAoVCpNKV4tMSA9IE1eLTEgKiBUXi0xCiAgICAgVHJhbnNmb3JtIHJlc3VsdDsKICAgICBpZiAobVR5cGUgPD0gVFJBTlNMQVRFKSB7Ci0gICAgICAgIC8vIDEgMCB4Ci0gICAgICAgIC8vIDAgMSB5Ci0gICAgICAgIC8vIDAgMCAxCisgICAgICAgIC8vIDEgMCAwCisgICAgICAgIC8vIDAgMSAwCisgICAgICAgIC8vIHggeSAxCiAgICAgICAgIHJlc3VsdCA9ICp0aGlzOwogICAgICAgICByZXN1bHQubU1hdHJpeFsyXVswXSA9IC1yZXN1bHQubU1hdHJpeFsyXVswXTsKICAgICAgICAgcmVzdWx0Lm1NYXRyaXhbMl1bMV0gPSAtcmVzdWx0Lm1NYXRyaXhbMl1bMV07CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gYSBjIHgKLSAgICAgICAgLy8gYiBkIHkKLSAgICAgICAgLy8gMCAwIDEKKyAgICAgICAgLy8gYSBjIDAKKyAgICAgICAgLy8gYiBkIDAKKyAgICAgICAgLy8geCB5IDEKICAgICAgICAgY29uc3QgbWF0MzMmIE0obU1hdHJpeCk7CiAgICAgICAgIGNvbnN0IGZsb2F0IGEgPSBNWzBdWzBdOwogICAgICAgICBjb25zdCBmbG9hdCBiID0gTVsxXVswXTsKQEAgLTMxOSwxNiArMzE5LDE3IEBACiAgICAgICAgIGNvbnN0IGZsb2F0IHggPSBNWzJdWzBdOwogICAgICAgICBjb25zdCBmbG9hdCB5ID0gTVsyXVsxXTsKIAotICAgICAgICBUcmFuc2Zvcm0gUiwgVDsKICAgICAgICAgY29uc3QgZmxvYXQgaWRldCA9IDEuMCAvIChhKmQgLSBiKmMpOwotICAgICAgICBSLm1NYXRyaXhbMF1bMF0gPSAgZCppZGV0OyAgICBSLm1NYXRyaXhbMF1bMV0gPSAtYyppZGV0OwotICAgICAgICBSLm1NYXRyaXhbMV1bMF0gPSAtYippZGV0OyAgICBSLm1NYXRyaXhbMV1bMV0gPSAgYSppZGV0OwotICAgICAgICBSLm1UeXBlID0gbVR5cGUgJj0gflRSQU5TTEFURTsKKyAgICAgICAgcmVzdWx0Lm1NYXRyaXhbMF1bMF0gPSAgZCppZGV0OworICAgICAgICByZXN1bHQubU1hdHJpeFswXVsxXSA9IC1jKmlkZXQ7CisgICAgICAgIHJlc3VsdC5tTWF0cml4WzFdWzBdID0gLWIqaWRldDsKKyAgICAgICAgcmVzdWx0Lm1NYXRyaXhbMV1bMV0gPSAgYSppZGV0OworICAgICAgICByZXN1bHQubVR5cGUgPSBtVHlwZTsKIAotICAgICAgICBULm1NYXRyaXhbMl1bMF0gPSAteDsKLSAgICAgICAgVC5tTWF0cml4WzJdWzFdID0gLXk7Ci0gICAgICAgIFQubVR5cGUgPSBUUkFOU0xBVEU7Ci0gICAgICAgIHJlc3VsdCA9ICBSICogVDsKKyAgICAgICAgdmVjMiBUKC14LCAteSk7CisgICAgICAgIFQgPSByZXN1bHQudHJhbnNmb3JtKFQpOworICAgICAgICByZXN1bHQubU1hdHJpeFsyXVswXSA9IFRbMF07CisgICAgICAgIHJlc3VsdC5tTWF0cml4WzJdWzFdID0gVFsxXTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0K