ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCBlN2M1MjM5Li4yNWI4MDQ3IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDEzICsxLDI2IEBACisyMDAxLTExLTIwICBEYXZpZCBUdXJuZXIgICAgICAgPGRhdmlkQGZyZWV0eXBlLm9yZz4KKworICAgICAgICAqIHNyYy9wc2hpbnRlci97cHNoYWxnbzIuYywgcHNoYWxnbzEuY306IGZpeGVkIHN0dXBpZCBidWcgaW4gc29ydGluZworICAgICAgICByb3V0aW5lIHRoYXQgY3JlYXRlZCBuYXN0eSBhbGlnbm1lbnQgYXJ0ZWZhY3RzLgorCisgICAgICAgICogc3JjL3BzaGludGVyL3BzaHJlYy5jLCB0ZXN0cy9ndmlldy5jOiBkZWJ1Z2dpbmcgdXBkYXRlcy4uCisKKyAgICAgICAgKiBzcmMvc21vb3RoL2Z0Z3JheXMuYzogZGUtYWN0aXZhdGVkIGV4cGVyaW1lbnRhbCBnYW1tZSBzdXBwb3J0LAorICAgICAgICBhcHBhcmVudGx5LCAib3B0aW1hbCIgZ2FtbWEgdGFibGVzIGRlcGVuZCBvbiB0aGUgbW9uaXRvciB0eXBlLAorICAgICAgICByZXNvbHV0aW9uIGFuZCBnZW5lcmFsIGthcm1hLCBzbyBpdCdzIGJldHRlciB0byBjb21wdXRlIHRoZW0gb3V0c2lkZQorICAgICAgICBvZiB0aGUgcmFzdGVyaXplciBpdHNlbGYuLgorCisKIDIwMDEtMTAtMjkgIERhdmlkIFR1cm5lciAgICAgICA8ZGF2aWRAZnJlZXR5cGUub3JnPgogCiAJKiBzcmMvc21vb3RoL2Z0Z3JheXMuYzogYWRkaW5nIGV4cGVyaW1lbnRhbCAiZ2FtbWEiIHN1cHBvcnQuIFRoaXMKIAlwcm9kdWNlcyBzbW9vdGhlciBnbHlwaHMgYXQgc21hbGwgc2l6ZXMgZm9yIHZlcnkgbGl0dGxlIGNvc3QKLQkKKwogCSogc3JjL2F1dG9oaW50L2FoZ2x5cGguYywgc3JjL2F1dG9oaW50L2FoaGludC5jOiB2YXJpb3VzIGZpeGVzIHRvCiAJdGhlIGF1dG8taGludGVyLiBUaGV5IG1lcmVseSBpbXByb3ZlIHRoZSBvdXRwdXQgb2Ygc2Fucy1zZXJpZiBmb250cy4KIAlOb3RlIHRoYXQgdGhlcmUgYXJlIHN0aWxsIHByb2JsZW1zIHdpdGggc2VyaWZlZCBmb250cyBhbmQgY29tcG9zaXRlcwogCShhY2NlbnRlZCBjaGFyYWN0ZXJzKQotCQorCiAJKiB0ZXN0cy9ndmlldy5jOiB1cGRhdGVkIHRoZSBkZWJ1Z2dpbmcgZ2x5cGggdmlld2VyIHRvIHNob3cgdGhlCiAJaGludHMgZ2VuZXJhdGVkIGJ5IHRoZSAiYXV0b2hpbnQiIG1vZHVsZQogCkBAIC0yMiwxNSArMzUsMTUgQEAKICAgICAgICAgKiBpbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCwgaW5jbHVkZS9mcmVldHlwZS9jYWNoZS8qLmgsCiAgICAgICAgIHNyYy9jYWNoZS8qLmM6IE1ham9yIHJlLWRlc2lnbiBvZiB0aGUgY2FjaGUgc3ViLXN5c3RlbSB0byBwcm92aWRlCiAgICAgICAgIGJldHRlciBwZXJmb3JtYW5jZSBhcyB3ZWxsIGFzIGFuICJBY3F1aXJlIi8iUmVsZWFzZSIgQVBJLi4KLSAgICAgICAgCisKICAgICAgICAgc2VlbXMgdG8gd29yayB3ZWxsIGhlcmUuLiBidXQgcHJvYmFibHkgbmVlZHMgYSBiaXQgbW9yZSB0ZXN0aW5nLi4KLSAgICAgICAgCisKIAogMjAwMS0xMC0yNiAgTGVvbmFyZCBSb3NlbnRob2wgIDxsZW9uYXJkckBsYXplcndhcmUuY29tPgogCiAJKiB1cGRhdGVkIE1hYyBPUyBSRUFETUUgKGJ1aWxkcy9tYWMvKSB0byByZWZsZWN0IG15IHRha2luZyBvdmVyCiAJdGhlIHByb2plY3QgYW5kIHRoYXQgaXMgbm93IGJlaW5nIGFjdGl2ZWx5IG1haW50YWluZWQuCi0JCisKIAkqIEFwcGxpZWQgcGF0Y2hlcyBmcm9tIFBhdWwgTWlsbGVyICg8cGF1bG1AcHJvZm91bmRlZmZlY3RzLmNvbT4pCiAJdG8gL3NyYy9iYXNlL2Z0bWFjLmMgdG8gc3VwcG9ydCBsb2FkaW5nIGEgZmFjZSBvdGhlciB0aGFuIHRoZQogCWZpcnN0IGZyb20gYSBGT05EIHJlc291cmNlLgpAQCAtNjEsNyArNzQsNyBAQAogCWltcHJvdmVtZW50cyB0byB0aGUgbWVtb3J5IGRlYnVnZ2VyIHRvIHJlcG9ydCBtb3JlIGluZm9ybWF0aW9uIGluCiAJY2FzZSBvZiBlcnJvcnMuIEFsc28sIHNvbWUgYWxsb2NhdGlvbnMgdGhhdCBvY2N1cmVkIHRocm91Z2gKIAlSRUFMTE9DIGNvdWxkbid0IGJlIHByZXZpb3VzbHkgY2F0Y2hlZCBjb3JyZWN0bHkuLgotCQorCiAKIAkqIHNyYy9hdXRvaGludC9haGdseXBoLmMsIHNyYy9yYXN0ZXIvZnRyYXN0ZXIuYywKIAlzcmMvc21vb3RoL2Z0Z3JheXMuYzogcmVwbGFjZWQgbGliZXJhbCB1c2VzIG9mICJtZW1zZXQiIGJ5IHRoZQpAQCAtODcsMTAgKzEwMCwxMCBAQAogCXRoZSBGVF9ERUJVR19NRU1PUlkgbWFjcm8gaW4gImZ0b3B0aW9uLmgiIHRvIGVuYWJsZSBpdC4gSXQgd2lsbCByZWNvcmQKIAlldmVyeSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGFuZCByZXBvcnQgc2ltcGxlIGVycm9ycyBsaWtlIG1lbW9yeQogCWxlYWtzIGFuZCBkb3VibGUgZGVsZXRlcy4KLQkKKwogCSogaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaDogYWRkZWQgdGhlIEZUX0RFQlVHX01FTU9SWSBtYWNybwogCWRlZmluaXRpb24KLQkKKwogCSogc3JjL2Jhc2UvZnRzeXN0ZW0uYyAoRlRfTmV3X01lbW9yeSwgRlRfRG9uZV9NZW1vcnkpOiBtb2RpZmllZCB0aGUKIAliYXNlIGNvbXBvbmVudCB0byB1c2UgdGhlIGRlYnVnZ2luZyBtZW1vcnkgbWFuYWdlciB3aGVuIHRoZSBtYWNybwogCUZUX0RFQlVHX01FTU9SWSBpcyBkZWZpbmVkLi4KQEAgLTExNSw3ICsxMjgsNyBAQAogCiAKIDIwMDEtMTAtMjAgIFRvbSBLYWN2aW5za3kgIDx0a2Fjdmluc0BmcmVldHlwZS5vcmc+Ci0JCisKIAkqIHNyYy90eXBlMS90MWxvYWQuYyAocGFyc2VfZW5jb2RpbmcpOiBBZGQgYSB0ZXN0IHRvIG1ha2Ugc3VyZQogCXRoYXQgY3VzdG9tIGVuY29kaW5ncyAoaS5lLiwgbmVpdGhlciBTdGFuZGFyZEVuY29kaW5nIG5vcgogCUV4cGVydEVuY29kaW5nKSBhcmUgbm90IGxvYWRlZCB0d2ljZSB3aGVuIHRoZSBUeXBlIDEgZm9udCBpcwpAQCAtMTYyLDcgKzE3NSw3IEBACiAgICAgICAgIHNvbWUgc3RyYW5nZSBidWdzIGluIHRoZSBQb3N0c2NyaXB0IGhpbnRlcgogCiAgICAgICAgICogc3JjL2NpZC9jaWRnbG9hZC5jOiBhZGRpbmcgc3VwcG9ydCB0byBuZXcgcG9zdHNjcmlwdCBoaW50ZXIKLSAgICAgICAgCisKICAgICAgICAgKiBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzZ2xvYmFsLmgsCiAgICAgICAgICAgaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgsCiAgICAgICAgICAgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaCwKQEAgLTI3Niw3ICsyODksNyBAQAogCVByb3ZpZGUgYSBwdWJsaWMgQVBJIHRvIG1hbmFnZSBtdWx0aXBsZSBzaXplIG9iamVjdHMgZm9yIGEgZ2l2ZW4KIAlGVF9GYWNlIGluIHRoZSBuZXcgaGVhZGVyIGZpbGUgYGZ0c2l6ZXMuaCcuCiAKLQkqIGluY2x1ZGUvZnJlZXR5cGUvZnRzaXplcy5oOiBOZXcgaGVhZGVyIGZpbGUsIAorCSogaW5jbHVkZS9mcmVldHlwZS9mdHNpemVzLmg6IE5ldyBoZWFkZXIgZmlsZSwKIAkqIGluY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmg6IFVzZSBpdC4KIAlSZW1vdmUgZGVjbGFyYXRpb25zIG9mIEZUX05ld19TaXplIGFuZCBGVF9Eb25lX1NpemUgKG1vdmVkIHRvCiAJZnRzaXplcy5oKS4KQEAgLTUyMCw3ICs1MzMsNyBAQAogMjAwMS0wNi0yMiAgRGF2aWQgVHVybmVyIDxkYXZpZEBmcmVldHlwZS5vcmc+CiAKIAkqIGRvY3MvUEFURU5UUzogQWRkZWQgcGF0ZW50cyBkaXNjbGFpbWVyLiAgVGhpcyBvbmUgd2FzIG1pc3NpbmchCi0gICAgCisKIAkqIGRvY3MvQ0hBTkdFUywgZG9jcy90b2RvOiBVcGRhdGVkIGZvciB0aGUgdXBjb21pbmcgMi4wLjQgcmVsZWFzZS4KIAogMjAwMS0wNi0yMCAgV2VybmVyIExlbWJlcmcgIDx3bEBnbnUub3JnPgpkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaGFsZ28xLmMgYi9zcmMvcHNoaW50ZXIvcHNoYWxnbzEuYwppbmRleCBlNjQ5Y2RlLi45ZDYxYmNhIDEwMDY0NAotLS0gYS9zcmMvcHNoaW50ZXIvcHNoYWxnbzEuYworKysgYi9zcmMvcHNoaW50ZXIvcHNoYWxnbzEuYwpAQCAtMTUsNyArMTUsNyBAQAogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAorCiAgLyogcmV0dXJuIHRydWUgaWZmIHR3byBzdGVtIGhpbnRzIG92ZXJsYXAgKi8KICAgc3RhdGljIEZUX0ludAogICBwc2gxX2hpbnRfb3ZlcmxhcCggUFNIMV9IaW50ICBoaW50MSwKQEAgLTI0LDggKzI0LDggQEAKICAgICByZXR1cm4gKCBoaW50MS0+b3JnX3BvcyArIGhpbnQxLT5vcmdfbGVuID49IGhpbnQyLT5vcmdfcG9zICYmCiAgICAgICAgICAgICAgaGludDItPm9yZ19wb3MgKyBoaW50Mi0+b3JnX2xlbiA+PSBoaW50MS0+b3JnX3BvcyApOwogICB9Ci0gCi0gCisKKwogIC8qIGRlc3Ryb3kgaGludHMgdGFibGUgKi8KICAgc3RhdGljIHZvaWQKICAgcHNoMV9oaW50X3RhYmxlX2RvbmUoIFBTSDFfSGludF9UYWJsZSAgdGFibGUsCkBAIC0zNCw3ICszNCw3IEBACiAgICAgRlJFRSggdGFibGUtPnpvbmVzICk7CiAgICAgdGFibGUtPm51bV96b25lcyA9IDA7CiAgICAgdGFibGUtPnpvbmUgICAgICA9IDA7Ci0gICAgCisKICAgICBGUkVFKCB0YWJsZS0+c29ydCApOwogICAgIEZSRUUoIHRhYmxlLT5oaW50cyApOwogICAgIHRhYmxlLT5udW1faGludHMgICA9IDA7CkBAIC00OSw3ICs0OSw3IEBACiAgIHsKICAgICBGVF9VSW50ICAgY291bnQgPSB0YWJsZS0+bWF4X2hpbnRzOwogICAgIFBTSDFfSGludCAgaGludCAgPSB0YWJsZS0+aGludHM7Ci0gICAgCisKICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgaGludCsrICkKICAgICB7CiAgICAgICBwc2gxX2hpbnRfZGVhY3RpdmF0ZShoaW50KTsKQEAgLTcwLDEzICs3MCwxMyBAQAogICAgICAgRlRfRVJST1IoKCAiJXMuYWN0aXZhdGU6IGludmFsaWQgaGludCBpbmRleCAlZFxuIiwgaW5kZXggKSk7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgICAgICAKKwogICAgIC8qIGlnbm9yZSBhY3RpdmUgaGludHMgKi8KICAgICBpZiAoIHBzaDFfaGludF9pc19hY3RpdmUoaGludCkgKQogICAgICAgcmV0dXJuOwotICAgIAorCiAgICAgcHNoMV9oaW50X2FjdGl2YXRlKGhpbnQpOwotICAgIAorCiAgICAgLyogbm93IHNjYW4gdGhlIGN1cnJlbnQgYWN0aXZlIGhpbnQgc2V0IGluIG9yZGVyIHRvIGRldGVybWluZSAqLwogICAgIC8qIGlmIHdlJ3JlIG92ZXJsYXBwaW5nIHdpdGggYW5vdGhlciBzZWdtZW50Li4gICAgICAgICAgICAgICAgKi8KICAgICB7CkBAIC04NCwxMSArODQsMTEgQEAKICAgICAgIEZUX1VJbnQgICAgIGNvdW50ICA9IHRhYmxlLT5udW1faGludHM7CiAgICAgICBQU0gxX0hpbnQgICBoaW50MjsKIAotICAgICAgaGludC0+cGFyZW50ID0gMDsgICAgICAKKyAgICAgIGhpbnQtPnBhcmVudCA9IDA7CiAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc29ydGVkKysgKQogICAgICAgewogICAgICAgICBoaW50MiA9IHNvcnRlZFswXTsKLSAgICAgICAgCisKICAgICAgICAgaWYgKCBwc2gxX2hpbnRfb3ZlcmxhcCggaGludCwgaGludDIgKSApCiAgICAgICAgIHsKICAgICAgICAgICBoaW50LT5wYXJlbnQgPSBoaW50MjsKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIGlmICggdGFibGUtPm51bV9oaW50cyA8IHRhYmxlLT5tYXhfaGludHMgKQogICAgICAgdGFibGUtPnNvcnRfZ2xvYmFsWyB0YWJsZS0+bnVtX2hpbnRzKysgXSA9IGhpbnQ7CiAgICAgZWxzZQpAQCAtMTE1LDE0ICsxMTUsMTQgQEAKICAgICBGVF9CeXRlKiAgY3Vyc29yID0gaGludF9tYXNrLT5ieXRlczsKICAgICBGVF9VSW50ICAgaW5kZXgsIGxpbWl0OwogCi0gICAgbGltaXQgPSBoaW50X21hc2stPm51bV9iaXRzOyAKLSAgICAKKyAgICBsaW1pdCA9IGhpbnRfbWFzay0+bnVtX2JpdHM7CisKICAgICBpZiAoIGxpbWl0ICE9IHRhYmxlLT5tYXhfaGludHMgKQogICAgIHsKICAgICAgIEZUX0VSUk9SKCggIiVzLmFjdGl2YXRlX21hc2s6IGludmFsaWQgYml0IGNvdW50ICglZCBpbnN0ZWFkIG9mICVkKVxuIiwKICAgICAgICAgICAgICAgICAgInBzLmZpdHRlciIsIGhpbnRfbWFzay0+bnVtX2JpdHMsIHRhYmxlLT5tYXhfaGludHMgKSk7CiAgICAgfQotICAgICAgICAKKwogICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsaW1pdDsgaW5kZXgrKyApCiAgICAgewogICAgICAgaWYgKCBtYXNrID09IDAgKQpAQCAtMTMwLDEwICsxMzAsMTAgQEAKICAgICAgICAgdmFsICA9ICpjdXJzb3IrKzsKICAgICAgICAgbWFzayA9IDB4ODA7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaWYgKCB2YWwgJiBtYXNrICkKICAgICAgICAgcHNoMV9oaW50X3RhYmxlX3JlY29yZCggdGFibGUsIGluZGV4ICk7Ci0gICAgICAgIAorCiAgICAgICBtYXNrID4+PSAxOwogICAgIH0KICAgfQpAQCAtMTUxLDI0ICsxNTEsMjQgQEAKICAgICBGVF9FcnJvciAgZXJyb3I7CiAKICAgICBGVF9VTlVTRUQoY291bnRlcl9tYXNrcyk7Ci0gICAgCisKICAgICAvKiBhbGxvY2F0ZSBvdXIgdGFibGVzICovCiAgICAgaWYgKCBBTExPQ19BUlJBWSggdGFibGUtPnNvcnQsICAyKmNvdW50LCAgIFBTSDFfSGludCAgICApIHx8CiAgICAgICAgICBBTExPQ19BUlJBWSggdGFibGUtPmhpbnRzLCAgIGNvdW50LCAgIFBTSDFfSGludFJlYyApIHx8CiAgICAgICAgICBBTExPQ19BUlJBWSggdGFibGUtPnpvbmVzLCAyKmNvdW50KzEsIFBTSDFfWm9uZVJlYyApICkKICAgICAgIGdvdG8gRXhpdDsKLSAgICAKKwogICAgIHRhYmxlLT5tYXhfaGludHMgICA9IGNvdW50OwogICAgIHRhYmxlLT5zb3J0X2dsb2JhbCA9IHRhYmxlLT5zb3J0ICsgY291bnQ7CiAgICAgdGFibGUtPm51bV9oaW50cyAgID0gMDsKICAgICB0YWJsZS0+bnVtX3pvbmVzICAgPSAwOwogICAgIHRhYmxlLT56b25lICAgICAgICA9IDA7Ci0gICAgCisKICAgICAvKiBub3csIGluaXRpYWxpc2UgdGhlICJoaW50cyIgYXJyYXkgKi8KICAgICB7CiAgICAgICBQU0gxX0hpbnQgIHdyaXRlID0gdGFibGUtPmhpbnRzOwogICAgICAgUFNfSGludCAgIHJlYWQgID0gaGludHMtPmhpbnRzOwotICAgICAgCisKICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB3cml0ZSsrLCByZWFkKysgKQogICAgICAgewogICAgICAgICB3cml0ZS0+b3JnX3BvcyA9IHJlYWQtPnBvczsKQEAgLTE4NSwyMiArMTg1LDIyIEBACiAgICAgICBQU19NYXNrICBtYXNrICA9IGhpbnRfbWFza3MtPm1hc2tzOwogCiAgICAgICB0YWJsZS0+aGludF9tYXNrcyA9IGhpbnRfbWFza3M7Ci0gICAgICAKKwogICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIG1hc2srKyApCiAgICAgICAgIHBzaDFfaGludF90YWJsZV9yZWNvcmRfbWFzayggdGFibGUsIG1hc2sgKTsKICAgICB9Ci0gICAgCisKICAgICAvKiBub3csIGRvIGEgbGluZWFyIHBhcnNlIGluIGNhc2Ugc29tZSBoaW50cyB3ZXJlIGxlZnQgYWxvbmUgKi8KICAgICBpZiAoIHRhYmxlLT5udW1faGludHMgIT0gdGFibGUtPm1heF9oaW50cyApCiAgICAgewogICAgICAgRlRfVUludCAgIGluZGV4LCBjb3VudDsKLSAgICAgIAorCiAgICAgICBGVF9FUlJPUigoICIlcy5pbml0OiBtaXNzaW5nL2luY29ycmVjdCBoaW50IG1hc2tzICEhXG4iICkpOwogICAgICAgY291bnQgPSB0YWJsZS0+bWF4X2hpbnRzOwogICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrICkKICAgICAgICAgcHNoMV9oaW50X3RhYmxlX3JlY29yZCggdGFibGUsIGluZGV4ICk7Ci0gICAgfSAgICAKLSAgICAKKyAgICB9CisKICAgRXhpdDoKICAgICByZXR1cm4gZXJyb3I7CiAgIH0KQEAgLTIxNSwxMSArMjE1LDExIEBACiAgICAgRlRfQnl0ZSogIGN1cnNvciA9IGhpbnRfbWFzay0+Ynl0ZXM7CiAgICAgRlRfVUludCAgIGluZGV4LCBsaW1pdCwgY291bnQ7CiAKLSAgICBsaW1pdCA9IGhpbnRfbWFzay0+bnVtX2JpdHM7IAorICAgIGxpbWl0ID0gaGludF9tYXNrLT5udW1fYml0czsKICAgICBjb3VudCA9IDA7CiAKICAgICBwc2gxX2hpbnRfdGFibGVfZGVhY3RpdmF0ZSggdGFibGUgKTsKLSAgICAKKwogICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsaW1pdDsgaW5kZXgrKyApCiAgICAgewogICAgICAgaWYgKCBtYXNrID09IDAgKQpAQCAtMjI3LDE3ICsyMjcsMTcgQEAKICAgICAgICAgdmFsICA9ICpjdXJzb3IrKzsKICAgICAgICAgbWFzayA9IDB4ODA7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaWYgKCB2YWwgJiBtYXNrICkKICAgICAgIHsKICAgICAgICAgUFNIMV9IaW50ICBoaW50ID0gJnRhYmxlLT5oaW50c1tpbmRleF07Ci0gICAgICAgIAorCiAgICAgICAgIGlmICggIXBzaDFfaGludF9pc19hY3RpdmUoaGludCkgKQogICAgICAgICB7CiAgICAgICAgICAgUFNIMV9IaW50KiAgc29ydCAgID0gdGFibGUtPnNvcnQ7CiAgICAgICAgICAgRlRfVUludCAgICBjb3VudDI7CiAgICAgICAgICAgUFNIMV9IaW50ICAgaGludDI7Ci0gICAgICAgICAgCisKICAgICAgICAgICBmb3IgKCBjb3VudDIgPSBjb3VudDsgY291bnQyID4gMDsgY291bnQyLS0sIHNvcnQrKyApCiAgICAgICAgICAgewogICAgICAgICAgICAgaGludDIgPSBzb3J0WzBdOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICAKKwogICAgICAgICAgIGlmICggY291bnQyID09IDAgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIHBzaDFfaGludF9hY3RpdmF0ZSggaGludCApOwpAQCAtMjU4LDE1ICsyNTgsMTUgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgRlRfRVJST1IoKCAiJXMuYWN0aXZhdGVfbWFzazogdG9vIG1hbnkgYWN0aXZlIGhpbnRzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJwc2YuaGludCIgKSk7Ci0gICAgICAgICAgICB9IAorICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQotICAgICAgICAKKwogICAgICAgbWFzayA+Pj0gMTsKICAgICB9CiAgICAgdGFibGUtPm51bV9oaW50cyA9IGNvdW50OwotICAgIAorCiAgICAgLyogbm93LCBzb3J0IHRoZSBoaW50cywgdGhleSdyZSBndWFyYW50ZWVkIHRvIG5vdCBvdmVybGFwICovCiAgICAgLyogc28gd2UgY2FuIGNvbXBhcmUgdGhlaXIgIm9yZ19wb3MiIGZpZWxkIGRpcmVjdGx5Li4gICAgICovCiAgICAgewpAQCAtMjg0LDkgKzI4NCw5IEBACiAgICAgICAgICAgaGludDIgPSBzb3J0W2kyXTsKICAgICAgICAgICBpZiAoIGhpbnQyLT5vcmdfcG9zIDwgaGludDEtPm9yZ19wb3MgKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgICBzb3J0W2kxXSA9IGhpbnQyOwotICAgICAgICAgIHNvcnRbaTJdID0gaGludDE7CisKKyAgICAgICAgICBzb3J0W2kyKzFdID0gaGludDI7CisgICAgICAgICAgc29ydFtpMl0gICA9IGhpbnQxOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMzA1LDcgKzMwNSw3IEBACiAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gCisKICNpZmRlZiBERUJVR19ISU5URVIKICAgdm9pZAogICBwc19zaW1wbGVfc2NhbGUoIFBTSDFfSGludF9UYWJsZSAgdGFibGUsCkBAIC0zMTUsNyArMzE1LDcgQEAKICAgewogICAgIFBTSDFfSGludCAgaGludDsKICAgICBGVF9VSW50ICAgIGNvdW50OwotICAKKwogICAgIGZvciAoIGNvdW50ID0gMDsgY291bnQgPCB0YWJsZS0+bnVtX2hpbnRzOyBjb3VudCsrICkKICAgICB7CiAgICAgICBoaW50ID0gdGFibGUtPnNvcnRbY291bnRdOwpAQCAtMzIzLDEyICszMjMsMTIgQEAKICAgICAgIHsKICAgICAgICAgaGludC0+Y3VyX3BvcyA9IEZUX011bEZpeCggaGludC0+b3JnX3Bvcywgc2NhbGUgKSArIGRlbHRhOwogICAgICAgICBoaW50LT5jdXJfbGVuID0gRlRfTXVsRml4KCBoaW50LT5vcmdfbGVuLCBzY2FsZSApOwotICAgICAgICAKKwogICAgICAgICBpZiAocHMxX2RlYnVnX2hpbnRfZnVuYykKICAgICAgICAgICBwczFfZGVidWdfaGludF9mdW5jKCBoaW50LCB2ZXJ0aWNhbCApOwogICAgICAgfQogICAgIH0KLSAgfSAgICAgICAgICAgICAgICAKKyAgfQogI2VuZGlmCiAKICAgRlRfTE9DQUxfREVGICBGVF9FcnJvcgpAQCAtMzQ5LDcgKzM0OSw3IEBACiAgICAgICBwc19zaW1wbGVfc2NhbGUoIHRhYmxlLCBzY2FsZSwgZGVsdGEsIHZlcnRpY2FsICk7CiAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgICAKKwogICAgIGlmICggcHNfZGVidWdfbm9faG9yel9oaW50cyAmJiAhdmVydGljYWwgKQogICAgIHsKICAgICAgIHBzX3NpbXBsZV9zY2FsZSggdGFibGUsIHNjYWxlLCBkZWx0YSwgdmVydGljYWwgKTsKQEAgLTM1OSwxMCArMzU5LDEwIEBACiAKICAgICAvKiBYWFhYOiBmb3Igbm93LCB3ZSBvbmx5IHNjYWxlIHRoZSBoaW50cyB0byB0ZXN0IGFsbCBvdGhlciBhc3BlY3RzICovCiAgICAgLyogICAgICAgb2YgdGhlIFBvc3RzY3JpcHQgSGludGVyLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHsgIAorICAgIHsKICAgICAgIFBTSDFfSGludCAgaGludDsKICAgICAgIEZUX1VJbnQgICBjb3VudDsKLSAgICAKKwogICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHRhYmxlLT5udW1faGludHM7IGNvdW50KysgKQogICAgICAgewogICAgICAgICBoaW50ID0gdGFibGUtPnNvcnRbY291bnRdOwpAQCAtMzcxLDEwICszNzEsMTAgQEAKICMgaWYgMQogICAgICAgICAgIEZUX1BvcyAgIHBvcyA9IEZUX011bEZpeCggaGludC0+b3JnX3Bvcywgc2NhbGUgKSArIGRlbHRhOwogICAgICAgICAgIEZUX1BvcyAgIGxlbiA9IEZUX011bEZpeCggaGludC0+b3JnX2xlbiwgc2NhbGUgKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIEZUX1BvcyAgIGZpdF9jZW50ZXI7CiAgICAgICAgICAgRlRfUG9zICAgZml0X2xlbjsKLSAgICAgICAgICAKKwogICAgICAgICAgIFBTSF9BbGlnbm1lbnRSZWMgIGFsaWduOwogCiAgICAgICAgICAgLyogY29tcHV0ZSBmaXR0ZWQgd2lkdGgvaGVpZ2h0ICovCkBAIC0zODMsOSArMzgzLDkgQEAKICAgICAgICAgICAgIGZpdF9sZW4gPSA2NDsKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBmaXRfbGVuID0gKGZpdF9sZW4gKyAzMiApICYgLTY0OwotICAgICAgICAgICAgCisKICAgICAgICAgICBoaW50LT5jdXJfbGVuID0gZml0X2xlbjsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgLyogY2hlY2sgYmx1ZSB6b25lcyBmb3IgaG9yaXpvbnRhbCBzdGVtcyAqLwogICAgICAgICAgIGFsaWduLmFsaWduICAgICA9IDA7CiAgICAgICAgICAgYWxpZ24uYWxpZ25fYm90ID0gYWxpZ24uYWxpZ25fdG9wID0gMDsKQEAgLTQwNSwxNCArNDA1LDE0IEBACiAgICAgICAgICAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX3RvcCAtIGZpdF9sZW47CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgCisKICAgICAgICAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fQk9UOgogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLyogdGhlIGJvdHRvbSBvZiB0aGUgc3RlbSBpcyBhbGlnbmVkIGFnYWluc3QgYSBibHVlIHpvbmUgKi8KICAgICAgICAgICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fYm90OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX1RPUCB8IFBTSF9CTFVFX0FMSUdOX0JPVDoKICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8qIGJvdGggZWRnZXMgb2YgdGhlIHN0ZW0gYXJlIGFsaWduZWQgYWdhaW5zdCBibHVlIHpvbmVzICovCkBAIC00MjAsNyArNDIwLDcgQEAKICAgICAgICAgICAgICAgICBoaW50LT5jdXJfbGVuID0gYWxpZ24uYWxpZ25fdG9wIC0gYWxpZ24uYWxpZ25fYm90OwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgLyogbm9ybWFsIHByb2Nlc3NpbmcgKi8KICAgICAgICAgICAgICAgaWYgKCAoZml0X2xlbi82NCkgJiAxICkKQEAgLTQzMywyMiArNDMzLDIyIEBACiAgICAgICAgICAgICAgICAgLyogZXZlbiBudW1iZXIgb2YgcGl4ZWxzICovCiAgICAgICAgICAgICAgICAgZml0X2NlbnRlciA9IChwb3MgKyAobGVuID4+IDEpICsgMzIpICYgLTY0OwogICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAgIGhpbnQtPmN1cl9wb3MgPSBmaXRfY2VudGVyIC0gKGZpdF9sZW4gPj4gMSk7CiAgICAgICAgICAgfQogIyBlbHNlCiAgICAgICAgICAgaGludC0+Y3VyX3BvcyA9IChGVF9NdWxGaXgoIGhpbnQtPm9yZ19wb3MsIHNjYWxlICkgKyBkZWx0YSArIDMyKSAmIC02NDsKICAgICAgICAgICBoaW50LT5jdXJfbGVuID0gIEZUX011bEZpeCggaGludC0+b3JnX2xlbiwgc2NhbGUgKTsKLSMgZW5kaWYgICAgICAgICAgCisjIGVuZGlmCiAKICNpZmRlZiBERUJVR19ISU5URVIKICAgICAgICAgaWYgKHBzMV9kZWJ1Z19oaW50X2Z1bmMpCiAgICAgICAgICAgcHMxX2RlYnVnX2hpbnRfZnVuYyggaGludCwgdmVydGljYWwgKTsKLSNlbmRpZiAgICAgICAgCisjZW5kaWYKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHJldHVybiAwOwogICB9CiAKQEAgLTQ2Miw3ICs0NjIsNyBAQAogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAorCiAjZGVmaW5lICBQU0gxX1pPTkVfTUlOICAtMzIwMDAwMAogI2RlZmluZSAgUFNIMV9aT05FX01BWCAgKzMyMDAwMDAKIApAQCAtNDk3LDkgKzQ5Nyw5IEBACiAgICAgRlRfVUludCAgIGNvdW50OwogICAgIFBTSDFfWm9uZSAgem9uZTsKICAgICBQU0gxX0hpbnQgKnNvcnQsIGhpbnQsIGhpbnQyOwotICAgIAorCiAgICAgem9uZSAgPSB0YWJsZS0+em9uZXM7Ci0gICAgCisKICAgICAvKiBzcGVjaWFsIGNhc2UsIG5vIGhpbnRzIGRlZmluZWQgKi8KICAgICBpZiAoIHRhYmxlLT5udW1faGludHMgPT0gMCApCiAgICAgewpAQCAtNTA3LDI2ICs1MDcsMjYgQEAKICAgICAgIHpvbmUtPmRlbHRhID0gZGVsdGE7CiAgICAgICB6b25lLT5taW4gICA9IFBTSDFfWk9ORV9NSU47CiAgICAgICB6b25lLT5tYXggICA9IFBTSDFfWk9ORV9NQVg7Ci0gICAgICAKKwogICAgICAgdGFibGUtPm51bV96b25lcyA9IDE7CiAgICAgICB0YWJsZS0+em9uZSAgICAgID0gem9uZTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgCisKICAgICAvKiB0aGUgZmlyc3Qgem9uZSBpcyBiZWZvcmUgdGhlIGZpcnN0IGhpbnQgKi8KICAgICAvKiB4JyA9ICh4LXgwKSpzICsgeDAnID0geCpzICsgKCB4MCcgLSB4MCpzICkgKi8KICAgICBzb3J0ICA9IHRhYmxlLT5zb3J0OwogICAgIGhpbnQgID0gc29ydFswXTsKLSAgICAKKwogICAgIHpvbmUtPnNjYWxlID0gc2NhbGU7CiAgICAgem9uZS0+ZGVsdGEgPSBoaW50LT5jdXJfcG9zIC0gRlRfTXVsRml4KCBoaW50LT5vcmdfcG9zLCBzY2FsZSApOwogICAgIHpvbmUtPm1pbiAgID0gUFNIMV9aT05FX01JTjsKICAgICB6b25lLT5tYXggICA9IGhpbnQtPm9yZ19wb3M7Ci0gICAgCisKICAgICBwcmludF96b25lKCB6b25lICk7Ci0gICAgCisKICAgICB6b25lKys7Ci0gICAgCisKICAgICBmb3IgKCBjb3VudCA9IHRhYmxlLT5udW1faGludHM7IGNvdW50ID4gMDsgY291bnQtLSApCiAgICAgewogICAgICAgRlRfRml4ZWQgIHNjYWxlMjsKQEAgLTUzNiw3ICs1MzYsNyBAQAogICAgICAgICAvKiBzZXR1cCBhIHpvbmUgZm9yIGlubmVyLXN0ZW0gaW50ZXJwb2xhdGlvbiAqLwogICAgICAgICAvKiAoeCcgLSB4MCcpID0gKHggLSB4MCkqKHgxJy14MCcpLyh4MS14MCkgICAqLwogICAgICAgICAvKiB4JyA9IHgqczIgKyB4MCcgLSB4MCpzMiAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAKKwogICAgICAgICBzY2FsZTIgICAgICA9IEZUX0RpdkZpeCggaGludC0+Y3VyX2xlbiwgaGludC0+b3JnX2xlbiApOwogICAgICAgICB6b25lLT5zY2FsZSA9IHNjYWxlMjsKICAgICAgICAgem9uZS0+bWluICAgPSBoaW50LT5vcmdfcG9zOwpAQCAtNTQ0LDE2ICs1NDQsMTYgQEAKICAgICAgICAgem9uZS0+ZGVsdGEgPSBoaW50LT5jdXJfcG9zIC0gRlRfTXVsRml4KCB6b25lLT5taW4sIHNjYWxlMiApOwogCiAgICAgICAgIHByaW50X3pvbmUoIHpvbmUgKTsKLSAgICAKKwogICAgICAgICB6b25lKys7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaWYgKCBjb3VudCA9PSAxICkKICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAorCiAgICAgICBzb3J0Kys7CiAgICAgICBoaW50MiA9IHNvcnRbMF07Ci0gICAgICAKKwogICAgICAgLyogc2V0dXAgem9uZSBmb3IgaW50ZXItc3RlbSBpbnRlcnBvbGF0aW9uICovCiAgICAgICAvKiAoeCcteDEnKSA9ICh4LXgxKSooeDInLXgxJykvKHgyLXgxKSAgICAgKi8KICAgICAgIC8qIHgnID0geCpzMyArIHgxJyAtIHgxKnMzICAgICAgICAgICAgICAgICAqLwpAQCAtNTY1LDkgKzU2NSw5IEBACiAgICAgICB6b25lLT5kZWx0YSA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuIC0gRlRfTXVsRml4KCB6b25lLT5taW4sIHNjYWxlMiApOwogCiAgICAgICBwcmludF96b25lKCB6b25lICk7Ci0gICAgCisKICAgICAgIHpvbmUrKzsKLSAgICAgIAorCiAgICAgICBoaW50ICA9IGhpbnQyOwogICAgIH0KIApAQCAtNTc4LDMwICs1NzgsMzAgQEAKICAgICB6b25lLT5kZWx0YSA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuIC0gRlRfTXVsRml4KCB6b25lLT5taW4sIHNjYWxlICk7CiAKICAgICBwcmludF96b25lKCB6b25lICk7Ci0gICAgCisKICAgICB6b25lKys7Ci0gICAgCisKICAgICB0YWJsZS0+bnVtX3pvbmVzID0gem9uZSAtIHRhYmxlLT56b25lczsKICAgICB0YWJsZS0+em9uZSAgICAgID0gdGFibGUtPnpvbmVzOwogICB9CiAKIAotIC8qIHR1bmUgYSBzaW5nbGUgY29vcmRpbmF0ZSB3aXRoIHRoZSBjdXJyZW50IGludGVycG9sYXRpb24gem9uZXMgKi8gIAorIC8qIHR1bmUgYSBzaW5nbGUgY29vcmRpbmF0ZSB3aXRoIHRoZSBjdXJyZW50IGludGVycG9sYXRpb24gem9uZXMgKi8KICAgc3RhdGljIEZUX1BvcwogICBwc2gxX2hpbnRfdGFibGVfdHVuZV9jb29yZCggUFNIMV9IaW50X1RhYmxlICB0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgY29vcmQgKQogICB7CiAgICAgUFNIMV9ab25lICAgem9uZTsKLSAgICAKKwogICAgIHpvbmUgPSB0YWJsZS0+em9uZTsKLSAgICAgIAorCiAgICAgaWYgKCBjb29yZCA8IHpvbmUtPm1pbiApCiAgICAgewogICAgICAgZG8KICAgICAgIHsKICAgICAgICAgaWYgKCB6b25lID09IHRhYmxlLT56b25lcyApCiAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCisKICAgICAgICAgem9uZS0tOwogICAgICAgfQogICAgICAgd2hpbGUgKCBjb29yZCA8IHpvbmUtPm1pbiApOwpAQCAtNjEzLDEzICs2MTMsMTMgQEAKICAgICAgIHsKICAgICAgICAgaWYgKCB6b25lID09IHRhYmxlLT56b25lcyArIHRhYmxlLT5udW1fem9uZXMgLSAxICkKICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAKKwogICAgICAgICB6b25lKys7CiAgICAgICB9CiAgICAgICB3aGlsZSAoIGNvb3JkID4gem9uZS0+bWF4ICk7CiAgICAgICB0YWJsZS0+em9uZSA9IHpvbmU7CiAgICAgfQotICAgICAgICAKKwogICAgIHJldHVybiBGVF9NdWxGaXgoIGNvb3JkLCB6b25lLT5zY2FsZSApICsgem9uZS0+ZGVsdGE7CiAgIH0KIApAQCAtNjM5LDcgKzYzOSw3IEBACiAgICAgUFNIX0RpbWVuc2lvbiAgZGltICAgICAgICA9ICZnbG9iYWxzLT5kaW1lbnNpb25bdmVydGljYWxdOwogICAgIEZUX0ZpeGVkICAgICAgICBzY2FsZSAgICAgID0gZGltLT5zY2FsZV9tdWx0OwogICAgIEZUX0ZpeGVkICAgICAgICBkZWx0YSAgICAgID0gZGltLT5zY2FsZV9kZWx0YTsKLSAgICAKKwogICAgIGlmICggaGludF9tYXNrcyAmJiBoaW50X21hc2tzLT5udW1fbWFza3MgPiAwICkKICAgICB7CiAgICAgICBmaXJzdCA9IDA7CkBAIC02NDgsNDAgKzY0OCw0MCBAQAogICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIG1hc2srKyApCiAgICAgICB7CiAgICAgICAgIGxhc3QgPSBtYXNrLT5lbmRfcG9pbnQ7Ci0gICAgICAgIAorCiAgICAgICAgIGlmICggbGFzdCA+IGZpcnN0ICkKICAgICAgICAgewogICAgICAgICAgIEZUX1ZlY3RvciogICB2ZWM7CiAgICAgICAgICAgRlRfSW50ICAgICAgIGNvdW50MjsKLSAgICAgICAgICAKKwogICAgICAgICAgIHBzaDFfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrKCB0YWJsZSwgbWFzayApOwogICAgICAgICAgIHBzaDFfaGludF90YWJsZV9vcHRpbWl6ZSggdGFibGUsIGdsb2JhbHMsIG91dGxpbmUsIHZlcnRpY2FsICk7CiAgICAgICAgICAgcHNoMV9oaW50X3RhYmxlX3NldHVwX3pvbmVzKCB0YWJsZSwgc2NhbGUsIGRlbHRhICk7CiAgICAgICAgICAgbGFzdCA9IG1hc2stPmVuZF9wb2ludDsKLSAgICAgICAgICAKKwogICAgICAgICAgIHZlYyAgICA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwogICAgICAgICAgIGNvdW50MiA9IGxhc3QgLSBmaXJzdDsKICAgICAgICAgICBmb3IgKCA7IGNvdW50MiA+IDA7IGNvdW50Mi0tLCB2ZWMrKyApCiAgICAgICAgICAgewogICAgICAgICAgICAgRlRfUG9zICB4LCAqcHg7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHggID0gdmVydGljYWwgPyAmdmVjLT54IDogJnZlYy0+eTsKICAgICAgICAgICAgIHggICA9ICpweDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAqcHggPSBwc2gxX2hpbnRfdGFibGVfdHVuZV9jb29yZCggdGFibGUsIChGVF9JbnQpeCApOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAgIAorCiAgICAgICAgIGZpcnN0ID0gbGFzdDsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZSAgICAvKiBubyBoaW50cyBpbiB0aGlzIGdseXBoLCBzaW1wbHkgc2NhbGUgdGhlIG91dGxpbmUgKi8KICAgICB7CiAgICAgICBGVF9WZWN0b3IqICB2ZWM7Ci0gICAgICAKKwogICAgICAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7CiAgICAgICBjb3VudCA9IG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgCisKICAgICAgIGlmICggdmVydGljYWwgKQogICAgICAgewogICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgdmVjKysgKQpAQCAtNjk0LDggKzY5NCw4IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIAotICAKKworCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCkBAIC03MDMsNyArNzAzLDcgQEAKICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgCisKICAgRlRfRXJyb3IKICAgcHMxX2hpbnRzX2FwcGx5KCBQU19IaW50cyAgICAgcHNfaGludHMsCiAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUsCkBAIC03MTIsMTEgKzcxMiwxMSBAQAogICAgIFBTSDFfSGludF9UYWJsZVJlYyAgaGludHM7CiAgICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvciA9IDA7CiAgICAgRlRfSW50ICAgICAgICAgICAgICBkaW1lbnNpb247Ci0gICAgCisKICAgICBmb3IgKCBkaW1lbnNpb24gPSAxOyBkaW1lbnNpb24gPj0gMDsgZGltZW5zaW9uLS0gKQogICAgIHsKICAgICAgIFBTX0RpbWVuc2lvbiAgZGltID0gJnBzX2hpbnRzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICAgIAorCiAgICAgICAvKiBpbml0aWFsaXNlIGhpbnRzIHRhYmxlICovCiAgICAgICBtZW1zZXQoICZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSApOwogICAgICAgZXJyb3IgPSBwc2gxX2hpbnRfdGFibGVfaW5pdCggJmhpbnRzLApAQCAtNzI1LDE1ICs3MjUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkaW0tPmNvdW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfaGludHMtPm1lbW9yeSApOwogICAgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7Ci0gICAgICAKKwogICAgICAgcHNoMV9oaW50X3RhYmxlX3R1bmVfb3V0bGluZSggJmhpbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb24gKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgICAgIHBzaDFfaGludF90YWJsZV9kb25lKCAmaGludHMsIHBzX2hpbnRzLT5tZW1vcnkgKTsKICAgICB9Ci0gICAgCisKICAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICByZXR1cm4gZXJyb3I7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hhbGdvMi5jIGIvc3JjL3BzaGludGVyL3BzaGFsZ28yLmMKaW5kZXggOTVmMTY3YS4uODZlZGUxZCAxMDA2NDQKLS0tIGEvc3JjL3BzaGludGVyL3BzaGFsZ28yLmMKKysrIGIvc3JjL3BzaGludGVyL3BzaGFsZ28yLmMKQEAgLTQsNyArNCw3IEBACiAjaW5jbHVkZSAicHNoYWxnbzIuaCIKIAogCi0jaWZkZWYgREVCVUdfSElOVEVSICAKKyNpZmRlZiBERUJVR19ISU5URVIKICAgZXh0ZXJuICBQU0gyX0hpbnRfVGFibGUgIHBzMl9kZWJ1Z19oaW50X3RhYmxlICA9IDA7CiAgIGV4dGVybiAgUFNIMl9IaW50RnVuYyAgICBwczJfZGVidWdfaGludF9mdW5jICAgPSAwOwogICBleHRlcm4gIFBTSDJfR2x5cGggICAgICAgcHMyX2RlYnVnX2dseXBoICAgICAgID0gMDsKQEAgLTE3LDcgKzE3LDcgQEAKICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKKwogIC8qIHJldHVybiB0cnVlIGlmZiB0d28gc3RlbSBoaW50cyBvdmVybGFwICovCiAgIHN0YXRpYyBGVF9JbnQKICAgcHNoMl9oaW50X292ZXJsYXAoIFBTSDJfSGludCAgaGludDEsCkBAIC0yNiw4ICsyNiw4IEBACiAgICAgcmV0dXJuICggaGludDEtPm9yZ19wb3MgKyBoaW50MS0+b3JnX2xlbiA+PSBoaW50Mi0+b3JnX3BvcyAmJgogICAgICAgICAgICAgIGhpbnQyLT5vcmdfcG9zICsgaGludDItPm9yZ19sZW4gPj0gaGludDEtPm9yZ19wb3MgKTsKICAgfQotIAotIAorCisKICAvKiBkZXN0cm95IGhpbnRzIHRhYmxlICovCiAgIHN0YXRpYyB2b2lkCiAgIHBzaDJfaGludF90YWJsZV9kb25lKCBQU0gyX0hpbnRfVGFibGUgIHRhYmxlLApAQCAtMzYsNyArMzYsNyBAQAogICAgIEZSRUUoIHRhYmxlLT56b25lcyApOwogICAgIHRhYmxlLT5udW1fem9uZXMgPSAwOwogICAgIHRhYmxlLT56b25lICAgICAgPSAwOwotICAgIAorCiAgICAgRlJFRSggdGFibGUtPnNvcnQgKTsKICAgICBGUkVFKCB0YWJsZS0+aGludHMgKTsKICAgICB0YWJsZS0+bnVtX2hpbnRzICAgPSAwOwpAQCAtNTEsNyArNTEsNyBAQAogICB7CiAgICAgRlRfVUludCAgIGNvdW50ID0gdGFibGUtPm1heF9oaW50czsKICAgICBQU0gyX0hpbnQgIGhpbnQgID0gdGFibGUtPmhpbnRzOwotICAgIAorCiAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGhpbnQrKyApCiAgICAgewogICAgICAgcHNoMl9oaW50X2RlYWN0aXZhdGUoaGludCk7CkBAIC03MiwxMyArNzIsMTMgQEAKICAgICAgIEZUX0VSUk9SKCggIiVzLmFjdGl2YXRlOiBpbnZhbGlkIGhpbnQgaW5kZXggJWRcbiIsIGluZGV4ICkpOwogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICAgICAgCisKICAgICAvKiBpZ25vcmUgYWN0aXZlIGhpbnRzICovCiAgICAgaWYgKCBwc2gyX2hpbnRfaXNfYWN0aXZlKGhpbnQpICkKICAgICAgIHJldHVybjsKLSAgICAKKwogICAgIHBzaDJfaGludF9hY3RpdmF0ZShoaW50KTsKLSAgICAKKwogICAgIC8qIG5vdyBzY2FuIHRoZSBjdXJyZW50IGFjdGl2ZSBoaW50IHNldCBpbiBvcmRlciB0byBkZXRlcm1pbmUgKi8KICAgICAvKiBpZiB3ZSdyZSBvdmVybGFwcGluZyB3aXRoIGFub3RoZXIgc2VnbWVudC4uICAgICAgICAgICAgICAgICovCiAgICAgewpAQCAtODYsMTEgKzg2LDExIEBACiAgICAgICBGVF9VSW50ICAgICBjb3VudCAgPSB0YWJsZS0+bnVtX2hpbnRzOwogICAgICAgUFNIMl9IaW50ICAgaGludDI7CiAKLSAgICAgIGhpbnQtPnBhcmVudCA9IDA7ICAgICAgCisgICAgICBoaW50LT5wYXJlbnQgPSAwOwogICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNvcnRlZCsrICkKICAgICAgIHsKICAgICAgICAgaGludDIgPSBzb3J0ZWRbMF07Ci0gICAgICAgIAorCiAgICAgICAgIGlmICggcHNoMl9oaW50X292ZXJsYXAoIGhpbnQsIGhpbnQyICkgKQogICAgICAgICB7CiAgICAgICAgICAgaGludC0+cGFyZW50ID0gaGludDI7CkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBpZiAoIHRhYmxlLT5udW1faGludHMgPCB0YWJsZS0+bWF4X2hpbnRzICkKICAgICAgIHRhYmxlLT5zb3J0X2dsb2JhbFsgdGFibGUtPm51bV9oaW50cysrIF0gPSBoaW50OwogICAgIGVsc2UKQEAgLTExNyw4ICsxMTcsOCBAQAogICAgIEZUX0J5dGUqICBjdXJzb3IgPSBoaW50X21hc2stPmJ5dGVzOwogICAgIEZUX1VJbnQgICBpbmRleCwgbGltaXQ7CiAKLSAgICBsaW1pdCA9IGhpbnRfbWFzay0+bnVtX2JpdHM7IAotICAgIAorICAgIGxpbWl0ID0gaGludF9tYXNrLT5udW1fYml0czsKKwogICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsaW1pdDsgaW5kZXgrKyApCiAgICAgewogICAgICAgaWYgKCBtYXNrID09IDAgKQpAQCAtMTI2LDEwICsxMjYsMTAgQEAKICAgICAgICAgdmFsICA9ICpjdXJzb3IrKzsKICAgICAgICAgbWFzayA9IDB4ODA7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaWYgKCB2YWwgJiBtYXNrICkKICAgICAgICAgcHNoMl9oaW50X3RhYmxlX3JlY29yZCggdGFibGUsIGluZGV4ICk7Ci0gICAgICAgIAorCiAgICAgICBtYXNrID4+PSAxOwogICAgIH0KICAgfQpAQCAtMTQ3LDI0ICsxNDcsMjQgQEAKICAgICBGVF9FcnJvciAgZXJyb3I7CiAKICAgICBGVF9VTlVTRUQoY291bnRlcl9tYXNrcyk7Ci0gICAgCisKICAgICAvKiBhbGxvY2F0ZSBvdXIgdGFibGVzICovCiAgICAgaWYgKCBBTExPQ19BUlJBWSggdGFibGUtPnNvcnQsICAyKmNvdW50LCAgIFBTSDJfSGludCAgICApIHx8CiAgICAgICAgICBBTExPQ19BUlJBWSggdGFibGUtPmhpbnRzLCAgIGNvdW50LCAgIFBTSDJfSGludFJlYyApIHx8CiAgICAgICAgICBBTExPQ19BUlJBWSggdGFibGUtPnpvbmVzLCAyKmNvdW50KzEsIFBTSDJfWm9uZVJlYyApICkKICAgICAgIGdvdG8gRXhpdDsKLSAgICAKKwogICAgIHRhYmxlLT5tYXhfaGludHMgICA9IGNvdW50OwogICAgIHRhYmxlLT5zb3J0X2dsb2JhbCA9IHRhYmxlLT5zb3J0ICsgY291bnQ7CiAgICAgdGFibGUtPm51bV9oaW50cyAgID0gMDsKICAgICB0YWJsZS0+bnVtX3pvbmVzICAgPSAwOwogICAgIHRhYmxlLT56b25lICAgICAgICA9IDA7Ci0gICAgCisKICAgICAvKiBub3csIGluaXRpYWxpc2UgdGhlICJoaW50cyIgYXJyYXkgKi8KICAgICB7CiAgICAgICBQU0gyX0hpbnQgIHdyaXRlID0gdGFibGUtPmhpbnRzOwogICAgICAgUFNfSGludCAgIHJlYWQgID0gaGludHMtPmhpbnRzOwotICAgICAgCisKICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB3cml0ZSsrLCByZWFkKysgKQogICAgICAgewogICAgICAgICB3cml0ZS0+b3JnX3BvcyA9IHJlYWQtPnBvczsKQEAgLTE4MSwyMiArMTgxLDIyIEBACiAgICAgICBQU19NYXNrICBtYXNrICA9IGhpbnRfbWFza3MtPm1hc2tzOwogCiAgICAgICB0YWJsZS0+aGludF9tYXNrcyA9IGhpbnRfbWFza3M7Ci0gICAgICAKKwogICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIG1hc2srKyApCiAgICAgICAgIHBzaDJfaGludF90YWJsZV9yZWNvcmRfbWFzayggdGFibGUsIG1hc2sgKTsKICAgICB9Ci0gICAgCisKICAgICAvKiBub3csIGRvIGEgbGluZWFyIHBhcnNlIGluIGNhc2Ugc29tZSBoaW50cyB3ZXJlIGxlZnQgYWxvbmUgKi8KICAgICBpZiAoIHRhYmxlLT5udW1faGludHMgIT0gdGFibGUtPm1heF9oaW50cyApCiAgICAgewogICAgICAgRlRfVUludCAgIGluZGV4LCBjb3VudDsKLSAgICAgIAorCiAgICAgICBGVF9FUlJPUigoICIlcy5pbml0OiBtaXNzaW5nL2luY29ycmVjdCBoaW50IG1hc2tzICEhXG4iICkpOwogICAgICAgY291bnQgPSB0YWJsZS0+bWF4X2hpbnRzOwogICAgICAgZm9yICggaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrICkKICAgICAgICAgcHNoMl9oaW50X3RhYmxlX3JlY29yZCggdGFibGUsIGluZGV4ICk7Ci0gICAgfSAgICAKLSAgICAKKyAgICB9CisKICAgRXhpdDoKICAgICByZXR1cm4gZXJyb3I7CiAgIH0KQEAgLTIxMSwxMSArMjExLDExIEBACiAgICAgRlRfQnl0ZSogIGN1cnNvciA9IGhpbnRfbWFzay0+Ynl0ZXM7CiAgICAgRlRfVUludCAgIGluZGV4LCBsaW1pdCwgY291bnQ7CiAKLSAgICBsaW1pdCA9IGhpbnRfbWFzay0+bnVtX2JpdHM7IAorICAgIGxpbWl0ID0gaGludF9tYXNrLT5udW1fYml0czsKICAgICBjb3VudCA9IDA7CiAKICAgICBwc2gyX2hpbnRfdGFibGVfZGVhY3RpdmF0ZSggdGFibGUgKTsKLSAgICAKKwogICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsaW1pdDsgaW5kZXgrKyApCiAgICAgewogICAgICAgaWYgKCBtYXNrID09IDAgKQpAQCAtMjIzLDE1ICsyMjMsMTUgQEAKICAgICAgICAgdmFsICA9ICpjdXJzb3IrKzsKICAgICAgICAgbWFzayA9IDB4ODA7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaWYgKCB2YWwgJiBtYXNrICkKICAgICAgIHsKICAgICAgICAgUFNIMl9IaW50ICBoaW50ID0gJnRhYmxlLT5oaW50c1tpbmRleF07Ci0gICAgICAgIAorCiAgICAgICAgIGlmICggIXBzaDJfaGludF9pc19hY3RpdmUoaGludCkgKQogICAgICAgICB7CiAgICAgICAgICAgRlRfVUludCAgICAgY291bnQyOwotICAgICAgICAgIAorCiAjaWYgMAogICAgICAgICAgIFBTSDJfSGludCogIHNvcnQgPSB0YWJsZS0+c29ydDsKICAgICAgICAgICBQU0gyX0hpbnQgICBoaW50MjsKQEAgLTI0OCw3ICsyNDgsNyBAQAogI2Vsc2UKICAgICAgICAgICBjb3VudDIgPSAwOwogI2VuZGlmCi0gICAgICAgICAgCisKICAgICAgICAgICBpZiAoIGNvdW50MiA9PSAwICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBwc2gyX2hpbnRfYWN0aXZhdGUoIGhpbnQgKTsKQEAgLTI1OCwxNSArMjU4LDE1IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIEZUX0VSUk9SKCggIiVzLmFjdGl2YXRlX21hc2s6IHRvbyBtYW55IGFjdGl2ZSBoaW50c1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicHNmLmhpbnQiICkpOwotICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgICAgCisKICAgICAgIG1hc2sgPj49IDE7CiAgICAgfQogICAgIHRhYmxlLT5udW1faGludHMgPSBjb3VudDsKLSAgICAKKwogICAgIC8qIG5vdywgc29ydCB0aGUgaGludHMsIHRoZXkncmUgZ3VhcmFudGVlZCB0byBub3Qgb3ZlcmxhcCAqLwogICAgIC8qIHNvIHdlIGNhbiBjb21wYXJlIHRoZWlyICJvcmdfcG9zIiBmaWVsZCBkaXJlY3RseS4uICAgICAqLwogICAgIHsKQEAgLTI4MiwxMSArMjgyLDEyIEBACiAgICAgICAgIGZvciAoIGkyID0gaTEtMTsgaTIgPj0gMDsgaTItLSApCiAgICAgICAgIHsKICAgICAgICAgICBoaW50MiA9IHNvcnRbaTJdOworCiAgICAgICAgICAgaWYgKCBoaW50Mi0+b3JnX3BvcyA8IGhpbnQxLT5vcmdfcG9zICkKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgICAgc29ydFtpMV0gPSBoaW50MjsKLSAgICAgICAgICBzb3J0W2kyXSA9IGhpbnQxOworCisgICAgICAgICAgc29ydFtpMisxXSA9IGhpbnQyOworICAgICAgICAgIHNvcnRbaTJdICAgPSBoaW50MTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTMwNSw3ICszMDYsNyBAQAogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotIAorCiAjaWZkZWYgREVCVUdfSElOVEVSCiAgIHN0YXRpYyB2b2lkCiAgIHBzMl9zaW1wbGVfc2NhbGUoIFBTSDJfSGludF9UYWJsZSAgdGFibGUsCkBAIC0zMTUsMTggKzMxNiwxOCBAQAogICB7CiAgICAgUFNIMl9IaW50ICBoaW50OwogICAgIEZUX1VJbnQgICAgY291bnQ7Ci0gIAorCiAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHRhYmxlLT5tYXhfaGludHM7IGNvdW50KysgKQogICAgIHsKICAgICAgIGhpbnQgPSB0YWJsZS0+aGludHMgKyBjb3VudDsKIAogICAgICAgaGludC0+Y3VyX3BvcyA9IEZUX011bEZpeCggaGludC0+b3JnX3Bvcywgc2NhbGUgKSArIGRlbHRhOwogICAgICAgaGludC0+Y3VyX2xlbiA9IEZUX011bEZpeCggaGludC0+b3JnX2xlbiwgc2NhbGUgKTsKLSAgICAgICAgCisKICAgICAgIGlmIChwczJfZGVidWdfaGludF9mdW5jKQogICAgICAgICBwczJfZGVidWdfaGludF9mdW5jKCBoaW50LCB2ZXJ0aWNhbCApOwogICAgIH0KLSAgfSAgICAgICAgICAgICAgICAKKyAgfQogI2VuZGlmCiAKIApAQCAtMzQwLDEzICszNDEsMTMgQEAKICAgICBGVF9GaXhlZCAgICAgICBkZWx0YSA9IGRpbS0+c2NhbGVfZGVsdGE7CiAKICAgICBpZiAoICFwc2gyX2hpbnRfaXNfZml0dGVkKGhpbnQpICkKLSAgICB7ICAgICAgCisgICAgewogICAgICAgRlRfUG9zICAgcG9zID0gRlRfTXVsRml4KCBoaW50LT5vcmdfcG9zLCBzY2FsZSApICsgZGVsdGE7CiAgICAgICBGVF9Qb3MgICBsZW4gPSBGVF9NdWxGaXgoIGhpbnQtPm9yZ19sZW4sIHNjYWxlICk7Ci0gICAgICAKKwogICAgICAgRlRfUG9zICAgZml0X2NlbnRlcjsKICAgICAgIEZUX1BvcyAgIGZpdF9sZW47Ci0gICAgICAKKwogICAgICAgUFNIX0FsaWdubWVudFJlYyAgYWxpZ247CiAKICAgICAgIC8qIGNvbXB1dGUgZml0dGVkIHdpZHRoL2hlaWdodCAqLwpAQCAtMzU5LDEzICszNjAsMTMgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgIGZpdF9sZW4gPSAoZml0X2xlbiArIDMyICkgJiAtNjQ7CiAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICBoaW50LT5jdXJfbGVuID0gZml0X2xlbjsKLSAgICAgICAgCisKICAgICAgIC8qIGNoZWNrIGJsdWUgem9uZXMgZm9yIGhvcml6b250YWwgc3RlbXMgKi8KICAgICAgIGFsaWduLmFsaWduID0gMDsKICAgICAgIGFsaWduLmFsaWduX2JvdCA9IGFsaWduLmFsaWduX3RvcCA9IDA7Ci0gICAgICAKKwogICAgICAgaWYgKCF2ZXJ0aWNhbCkKICAgICAgIHsKICAgICAgICAgcHNoX2JsdWVzX3NuYXBfc3RlbSggJmdsb2JhbHMtPmJsdWVzLApAQCAtMzgyLDE0ICszODMsMTQgQEAKICAgICAgICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl90b3AgLSBmaXRfbGVuOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQotICAgICAgICAgIAorCiAgICAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fQk9UOgogICAgICAgICAgIHsKICAgICAgICAgICAgIC8qIHRoZSBib3R0b20gb2YgdGhlIHN0ZW0gaXMgYWxpZ25lZCBhZ2FpbnN0IGEgYmx1ZSB6b25lICovCiAgICAgICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fYm90OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQotICAgICAgICAgIAorCiAgICAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fVE9QIHwgUFNIX0JMVUVfQUxJR05fQk9UOgogICAgICAgICAgIHsKICAgICAgICAgICAgIC8qIGJvdGggZWRnZXMgb2YgdGhlIHN0ZW0gYXJlIGFsaWduZWQgYWdhaW5zdCBibHVlIHpvbmVzICovCkBAIC0zOTcsMjYgKzM5OCwyNiBAQAogICAgICAgICAgICAgaGludC0+Y3VyX2xlbiA9IGFsaWduLmFsaWduX3RvcCAtIGFsaWduLmFsaWduX2JvdDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KLSAgICAgICAgICAKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIHsKICAgICAgICAgICAgIFBTSDJfSGludCAgcGFyZW50ID0gaGludC0+cGFyZW50OwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICggcGFyZW50ICkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgRlRfUG9zICBwYXJfb3JnX2NlbnRlciwgcGFyX2N1cl9jZW50ZXI7CiAgICAgICAgICAgICAgIEZUX1BvcyAgY3VyX29yZ19jZW50ZXIsIGN1cl9kZWx0YTsKLSAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgLyogZW5zdXJlIHRoYXQgcGFyZW50IGlzIGFscmVhZHkgZml0dGVkICovCiAgICAgICAgICAgICAgIGlmICggIXBzaDJfaGludF9pc19maXR0ZWQocGFyZW50KSApCiAgICAgICAgICAgICAgICAgcHNoMl9oaW50X2FsaWduKCBwYXJlbnQsIGdsb2JhbHMsIHZlcnRpY2FsICk7Ci0gICAgICAgICAgICAgICAgCisKICAgICAgICAgICAgICAgcGFyX29yZ19jZW50ZXIgPSBwYXJlbnQtPm9yZ19wb3MgKyAocGFyZW50LT5vcmdfbGVuLzIpOwogICAgICAgICAgICAgICBwYXJfY3VyX2NlbnRlciA9IHBhcmVudC0+Y3VyX3BvcyArIChwYXJlbnQtPmN1cl9sZW4vMik7Ci0gICAgICAgICAgICAgIGN1cl9vcmdfY2VudGVyID0gaGludC0+b3JnX3BvcyArIChoaW50LT5vcmdfbGVuLzIpOwotICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgY3VyX29yZ19jZW50ZXIgPSBoaW50LT5vcmdfcG9zICAgKyAoaGludC0+b3JnX2xlbi8yKTsKKwogICAgICAgICAgICAgICBjdXJfZGVsdGEgPSBGVF9NdWxGaXgoIGN1cl9vcmdfY2VudGVyIC0gcGFyX29yZ19jZW50ZXIsIHNjYWxlICk7Ci0jaWYgMCAgICAgICAgICAgICAgCisjaWYgMAogICAgICAgICAgICAgICBpZiAoIGN1cl9kZWx0YSA+PSAwICkKICAgICAgICAgICAgICAgICBjdXJfZGVsdGEgPSAoY3VyX2RlbHRhKzE2KSAmIC02NDsKICAgICAgICAgICAgICAgZWxzZQpAQCAtNDM2LDE5ICs0MzcsMTkgQEAKICAgICAgICAgICAgICAgLyogZXZlbiBudW1iZXIgb2YgcGl4ZWxzICovCiAgICAgICAgICAgICAgIGZpdF9jZW50ZXIgPSAocG9zICsgKGxlbiA+PiAxKSArIDMyKSAmIC02NDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAKKwogICAgICAgICAgICAgaGludC0+Y3VyX3BvcyA9IGZpdF9jZW50ZXIgLSAoZml0X2xlbiA+PiAxKTsKICAgICAgICAgICB9CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgcHNoMl9oaW50X3NldF9maXR0ZWQoaGludCk7Ci0gICAgICAKKwogI2lmZGVmIERFQlVHX0hJTlRFUgogICAgICAgaWYgKHBzMl9kZWJ1Z19oaW50X2Z1bmMpCiAgICAgICAgIHBzMl9kZWJ1Z19oaW50X2Z1bmMoIGhpbnQsIHZlcnRpY2FsICk7CiAjZW5kaWYKICAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfQogCiAKICAgc3RhdGljIHZvaWQKQEAgLTQ2OSw3ICs0NzAsNyBAQAogICAgICAgcHMyX3NpbXBsZV9zY2FsZSggdGFibGUsIHNjYWxlLCBkZWx0YSwgdmVydGljYWwgKTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgICAKKwogICAgIGlmICggcHNfZGVidWdfbm9faG9yel9oaW50cyAmJiAhdmVydGljYWwgKQogICAgIHsKICAgICAgIHBzMl9zaW1wbGVfc2NhbGUoIHRhYmxlLCBzY2FsZSwgZGVsdGEsIHZlcnRpY2FsICk7CkBAIC00OTEsNyArNDkyLDcgQEAKICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKKwogI2RlZmluZSAgUFNIMl9aT05FX01JTiAgLTMyMDAwMDAKICNkZWZpbmUgIFBTSDJfWk9ORV9NQVggICszMjAwMDAwCiAKQEAgLTUyNyw5ICs1MjgsOSBAQAogICAgIEZUX1VJbnQgICBjb3VudDsKICAgICBQU0gyX1pvbmUgIHpvbmU7CiAgICAgUFNIMl9IaW50ICpzb3J0LCBoaW50LCBoaW50MjsKLSAgICAKKwogICAgIHpvbmUgID0gdGFibGUtPnpvbmVzOwotICAgIAorCiAgICAgLyogc3BlY2lhbCBjYXNlLCBubyBoaW50cyBkZWZpbmVkICovCiAgICAgaWYgKCB0YWJsZS0+bnVtX2hpbnRzID09IDAgKQogICAgIHsKQEAgLTUzNywyNiArNTM4LDI2IEBACiAgICAgICB6b25lLT5kZWx0YSA9IGRlbHRhOwogICAgICAgem9uZS0+bWluICAgPSBQU0gyX1pPTkVfTUlOOwogICAgICAgem9uZS0+bWF4ICAgPSBQU0gyX1pPTkVfTUFYOwotICAgICAgCisKICAgICAgIHRhYmxlLT5udW1fem9uZXMgPSAxOwogICAgICAgdGFibGUtPnpvbmUgICAgICA9IHpvbmU7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIAorCiAgICAgLyogdGhlIGZpcnN0IHpvbmUgaXMgYmVmb3JlIHRoZSBmaXJzdCBoaW50ICovCiAgICAgLyogeCcgPSAoeC14MCkqcyArIHgwJyA9IHgqcyArICggeDAnIC0geDAqcyApICovCiAgICAgc29ydCAgPSB0YWJsZS0+c29ydDsKICAgICBoaW50ICA9IHNvcnRbMF07Ci0gICAgCisKICAgICB6b25lLT5zY2FsZSA9IHNjYWxlOwogICAgIHpvbmUtPmRlbHRhID0gaGludC0+Y3VyX3BvcyAtIEZUX011bEZpeCggaGludC0+b3JnX3Bvcywgc2NhbGUgKTsKICAgICB6b25lLT5taW4gICA9IFBTSDJfWk9ORV9NSU47CiAgICAgem9uZS0+bWF4ICAgPSBoaW50LT5vcmdfcG9zOwotICAgIAorCiAgICAgcHJpbnRfem9uZSggem9uZSApOwotICAgIAorCiAgICAgem9uZSsrOwotICAgIAorCiAgICAgZm9yICggY291bnQgPSB0YWJsZS0+bnVtX2hpbnRzOyBjb3VudCA+IDA7IGNvdW50LS0gKQogICAgIHsKICAgICAgIEZUX0ZpeGVkICBzY2FsZTI7CkBAIC01NjYsNyArNTY3LDcgQEAKICAgICAgICAgLyogc2V0dXAgYSB6b25lIGZvciBpbm5lci1zdGVtIGludGVycG9sYXRpb24gKi8KICAgICAgICAgLyogKHgnIC0geDAnKSA9ICh4IC0geDApKih4MScteDAnKS8oeDEteDApICAgKi8KICAgICAgICAgLyogeCcgPSB4KnMyICsgeDAnIC0geDAqczIgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgCisKICAgICAgICAgc2NhbGUyICAgICAgPSBGVF9EaXZGaXgoIGhpbnQtPmN1cl9sZW4sIGhpbnQtPm9yZ19sZW4gKTsKICAgICAgICAgem9uZS0+c2NhbGUgPSBzY2FsZTI7CiAgICAgICAgIHpvbmUtPm1pbiAgID0gaGludC0+b3JnX3BvczsKQEAgLTU3NCwxNiArNTc1LDE2IEBACiAgICAgICAgIHpvbmUtPmRlbHRhID0gaGludC0+Y3VyX3BvcyAtIEZUX011bEZpeCggem9uZS0+bWluLCBzY2FsZTIgKTsKIAogICAgICAgICBwcmludF96b25lKCB6b25lICk7Ci0gICAgCisKICAgICAgICAgem9uZSsrOwogICAgICAgfQotICAgICAgCisKICAgICAgIGlmICggY291bnQgPT0gMSApCiAgICAgICAgIGJyZWFrOwotICAgICAgICAKKwogICAgICAgc29ydCsrOwogICAgICAgaGludDIgPSBzb3J0WzBdOwotICAgICAgCisKICAgICAgIC8qIHNldHVwIHpvbmUgZm9yIGludGVyLXN0ZW0gaW50ZXJwb2xhdGlvbiAqLwogICAgICAgLyogKHgnLXgxJykgPSAoeC14MSkqKHgyJy14MScpLyh4Mi14MSkgICAgICovCiAgICAgICAvKiB4JyA9IHgqczMgKyB4MScgLSB4MSpzMyAgICAgICAgICAgICAgICAgKi8KQEAgLTU5NSw5ICs1OTYsOSBAQAogICAgICAgem9uZS0+ZGVsdGEgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbiAtIEZUX011bEZpeCggem9uZS0+bWluLCBzY2FsZTIgKTsKIAogICAgICAgcHJpbnRfem9uZSggem9uZSApOwotICAgIAorCiAgICAgICB6b25lKys7Ci0gICAgICAKKwogICAgICAgaGludCAgPSBoaW50MjsKICAgICB9CiAKQEAgLTYwOCwzMSArNjA5LDMxIEBACiAgICAgem9uZS0+ZGVsdGEgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbiAtIEZUX011bEZpeCggem9uZS0+bWluLCBzY2FsZSApOwogCiAgICAgcHJpbnRfem9uZSggem9uZSApOwotICAgIAorCiAgICAgem9uZSsrOwotICAgIAorCiAgICAgdGFibGUtPm51bV96b25lcyA9IHpvbmUgLSB0YWJsZS0+em9uZXM7CiAgICAgdGFibGUtPnpvbmUgICAgICA9IHRhYmxlLT56b25lczsKICAgfQogI2VuZGlmCiAKICNpZiAwCi0gLyogdHVuZSBhIHNpbmdsZSBjb29yZGluYXRlIHdpdGggdGhlIGN1cnJlbnQgaW50ZXJwb2xhdGlvbiB6b25lcyAqLyAgCisgLyogdHVuZSBhIHNpbmdsZSBjb29yZGluYXRlIHdpdGggdGhlIGN1cnJlbnQgaW50ZXJwb2xhdGlvbiB6b25lcyAqLwogICBzdGF0aWMgRlRfUG9zCiAgIHBzaDJfaGludF90YWJsZV90dW5lX2Nvb3JkKCBQU0gyX0hpbnRfVGFibGUgIHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgICBjb29yZCApCiAgIHsKICAgICBQU0gyX1pvbmUgICB6b25lOwotICAgIAorCiAgICAgem9uZSA9IHRhYmxlLT56b25lOwotICAgICAgCisKICAgICBpZiAoIGNvb3JkIDwgem9uZS0+bWluICkKICAgICB7CiAgICAgICBkbwogICAgICAgewogICAgICAgICBpZiAoIHpvbmUgPT0gdGFibGUtPnpvbmVzICkKICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAKKwogICAgICAgICB6b25lLS07CiAgICAgICB9CiAgICAgICB3aGlsZSAoIGNvb3JkIDwgem9uZS0+bWluICk7CkBAIC02NDQsMTMgKzY0NSwxMyBAQAogICAgICAgewogICAgICAgICBpZiAoIHpvbmUgPT0gdGFibGUtPnpvbmVzICsgdGFibGUtPm51bV96b25lcyAtIDEgKQogICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIAorCiAgICAgICAgIHpvbmUrKzsKICAgICAgIH0KICAgICAgIHdoaWxlICggY29vcmQgPiB6b25lLT5tYXggKTsKICAgICAgIHRhYmxlLT56b25lID0gem9uZTsKICAgICB9Ci0gICAgICAgIAorCiAgICAgcmV0dXJuIEZUX011bEZpeCggY29vcmQsIHpvbmUtPnNjYWxlICkgKyB6b25lLT5kZWx0YTsKICAgfQogI2VuZGlmCkBAIC02NzEsNyArNjcyLDcgQEAKICAgICBQU0hfRGltZW5zaW9uICBkaW0gICAgICAgID0gJmdsb2JhbHMtPmRpbWVuc2lvblt2ZXJ0aWNhbF07CiAgICAgRlRfRml4ZWQgICAgICAgc2NhbGUgICAgICA9IGRpbS0+c2NhbGVfbXVsdDsKICAgICBGVF9GaXhlZCAgICAgICBkZWx0YSAgICAgID0gZGltLT5zY2FsZV9kZWx0YTsKLSAgICAKKwogICAgIGlmICggaGludF9tYXNrcyAmJiBoaW50X21hc2tzLT5udW1fbWFza3MgPiAwICkKICAgICB7CiAgICAgICBmaXJzdCA9IDA7CkBAIC02ODAsNDAgKzY4MSw0MCBAQAogICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIG1hc2srKyApCiAgICAgICB7CiAgICAgICAgIGxhc3QgPSBtYXNrLT5lbmRfcG9pbnQ7Ci0gICAgICAgIAorCiAgICAgICAgIGlmICggbGFzdCA+IGZpcnN0ICkKICAgICAgICAgewogICAgICAgICAgIEZUX1ZlY3RvciogICB2ZWM7CiAgICAgICAgICAgRlRfSW50ICAgICAgIGNvdW50MjsKLSAgICAgICAgICAKKwogICAgICAgICAgIHBzaDJfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrKCB0YWJsZSwgbWFzayApOwogICAgICAgICAgIHBzaDJfaGludF90YWJsZV9vcHRpbWl6ZSggdGFibGUsIGdsb2JhbHMsIG91dGxpbmUsIHZlcnRpY2FsICk7CiAgICAgICAgICAgcHNoMl9oaW50X3RhYmxlX3NldHVwX3pvbmVzKCB0YWJsZSwgc2NhbGUsIGRlbHRhICk7CiAgICAgICAgICAgbGFzdCA9IG1hc2stPmVuZF9wb2ludDsKLSAgICAgICAgICAKKwogICAgICAgICAgIHZlYyAgICA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwogICAgICAgICAgIGNvdW50MiA9IGxhc3QgLSBmaXJzdDsKICAgICAgICAgICBmb3IgKCA7IGNvdW50MiA+IDA7IGNvdW50Mi0tLCB2ZWMrKyApCiAgICAgICAgICAgewogICAgICAgICAgICAgRlRfUG9zICB4LCAqcHg7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgcHggID0gdmVydGljYWwgPyAmdmVjLT54IDogJnZlYy0+eTsKICAgICAgICAgICAgIHggICA9ICpweDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAqcHggPSBwc2gyX2hpbnRfdGFibGVfdHVuZV9jb29yZCggdGFibGUsIChGVF9JbnQpeCApOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAgIAorCiAgICAgICAgIGZpcnN0ID0gbGFzdDsKICAgICAgIH0KICAgICB9CiAgICAgZWxzZSAgICAvKiBubyBoaW50cyBpbiB0aGlzIGdseXBoLCBzaW1wbHkgc2NhbGUgdGhlIG91dGxpbmUgKi8KICAgICB7CiAgICAgICBGVF9WZWN0b3IqICB2ZWM7Ci0gICAgICAKKwogICAgICAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7CiAgICAgICBjb3VudCA9IG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgCisKICAgICAgIGlmICggdmVydGljYWwgKQogICAgICAgewogICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgdmVjKysgKQpAQCAtNzQ5LDE3ICs3NTAsMTcgQEAKICAgICAgIGJlZm9yZSA9IGJlZm9yZS0+cHJldjsKICAgICAgIGlmICggYmVmb3JlID09IHBvaW50ICkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIAorCiAgICAgICBkX2JlZm9yZSA9IGJlZm9yZS0+b3JnX3UgLSBwb2ludC0+b3JnX3U7CiAgICAgfQogICAgIHdoaWxlICggZF9iZWZvcmUgPT0gMCApOwotICAgIAorCiAgICAgZG8KICAgICB7CiAgICAgICBhZnRlciA9IGFmdGVyLT5uZXh0OwogICAgICAgaWYgKCBhZnRlciA9PSBwb2ludCApCiAgICAgICAgIHJldHVybiAwOwotICAgICAgICAKKwogICAgICAgZF9hZnRlciA9IGFmdGVyLT5vcmdfdSAtIHBvaW50LT5vcmdfdTsKICAgICB9CiAgICAgd2hpbGUgKCBkX2FmdGVyID09IDAgKTsKQEAgLTc3Nyw3ICs3NzgsNyBAQAogCiAgICAgcHNoMl9oaW50X3RhYmxlX2RvbmUoICZnbHlwaC0+aGludF90YWJsZXNbMV0sIG1lbW9yeSApOwogICAgIHBzaDJfaGludF90YWJsZV9kb25lKCAmZ2x5cGgtPmhpbnRfdGFibGVzWzBdLCBtZW1vcnkgKTsKLSAgICAKKwogICAgIEZSRUUoIGdseXBoLT5wb2ludHMgKTsKICAgICBGUkVFKCBnbHlwaC0+Y29udG91cnMgKTsKIApAQCAtNzkzLDEwICs3OTQsMTAgQEAKICAgewogICAgIEZUX1BvcyAgYXgsIGF5OwogICAgIGludCAgICAgcmVzdWx0ID0gUFNIMl9ESVJfTk9ORTsKLSAgICAKKwogICAgIGF4ID0gKCBkeCA+PSAwICkgPyBkeCA6IC1keDsKICAgICBheSA9ICggZHkgPj0gMCApID8gZHkgOiAtZHk7Ci0gICAgCisKICAgICBpZiAoIGF5KjEyIDwgYXggKQogICAgIHsKICAgICAgIC8qIHxkeXwgPDw8IHxkeHwgIG1lYW5zIGEgbmVhci1ob3Jpem9udGFsIHNlZ21lbnQgKi8KQEAgLTgxOSw0MCArODIwLDQwIEBACiAgIHsKICAgICBGVF9FcnJvciAgIGVycm9yOwogICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIAorCiAgICAgLyogY2xlYXIgYWxsIGZpZWxkcyAqLwogICAgIG1lbXNldCggZ2x5cGgsIDAsIHNpemVvZigqZ2x5cGgpICk7Ci0gICAgCisKICAgICBtZW1vcnkgPSBnbG9iYWxzLT5tZW1vcnk7Ci0gICAgCisKICAgICAvKiBhbGxvY2F0ZSBhbmQgc2V0dXAgcG9pbnRzICsgY29udG91cnMgYXJyYXlzICovCiAgICAgaWYgKCBBTExPQ19BUlJBWSggZ2x5cGgtPnBvaW50cywgICBvdXRsaW5lLT5uX3BvaW50cywgICBQU0gyX1BvaW50UmVjICAgKSB8fAogICAgICAgICAgQUxMT0NfQVJSQVkoIGdseXBoLT5jb250b3Vycywgb3V0bGluZS0+bl9jb250b3VycywgUFNIMl9Db250b3VyUmVjICkgKQogICAgICAgZ290byBFeGl0OwotICAgIAorCiAgICAgZ2x5cGgtPm51bV9wb2ludHMgICA9IG91dGxpbmUtPm5fcG9pbnRzOwogICAgIGdseXBoLT5udW1fY29udG91cnMgPSBvdXRsaW5lLT5uX2NvbnRvdXJzOwotICAgIAorCiAgICAgewogICAgICAgRlRfVUludCAgICAgICBmaXJzdCA9IDAsIG5leHQsIG47CiAgICAgICBQU0gyX1BvaW50ICAgIHBvaW50cyAgPSBnbHlwaC0+cG9pbnRzOwogICAgICAgUFNIMl9Db250b3VyICBjb250b3VyID0gZ2x5cGgtPmNvbnRvdXJzOwotICAgICAgCisKICAgICAgIGZvciAoIG4gPSAwOyBuIDwgZ2x5cGgtPm51bV9jb250b3VyczsgbisrICkKICAgICAgIHsKICAgICAgICAgRlRfSW50ICAgICAgY291bnQ7CiAgICAgICAgIFBTSDJfUG9pbnQgIHBvaW50OwotICAgICAgICAKKwogICAgICAgICBuZXh0ICA9IG91dGxpbmUtPmNvbnRvdXJzW25dICsgMTsKICAgICAgICAgY291bnQgPSBuZXh0IC0gZmlyc3Q7Ci0gICAgICAgIAorCiAgICAgICAgIGNvbnRvdXItPnN0YXJ0ID0gcG9pbnRzICsgZmlyc3Q7CiAgICAgICAgIGNvbnRvdXItPmNvdW50ID0gKEZUX1VJbnQpY291bnQ7Ci0gICAgICAgIAorCiAgICAgICAgIGlmICggY291bnQgPiAwICkKICAgICAgICAgewogICAgICAgICAgIHBvaW50ID0gcG9pbnRzICsgZmlyc3Q7Ci0gICAgICAgICAgCisKICAgICAgICAgICBwb2ludC0+cHJldiAgICA9IHBvaW50cyArIG5leHQgLSAxOwogICAgICAgICAgIHBvaW50LT5jb250b3VyID0gY29udG91cjsKICAgICAgICAgICBmb3IgKCA7IGNvdW50ID4gMTsgY291bnQtLSApCkBAIC04NjUsNyArODY2LDcgQEAKICAgICAgICAgICBwb2ludC0+bmV4dCA9IHBvaW50cyArIGZpcnN0OwogICAgICAgICB9CiAKLSAgICAgICAgY29udG91cisrOyAKKyAgICAgICAgY29udG91cisrOwogICAgICAgICBmaXJzdCA9IG5leHQ7CiAgICAgICB9CiAgICAgfQpAQCAtODc1LDI2ICs4NzYsMjYgQEAKICAgICAgIFBTSDJfUG9pbnQgIHBvaW50ICA9IHBvaW50czsKICAgICAgIEZUX1ZlY3RvciogIHZlYyAgICA9IG91dGxpbmUtPnBvaW50czsKICAgICAgIEZUX1VJbnQgICAgIG47Ci0gICAgICAKKwogICAgICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX3BvaW50czsgbisrLCBwb2ludCsrICkKICAgICAgIHsKICAgICAgICAgRlRfSW50ICAgIG5fcHJldiA9IHBvaW50LT5wcmV2IC0gcG9pbnRzOwogICAgICAgICBGVF9JbnQgICAgbl9uZXh0ID0gcG9pbnQtPm5leHQgLSBwb2ludHM7CiAgICAgICAgIEZUX1BvcyAgICBkeGksIGR5aSwgZHhvLCBkeW87Ci0gICAgICAgIAorCiAgICAgICAgIGlmICggIShvdXRsaW5lLT50YWdzW25dICYgRlRfQ3VydmVfVGFnX09uKSApCiAgICAgICAgICAgcG9pbnQtPmZsYWdzID0gUFNIMl9QT0lOVF9PRkY7Ci0gICAgICAgIAorCiAgICAgICAgIGR4aSA9IHZlY1tuXS54IC0gdmVjW25fcHJldl0ueDsKICAgICAgICAgZHlpID0gdmVjW25dLnkgLSB2ZWNbbl9wcmV2XS55OwotICAgICAgICAKKwogICAgICAgICBwb2ludC0+ZGlyX2luID0gKEZUX0NoYXIpIHBzaDJfY29tcHV0ZV9kaXIoIGR4aSwgZHlpICk7CiAKICAgICAgICAgZHhvID0gdmVjW25fbmV4dF0ueCAtIHZlY1tuXS54OwogICAgICAgICBkeW8gPSB2ZWNbbl9uZXh0XS55IC0gdmVjW25dLnk7CiAKICAgICAgICAgcG9pbnQtPmRpcl9vdXQgICA9IChGVF9DaGFyKSBwc2gyX2NvbXB1dGVfZGlyKCBkeG8sIGR5byApOwotICAgICAgICAKKwogICAgICAgICAvKiBkZXRlY3Qgc21vb3RoIHBvaW50cyAqLwogICAgICAgICBpZiAoIHBvaW50LT5mbGFncyAmIFBTSDJfUE9JTlRfT0ZGICkKICAgICAgICAgewpAQCAtOTA5LDE3ICs5MTAsMTcgQEAKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgRlRfQW5nbGUgIGFuZ2xlX2luLCBhbmdsZV9vdXQsIGRpZmY7Ci0gICAgICAgICAgCisKICAgICAgICAgICBhbmdsZV9pbiAgPSBGVF9BdGFuMiggZHhpLCBkeWkgKTsKICAgICAgICAgICBhbmdsZV9vdXQgPSBGVF9BdGFuMiggZHhvLCBkeW8gKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIGRpZmYgPSBhbmdsZV9pbiAtIGFuZ2xlX291dDsKICAgICAgICAgICBpZiAoIGRpZmYgPCAwICkKICAgICAgICAgICAgIGRpZmYgPSAtZGlmZjsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgaWYgKCBkaWZmID4gRlRfQU5HTEVfUEkgKQogICAgICAgICAgICAgZGlmZiA9IEZUX0FOR0xFXzJQSSAtIGRpZmY7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgIGlmICggKGRpZmYgPCBGVF9BTkdMRV9QSS8xNikgKQogICAgICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IFBTSDJfUE9JTlRfU01PT1RIOwogICAgICAgICB9CkBAIC05MzcsMTQgKzkzOCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc19oaW50cy0+ZGltZW5zaW9uWzBdLmNvdW50ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwogICAgIGlmIChlcnJvcikgZ290byBFeGl0OwotICAgIAorCiAgICAgZXJyb3IgPSBwc2gyX2hpbnRfdGFibGVfaW5pdCggJmdseXBoLT5oaW50X3RhYmxlcyBbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMV0uaGludHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMV0ubWFza3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMV0uY291bnRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7CiAgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7Ci0gICAgCisKICAgRXhpdDoKICAgICByZXR1cm4gZXJyb3I7CiAgIH0KQEAgLTk2NywxNSArOTY4LDE1IEBACiAgICAgICAgIHBvaW50LT5vcmdfdSA9IHZlYy0+eDsKICAgICAgIGVsc2UKICAgICAgICAgcG9pbnQtPm9yZ191ID0gdmVjLT55OwotICAgICAgICAKKwogI2lmZGVmIERFQlVHX0hJTlRFUgogICAgICAgcG9pbnQtPm9yZ194ICA9IHZlYy0+eDsKICAgICAgIHBvaW50LT5vcmdfeSAgPSB2ZWMtPnk7Ci0jZW5kaWYgICAgICAgIAorI2VuZGlmCiAgICAgfQogICB9CiAKLSAgCisKICAvKiBzYXZlIGhpbnRlZCBwb2ludCBjb29yZGluYXRlcyBiYWNrIHRvIG91dGxpbmUgKi8KICAgc3RhdGljIHZvaWQKICAgcHNoMl9nbHlwaF9zYXZlX3BvaW50cyggUFNIMl9HbHlwaCAgZ2x5cGgsCkBAIC05ODUsMTQgKzk4NiwxNCBAQAogICAgIFBTSDJfUG9pbnQgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKICAgICBGVF9WZWN0b3IqICB2ZWMgICA9IGdseXBoLT5vdXRsaW5lLT5wb2ludHM7CiAgICAgY2hhciogICAgICAgdGFncyAgPSBnbHlwaC0+b3V0bGluZS0+dGFnczsKLSAgICAKKwogICAgIGZvciAoIG4gPSAwOyBuIDwgZ2x5cGgtPm51bV9wb2ludHM7IG4rKyApCi0gICAgeyAKKyAgICB7CiAgICAgICBpZiAodmVydGljYWwpCiAgICAgICAgIHZlY1tuXS54ID0gcG9pbnQtPmN1cl91OwogICAgICAgZWxzZQogICAgICAgICB2ZWNbbl0ueSA9IHBvaW50LT5jdXJfdTsKLSAgICAgIAorCiAgICAgICBpZiAoIHBzaDJfcG9pbnRfaXNfc3Ryb25nKHBvaW50KSApCiAgICAgICAgIHRhZ3Nbbl0gfD0gdmVydGljYWwgPyAzMiA6IDY0OwogCkBAIC0xMDA3LDEyICsxMDA4LDE0IEBACiAgICAgICAgIHBvaW50LT5jdXJfeSAgID0gcG9pbnQtPmN1cl91OwogICAgICAgICBwb2ludC0+ZmxhZ3NfeSA9IHBvaW50LT5mbGFnczsKICAgICAgIH0KLSNlbmRpZiAgICAgICAgICAgIAorI2VuZGlmCiAgICAgICBwb2ludCsrOwogICAgIH0KICAgfQogCiAKKyNkZWZpbmUgIFBTSDJfU1RST05HX1RIUkVTSE9MRCAgMTAKKwogICBzdGF0aWMgdm9pZAogICBwc2gyX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnQoIFBTSDJfSGludF9UYWJsZSAgdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIMl9Qb2ludCAgICAgICBwb2ludCwKQEAgLTEwMjAsMzEgKzEwMjMsMzEgQEAKICAgewogICAgIFBTSDJfSGludCogICBzb3J0ICAgICAgPSB0YWJsZS0+c29ydDsKICAgICBGVF9VSW50ICAgICAgbnVtX2hpbnRzID0gdGFibGUtPm51bV9oaW50czsKLSAgICAKKwogICAgIGZvciAoIDsgbnVtX2hpbnRzID4gMDsgbnVtX2hpbnRzLS0sIHNvcnQrKyApCiAgICAgewogICAgICAgUFNIMl9IaW50ICBoaW50ID0gc29ydFswXTsKLSAgICAgIAorCiAgICAgICBpZiAoIEFCUyhwb2ludC0+ZGlyX2luKSAgPT0gbWFqb3JfZGlyIHx8CiAgICAgICAgICAgIEFCUyhwb2ludC0+ZGlyX291dCkgPT0gbWFqb3JfZGlyICkKICAgICAgIHsKICAgICAgICAgRlRfUG9zICBkOwotICAgICAgICAKKwogICAgICAgICBkID0gcG9pbnQtPm9yZ191IC0gaGludC0+b3JnX3BvczsKLSAgICAgICAgaWYgKCBBQlMoZCkgPCAzICkKKyAgICAgICAgaWYgKCBBQlMoZCkgPCBQU0gyX1NUUk9OR19USFJFU0hPTEQgKQogICAgICAgICB7CiAgICAgICAgIElzX1N0cm9uZzoKICAgICAgICAgICBwc2gyX3BvaW50X3NldF9zdHJvbmcocG9pbnQpOwogICAgICAgICAgIHBvaW50LT5oaW50ID0gaGludDsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBkIC09IGhpbnQtPm9yZ19sZW47Ci0gICAgICAgIGlmICggQUJTKGQpIDwgMyApCisgICAgICAgIGlmICggQUJTKGQpIDwgUFNIMl9TVFJPTkdfVEhSRVNIT0xEICkKICAgICAgICAgICBnb3RvIElzX1N0cm9uZzsKICAgICAgIH0KIAotI2lmIDEgICAgICAgICAgICAgIAorI2lmIDEKICAgICAgIGlmICggcG9pbnQtPm9yZ191ID49IGhpbnQtPm9yZ19wb3MgJiYKICAgICAgICAgICAgcG9pbnQtPm9yZ191IDw9IGhpbnQtPm9yZ19wb3MgKyBoaW50LT5vcmdfbGVuICYmCiAgICAgICAgICAgIHBzaDJfcG9pbnRfaXNfZXh0cmVtdW0oIHBvaW50ICkgKQpAQCAtMTA1MywxMSArMTA1NiwxMSBAQAogICAgICAgICBwb2ludC0+aGludCA9IGhpbnQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotI2VuZGlmICAgICAgICAgICAgICAgIAorI2VuZGlmCiAgICAgfQogICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisKIAogIC8qIGZpbmQgc3Ryb25nIHBvaW50cyBpbiBhIGdseXBoICovCiAgIHN0YXRpYyB2b2lkCkBAIC0xMDcxLDggKzEwNzQsOCBAQAogICAgICAgUFNfTWFzayAgICAgICAgICBtYXNrICAgICAgPSB0YWJsZS0+aGludF9tYXNrcy0+bWFza3M7CiAgICAgICBGVF9VSW50ICAgICAgICAgIG51bV9tYXNrcyA9IHRhYmxlLT5oaW50X21hc2tzLT5udW1fbWFza3M7CiAgICAgICBGVF9VSW50ICAgICAgICAgIGZpcnN0ICAgICA9IDA7Ci0gICAgICBGVF9JbnQgICAgICAgICAgIG1ham9yX2RpciA9IHZlcnRpY2FsID8gUFNIMl9ESVJfVVAgICAgOiBQU0gyX0RJUl9SSUdIVDsKLSAgICAgIAorICAgICAgRlRfSW50ICAgICAgICAgICBtYWpvcl9kaXIgPSB2ZXJ0aWNhbCA/IFBTSDJfRElSX1VQIDogUFNIMl9ESVJfUklHSFQ7CisKICAgICAgIC8qIHByb2Nlc3Mgc2Vjb25kYXJ5IGhpbnRzIHRvICJzZWxlY3RlZCIgcG9pbnRzICovCiAgICAgICBpZiAoIG51bV9tYXNrcyA+IDEgKQogICAgICAgewpAQCAtMTA4MSwyOCArMTA4NCwyOCBAQAogICAgICAgICB7CiAgICAgICAgICAgRlRfVUludCAgbmV4dDsKICAgICAgICAgICBGVF9JbnQgICBjb3VudDsKLSAgICAgICAgICAKKwogICAgICAgICAgIG5leHQgID0gbWFzay0+ZW5kX3BvaW50OwogICAgICAgICAgIGNvdW50ID0gbmV4dCAtIGZpcnN0OwogICAgICAgICAgIGlmICggY291bnQgPiAwICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBQU0gyX1BvaW50ICBwb2ludCA9IGdseXBoLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBwc2gyX2hpbnRfdGFibGVfYWN0aXZhdGVfbWFzayggdGFibGUsIG1hc2sgKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcG9pbnQrKyApCiAgICAgICAgICAgICAgIHBzaDJfaGludF90YWJsZV9maW5kX3N0cm9uZ19wb2ludCggdGFibGUsIHBvaW50LCBtYWpvcl9kaXIgKTsKICAgICAgICAgICB9CiAgICAgICAgICAgZmlyc3QgPSBuZXh0OwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLyogcHJvY2VzcyBwcmltYXJ5IGhpbnRzIGZvciBhbGwgcG9pbnRzICovCiAgICAgICBpZiAoIG51bV9tYXNrcyA9PSAxICkKICAgICAgIHsKICAgICAgICAgRlRfVUludCAgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKICAgICAgICAgUFNIMl9Qb2ludCAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotICAgICAgICAKKwogICAgICAgICBwc2gyX2hpbnRfdGFibGVfYWN0aXZhdGVfbWFzayggdGFibGUsIHRhYmxlLT5oaW50X21hc2tzLT5tYXNrcyApOwogICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgcG9pbnQrKyApCiAgICAgICAgIHsKQEAgLTExMTAsMTMgKzExMTMsMTMgQEAKICAgICAgICAgICAgIHBzaDJfaGludF90YWJsZV9maW5kX3N0cm9uZ19wb2ludCggdGFibGUsIHBvaW50LCBtYWpvcl9kaXIgKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgCisKICAgICAgIC8qIG5vdywgY2VydGFpbiBwb2ludHMgbWF5IGhhdmUgYmVlbiBhdHRhY2hlZCB0byBoaW50IGFuZCAqLwogICAgICAgLyogbm90IG1hcmtlZCBhcyBzdHJvbmcsIHVwZGF0ZSB0aGVpciBmbGFncyB0aGVuLi4gICAgICAgICovCiAgICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7CisgICAgICAgIEZUX1VJbnQgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7CiAgICAgICAgIFBTSDJfUG9pbnQgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKLSAgICAgICAgCisKICAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQogICAgICAgICAgIGlmICggcG9pbnQtPmhpbnQgJiYgIXBzaDJfcG9pbnRfaXNfc3Ryb25nKHBvaW50KSApCiAgICAgICAgICAgICBwc2gyX3BvaW50X3NldF9zdHJvbmcocG9pbnQpOwpAQCAtMTEzNywzMiArMTE0MCwzMiBAQAogICAgIHsKICAgICAgIEZUX1VJbnQgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7CiAgICAgICBQU0gyX1BvaW50ICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0gICAgICAKKwogICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQogICAgICAgewogICAgICAgICBQU0gyX0hpbnQgIGhpbnQgPSBwb2ludC0+aGludDsKLSAgICAgICAgCisKICAgICAgICAgaWYgKCBoaW50ICkKICAgICAgICAgewogICAgICAgICAgIEZUX1BvcyAgZGVsdGE7Ci0gICAgICAgICAgCisKICAgICAgICAgICBkZWx0YSA9IHBvaW50LT5vcmdfdSAtIGhpbnQtPm9yZ19wb3M7Ci0gICAgICAgICAgCisKICAgICAgICAgICBpZiAoIGRlbHRhIDw9IDAgKQogICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvcyArIEZUX011bEZpeCggZGVsdGEsIHNjYWxlICk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgIGVsc2UgaWYgKCBkZWx0YSA+PSBoaW50LT5vcmdfbGVuICkKICAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGhpbnQtPmN1cl9wb3MgKyBoaW50LT5jdXJfbGVuICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZGVsdGEgLSBoaW50LT5vcmdfbGVuLCBzY2FsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKICAgICAgICAgICBlbHNlIGlmICggaGludC0+b3JnX2xlbiA+IDAgKQogICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGRlbHRhLCBoaW50LT5jdXJfbGVuLCBoaW50LT5vcmdfbGVuICk7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvczsKLSAgICAgICAgICAKKwogICAgICAgICAgIHBzaDJfcG9pbnRfc2V0X2ZpdHRlZChwb2ludCk7Ci0gICAgICAgIH0gCisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTExODAsNDMgKzExODMsNDMgQEAKICAgICB7CiAgICAgICBGVF9VSW50ICAgICBjb3VudCA9IGdseXBoLT5udW1fcG9pbnRzOwogICAgICAgUFNIMl9Qb2ludCAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotICAgICAgCisKICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKICAgICAgIHsKICAgICAgICAgaWYgKCBwc2gyX3BvaW50X2lzX3N0cm9uZyhwb2ludCkgKQogICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIAorCiAgICAgICAgIC8qIHNvbWV0aW1lcywgc29tZSBsb2NhbCBleHRyZW1hcyBhcmUgc21vb3RoIHBvaW50cyAqLwogICAgICAgICBpZiAoIHBzaDJfcG9pbnRfaXNfc21vb3RoKHBvaW50KSApCiAgICAgICAgIHsKICAgICAgICAgICBpZiAoIHBvaW50LT5kaXJfaW4gPT0gUFNIMl9ESVJfTk9ORSAgfHwKICAgICAgICAgICAgICAgIHBvaW50LT5kaXJfaW4gIT0gcG9pbnQtPmRpcl9vdXQgKQogICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgIGlmICggIXBzaDJfcG9pbnRfaXNfZXh0cmVtdW0oIHBvaW50ICkgKQogICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgIHBvaW50LT5mbGFncyAmPSB+UFNIMl9QT0lOVF9TTU9PVEg7CiAgICAgICAgIH0KLSAgICAgICAgICAKKwogICAgICAgICAvKiBmaW5kIGJlc3QgZW5jbG9zaW5nIHBvaW50IGNvb3JkaW5hdGVzICovCiAgICAgICAgIHsKICAgICAgICAgICBQU0gyX1BvaW50ICBiZWZvcmUgPSAwOwogICAgICAgICAgIFBTSDJfUG9pbnQgIGFmdGVyICA9IDA7Ci0gICAgICAgICAgCisKICAgICAgICAgICBGVF9Qb3MgICAgICBkaWZmX2JlZm9yZSA9IC0zMjAwMDsKICAgICAgICAgICBGVF9Qb3MgICAgICBkaWZmX2FmdGVyICA9ICAzMjAwMDsKICAgICAgICAgICBGVF9Qb3MgICAgICB1ID0gcG9pbnQtPm9yZ191OwotICAgICAgICAgIAorCiAgICAgICAgICAgRlRfSW50ICAgICAgY291bnQyID0gZ2x5cGgtPm51bV9wb2ludHM7CiAgICAgICAgICAgUFNIMl9Qb2ludCAgY3VyICAgID0gZ2x5cGgtPnBvaW50czsKLSAgICAgICAgICAKKwogICAgICAgICAgIGZvciAoIDsgY291bnQyID4gMDsgY291bnQyLS0sIGN1cisrICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHBzaDJfcG9pbnRfaXNfc3Ryb25nKGN1cikgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICBGVF9Qb3MgICBkaWZmID0gY3VyLT5vcmdfdSAtIHU7OwotICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgICBpZiAoIGRpZmYgPD0gMCApCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIGRpZmYgPiBkaWZmX2JlZm9yZSApCkBAIC0xMjM1LDEyICsxMjM4LDEyIEBACiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgCisKICAgICAgICAgICBpZiAoICFiZWZvcmUgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggIWFmdGVyICkKICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvKiB3ZSdyZSBiZWZvcmUgdGhlIGZpcnN0IHN0cm9uZyBwb2ludCBjb29yZGluYXRlICovCiAgICAgICAgICAgICAvKiBzaW1wbHkgdHJhbnNsYXRlIHRoZSBwb2ludC4uICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBhZnRlci0+Y3VyX3UgKwpAQCAtMTI1NywyMyArMTI2MCwyMyBAQAogICAgICAgICAgIHsKICAgICAgICAgICAgIGlmICggZGlmZl9iZWZvcmUgPT0gMCApCiAgICAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGJlZm9yZS0+Y3VyX3U7Ci0gICAgICAgICAgICAgIAorCiAgICAgICAgICAgICBlbHNlIGlmICggZGlmZl9hZnRlciA9PSAwICkKICAgICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gYWZ0ZXItPmN1cl91OwotICAgICAgICAgICAgICAKKwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBiZWZvcmUtPmN1cl91ICsgCisgICAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGJlZm9yZS0+Y3VyX3UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIHUgLSBiZWZvcmUtPm9yZ191LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5jdXJfdSAtIGJlZm9yZS0+Y3VyX3UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPm9yZ191IC0gYmVmb3JlLT5vcmdfdSApOwogICAgICAgICAgIH0KLSAgICAgICAgICAKKwogICAgICAgICAgIHBzaDJfcG9pbnRfc2V0X2ZpdHRlZChwb2ludCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0jZW5kaWYgICAgCi0gIH0gIAorI2VuZGlmCisgIH0KIAogCiAKQEAgLTEyODcsNjEgKzEyOTAsNjEgQEAKICAgICBGVF9GaXhlZCAgICAgIGRlbHRhICAgICAgICA9IGRpbS0+c2NhbGVfZGVsdGE7CiAgICAgUFNIMl9Db250b3VyICBjb250b3VyICAgICAgPSBnbHlwaC0+Y29udG91cnM7CiAgICAgRlRfVUludCAgICAgICBudW1fY29udG91cnMgPSBnbHlwaC0+bnVtX2NvbnRvdXJzOwotICAgIAorCiAgICAgZm9yICggOyBudW1fY29udG91cnMgPiAwOyBudW1fY29udG91cnMtLSwgY29udG91cisrICkKICAgICB7CiAgICAgICBQU0gyX1BvaW50ICAgc3RhcnQgPSBjb250b3VyLT5zdGFydDsKICAgICAgIFBTSDJfUG9pbnQgICBmaXJzdCwgbmV4dCwgcG9pbnQ7CiAgICAgICBGVF9VSW50ICAgICAgZml0X2NvdW50OwotICAgICAgCisKICAgICAgIC8qIGNvdW50IHRoZSBudW1iZXIgb2Ygc3Ryb25nIHBvaW50cyBpbiB0aGlzIGNvbnRvdXIgKi8KICAgICAgIG5leHQgICAgICA9IHN0YXJ0ICsgY29udG91ci0+Y291bnQ7CiAgICAgICBmaXRfY291bnQgPSAwOwogICAgICAgZmlyc3QgICAgID0gMDsKLSAgICAgIAorCiAgICAgICBmb3IgKCBwb2ludCA9IHN0YXJ0OyBwb2ludCA8IG5leHQ7IHBvaW50KysgKQogICAgICAgICBpZiAoIHBzaDJfcG9pbnRfaXNfZml0dGVkKHBvaW50KSApCiAgICAgICAgIHsKICAgICAgICAgICBpZiAoICFmaXJzdCApCiAgICAgICAgICAgICBmaXJzdCA9IHBvaW50OwotICAgICAgICAgICAgCisKICAgICAgICAgICBmaXRfY291bnQrKzsKICAgICAgICAgfQotICAgICAgCisKICAgICAgIC8qIGlmIHRoZXJlIGlzIGxlc3MgdGhhbiAyIGZpdHRlZCBwb2ludHMgaW4gdGhlIGNvbnRvdXIsIHdlJ2xsICovCiAgICAgICAvKiBzaW1wbHkgc2NhbGUgYW5kIGV2ZW50dWFsbHkgdHJhbnNsYXRlIHRoZSBjb250b3VyIHBvaW50cyAgICAqLwogICAgICAgaWYgKCBmaXRfY291bnQgPCAyICkKICAgICAgIHsKICAgICAgICAgaWYgKCBmaXRfY291bnQgPT0gMSApCiAgICAgICAgICAgZGVsdGEgPSBmaXJzdC0+Y3VyX3UgLSBGVF9NdWxGaXgoIGZpcnN0LT5vcmdfdSwgc2NhbGUgKTsKLSAgICAgICAgICAKKwogICAgICAgICBmb3IgKCBwb2ludCA9IHN0YXJ0OyBwb2ludCA8IG5leHQ7IHBvaW50KysgKQogICAgICAgICAgIGlmICggcG9pbnQgIT0gZmlyc3QgKQogICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gRlRfTXVsRml4KCBwb2ludC0+b3JnX3UsIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgICAgICAgIAorCiAgICAgICAgIGdvdG8gTmV4dF9Db250b3VyOwogICAgICAgfQotICAgICAgICAgICAgICAKKwogICAgICAgLyogdGhlcmUgYXJlIG1vcmUgdGhhbiAyIHN0cm9uZyBwb2ludHMgaW4gdGhpcyBjb250b3VyLCB3ZSdsbCAqLwogICAgICAgLyogbmVlZCB0byBpbnRlcnBvbGF0ZSB3ZWFrIHBvaW50cyBiZXR3ZWVuIHRoZW0uLiAgICAgICAgICAgICAqLwogICAgICAgc3RhcnQgPSBmaXJzdDsKICAgICAgIGRvCiAgICAgICB7CiAgICAgICAgIHBvaW50ID0gZmlyc3Q7Ci0gICAgICAgIAorCiAgICAgICAgIC8qIHNraXAgY29uc2VjdXRpdmUgZml0dGVkIHBvaW50cyAqLwogICAgICAgICBmb3IgKDs7KQogICAgICAgICB7Ci0gICAgICAgICAgbmV4dCA9IGZpcnN0LT5uZXh0OyAKKyAgICAgICAgICBuZXh0ID0gZmlyc3QtPm5leHQ7CiAgICAgICAgICAgaWYgKCBuZXh0ID09IHN0YXJ0ICkKICAgICAgICAgICAgIGdvdG8gTmV4dF9Db250b3VyOwotICAgICAgICAgICAgCisKICAgICAgICAgICBpZiAoICFwc2gyX3BvaW50X2lzX2ZpdHRlZChuZXh0KSApCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgZmlyc3QgPSBuZXh0OwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8qIGZpbmQgbmV4dCBmaXR0ZWQgcG9pbnQgYWZ0ZXIgdW5maXR0ZWQgb25lICovCiAgICAgICAgIGZvciAoOzspCiAgICAgICAgIHsKQEAgLTEzNDksNyArMTM1Miw3IEBACiAgICAgICAgICAgaWYgKCBwc2gyX3BvaW50X2lzX2ZpdHRlZChuZXh0KSApCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICAvKiBub3cgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVtICovCiAgICAgICAgIHsKICAgICAgICAgICBGVF9Qb3MgICAgb3JnX2EsIG9yZ19hYiwgY3VyX2EsIGN1cl9hYjsKQEAgLTEzNzAsMTcgKzEzNzMsMTcgQEAKICAgICAgICAgICAgIG9yZ19hYiA9IGZpcnN0LT5vcmdfdSAtIG9yZ19hOwogICAgICAgICAgICAgY3VyX2FiID0gZmlyc3QtPmN1cl91IC0gY3VyX2E7CiAgICAgICAgICAgfQotICAgICAgICAgIAorCiAgICAgICAgICAgc2NhbGVfYWIgPSAweDEwMDAwTDsKICAgICAgICAgICBpZiAoIG9yZ19hYiA+IDAgKQogICAgICAgICAgICAgc2NhbGVfYWIgPSBGVF9EaXZGaXgoIGN1cl9hYiwgb3JnX2FiICk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgIHBvaW50ID0gZmlyc3QtPm5leHQ7CiAgICAgICAgICAgZG8KICAgICAgICAgICB7CiAgICAgICAgICAgICBvcmdfYyAgPSBwb2ludC0+b3JnX3U7CiAgICAgICAgICAgICBvcmdfYWMgPSBvcmdfYyAtIG9yZ19hOwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIGlmICggb3JnX2FjIDw9IDAgKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKiBvbiB0aGUgbGVmdCBvZiB0aGUgaW50ZXJwb2xhdGlvbiB6b25lICovCkBAIC0xMzkyLDI4ICsxMzk1LDI4IEBACiAgICAgICAgICAgICAgIGN1cl9jID0gY3VyX2EgKyBjdXJfYWIgKyBGVF9NdWxGaXgoIG9yZ19hYyAtIG9yZ19hYiwgc2NhbGUgKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsgCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgaW50ZXJwb2xhdGlvbiB6b25lICovCiAgICAgICAgICAgICAgIGN1cl9jID0gY3VyX2EgKyBGVF9NdWxGaXgoIG9yZ19hYywgc2NhbGVfYWIgKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBjdXJfYzsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBwb2ludCA9IHBvaW50LT5uZXh0OwogICAgICAgICAgIH0KICAgICAgICAgICB3aGlsZSAoIHBvaW50ICE9IG5leHQgKTsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoga2VlcCBnb2luZyB1bnRpbCBhbGwgcG9pbnRzIGluIHRoZSBjb250b3VycyBoYXZlIGJlZW4gcHJvY2Vzc2VkICovICAKKworICAgICAgICAvKiBrZWVwIGdvaW5nIHVudGlsIGFsbCBwb2ludHMgaW4gdGhlIGNvbnRvdXJzIGhhdmUgYmVlbiBwcm9jZXNzZWQgKi8KICAgICAgICAgZmlyc3QgPSBuZXh0OwogICAgICAgfQogICAgICAgd2hpbGUgKCBmaXJzdCAhPSBzdGFydCApOwotICAgICAgCisKICAgICBOZXh0X0NvbnRvdXI6CiAgICAgICA7CiAgICAgfQogICB9Ci0gIAorCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCkBAIC0xNDIxLDcgKzE0MjQsNyBAQAogIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAKKwogICBGVF9FcnJvcgogICBwczJfaGludHNfYXBwbHkoIFBTX0hpbnRzICAgICBwc19oaW50cywKICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKQEAgLTE0MzYsNyArMTQzOSw3IEBACiAgICAgbWVtb3J5ID0gZ2xvYmFscy0+bWVtb3J5OwogCiAgICAgRlRfVU5VU0VEKGdseXBocmVjKTsKLSAgICAKKwogCiAjaWZkZWYgREVCVUdfSElOVEVSCiAgICAgaWYgKCBwczJfZGVidWdfZ2x5cGggKQpAQCAtMTQ0NCwyMyArMTQ0NywyMyBAQAogICAgICAgcHNoMl9nbHlwaF9kb25lKCBwczJfZGVidWdfZ2x5cGggKTsKICAgICAgIEZSRUUoIHBzMl9kZWJ1Z19nbHlwaCApOwogICAgIH0KLSAgICAKKwogICAgIGlmICggQUxMT0MoIGdseXBoLCBzaXplb2YoKmdseXBoKSApICkKICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIAorCiAgICAgcHMyX2RlYnVnX2dseXBoID0gZ2x5cGg7Ci0jZWxzZSAKLSAgICBnbHlwaCA9ICZnbHlwaHJlYzsgICAgCisjZWxzZQorICAgIGdseXBoID0gJmdseXBocmVjOwogI2VuZGlmCiAKICAgICBlcnJvciA9IHBzaDJfZ2x5cGhfaW5pdCggZ2x5cGgsIG91dGxpbmUsIHBzX2hpbnRzLCBnbG9iYWxzICk7CiAgICAgaWYgKGVycm9yKSBnb3RvIEV4aXQ7Ci0gICAgCisKICAgICBmb3IgKCBkaW1lbnNpb24gPSAxOyBkaW1lbnNpb24gPj0gMDsgZGltZW5zaW9uLS0gKQogICAgIHsKICAgICAgIC8qIGxvYWQgb3V0bGluZSBjb29yZGluYXRlcyBpbnRvIGdseXBoICovCiAgICAgICBwc2gyX2dseXBoX2xvYWRfcG9pbnRzKCBnbHlwaCwgZGltZW5zaW9uICk7Ci0gICAgICAKKwogICAgICAgLyogY29tcHV0ZSBhbGlnbmVkIHN0ZW0vaGludHMgcG9zaXRpb25zICovCiAgICAgICBwc2gyX2hpbnRfdGFibGVfYWxpZ25faGludHMoICZnbHlwaC0+aGludF90YWJsZXNbZGltZW5zaW9uXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGgtPmdsb2JhbHMsCkBAIC0xNDcxLDEzICsxNDc0LDEzIEBACiAgICAgICBwc2gyX2dseXBoX2ludGVycG9sYXRlX3N0cm9uZ19wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKICAgICAgIHBzaDJfZ2x5cGhfaW50ZXJwb2xhdGVfbm9ybWFsX3BvaW50cyggZ2x5cGgsIGRpbWVuc2lvbiApOwogICAgICAgcHNoMl9nbHlwaF9pbnRlcnBvbGF0ZV9vdGhlcl9wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKLSAgICAgIAorCiAgICAgICAvKiBzYXZlIGhpbnRlZCBjb29yZGluYXRlcyBiYWNrIHRvIG91dGxpbmUgKi8KICAgICAgIHBzaDJfZ2x5cGhfc2F2ZV9wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKICAgICB9Ci0gICAgCi0gIEV4aXQ6ICAgIAotI2lmbmRlZiBERUJVR19ISU5URVIgIAorCisgIEV4aXQ6CisjaWZuZGVmIERFQlVHX0hJTlRFUgogICAgIHBzaDJfZ2x5cGhfZG9uZSggZ2x5cGggKTsKICNlbmRpZgogICAgIHJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL3NyYy9wc2hpbnRlci9wc2hhbGdvMi5oIGIvc3JjL3BzaGludGVyL3BzaGFsZ28yLmgKaW5kZXggNTc1NzEyYy4uZDA0M2E2NSAxMDA2NDQKLS0tIGEvc3JjL3BzaGludGVyL3BzaGFsZ28yLmgKKysrIGIvc3JjL3BzaGludGVyL3BzaGFsZ28yLmgKQEAgLTMxLDExICszMSwxMSBAQAogICAgIFBTSDJfSElOVF9HSE9TVCAgPSBQU19ISU5UX0ZMQUdfR0hPU1QsCiAgICAgUFNIMl9ISU5UX0JPVFRPTSA9IFBTX0hJTlRfRkxBR19CT1RUT00sCiAgICAgUFNIMl9ISU5UX0FDVElWRSA9IDQsCi0gICAgUFNIMl9ISU5UX0ZJVFRFRCA9IDggIAorICAgIFBTSDJfSElOVF9GSVRURUQgPSA4CiAgIH0gUFNIMl9IaW50X0ZsYWdzOwogCiAjZGVmaW5lICBwc2gyX2hpbnRfaXNfYWN0aXZlKHgpICAoKCh4KS0+ZmxhZ3MgICYgUFNIMl9ISU5UX0FDVElWRSkgIT0gMCkKLSNkZWZpbmUgIHBzaDJfaGludF9pc19naG9zdCh4KSAgICgoKHgpLT5mbGFncyAgJiBQU0gyX0hJTlRfR0hPU1QpICAhPSAwKSAgCisjZGVmaW5lICBwc2gyX2hpbnRfaXNfZ2hvc3QoeCkgICAoKCh4KS0+ZmxhZ3MgICYgUFNIMl9ISU5UX0dIT1NUKSAgIT0gMCkKICNkZWZpbmUgIHBzaDJfaGludF9pc19maXR0ZWQoeCkgICgoKHgpLT5mbGFncyAgJiBQU0gyX0hJTlRfRklUVEVEKSAhPSAwKQogCiAjZGVmaW5lICBwc2gyX2hpbnRfYWN0aXZhdGUoeCkgICAgICh4KS0+ZmxhZ3MgfD0gIFBTSDJfSElOVF9BQ1RJVkUKQEAgLTUxLDcgKzUxLDcgQEAKICAgICBGVF9VSW50ICAgIGZsYWdzOwogICAgIFBTSDJfSGludCAgcGFyZW50OwogICAgIEZUX0ludCAgICAgb3JkZXI7Ci0gIAorCiAgIH0gUFNIMl9IaW50UmVjOwogCiAKQEAgLTY0LDcgKzY0LDcgQEAKICAgICBGVF9GaXhlZCAgZGVsdGE7CiAgICAgRlRfUG9zICAgIG1pbjsKICAgICBGVF9Qb3MgICAgbWF4OwotICAgIAorCiAgIH0gUFNIMl9ab25lUmVjLCAqUFNIMl9ab25lOwogCiAKQEAgLTgwLDEyICs4MCwxMyBAQAogICAgIFBTSDJfWm9uZSAgICAgIHpvbmU7CiAgICAgUFNfTWFza19UYWJsZSAgaGludF9tYXNrczsKICAgICBQU19NYXNrX1RhYmxlICBjb3VudGVyX21hc2tzOwotICAgIAorCiAgIH0gUFNIMl9IaW50X1RhYmxlUmVjLCAqUFNIMl9IaW50X1RhYmxlOwogCisKICAgdHlwZWRlZiBzdHJ1Y3QgUFNIMl9Qb2ludFJlY18qICAgIFBTSDJfUG9pbnQ7CiAgIHR5cGVkZWYgc3RydWN0IFBTSDJfQ29udG91clJlY18qICBQU0gyX0NvbnRvdXI7Ci0gIAorCiAgIGVudW0KICAgewogICAgIFBTSDJfRElSX05PTkUgICA9ICA0LApAQCAtOTQsNyArOTUsNyBAQAogICAgIFBTSDJfRElSX0xFRlQgICA9IC0yLAogICAgIFBTSDJfRElSX1JJR0hUICA9ICAyCiAgIH07Ci0gIAorCiAgIGVudW0KICAgewogICAgIFBTSDJfUE9JTlRfT0ZGICAgID0gMSwgICAvKiBwb2ludCBpcyBvZmYgdGhlIGN1cnZlICAqLwpAQCAtMTI0LDEwICsxMjUsMTEgQEAKICAgICBGVF9Qb3MgICAgICAgIGN1cl95OwogICAgIEZUX1VJbnQgICAgICAgZmxhZ3NfeDsKICAgICBGVF9VSW50ICAgICAgIGZsYWdzX3k7Ci0jZW5kaWYgICAgCi0gICAgCisjZW5kaWYKKwogICB9IFBTSDJfUG9pbnRSZWM7CiAKKwogI2RlZmluZSAgcHNoMl9wb2ludF9pc19zdHJvbmcocCkgICAoKHApLT5mbGFncyAmIFBTSDJfUE9JTlRfU1RST05HKQogI2RlZmluZSAgcHNoMl9wb2ludF9pc19maXR0ZWQocCkgICAoKHApLT5mbGFncyAmIFBTSDJfUE9JTlRfRklUVEVEKQogI2RlZmluZSAgcHNoMl9wb2ludF9pc19zbW9vdGgocCkgICAoKHApLT5mbGFncyAmIFBTSDJfUE9JTlRfU01PT1RIKQpAQCAtMTQwLDM3ICsxNDIsMzcgQEAKICAgewogICAgIFBTSDJfUG9pbnQgIHN0YXJ0OwogICAgIEZUX1VJbnQgICAgIGNvdW50OwotICAgCisKICAgfSBQU0gyX0NvbnRvdXJSZWM7CiAKLSAgCisKIAogICB0eXBlZGVmIHN0cnVjdCBQU0gyX0dseXBoUmVjXwogICB7CiAgICAgRlRfVUludCAgICAgICAgICAgICBudW1fcG9pbnRzOwogICAgIEZUX1VJbnQgICAgICAgICAgICAgbnVtX2NvbnRvdXJzOwotICAgIAorCiAgICAgUFNIMl9Qb2ludCAgICAgICAgICBwb2ludHM7CiAgICAgUFNIMl9Db250b3VyICAgICAgICBjb250b3VyczsKLSAgICAgICAgICAgICAgIAorCiAgICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnk7CiAgICAgRlRfT3V0bGluZSogICAgICAgICBvdXRsaW5lOwogICAgIFBTSF9HbG9iYWxzICAgICAgICAgZ2xvYmFsczsKICAgICBQU0gyX0hpbnRfVGFibGVSZWMgIGhpbnRfdGFibGVzWzJdOwotICAgIAorCiAgICAgRlRfQm9vbCAgICAgICAgICAgICB2ZXJ0aWNhbDsKICAgICBGVF9JbnQgICAgICAgICAgICAgIG1ham9yX2RpcjsKICAgICBGVF9JbnQgICAgICAgICAgICAgIG1pbm9yX2RpcjsKLSAgICAKKwogICB9IFBTSDJfR2x5cGhSZWMsICpQU0gyX0dseXBoOwogCiAKLSNpZmRlZiBERUJVR19ISU5URVIgIAorI2lmZGVmIERFQlVHX0hJTlRFUgogICBleHRlcm4gIFBTSDJfSGludF9UYWJsZSAgcHMyX2RlYnVnX2hpbnRfdGFibGU7CiAKICAgdHlwZWRlZiB2b2lkICAoKlBTSDJfSGludEZ1bmMpKCBQU0gyX0hpbnQgIGhpbnQsIEZUX0Jvb2wgdmVydGljYWwgKTsKICAgZXh0ZXJuICBQU0gyX0hpbnRGdW5jICAgIHBzMl9kZWJ1Z19oaW50X2Z1bmM7Ci0gIAorCiAgIGV4dGVybiAgUFNIMl9HbHlwaCAgICAgICBwczJfZGVidWdfZ2x5cGg7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL3BzaGludGVyL3BzaHJlYy5jIGIvc3JjL3BzaGludGVyL3BzaHJlYy5jCmluZGV4IDY1OWRjNGEuLjI1MGQ5YzQgMTAwNjQ0Ci0tLSBhL3NyYy9wc2hpbnRlci9wc2hyZWMuYworKysgYi9zcmMvcHNoaW50ZXIvcHNocmVjLmMKQEAgLTEwMDksOSArMTAwOSw5IEBACiAgICAgICB9CiAgICAgfQogCi0jaWZkZWYgREVCVUdfVklFVworI2lmZGVmIERFQlVHX0hJTlRFUgogICAgIGlmICghZXJyb3IpCi0gICAgICB0aGVfcHNfaGludHMgPSBoaW50czsKKyAgICAgIHBzX2RlYnVnX2hpbnRzID0gaGludHM7CiAjZW5kaWYKICAgICByZXR1cm4gZXJyb3I7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zbW9vdGgvZnRncmF5cy5jIGIvc3JjL3Ntb290aC9mdGdyYXlzLmMKaW5kZXggMDMxYTFkOS4uMTU1YzM1MiAxMDA2NDQKLS0tIGEvc3JjL3Ntb290aC9mdGdyYXlzLmMKKysrIGIvc3JjL3Ntb290aC9mdGdyYXlzLmMKQEAgLTg2LDcgKzg2LDcgQEAKIAogCiAvKiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgZ2FtbWEgY29ycmVjdGlvbiB3aXRoaW4gdGhlIHJhc3Rlcml6ZXIgKi8KLSNkZWZpbmUgIEdSQVlTX1VTRV9HQU1NQQorI2RlZmluZSAgeHh4R1JBWVNfVVNFX0dBTU1BCiAKICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjA5LDcgKzIwOSw3IEBACiAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAvKiAgIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIAorCiAgIC8qIGRvbid0IGNoYW5nZSB0aGUgZm9sbG93aW5nIHR5cGVzIHRvIEZUX0ludCBvciBGVF9Qb3MsIHNpbmNlIHdlIG1pZ2h0ICovCiAgIC8qIG5lZWQgdG8gZGVmaW5lIHRoZW0gdG8gImZsb2F0IiBvciAiZG91YmxlIiB3aGVuIGV4cGVyaW1lbnRpbmcgd2l0aCAgICovCiAgIC8qIG5ldyBhbGdvcml0aG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMjAsNyArMjIwLDcgQEAKICAgLyogZGV0ZXJtaW5lIHRoZSB0eXBlIHVzZWQgdG8gc3RvcmUgY2VsbCBhcmVhcy4gIFRoaXMgbm9ybWFsbHkgdGFrZXMgYXQgKi8KICAgLyogbGVhc3QgUElYRUxfQllURVMqMiArIDEuICBPbiAxNi1iaXQgc3lzdGVtcywgd2UgbmVlZCB0byB1c2UgYGxvbmcnICAgKi8KICAgLyogaW5zdGVhZCBvZiBgaW50Jywgb3RoZXJ3aXNlIGJhZCB0aGluZ3MgaGFwcGVuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAKKwogI2lmIFBJWEVMX0JJVFMgPD0gNwogCiAgIHR5cGVkZWYgaW50ICAgVEFyZWE7CkBAIC0xMTgxLDkgKzExODEsOSBAQAogICAgIC8qIHN0YXJ0IHRvIGEgbmV3IHBvc2l0aW9uICovCiAgICAgeCA9IFVQU0NBTEUoIHRvLT54ICk7CiAgICAgeSA9IFVQU0NBTEUoIHRvLT55ICk7Ci0gICAgCisKICAgICBncmF5X3N0YXJ0X2NlbGwoIChQUmFzdGVyKXJhc3RlciwgVFJVTkMoIHggKSwgVFJVTkMoIHkgKSApOwotICAgICAgCisKICAgICAoKFBSYXN0ZXIpcmFzdGVyKS0+eCA9IHg7CiAgICAgKChQUmFzdGVyKXJhc3RlciktPnkgPSB5OwogICAgIHJldHVybiAwOwpAQCAtMTI0Myw3ICsxMjQzLDcgQEAKICNpZmRlZiBHUkFZU19VU0VfR0FNTUEKICAgICAgIGNvdmVyYWdlID0gcmFzdGVyLT5nYW1tYVsoRlRfQnl0ZSljb3ZlcmFnZV07CiAjZW5kaWYKLSAgICAgIAorCiAgICAgICBpZiAoIGNvdmVyYWdlICkKICNpZiAxCiAgICAgICAgIE1FTV9TZXQoIHAgKyBzcGFucy0+eCwgKHVuc2lnbmVkIGNoYXIpY292ZXJhZ2UsIHNwYW5zLT5sZW4gKTsKQEAgLTE0MDAsNyArMTQwMCw3IEBACiAKICAgICBpZiAoIHJhcy5udW1fY2VsbHMgPT0gMCApCiAgICAgICByZXR1cm47Ci0gICAgICAKKwogICAgIGN1ciAgID0gcmFzLmNlbGxzOwogICAgIGxpbWl0ID0gY3VyICsgcmFzLm51bV9jZWxsczsKIApAQCAtMTc0OCw3ICsxNzQ4LDcgQEAKICAgICB9OwogCiAgICAgdm9sYXRpbGUgaW50ICBlcnJvciA9IDA7Ci0gICAgCisKICAgICBpZiAoIHNldGptcCggcmFzLmp1bXBfYnVmZmVyICkgPT0gMCApCiAgICAgewogICAgICAgZXJyb3IgPSBGVF9PdXRsaW5lX0RlY29tcG9zZSggJnJhcy5vdXRsaW5lLCAmaW50ZXJmYWNlLCAmcmFzICk7CkBAIC0xNzc4LDcgKzE3NzgsNyBAQAogCiAgICAgLyogY2xpcCB0byB0YXJnZXQgYml0bWFwLCBleGl0IGlmIG5vdGhpbmcgdG8gZG8gKi8KICAgICBjbGlwID0gJnJhcy5jbGlwX2JveDsKLSAgICAKKwogICAgIGlmICggcmFzLm1heF9leCA8PSBjbGlwLT54TWluIHx8IHJhcy5taW5fZXggPj0gY2xpcC0+eE1heCB8fAogICAgICAgICAgcmFzLm1heF9leSA8PSBjbGlwLT55TWluIHx8IHJhcy5taW5fZXkgPj0gY2xpcC0+eU1heCApCiAgICAgICByZXR1cm4gMDsKQEAgLTE4NDEsNyArMTg0MSw3IEBACiAKICNpZiAxCiAgICAgICAgIGVycm9yID0gZ3JheV9jb252ZXJ0X2dseXBoX2lubmVyKCBSQVNfVkFSICk7Ci0jZWxzZSAgICAgICAKKyNlbHNlCiAgICAgICAgIGVycm9yID0gRlRfT3V0bGluZV9EZWNvbXBvc2UoIG91dGxpbmUsICZpbnRlcmZhY2UsICZyYXMgKSB8fAogICAgICAgICAgICAgICAgIGdyYXlfcmVjb3JkX2NlbGwoIFJBU19WQVIgKTsKICNlbmRpZgpAQCAtMTk4NywxOCArMTk4NywxOCBAQAogICBncmF5c19pbml0X2dhbW1hKCBQUmFzdGVyICByYXN0ZXIgKQogICB7CiAgICAgRlRfVUludCAgeCwgYTsKLSAgICAKKwogICAgIGZvciAoIHggPSAwOyB4IDwgMjU2OyB4KysgKQogICAgIHsKICAgICAgIGlmICggeCA8PSBNX1ggKQogICAgICAgICBhID0gKHggKiBNX1kgKyAoTV9YLzIpKSAvIE1fWDsKICAgICAgIGVsc2UKICAgICAgICAgYSA9IE1fWSArICgoeC1NX1gpKihNX01BWC1NX1kpICsgKE1fTUFYLU1fWCkvMikvKE1fTUFYLU1fWCk7Ci0gICAgICAKKwogICAgICAgcmFzdGVyLT5nYW1tYVt4XSA9IChGVF9CeXRlKWE7CiAgICAgfQogICB9Ci0gIAorCiAjZW5kaWYgLyogR1JBWVNfVVNFX0dBTU1BICovCiAKICNpZmRlZiBfU1RBTkRBTE9ORV8KQEAgLTIwMTgsNyArMjAxOCw3IEBACiAjaWZkZWYgR1JBWVNfVVNFX0dBTU1BCiAgICAgZ3JheXNfaW5pdF9nYW1tYSggKFBSYXN0ZXIpKmFyYXN0ZXIgKTsKICNlbmRpZgotICAgIAorCiAgICAgcmV0dXJuIDA7CiAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdHMvZ3ZpZXcuYyBiL3Rlc3RzL2d2aWV3LmMKaW5kZXggNGMxZGYzNy4uOGUxYjI0MiAxMDA2NDQKLS0tIGEvdGVzdHMvZ3ZpZXcuYworKysgYi90ZXN0cy9ndmlldy5jCkBAIC03NCw2ICs3NCw3IEBACiBzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2VkZ2VzICAgID0gMDsKIHN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfc2VnbWVudHMgPSAxOwogc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19saW5rcyAgICA9IDE7CitzdGF0aWMgIGludCAgIG9wdGlvbl9zaG93X2luZGljZXMgID0gMDsKIAogc3RhdGljICBpbnQgICBvcHRpb25fc2hvd19wc19oaW50cyAgID0gMTsKIHN0YXRpYyAgaW50ICAgb3B0aW9uX3Nob3dfaG9yel9oaW50cyA9IDE7CkBAIC0xMTIsNyArMTEzLDcgQEAKICNkZWZpbmUgIEVER0VfQ09MT1IgICAgICAgIDB4RjA3MDQwNzAKICNkZWZpbmUgIFNFR01FTlRfQ09MT1IgICAgIDB4RjAyMDYwNDAKICNkZWZpbmUgIExJTktfQ09MT1IgICAgICAgIDB4RjBGRkZGMDAKLSNkZWZpbmUgIFNFUklGX0xJTktfQ09MT1IgIDB4RjBGRjgwOEYgIAorI2RlZmluZSAgU0VSSUZfTElOS19DT0xPUiAgMHhGMEZGODA4RgogCiAvKiBwcmludCBtZXNzYWdlIGFuZCBhYm9ydCBwcm9ncmFtICovCiBzdGF0aWMgdm9pZApAQCAtMTYwLDE1ICsxNjEsMTUgQEAKIAogc3RhdGljIHZvaWQKIHJlc2V0X3NjYWxlKCBOVl9TY2FsZSAgc2NhbGUgKQoteyAKK3sKICAvKiBjb21wdXRlIGZvbnQgdW5pdHMgLT4gZ3JpZCBwaXhlbHMgc2NhbGUgZmFjdG9yICovCiAgIGdseXBoX3NjYWxlID0gdGFyZ2V0LT53aWR0aCowLjc1IC8gZmFjZS0+dW5pdHNfcGVyX0VNICogc2NhbGU7Ci0gCisKICAvKiBzZXR1cCBmb250IHVuaXRzIC0+IGdyaWQgcGl4ZWxzIHRyYW5zZm9ybSAqLwogICBudl90cmFuc2Zvcm1fc2V0X3NjYWxlKCAmZ2x5cGhfdHJhbnNmb3JtLCBnbHlwaF9zY2FsZSwgLWdseXBoX3NjYWxlICk7CiAgIGdseXBoX29yZ194ID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhLnggPSB0YXJnZXQtPndpZHRoKjAuMTI1OwogICBnbHlwaF9vcmdfeSA9IGdseXBoX3RyYW5zZm9ybS5kZWx0YS55ID0gdGFyZ2V0LT5oZWlnaHQqMC44NzU7Ci0gCisKICAvKiBzZXR1cCBzdWJwaXhlbHMgLT4gZ3JpZCBwaXhlbHMgdHJhbnNmb3JtICovCiAgIG52X3RyYW5zZm9ybV9zZXRfc2NhbGUoICZzaXplX3RyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9zY2FsZS9udl9mcm9tZml4ZWQoZmFjZS0+c2l6ZS0+bWV0cmljcy54X3NjYWxlKSwKQEAgLTE3Niw4ICsxNzcsOCBAQAogCiAgIHNpemVfdHJhbnNmb3JtLmRlbHRhID0gZ2x5cGhfdHJhbnNmb3JtLmRlbHRhOwogfQotICAgICAgICAgICAKLSAgICAgICAgICAgCisKKwogc3RhdGljIHZvaWQKIHJlc2V0X3NpemUoIGludCAgcGl4ZWxfc2l6ZSwgTlZfU2NhbGUgIHNjYWxlICkKIHsKQEAgLTIwNCw3ICsyMDUsNyBAQAogICBpZiAoIG9wdGlvbl9zaG93X2dyaWQgKQogICB7CiAgICAgTlZfU2NhbGUgIG1pbiwgbWF4LCB4LCBzdGVwOwotICAgIAorCiAgICAgLyogZHJhdyB2ZXJ0aWNhbCBncmlkIGJhcnMgKi8KICAgICBzdGVwID0gNjQuICogc2l6ZV90cmFuc2Zvcm0ubWF0cml4Lnh4OwogICAgIGlmIChzdGVwID4gMS4pCkBAIC0yMTIsMTIgKzIxMywxMiBAQAogICAgICAgbWluICA9IG1heCA9IGdseXBoX29yZ194OwogICAgICAgd2hpbGUgKCBtaW4gLSBzdGVwID49IDAgKSAgICAgICAgICAgICBtaW4gLT0gc3RlcDsKICAgICAgIHdoaWxlICggbWF4ICsgc3RlcCA8IHRhcmdldC0+d2lkdGggKSAgbWF4ICs9IHN0ZXA7Ci0gICAgICAgIAorCiAgICAgICBmb3IgKCB4ID0gbWluOyB4IDw9IG1heDsgeCArPSBzdGVwICkKICAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAoTlZfSW50KSh4Ky41KSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdGFyZ2V0LT5oZWlnaHQsIEdSSURfQ09MT1IgKTsKICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCiAgICAgLyogZHJhdyBob3Jpem9udGFsIGdyaWQgYmFycyAqLwogICAgIHN0ZXAgPSAtNjQuICogc2l6ZV90cmFuc2Zvcm0ubWF0cml4Lnl5OwogICAgIGlmIChzdGVwID4gMS4pCkBAIC0yMjUsMjkgKzIyNiwyOSBAQAogICAgICAgbWluICA9IG1heCA9IGdseXBoX29yZ195OwogICAgICAgd2hpbGUgKCBtaW4gLSBzdGVwID49IDAgKSAgICAgICAgICAgICAgbWluIC09IHN0ZXA7CiAgICAgICB3aGlsZSAoIG1heCArIHN0ZXAgPCB0YXJnZXQtPmhlaWdodCApICBtYXggKz0gc3RlcDsKLSAgICAgICAgCisKICAgICAgIGZvciAoIHggPSBtaW47IHggPD0gbWF4OyB4ICs9IHN0ZXAgKQogICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIChOVl9JbnQpKHgrLjUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPndpZHRoLCAxLCBHUklEX0NPTE9SICk7CiAgICAgfQotICB9ICAKLSAgCisgIH0KKwogICAvKiBkcmF3IGF4aXMgKi8KICAgaWYgKCBvcHRpb25fc2hvd19heGlzICkKICAgewogICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgeCwgMCwgMSwgdGFyZ2V0LT5oZWlnaHQsIEFYSVNfQ09MT1IgKTsKICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHksIHRhcmdldC0+d2lkdGgsIDEsIEFYSVNfQ09MT1IgKTsKICAgfQotICAKKwogICBpZiAoIG9wdGlvbl9zaG93X2VtICkKICAgewogICAgIE5WX1BhdGggIHBhdGg7CiAgICAgTlZfUGF0aCAgc3Ryb2tlOwogICAgIE5WX1VJbnQgIHVuaXRzID0gKE5WX1VJbnQpZmFjZS0+dW5pdHNfcGVyX0VNOwotICAgIAorCiAgICAgbnZfcGF0aF9uZXdfcmVjdGFuZ2xlKCByZW5kZXJlciwgMCwgMCwgdW5pdHMsIHVuaXRzLCAwLCAwLCAmcGF0aCApOwogICAgIG52X3BhdGhfdHJhbnNmb3JtKCBwYXRoLCAmZ2x5cGhfdHJhbnNmb3JtICk7Ci0gICAgCisKICAgICBudl9wYXRoX3N0cm9rZSggcGF0aCwgMS41LCBudl9wYXRoX2xpbmVjYXBfYnV0dCwgbnZfcGF0aF9saW5lam9pbl9taXRlciwKICAgICAgICAgICAgICAgICAgICAgNC4wLCAmc3Ryb2tlICk7CiAKQEAgLTI4MiwxMiArMjgzLDEyIEBACiAgICAgRlRfSW50ICAgICAgICAgIHkxLCB5MjsKICAgICBGVF9VSW50ICAgICAgICAgY291bnQ7CiAgICAgUFNIX0JsdWVfWm9uZSAgIHpvbmU7Ci0gICAgCisKICAgICAvKiBkcmF3IHRvcCB6b25lcyAqLwogICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfdG9wOwogICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwogICAgIHpvbmUgID0gdGFibGUtPnpvbmVzOwotICAgIAorCiAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCiAgICAgewogICAgICAgdi54ID0gMDsKQEAgLTMwMiw3ICszMDMsNyBAQAogICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJmdseXBoX3RyYW5zZm9ybSApOwogICAgICAgfQogICAgICAgeTEgID0gKGludCkodi55ICsgMC41KTsKLSAgICAgIAorCiAgICAgICB2LnggPSAwOwogICAgICAgaWYgKCAhcHNfZGVidWdfbm9faG9yel9oaW50cyApCiAgICAgICB7CkBAIC0zMTUsMzQgKzMxNiwzNCBAQAogICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJmdseXBoX3RyYW5zZm9ybSApOwogICAgICAgfQogICAgICAgeTIgPSAoaW50KSh2LnkgKyAwLjUpOwotICAgICAgCisKICAgICAgIG52X3BpeG1hcF9maWxsX3JlY3QoIHRhcmdldCwgMCwgeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQtPndpZHRoLCB5Mi15MSsxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQkxVRVNfVE9QX0NPTE9SICk7CiAKLSNpZiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjaWYgMAogICAgICAgcHJpbnRmKCAidG9wIFslLjNmICUuM2ZdXG4iLCB6b25lLT5jdXJfYm90dG9tLzY0LjAsIHpvbmUtPmN1cl90b3AvNjQuMCApOwotI2VuZGlmICAgICAgCisjZW5kaWYKICAgICB9Ci0gICAgCi0gICAgCisKKwogICAgIC8qIGRyYXcgYm90dG9tIHpvbmVzICovCiAgICAgdGFibGUgPSAmYmx1ZXMtPm5vcm1hbF9ib3R0b207CiAgICAgY291bnQgPSB0YWJsZS0+Y291bnQ7CiAgICAgem9uZSAgPSB0YWJsZS0+em9uZXM7Ci0gICAgCisKICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKICAgICB7CiAgICAgICB2LnggPSAwOwogICAgICAgdi55ID0gem9uZS0+Y3VyX3JlZjsKICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgIHkxICA9IChpbnQpKHYueSArIDAuNSk7Ci0gICAgICAKKwogICAgICAgdi54ID0gMDsKICAgICAgIHYueSA9IHpvbmUtPmN1cl9yZWYgKyB6b25lLT5jdXJfZGVsdGE7CiAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgICB5MiA9IChpbnQpKHYueSArIDAuNSk7Ci0gICAgICAKKwogICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCAwLCB5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC0+d2lkdGgsIHkyLXkxKzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCTFVFU19CT1RfQ09MT1IgKTsKQEAgLTM3MiwyMyArMzczLDIzIEBACiB7CiAgIGludCAgICAgICAgeDEsIHgyOwogICBOVl9WZWN0b3IgIHY7Ci0gIAotICAKKworCiAgIGlmICggcHNoaW50X3ZlcnRpY2FsICE9IHZlcnRpY2FsICkKICAgewogICAgIGlmICh2ZXJ0aWNhbCkKICAgICAgIHBzaGludF9jcG9zID0gNDA7CiAgICAgZWxzZQogICAgICAgcHNoaW50X2Nwb3MgPSAxMDsKLSAgICAgIAorCiAgICAgcHNoaW50X3ZlcnRpY2FsID0gdmVydGljYWw7CiAgIH0KLSAgCisKICAgaWYgKHZlcnRpY2FsKQogICB7CiAgICAgaWYgKCAhb3B0aW9uX3Nob3dfdmVydF9oaW50cyApCiAgICAgICByZXR1cm47Ci0gICAgICAKKwogICAgIHYueCA9IGhpbnQtPmN1cl9wb3M7CiAgICAgdi55ID0gMDsKICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CkBAIC00MjAsNyArNDIxLDcgQEAKICAgewogICAgIGlmICghb3B0aW9uX3Nob3dfaG9yel9oaW50cykKICAgICAgIHJldHVybjsKLSAgICAgIAorCiAgICAgdi55ID0gaGludC0+Y3VyX3BvczsKICAgICB2LnggPSAwOwogICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2LCAmc2l6ZV90cmFuc2Zvcm0gKTsKQEAgLTQ1Miw3ICs0NTMsNyBAQAogI2lmIDAKICAgcHJpbnRmKCAiWyU3LjNmICU3LjNmXSAlY1xuIiwgaGludC0+Y3VyX3Bvcy82NC4wLCAoaGludC0+Y3VyX3BvcytoaW50LT5jdXJfbGVuKS82NC4wLCB2ZXJ0aWNhbCA/ICd2JyA6ICdoJyApOwogI2VuZGlmCi0gIAorCiAgIHBzaGludF9jcG9zICs9IDEwOwogfQogCkBAIC00NzMsMjIgKzQ3NCwyMiBAQAogewogICBpbnQgICAgICAgIHgxLCB4MjsKICAgTlZfVmVjdG9yICB2OwotICAKKwogICBpZiAoIHBzaGludF92ZXJ0aWNhbCAhPSB2ZXJ0aWNhbCApCiAgIHsKICAgICBpZiAodmVydGljYWwpCiAgICAgICBwc2hpbnRfY3BvcyA9IDQwOwogICAgIGVsc2UKICAgICAgIHBzaGludF9jcG9zID0gMTA7Ci0gICAgICAKKwogICAgIHBzaGludF92ZXJ0aWNhbCA9IHZlcnRpY2FsOwogICB9Ci0gIAorCiAgIGlmICh2ZXJ0aWNhbCkKICAgewogICAgIGlmICggIW9wdGlvbl9zaG93X3ZlcnRfaGludHMgKQogICAgICAgcmV0dXJuOwotICAgICAgCisKICAgICB2LnggPSBoaW50LT5jdXJfcG9zOwogICAgIHYueSA9IDA7CiAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYsICZzaXplX3RyYW5zZm9ybSApOwpAQCAtNTIwLDcgKzUyMSw3IEBACiAgIHsKICAgICBpZiAoIW9wdGlvbl9zaG93X2hvcnpfaGludHMpCiAgICAgICByZXR1cm47Ci0gICAgICAKKwogICAgIHYueSA9IGhpbnQtPmN1cl9wb3M7CiAgICAgdi54ID0gMDsKICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdiwgJnNpemVfdHJhbnNmb3JtICk7CkBAIC01NTIsNyArNTUzLDcgQEAKICNpZiAwCiAgIHByaW50ZiggIlslNy4zZiAlNy4zZl0gJWNcbiIsIGhpbnQtPmN1cl9wb3MvNjQuMCwgKGhpbnQtPmN1cl9wb3MraGludC0+Y3VyX2xlbikvNjQuMCwgdmVydGljYWwgPyAndicgOiAnaCcgKTsKICNlbmRpZgotICAKKwogICBwc2hpbnRfY3BvcyArPSAxMDsKIH0KIApAQCAtNTY5LDE1ICs1NzAsMTUgQEAKICAgICBOVl9QYXRoICAgICAgIHZlcnRfcmVjdDsKICAgICBOVl9QYXRoICAgICAgIGhvcnpfcmVjdDsKICAgICBOVl9QYXRoICAgICAgIGRvdCwgY2lyY2xlOwotICAgIAorCiAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQogICAgIHsKICAgICAgIE5WX1ZlY3RvciAgdmVjOwotICAgICAgCisKICAgICAgIHZlYy54ID0gcG9pbnQtPmN1cl94OwogICAgICAgdmVjLnkgPSBwb2ludC0+Y3VyX3k7CiAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKLSAgICAgIAorCiAgICAgICBudl90cmFuc2Zvcm1fc2V0X3RyYW5zbGF0ZSggdHJhbnMsIHZlYy54LCB2ZWMueSApOwogCiAgICAgICBpZiAoIG9wdGlvbl9zaG93X3Ntb290aCAmJiAhcHNoMl9wb2ludF9pc19zbW9vdGgocG9pbnQpICkKQEAgLTU4NSw3ICs1ODYsNyBAQAogICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgU01PT1RIX0NPTE9SLCAyNTYgKTsKICAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsIHRyYW5zLCAwLCBzeW1ib2xfY2lyY2xlICk7CiAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICBpZiAob3B0aW9uX3Nob3dfaG9yel9oaW50cykKICAgICAgIHsKICAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3NfeSAmIFBTSDJfUE9JTlRfU1RST05HICkKQEAgLTU5NCw3ICs1OTUsNyBAQAogICAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgc3ltYm9sX3JlY3RfaCApOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgaWYgKG9wdGlvbl9zaG93X3ZlcnRfaGludHMpCiAgICAgICB7CiAgICAgICAgIGlmICggcG9pbnQtPmZsYWdzX3ggJiBQU0gyX1BPSU5UX1NUUk9ORyApCkBAIC02MDcsNiArNjA4LDQ0IEBACiAgIH0KIH0KIAorCitzdGF0aWMgdm9pZAorcHNfcHJpbnRfaGludHMoIHZvaWQgKQoreworICBpZiAoIHBzX2RlYnVnX2hpbnRzICkKKyAgeworICAgIEZUX0ludCAgICAgICAgIGRpbWVuc2lvbjsKKyAgICBQU0hfRGltZW5zaW9uICBkaW07CisKKyAgICBmb3IgKCBkaW1lbnNpb24gPSAxOyBkaW1lbnNpb24gPj0gMDsgZGltZW5zaW9uLS0gKQorICAgIHsKKyAgICAgIFBTX0RpbWVuc2lvbiAgZGltICAgPSAmcHNfZGVidWdfaGludHMtPmRpbWVuc2lvblsgZGltZW5zaW9uIF07CisgICAgICBQU19NYXNrICAgICAgIG1hc2sgID0gZGltLT5tYXNrcy5tYXNrczsKKyAgICAgIEZUX1VJbnQgICAgICAgY291bnQgPSBkaW0tPm1hc2tzLm51bV9tYXNrczsKKworICAgICAgcHJpbnRmKCAiJXMgaGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiwKKyAgICAgICAgICAgICAgZGltZW5zaW9uID8gInZlcnRpY2FsIiA6ICJob3Jpem9udGFsIiApOworCisgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbWFzaysrICkKKyAgICAgIHsKKyAgICAgICAgRlRfVUludCAgaW5kZXg7CisKKyAgICAgICAgcHJpbnRmKCAibWFzayAtPiAlZFxuIiwgbWFzay0+ZW5kX3BvaW50ICk7CisgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBtYXNrLT5udW1fYml0czsgaW5kZXgrKyApCisgICAgICAgIHsKKyAgICAgICAgICBpZiAoIG1hc2stPmJ5dGVzWyBpbmRleCA+PiAzIF0gJiAoMHg4MCA+PiAoaW5kZXggJiA3KSkgKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIFBTX0hpbnQgIGhpbnQgPSBkaW0tPmhpbnRzLmhpbnRzICsgaW5kZXg7CisKKyAgICAgICAgICAgIHByaW50ZiggIiVjIFslM2QgJTNkICglNGQpXVxuIiwgZGltZW5zaW9uID8gInYiIDogImgiLAorICAgICAgICAgICAgICAgICAgICBoaW50LT5wb3MsIGhpbnQtPnBvcyArIGhpbnQtPmxlbiwgaGludC0+bGVuICk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KQEAgLTYyOCw3ICs2NjcsNyBAQAogICB7CiAgICAgcDIueCA9IHA0LT54OwogICAgIHAyLnkgPSBwMS0+eTsKLSAgICAKKwogICAgIHAzLnggPSBwMS0+eDsKICAgICBwMy55ID0gcDQtPnk7CiAgIH0KQEAgLTYzNiwyNSArNjc1LDI1IEBACiAgIHsKICAgICBwMi54ID0gcDEtPng7CiAgICAgcDIueSA9IHA0LT55OwotICAgIAorCiAgICAgcDMueCA9IHA0LT54OwogICAgIHAzLnkgPSBwMS0+eTsKLSAgfSAgCi0gIAorICB9CisKICAgbnZfcGF0aF93cml0ZXJfbmV3KCByZW5kZXJlciwgJndyaXRlciApOwogICBudl9wYXRoX3dyaXRlcl9tb3ZldG8oIHdyaXRlciwgcDEgKTsKICAgbnZfcGF0aF93cml0ZXJfY3ViaWN0byggd3JpdGVyLCAmcDIsICZwMywgcDQgKTsKICAgbnZfcGF0aF93cml0ZXJfZW5kKCB3cml0ZXIgKTsKLSAgCisKICAgcGF0aCA9IG52X3BhdGhfd3JpdGVyX2dldF9wYXRoKCB3cml0ZXIgKTsKICAgbnZfcGF0aF93cml0ZXJfZGVzdHJveSggd3JpdGVyICk7Ci0gIAorCiAgIG52X3BhdGhfc3Ryb2tlKCBwYXRoLCAxLiwgbnZfcGF0aF9saW5lY2FwX2J1dHQsIG52X3BhdGhfbGluZWpvaW5fcm91bmQsIDEuLCAgJnN0cm9rZSApOwotICAKKwogICBudl9wYXRoX2Rlc3Ryb3koIHBhdGggKTsKLSAgCisKICAgcmV0dXJuIHN0cm9rZTsKLX0gICAgICAgICAgICAgIAorfQogCiAKIHN0YXRpYyB2b2lkCkBAIC02NjUsMjAgKzcwNCwyMCBAQAogICAgIEFIX091dGxpbmUqICBnbHlwaCA9IGFoX2RlYnVnX2hpbnRlci0+Z2x5cGg7CiAgICAgRlRfVUludCAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7CiAgICAgQUhfUG9pbnQqICAgIHBvaW50ID0gZ2x5cGgtPnBvaW50czsKLSAgICAKKwogICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yKCBwYWludGVyLCBTTU9PVEhfQ09MT1IsIDI1NiApOwotICAgIAorCiAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHBvaW50KysgKQogICAgIHsKICAgICAgIGlmICggISggcG9pbnQtPmZsYWdzICYgYWhfZmxhZ193ZWFrX2ludGVycG9sYXRpb24gKSApCiAgICAgICB7CiAgICAgICAgIE5WX1RyYW5zZm9ybSAgdHJhbnNmb3JtLCAqdHJhbnMgPSAmdHJhbnNmb3JtOwogICAgICAgICBOVl9WZWN0b3IgICAgIHZlYzsKLSAgICAgICAgCisKICAgICAgICAgdmVjLnggPSBwb2ludC0+eCAtIGFoX2RlYnVnX2hpbnRlci0+cHAxLng7CiAgICAgICAgIHZlYy55ID0gcG9pbnQtPnk7CiAgICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2ZWMsICZzaXplX3RyYW5zZm9ybSApOwotICAgICAgICAKKwogICAgICAgICBudl90cmFuc2Zvcm1fc2V0X3RyYW5zbGF0ZSggJnRyYW5zZm9ybSwgdmVjLngsIHZlYy55ICk7CiAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCB0cmFucywgMCwgc3ltYm9sX2NpcmNsZSApOwogICAgICAgfQpAQCAtNjk2LDMxICs3MzUsMzEgQEAKICAgICBGVF9VSW50ICAgICAgY291bnQ7CiAgICAgQUhfRWRnZSogICAgIGVkZ2U7CiAgICAgRlRfUG9zICAgICAgIHBwMSA9IGFoX2RlYnVnX2hpbnRlci0+cHAxLng7Ci0gICAgCisKICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgRURHRV9DT0xPUiwgMjU2ICk7CiAKICAgICBpZiAoIG9wdGlvbl9zaG93X2VkZ2VzICkKICAgICB7CiAgICAgICAvKiBkcmF3IHZlcnRpY2xhIGVkZ2VzICovCiAgICAgICBpZiAoIG9wdGlvbl9zaG93X3ZlcnRfaGludHMgKQotICAgICAgeyAgICAKKyAgICAgIHsKICAgICAgICAgY291bnQgPSBnbHlwaC0+bnVtX3ZlZGdlczsKICAgICAgICAgZWRnZSAgPSBnbHlwaC0+dmVydF9lZGdlczsKICAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGVkZ2UrKyApCiAgICAgICAgIHsKICAgICAgICAgICBOVl9WZWN0b3IgICAgIHZlYzsKICAgICAgICAgICBOVl9Qb3MgICAgICAgIHg7Ci0gICAgICAgICAgCisKICAgICAgICAgICB2ZWMueCA9IGVkZ2UtPnBvcyAtIHBwMTsKICAgICAgICAgICB2ZWMueSA9IDA7Ci0gICAgICAgICAgCisKICAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgICB4ID0gKEZUX1BvcykoIHZlYy54ICsgMC41ICk7Ci0gICAgICAgICAgCisKICAgICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHgsIDAsIDEsIHRhcmdldC0+aGVpZ2h0LCBFREdFX0NPTE9SICk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgCisKICAgICAgIC8qIGRyYXcgaG9yaXpvbnRhbCBlZGdlcyAqLwogICAgICAgaWYgKCBvcHRpb25fc2hvd19ob3J6X2hpbnRzICkKICAgICAgIHsKQEAgLTczMCwxOCArNzY5LDE4IEBACiAgICAgICAgIHsKICAgICAgICAgICBOVl9WZWN0b3IgICAgIHZlYzsKICAgICAgICAgICBOVl9Qb3MgICAgICAgIHg7Ci0gICAgICAgICAgCisKICAgICAgICAgICB2ZWMueCA9IDA7CiAgICAgICAgICAgdmVjLnkgPSBlZGdlLT5wb3M7Ci0gICAgICAgICAgCisKICAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdmVjLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgICB4ID0gKEZUX1BvcykoIHZlYy55ICsgMC41ICk7Ci0gICAgICAgICAgCisKICAgICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIDAsIHgsIHRhcmdldC0+d2lkdGgsIDEsIEVER0VfQ09MT1IgKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIGlmICggb3B0aW9uX3Nob3dfc2VnbWVudHMgKQogICAgIHsKICAgICAgIC8qIGRyYXcgdmVydGljYWwgc2VnbWVudHMgKi8KQEAgLTc0OSwxOCArNzg4LDE4IEBACiAgICAgICB7CiAgICAgICAgIEFIX1NlZ21lbnQqICBzZWcgICA9IGdseXBoLT52ZXJ0X3NlZ21lbnRzOwogICAgICAgICBGVF9VSW50ICAgICAgY291bnQgPSBnbHlwaC0+bnVtX3ZzZWdtZW50czsKLSAgICAgICAgCisKICAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHNlZysrICkKICAgICAgICAgewogICAgICAgICAgIEFIX1BvaW50ICAqZmlyc3QsICpsYXN0OwogICAgICAgICAgIE5WX1ZlY3RvciAgdjEsIHYyOwogICAgICAgICAgIE5WX1BvcyAgICAgeTEsIHkyLCB4OwotICAgICAgICAgIAorCiAgICAgICAgICAgZmlyc3QgPSBzZWctPmZpcnN0OwogICAgICAgICAgIGxhc3QgID0gc2VnLT5sYXN0OwotICAgICAgICAgIAorCiAgICAgICAgICAgdjEueCA9IHYyLnggPSBmaXJzdC0+eCAtIHBwMTsKLSAgICAgICAgICAKKwogICAgICAgICAgIGlmICggZmlyc3QtPnkgPD0gbGFzdC0+eSApCiAgICAgICAgICAgewogICAgICAgICAgICAgdjEueSA9IGZpcnN0LT55OwpAQCAtNzcxLDM1ICs4MTAsMzUgQEAKICAgICAgICAgICAgIHYxLnkgPSBsYXN0LT55OwogICAgICAgICAgICAgdjIueSA9IGZpcnN0LT55OwogICAgICAgICAgIH0KLSAgICAgICAgICAKKwogICAgICAgICAgIG52X3ZlY3Rvcl90cmFuc2Zvcm0oICZ2MSwgJnNpemVfdHJhbnNmb3JtICk7CiAgICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYyLCAmc2l6ZV90cmFuc2Zvcm0gKTsKLSAgICAgICAgICAKKwogICAgICAgICAgIHkxID0gKE5WX1BvcykoIHYxLnkgKyAwLjUgKTsKICAgICAgICAgICB5MiA9IChOVl9Qb3MpKCB2Mi55ICsgMC41ICk7CiAgICAgICAgICAgeCAgPSAoTlZfUG9zKSggdjEueCArIDAuNSApOwotICAgICAgICAgIAorCiAgICAgICAgICAgbnZfcGl4bWFwX2ZpbGxfcmVjdCggdGFyZ2V0LCB4LTEsIHkyLCAzLCBBQlMoeTEteTIpKzEsIFNFR01FTlRfQ09MT1IgKTsKICAgICAgICAgfQogICAgICAgfQotICAgICAgCisKICAgICAgIC8qIGRyYXcgaG9yaXpvbnRhbCBzZWdtZW50cyAqLwogICAgICAgaWYgKCBvcHRpb25fc2hvd19ob3J6X2hpbnRzICkKICAgICAgIHsKICAgICAgICAgQUhfU2VnbWVudCogIHNlZyAgID0gZ2x5cGgtPmhvcnpfc2VnbWVudHM7CiAgICAgICAgIEZUX1VJbnQgICAgICBjb3VudCA9IGdseXBoLT5udW1faHNlZ21lbnRzOwotICAgICAgICAKKwogICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc2VnKysgKQogICAgICAgICB7CiAgICAgICAgICAgQUhfUG9pbnQgICpmaXJzdCwgKmxhc3Q7CiAgICAgICAgICAgTlZfVmVjdG9yICB2MSwgdjI7CiAgICAgICAgICAgTlZfUG9zICAgICB5MSwgeTIsIHg7Ci0gICAgICAgICAgCisKICAgICAgICAgICBmaXJzdCA9IHNlZy0+Zmlyc3Q7CiAgICAgICAgICAgbGFzdCAgPSBzZWctPmxhc3Q7Ci0gICAgICAgICAgCisKICAgICAgICAgICB2MS55ID0gdjIueSA9IGZpcnN0LT55OwotICAgICAgICAgIAorCiAgICAgICAgICAgaWYgKCBmaXJzdC0+eCA8PSBsYXN0LT54ICkKICAgICAgICAgICB7CiAgICAgICAgICAgICB2MS54ID0gZmlyc3QtPnggLSBwcDE7CkBAIC04MTAsMTQgKzg0OSwxNCBAQAogICAgICAgICAgICAgdjEueCA9IGxhc3QtPnggLSBwcDE7CiAgICAgICAgICAgICB2Mi54ID0gZmlyc3QtPnggLSBwcDE7CiAgICAgICAgICAgfQotICAgICAgICAgIAorCiAgICAgICAgICAgbnZfdmVjdG9yX3RyYW5zZm9ybSggJnYxLCAmc2l6ZV90cmFuc2Zvcm0gKTsKICAgICAgICAgICBudl92ZWN0b3JfdHJhbnNmb3JtKCAmdjIsICZzaXplX3RyYW5zZm9ybSApOwotICAgICAgICAgIAorCiAgICAgICAgICAgeTEgPSAoTlZfUG9zKSggdjEueCArIDAuNSApOwogICAgICAgICAgIHkyID0gKE5WX1BvcykoIHYyLnggKyAwLjUgKTsKICAgICAgICAgICB4ICA9IChOVl9Qb3MpKCB2MS55ICsgMC41ICk7Ci0gICAgICAgICAgCisKICAgICAgICAgICBudl9waXhtYXBfZmlsbF9yZWN0KCB0YXJnZXQsIHkxLCB4LTEsIEFCUyh5MS15MikrMSwgMywgU0VHTUVOVF9DT0xPUiApOwogICAgICAgICB9CiAgICAgICB9CkBAIC04MjcsMTMgKzg2NiwxMyBAQAogICAgICAgewogICAgICAgICBBSF9TZWdtZW50KiAgc2VnICAgPSBnbHlwaC0+dmVydF9zZWdtZW50czsKICAgICAgICAgRlRfVUludCAgICAgIGNvdW50ID0gZ2x5cGgtPm51bV92c2VnbWVudHM7Ci0gICAgICAgIAorCiAgICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzZWcrKyApCiAgICAgICAgIHsKICAgICAgICAgICBBSF9TZWdtZW50KiAgc2VnMiA9IE5VTEw7CiAgICAgICAgICAgTlZfUGF0aCAgICAgIGxpbms7CiAgICAgICAgICAgTlZfVmVjdG9yICAgIHYxLCB2MjsKLSAgICAgICAgICAKKwogICAgICAgICAgIGlmICggc2VnLT5saW5rICkKICAgICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIHNlZy0+bGluayA+IHNlZyApCkBAIC04NDEsMTkgKzg4MCwxOSBAQAogICAgICAgICAgIH0KICAgICAgICAgICBlbHNlIGlmICggc2VnLT5zZXJpZiApCiAgICAgICAgICAgICBzZWcyID0gc2VnLT5zZXJpZjsKLSAgICAgICAgICAKKwogICAgICAgICAgIGlmICggc2VnMiApCiAgICAgICAgICAgewogICAgICAgICAgICAgdjEueCA9IHNlZy0+Zmlyc3QtPnggIC0gcHAxOwogICAgICAgICAgICAgdjIueCA9IHNlZzItPmZpcnN0LT54IC0gcHAxOwogICAgICAgICAgICAgdjEueSA9IChzZWctPmZpcnN0LT55ICsgc2VnLT5sYXN0LT55KS8yOwogICAgICAgICAgICAgdjIueSA9IChzZWcyLT5maXJzdC0+eSArIHNlZzItPmxhc3QtPnkpLzI7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgbGluayA9IGFoX2xpbmtfcGF0aCggJnYxLCAmdjIsIDEgKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgc2VnLT5zZXJpZiA/IFNFUklGX0xJTktfQ09MT1IgOiBMSU5LX0NPTE9SLCAyNTYgKTsKICAgICAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCAmc2l6ZV90cmFuc2Zvcm0sIDAsIGxpbmsgKTsKLSAgCisKICAgICAgICAgICAgIG52X3BhdGhfZGVzdHJveSggbGluayApOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODYzLDEzICs5MDIsMTMgQEAKICAgICAgIHsKICAgICAgICAgQUhfU2VnbWVudCogIHNlZyAgID0gZ2x5cGgtPmhvcnpfc2VnbWVudHM7CiAgICAgICAgIEZUX1VJbnQgICAgICBjb3VudCA9IGdseXBoLT5udW1faHNlZ21lbnRzOwotICAgICAgICAKKwogICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc2VnKysgKQogICAgICAgICB7CiAgICAgICAgICAgQUhfU2VnbWVudCogIHNlZzIgPSBOVUxMOwogICAgICAgICAgIE5WX1BhdGggICAgICBsaW5rOwogICAgICAgICAgIE5WX1ZlY3RvciAgICB2MSwgdjI7Ci0gICAgICAgICAgCisKICAgICAgICAgICBpZiAoIHNlZy0+bGluayApCiAgICAgICAgICAgewogICAgICAgICAgICAgaWYgKCBzZWctPmxpbmsgPiBzZWcgKQpAQCAtODc3LDE5ICs5MTYsMTkgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgZWxzZSBpZiAoIHNlZy0+c2VyaWYgKQogICAgICAgICAgICAgc2VnMiA9IHNlZy0+c2VyaWY7Ci0gICAgICAgICAgCisKICAgICAgICAgICBpZiAoIHNlZzIgKQogICAgICAgICAgIHsKICAgICAgICAgICAgIHYxLnkgPSBzZWctPmZpcnN0LT55OwogICAgICAgICAgICAgdjIueSA9IHNlZzItPmZpcnN0LT55OwogICAgICAgICAgICAgdjEueCA9IChzZWctPmZpcnN0LT54ICsgc2VnLT5sYXN0LT54KS8yIC0gcHAxOwogICAgICAgICAgICAgdjIueCA9IChzZWcyLT5maXJzdC0+eCArIHNlZzItPmxhc3QtPngpLzIgLSBwcDE7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgbGluayA9IGFoX2xpbmtfcGF0aCggJnYxLCAmdjIsIDAgKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBudl9wYWludGVyX3NldF9jb2xvciggcGFpbnRlciwgc2VnLT5zZXJpZiA/IFNFUklGX0xJTktfQ09MT1IgOiBMSU5LX0NPTE9SLCAyNTYgKTsKICAgICAgICAgICAgIG52X3BhaW50ZXJfZmlsbF9wYXRoKCBwYWludGVyLCAmc2l6ZV90cmFuc2Zvcm0sIDAsIGxpbmsgKTsKLSAgCisKICAgICAgICAgICAgIG52X3BhdGhfZGVzdHJveSggbGluayApOwogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTEyLDcgKzk1MSw3IEBACiAgIE5WX1BhdGggICBwYXRoOwogCiAgIHBzaGludF92ZXJ0aWNhbCAgICA9IC0xOwotICAKKwogICBwczFfZGVidWdfaGludF9mdW5jID0gb3B0aW9uX3Nob3dfcHNfaGludHMgPyBkcmF3X3BzMV9oaW50IDogMDsKICAgcHMyX2RlYnVnX2hpbnRfZnVuYyA9IG9wdGlvbl9zaG93X3BzX2hpbnRzID8gZHJhd19wczJfaGludCA6IDA7CiAKQEAgLTkyMiwxNiArOTYxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZUX0xPQURfTk9fQklUTUFQCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX0xPQURfTk9fQklUTUFQIHwgRlRfTE9BRF9OT19ISU5USU5HICk7CiAgIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgbG9hZCBnbHlwaCIgKTsKLSAgCisKICAgaWYgKCBmYWNlLT5nbHlwaC0+Zm9ybWF0ICE9IGZ0X2dseXBoX2Zvcm1hdF9vdXRsaW5lICkKICAgICBQYW5pYyggImNvdWxkIG5vdCBsb2FkIGdseXBoIG91dGxpbmUiICk7Ci0gIAorCiAgIGVycm9yID0gbnZfcGF0aF9uZXdfZnJvbV9vdXRsaW5lKCByZW5kZXJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOVl9PdXRsaW5lKikmZmFjZS0+Z2x5cGgtPm91dGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZV90cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0aCApOwogICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBnbHlwaCBwYXRoIiApOwotICAKKwogICAvKiB0cmFj6SBkdSBnbHlwaGUgcGxlaW4gKi8KICAgaWYgKCBvcHRpb25fc2hvd19nbHlwaCApCiAgIHsKQEAgLTk0MiwxNiArOTgxLDE2IEBACiAgIGlmICggb3B0aW9uX3Nob3dfc3Ryb2tlICkKICAgewogICAgIE5WX1BhdGggICBzdHJva2U7Ci0gICAgCisKICAgICBlcnJvciA9IG52X3BhdGhfc3Ryb2tlKCBwYXRoLCAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZfcGF0aF9saW5lY2FwX2J1dHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZfcGF0aF9saW5lam9pbl9taXRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAsICZzdHJva2UgKTsKICAgICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IHN0cm9rZSBnbHlwaCBwYXRoIiApOwotICAKKwogICAgIG52X3BhaW50ZXJfc2V0X2NvbG9yICggcGFpbnRlciwgMHhGRjAwMDA0MCwgMjU2ICk7CiAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGggKCBwYWludGVyLCAwLCAwLCBzdHJva2UgKTsKLSAgCisKICAgICBudl9wYXRoX2Rlc3Ryb3koIHN0cm9rZSApOwogICB9CiAKQEAgLTk2NCw3ICsxMDAzLDcgQEAKICAgICBOVl9JbnQgICAgICBuLCBmaXJzdCwgbGFzdDsKIAogICAgIG52X3BhdGhfZ2V0X291dGxpbmUoIHBhdGgsIE5VTEwsIG1lbW9yeSwgJm91dCApOwotICAgIAorCiAgICAgZmlyc3QgPSAwOwogICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0Lm5fY29udG91cnM7IG4rKyApCiAgICAgewpAQCAtOTcyLDQ3ICsxMDExLDU1IEBACiAgICAgICBOVl9UcmFuc2Zvcm0gICB0cmFuczsKICAgICAgIE5WX0NvbG9yICAgICAgIGNvbG9yOwogICAgICAgTlZfU3ViVmVjdG9yKiAgdmVjOwotICAgICAgCisKICAgICAgIGxhc3QgID0gb3V0LmNvbnRvdXJzW25dOwotICAgICAgCisKICAgICAgIGZvciAoIG0gPSBmaXJzdDsgbSA8PSBsYXN0OyBtKysgKQogICAgICAgewogICAgICAgICBjb2xvciA9IChvdXQudGFnc1ttXSAmIEZUX0N1cnZlX1RhZ19PbikKICAgICAgICAgICAgICAgPyBPTl9DT0xPUgogICAgICAgICAgICAgICA6IE9GRl9DT0xPUjsKLSAgICAgICAgICAgICAgCisKICAgICAgICAgdmVjID0gb3V0LnBvaW50cyArIG07CiAKLSAgICAgICAgbnZfdHJhbnNmb3JtX3NldF90cmFuc2xhdGUoICZ0cmFucywgdmVjLT54LzY0LjAsIHZlYy0+eS82NC4wICk7ICAgICAgICAKKyAgICAgICAgbnZfdHJhbnNmb3JtX3NldF90cmFuc2xhdGUoICZ0cmFucywgdmVjLT54LzY0LjAsIHZlYy0+eS82NC4wICk7CiAKICAgICAgICAgbnZfcGFpbnRlcl9zZXRfY29sb3IoIHBhaW50ZXIsIGNvbG9yLCAyNTYgKTsKICAgICAgICAgbnZfcGFpbnRlcl9maWxsX3BhdGgoIHBhaW50ZXIsICZ0cmFucywgMCwgc3ltYm9sX2RvdCApOwogCisgICAgICAgIGlmICggb3B0aW9uX3Nob3dfaW5kaWNlcyApCisgICAgICAgIHsKKyAgICAgICAgICBjaGFyICB0ZW1wWzVdOworCisgICAgICAgICAgc3ByaW50ZiggdGVtcCwgIiVkIiwgbSApOworICAgICAgICAgIG52X3BpeG1hcF9jZWxsX3RleHQoIHRhcmdldCwgdmVjLT54LzY0ICsgNCwgdmVjLT55LzY0IC0gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wLCBURVhUX0NPTE9SICk7CisgICAgICAgIH0KICAgICAgIH0KLSAgICAgIAorCiAgICAgICBmaXJzdCA9IGxhc3QgKyAxOwogICAgIH0KICAgfQogCiAgIGFoX2RyYXdfc21vb3RoX3BvaW50cygpOwogICBhaF9kcmF3X2VkZ2VzKCk7Ci0gIAorCiAgIG52X3BhdGhfZGVzdHJveSggcGF0aCApOwotICAKKwogICAvKiBhdXRyZSBpbmZvcyAqLwogICB7CiAgICAgY2hhciAgdGVtcFsxMDI0XTsKICAgICBjaGFyICB0ZW1wMls2NF07Ci0gICAgCisKICAgICBzcHJpbnRmKCB0ZW1wLCAiZm9udCBuYW1lIDogJXMgKCVzKSIsIGZhY2UtPmZhbWlseV9uYW1lLCBmYWNlLT5zdHlsZV9uYW1lICk7CiAgICAgbnZfcGl4bWFwX2NlbGxfdGV4dCggdGFyZ2V0LCAwLCAwLCB0ZW1wLCBURVhUX0NPTE9SICk7Ci0gICAgCisKICAgICBGVF9HZXRfR2x5cGhfTmFtZSggZmFjZSwgZ2x5cGhfaW5kZXgsIHRlbXAyLCA2MyApOwogICAgIHRlbXAyWzYzXSA9IDA7Ci0gICAgCisKICAgICBzcHJpbnRmKCB0ZW1wLCAiZ2x5cGggJTRkOiAlcyIsIGdseXBoX2luZGV4LCB0ZW1wMiApOwogICAgIG52X3BpeG1hcF9jZWxsX3RleHQoIHRhcmdldCwgMCwgOCwgdGVtcCwgVEVYVF9DT0xPUiApOwotICAgIAorCiAgICAgaWYgKCB0ZW1wX21lc3NhZ2VbMF0gKQogICAgIHsKICAgICAgIG52X3BpeG1hcF9jZWxsX3RleHQoIHRhcmdldCwgMCwgMTYsIHRlbXBfbWVzc2FnZSwgVEVYVF9DT0xPUiApOwpAQCAtMTA0MCw3ICsxMDg3LDcgQEAKICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIAorCiBzdGF0aWMgdm9pZAogaGFuZGxlX2V2ZW50KCBOVlZfRXZlbnRSZWMqICAgZXYgKQogewpAQCAtMTA2NSwyMyArMTExMiwyMyBAQAogCiAgICAgY2FzZSBOVlZfS0VZKCdzJyk6CiAgICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19zdHJva2UsICJnbHlwaCBzdHJva2UgZGlzcGxheSIgKQotICAgIAorCiAgICAgY2FzZSBOVlZfS0VZKCdnJyk6CiAgICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19nbHlwaCwgImdseXBoIGZpbGwgZGlzcGxheSIgKQotICAgICAgCisKICAgICBjYXNlIE5WVl9LRVkoJ2QnKToKICAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9zaG93X2RvdHMsICJjb250cm9sIHBvaW50cyBkaXNwbGF5IiApCi0gICAgICAKKwogICAgIGNhc2UgTlZWX0tFWSgnZScpOgogICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfZW0sICJFTSBzcXVhcmUgZGlzcGxheSIgKQotICAgIAorCiAgICAgY2FzZSBOVlZfS0VZKCcrJyk6CiAgICAgICB7CiAgICAgICAgIGdyaWRfc2NhbGUgKj0gMS4yOwogICAgICAgICByZXNldF9zY2FsZSggZ3JpZF9zY2FsZSApOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgY2FzZSBOVlZfS0VZKCctJyk6CiAgICAgICB7CiAgICAgICAgIGlmIChncmlkX3NjYWxlID4gMC4zKQpAQCAtMTEyNiwxMiArMTE3MywxOSBAQAogICAgIGNhc2UgTlZWX0tFWSgnUycpOgogICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfc21vb3RoLCAic21vb3RoIHBvaW50cyBkaXNwbGF5IiApOwogCisgICAgY2FzZSBOVlZfS0VZKCdpJyk6CisgICAgICBUT0dHTEVfT1BUSU9OKCBvcHRpb25fc2hvd19pbmRpY2VzLCAicG9pbnQgaW5kZXggZGlzcGxheSIgKTsKKwogICAgIGNhc2UgTlZWX0tFWSgnYicpOgogICAgICAgVE9HR0xFX09QVElPTiggb3B0aW9uX3Nob3dfYmx1ZXMsICJibHVlIHpvbmVzIGRpc3BsYXkiICk7CiAKICAgICBjYXNlIE5WVl9LRVkoJ2gnKToKICAgICAgIFRPR0dMRV9PUFRJT04oIG9wdGlvbl9oaW50aW5nLCAiaGludGluZyIgKQotICAgICAgCisKKyAgICBjYXNlIE5WVl9LRVkoJ0gnKToKKyAgICAgIHBzX3ByaW50X2hpbnRzKCk7CisgICAgICBicmVhazsKKwogICAgIGRlZmF1bHQ6CiAgICAgICA7CiAgIH0KQEAgLTExNjYsNyArMTIyMCw3IEBACiB7CiAgIGludCAgICBhcmdjID0gKmFyZ2NfcDsKICAgY2hhcioqIGFyZ3YgPSAqYXJndl9wOwotICAKKwogICB3aGlsZSAoYXJnYyA+IDIgJiYgYXJndlsxXVswXSA9PSAnLScpCiAgIHsKICAgICBzd2l0Y2ggKGFyZ3ZbMV1bMV0pCkBAIC0xMTc0LDI4ICsxMjI4LDI4IEBACiAgICAgICBPUFRJT04yKCAnZicsIGZpcnN0X2dseXBoID0gYXRvaSggYXJndlsyXSApOyApCiAKICAgICAgIE9QVElPTjIoICdzJywgcGl4ZWxfc2l6ZSA9IGF0b2koIGFyZ3ZbMl0gKTsgKQotICAgICAgCisKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHVzYWdlKCk7CiAgICAgfQogICB9Ci0gIAorCiAgICphcmdjX3AgPSBhcmdjOwogICAqYXJndl9wID0gYXJndjsKIH0KLSAgCi0gIAorCisKIAogaW50ICBtYWluKCBpbnQgIGFyZ2MsIGNoYXIqKiAgYXJndiApCiB7CiAgIGNoYXIqICBmaWxlbmFtZSA9ICIvd2lubnQvZm9udHMvYXJpYWwudHRmIjsKLSAgCisKICAgcGFyc2Vfb3B0aW9ucyggJmFyZ2MsICZhcmd2ICk7Ci0gIAorCiAgIGlmICggYXJnYyA+PSAyICkKICAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0gICAKLSAgCisKKwogICAvKiBjcmVhdGUgbGlicmFyeSAqLwogICBlcnJvciA9IG52X3JlbmRlcmVyX25ldyggMCwgJnJlbmRlcmVyICk7CiAgIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIE5pcnZhbmEgcmVuZGVyZXIiICk7CkBAIC0xMjA1LDcgKzEyNTksNyBAQAogCiAgIGVycm9yID0gbnZ2X2Rpc3BsYXlfbmV3KCByZW5kZXJlciwgJmRpc3BsYXkgKTsKICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBjcmVhdGUgZGlzcGxheSIgKTsKLSAgCisKICAgZXJyb3IgPSBudnZfc3VyZmFjZV9uZXcoIGRpc3BsYXksIDQ2MCwgNDYwLCBudl9waXhtYXBfdHlwZV9hcmdiLCAmc3VyZmFjZSApOwogICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGNyZWF0ZSBzdXJmYWNlIiApOwogCkBAIC0xMjEzLDI2ICsxMjY3LDI2IEBACiAKICAgZXJyb3IgPSBudl9wYWludGVyX25ldyggcmVuZGVyZXIsICZwYWludGVyICk7CiAgIGlmIChlcnJvcikgUGFuaWMoICJjb3VsZCBub3QgY3JlYXRlIHBhaW50ZXIiICk7Ci0gIAorCiAgIG52X3BhaW50ZXJfc2V0X3RhcmdldCggcGFpbnRlciwgdGFyZ2V0ICk7Ci0gIAorCiAgIGNsZWFyX2JhY2tncm91bmQoKTsKIAogICBlcnJvciA9IEZUX0luaXRfRnJlZVR5cGUoICZmcmVldHlwZSApOwogICBpZiAoZXJyb3IpIFBhbmljKCAiY291bGQgbm90IGluaXRpYWxpc2UgRnJlZVR5cGUiICk7Ci0gIAorCiAgIGVycm9yID0gRlRfTmV3X0ZhY2UoIGZyZWV0eXBlLCBmaWxlbmFtZSwgMCwgJmZhY2UgKTsKICAgaWYgKGVycm9yKSBQYW5pYyggImNvdWxkIG5vdCBvcGVuIGZvbnQgZmFjZSIgKTsKIAogICByZXNldF9zaXplKCBwaXhlbF9zaXplLCBncmlkX3NjYWxlICk7Ci0gCisKIAogICBudnZfc3VyZmFjZV9zZXRfdGl0bGUoIHN1cmZhY2UsICJGcmVlVHlwZSBHbHlwaCBWaWV3ZXIiICk7CiAKICAgewogICAgIE5WVl9FdmVudFJlYyAgZXZlbnQ7CiAKLSAgICBnbHlwaF9pbmRleCA9IGZpcnN0X2dseXBoOyAgICAKKyAgICBnbHlwaF9pbmRleCA9IGZpcnN0X2dseXBoOwogICAgIGZvciAoIDs7ICkKICAgICB7CiAgICAgICBjbGVhcl9iYWNrZ3JvdW5kKCk7CkBAIC0xMjQ3LDI5ICsxMzAxLDI5IEBACiAgICAgICBkcmF3X3BzX2JsdWVfem9uZXMoKTsKICAgICAgIGRyYXdfZ2x5cGgoIGdseXBoX2luZGV4ICk7CiAgICAgICBwczJfZHJhd19jb250cm9sX3BvaW50cygpOwotICAgICAgCisKICAgICAgIG52dl9zdXJmYWNlX3JlZnJlc2goIHN1cmZhY2UsIE5VTEwgKTsKIAogICAgICAgbnZ2X3N1cmZhY2VfbGlzdGVuKCBzdXJmYWNlLCAwLCAmZXZlbnQgKTsKICAgICAgIGlmICggZXZlbnQua2V5ID09IE5WVl9LZXlfRXNjICkKICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAorCiAgICAgICBoYW5kbGVfZXZlbnQoICZldmVudCApOwogICAgICAgc3dpdGNoIChldmVudC5rZXkpCiAgICAgICB7CiAgICAgICAgIGNhc2UgTlZWX0tleV9Fc2M6CiAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIAorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgOwogICAgICAgfQogICAgIH0KICAgfQotIAorCiAgRXhpdDoKICAgLyogd2FpdCBmb3IgZXNjYXBlICovCi0gICAgICAKLSAgCisKKwogICAvKiBkZXN0cm95IGRpc3BsYXkgKGFuZCBzdXJmYWNlKSAqLwogICBudnZfZGlzcGxheV91bnJlZiggZGlzcGxheSApOwogCg==