Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqIG5mc21vdW50LmMgLS0gTGludXggTkZTIG1vdW50CiAqIENvcHlyaWdodCAoQykgMTk5MyBSaWNrIFNsYWRrZXkgPGpyc0B3b3JsZC5zdGQuY29tPgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCiAqIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBXZWQgRmViICA4IDEyOjUxOjQ4IDE5OTUsIGJpcm9AeWdnZHJhc2lsLmNvbSAoUm9zcyBCaXJvKTogYWxsb3cgYWxsIHBvcnQKICogbnVtYmVycyB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KICoKICogRnJpLCA4IE1hciAxOTk2IDE4OjAxOjM5LCBTd2VuIFRodWVtbWxlciA8c3dlbkB1bmktcGFkZXJib3JuLmRlPjoKICogT21pdCB0aGUgY2FsbCB0byBjb25uZWN0KCkgZm9yIExpbnV4IHZlcnNpb24gMS4zLjExIG9yIGxhdGVyLgogKgogKiBXZWQgT2N0ICAxIDIzOjU1OjI4IDE5OTc6IERpY2sgU3RyZWVmbGFuZCA8ZGlja19zdHJlZWZsYW5kQHRhc2tpbmcuY29tPgogKiBJbXBsZW1lbnRlZCB0aGUgImJnIiwgImZnIiBhbmQgInJldHJ5IiBtb3VudCBvcHRpb25zIGZvciBORlMuCiAqCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIE1vZGlmaWVkIGJ5IE9sYWYgS2lyY2ggYW5kIFRyb25kIE15a2xlYnVzdCBmb3IgbmV3IE5GUyBjb2RlLAogKiBwbHVzIE5GU3YzIHN0dWZmLgogKi8KCi8qCiAqIG5mc21vdW50LmMsdiAxLjEuMS4xIDE5OTMvMTEvMTggMDg6NDA6NTEganJzIEV4cAogKi8KCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxuZXRkYi5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJidXN5Ym94LmgiCiN1bmRlZiBUUlVFCiN1bmRlZiBGQUxTRQojaW5jbHVkZSA8cnBjL3JwYy5oPgojaW5jbHVkZSA8cnBjL3BtYXBfcHJvdC5oPgojaW5jbHVkZSA8cnBjL3BtYXBfY2xudC5oPgojaW5jbHVkZSAibmZzbW91bnQuaCIKCi8qIFRoaXMgaXMganVzdCBhIHdhcm5pbmcgb2YgYSBjb21tb24gbWlzdGFrZS4gIFBvc3NpYmx5IHRoaXMgc2hvdWxkIGJlIGEKICogdWNsaWJjIGZhcSBlbnRyeSByYXRoZXIgdGhhbiBpbiBidXN5Ym94Li4uICovCiNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9ORlMgJiYgZGVmaW5lZChfX1VDTElCQ19fKSAmJiAhIGRlZmluZWQoX19VQ0xJQkNfSEFTX1JQQ19fKQojZXJyb3IgIllvdSBuZWVkIHRvIGJ1aWxkIHVDbGliYyB3aXRoIFVDTElCQ19IQVNfUlBDIGZvciBORlMgc3VwcG9ydC4iCiNlbmRpZgoKCi8qCiAqIE5GUyBzdGF0cy4gVGhlIGdvb2QgdGhpbmcgd2l0aCB0aGVzZSB2YWx1ZXMgaXMgdGhhdCBORlN2MyBlcnJvcnMgYXJlCiAqIGEgc3VwZXJzZXQgb2YgTkZTdjIgZXJyb3JzICh3aXRoIHRoZSBleGNlcHRpb24gb2YgTkZTRVJSX1dGTFVTSCB3aGljaAogKiBuby1vbmUgdXNlcyBhbnl3YXkpLCBzbyB3ZSBjYW4gaGFwcGlseSBtaXggY29kZSBhcyBsb25nIGFzIHdlIG1ha2Ugc3VyZQogKiBubyBORlN2MyBlcnJvcnMgYXJlIHJldHVybmVkIHRvIE5GU3YyIGNsaWVudHMuCiAqIEVycm9yIGNvZGVzIHRoYXQgaGF2ZSBhIGAtLScgaW4gdGhlIHYyIGNvbHVtbiBhcmUgbm90IHBhcnQgb2YgdGhlCiAqIHN0YW5kYXJkLCBidXQgc2VlbSB0byBiZSB3aWRlbHkgdXNlZCBuZXZlcnRoZWxlc3MuCiAqLwplbnVtIG5mc19zdGF0IHsKCU5GU19PSyA9IDAsCQkJLyogdjIgdjMgKi8KCU5GU0VSUl9QRVJNID0gMSwJCS8qIHYyIHYzICovCglORlNFUlJfTk9FTlQgPSAyLAkJLyogdjIgdjMgKi8KCU5GU0VSUl9JTyA9IDUsCQkJLyogdjIgdjMgKi8KCU5GU0VSUl9OWElPID0gNiwJCS8qIHYyIHYzICovCglORlNFUlJfRUFHQUlOID0gMTEsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX0FDQ0VTID0gMTMsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX0VYSVNUID0gMTcsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX1hERVYgPSAxOCwJCS8qICAgIHYzICovCglORlNFUlJfTk9ERVYgPSAxOSwJCS8qIHYyIHYzICovCglORlNFUlJfTk9URElSID0gMjAsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX0lTRElSID0gMjEsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX0lOVkFMID0gMjIsCQkvKiB2MiB2MyB0aGF0IFN1biBmb3Jnb3QgKi8KCU5GU0VSUl9GQklHID0gMjcsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX05PU1BDID0gMjgsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX1JPRlMgPSAzMCwJCS8qIHYyIHYzICovCglORlNFUlJfTUxJTksgPSAzMSwJCS8qICAgIHYzICovCglORlNFUlJfT1BOT1RTVVBQID0gNDUsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX05BTUVUT09MT05HID0gNjMsCS8qIHYyIHYzICovCglORlNFUlJfTk9URU1QVFkgPSA2NiwJCS8qIHYyIHYzICovCglORlNFUlJfRFFVT1QgPSA2OSwJCS8qIHYyIHYzICovCglORlNFUlJfU1RBTEUgPSA3MCwJCS8qIHYyIHYzICovCglORlNFUlJfUkVNT1RFID0gNzEsCQkvKiB2MiB2MyAqLwoJTkZTRVJSX1dGTFVTSCA9IDk5LAkJLyogdjIgICAgKi8KCU5GU0VSUl9CQURIQU5ETEUgPSAxMDAwMSwJLyogICAgdjMgKi8KCU5GU0VSUl9OT1RfU1lOQyA9IDEwMDAyLAkvKiAgICB2MyAqLwoJTkZTRVJSX0JBRF9DT09LSUUgPSAxMDAwMywJLyogICAgdjMgKi8KCU5GU0VSUl9OT1RTVVBQID0gMTAwMDQsCQkvKiAgICB2MyAqLwoJTkZTRVJSX1RPT1NNQUxMID0gMTAwMDUsCS8qICAgIHYzICovCglORlNFUlJfU0VSVkVSRkFVTFQgPSAxMDAwNiwJLyogICAgdjMgKi8KCU5GU0VSUl9CQURUWVBFID0gMTAwMDcsCQkvKiAgICB2MyAqLwoJTkZTRVJSX0pVS0VCT1ggPSAxMDAwOAkJLyogICAgdjMgKi8KfTsKCiNkZWZpbmUgTkZTX1BST0dSQU0JMTAwMDAzCgoKZW51bSB7CiNpZm5kZWYgTkZTX0ZIU0laRQoJTkZTX0ZIU0laRSA9IDMyLAojZW5kaWYKI2lmbmRlZiBORlNfUE9SVAoJTkZTX1BPUlQgPSAyMDQ5CiNlbmRpZgp9OwoKLyogRGlzYWJsZSB0aGUgbmxzIHN0dWZmICovCiMgdW5kZWYgYmluZHRleHRkb21haW4KIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWluLCBEaXJlY3RvcnkpIC8qIGVtcHR5ICovCiMgdW5kZWYgdGV4dGRvbWFpbgojIGRlZmluZSB0ZXh0ZG9tYWluKERvbWFpbikgLyogZW1wdHkgKi8KCmVudW0gewoJTVNfTUdDX1ZBTCA9IDB4YzBlZDAwMDAsIC8qIE1hZ2ljIG51bWJlciBpbmRpY2F0bmcgIm5ldyIgZmxhZ3MgKi8KCU1TX1JET05MWSA9IDEsICAgICAgLyogTW91bnQgcmVhZC1vbmx5ICovCglNU19OT1NVSUQgPSAyLCAgICAgIC8qIElnbm9yZSBzdWlkIGFuZCBzZ2lkIGJpdHMgKi8KCU1TX05PREVWID0gNCwgICAgICAvKiBEaXNhbGxvdyBhY2Nlc3MgdG8gZGV2aWNlIHNwZWNpYWwgZmlsZXMgKi8KCU1TX05PRVhFQyA9IDgsICAgICAgLyogRGlzYWxsb3cgcHJvZ3JhbSBleGVjdXRpb24gKi8KCU1TX1NZTkNIUk9OT1VTID0gMTYsICAgICAgLyogV3JpdGVzIGFyZSBzeW5jZWQgYXQgb25jZSAqLwoJTVNfUkVNT1VOVCA9IDMyLCAgICAgIC8qIEFsdGVyIGZsYWdzIG9mIGEgbW91bnRlZCBGUyAqLwoJTVNfTUFORExPQ0sgPSA2NCwgICAgICAvKiBBbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gYW4gRlMgKi8KCVNfUVVPVEEgPSAxMjgsICAgICAvKiBRdW90YSBpbml0aWFsaXplZCBmb3IgZmlsZS9kaXJlY3Rvcnkvc3ltbGluayAqLwoJU19BUFBFTkQgPSAyNTYsICAgICAvKiBBcHBlbmQtb25seSBmaWxlICovCglTX0lNTVVUQUJMRSA9IDUxMiwgICAgIC8qIEltbXV0YWJsZSBmaWxlICovCglNU19OT0FUSU1FID0gMTAyNCwgICAgLyogRG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZXMuICovCglNU19OT0RJUkFUSU1FID0gMjA0OCAgICAvKiBEbyBub3QgdXBkYXRlIGRpcmVjdG9yeSBhY2Nlc3MgdGltZXMgKi8KfTsKCgovKgogKiBXZSB3YW50IHRvIGJlIGFibGUgdG8gY29tcGlsZSBtb3VudCBvbiBvbGQga2VybmVscyBpbiBzdWNoIGEgd2F5CiAqIHRoYXQgdGhlIGJpbmFyeSB3aWxsIHdvcmsgd2VsbCBvbiBtb3JlIHJlY2VudCBrZXJuZWxzLgogKiBUaHVzLCBpZiBuZWNlc3Nhcnkgd2UgdGVhY2ggbmZzbW91bnQuYyB0aGUgc3RydWN0dXJlIG9mIG5ldyBmaWVsZHMKICogdGhhdCB3aWxsIGNvbWUgbGF0ZXIuCiAqCiAqIE1vcmVvdmVyLCB0aGUgbmV3IGtlcm5lbCBpbmNsdWRlcyBjb25mbGljdCB3aXRoIGdsaWJjIGluY2x1ZGVzCiAqIHNvIGl0IGlzIGVhc2llc3QgdG8gaWdub3JlIHRoZSBrZXJuZWwgYWx0b2dldGhlciAoYXQgY29tcGlsZSB0aW1lKS4KICovCgovKiBOT1RFOiBEbyBub3QgbWFrZSB0aGlzIGludG8gYSAnc3RhdGljIGNvbnN0IGludCcgYmVjYXVzZSB0aGUgcHJlLXByb2Nlc3NvcgogKiBuZWVkcyB0byB0ZXN0IHRoaXMgdmFsdWUgaW4gc29tZSAjaWYgc3RhdGVtZW50cy4gKi8KI2RlZmluZSBORlNfTU9VTlRfVkVSU0lPTiA0CgpzdHJ1Y3QgbmZzMl9maCB7CgljaGFyICAgICAgICAgICAgICAgICAgICBkYXRhWzMyXTsKfTsKc3RydWN0IG5mczNfZmggewoJdW5zaWduZWQgc2hvcnQgICAgICAgICAgc2l6ZTsKCXVuc2lnbmVkIGNoYXIgICAgICAgICAgIGRhdGFbNjRdOwp9OwoKc3RydWN0IG5mc19tb3VudF9kYXRhIHsKCWludAkJdmVyc2lvbjsJCS8qIDEgKi8KCWludAkJZmQ7CQkJLyogMSAqLwoJc3RydWN0IG5mczJfZmgJb2xkX3Jvb3Q7CQkvKiAxICovCglpbnQJCWZsYWdzOwkJCS8qIDEgKi8KCWludAkJcnNpemU7CQkJLyogMSAqLwoJaW50CQl3c2l6ZTsJCQkvKiAxICovCglpbnQJCXRpbWVvOwkJCS8qIDEgKi8KCWludAkJcmV0cmFuczsJCS8qIDEgKi8KCWludAkJYWNyZWdtaW47CQkvKiAxICovCglpbnQJCWFjcmVnbWF4OwkJLyogMSAqLwoJaW50CQlhY2Rpcm1pbjsJCS8qIDEgKi8KCWludAkJYWNkaXJtYXg7CQkvKiAxICovCglzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsJCS8qIDEgKi8KCWNoYXIJCWhvc3RuYW1lWzI1Nl07CQkvKiAxICovCglpbnQJCW5hbWxlbjsJCQkvKiAyICovCgl1bnNpZ25lZCBpbnQJYnNpemU7CQkJLyogMyAqLwoJc3RydWN0IG5mczNfZmgJcm9vdDsJCQkvKiA0ICovCn07CgovKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCAqLwplbnVtIHsKCU5GU19NT1VOVF9TT0ZUID0gMHgwMDAxLAkvKiAxICovCglORlNfTU9VTlRfSU5UUiA9IDB4MDAwMiwJLyogMSAqLwoJTkZTX01PVU5UX1NFQ1VSRSA9IDB4MDAwNCwJLyogMSAqLwoJTkZTX01PVU5UX1BPU0lYID0gMHgwMDA4LAkvKiAxICovCglORlNfTU9VTlRfTk9DVE8gPSAweDAwMTAsCS8qIDEgKi8KCU5GU19NT1VOVF9OT0FDID0gMHgwMDIwLAkvKiAxICovCglORlNfTU9VTlRfVENQID0gMHgwMDQwLAkJLyogMiAqLwoJTkZTX01PVU5UX1ZFUjMgPSAweDAwODAsCS8qIDMgKi8KCU5GU19NT1VOVF9LRVJCRVJPUyA9IDB4MDEwMCwJLyogMyAqLwoJTkZTX01PVU5UX05PTkxNID0gMHgwMjAwCS8qIDMgKi8KfTsKCgojZGVmaW5lIFVUSUxfTElOVVhfVkVSU0lPTiAiMi4xMG0iCiNkZWZpbmUgdXRpbF9saW51eF92ZXJzaW9uICJ1dGlsLWxpbnV4LTIuMTBtIgoKI2RlZmluZSBIQVZFX2luZXRfYXRvbgojZGVmaW5lIEhBVkVfc2NzaV9oCiNkZWZpbmUgSEFWRV9ibGtwZ19oCiNkZWZpbmUgSEFWRV9rZF9oCiNkZWZpbmUgSEFWRV90ZXJtY2FwCiNkZWZpbmUgSEFWRV9sb2NhbGVfaAojZGVmaW5lIEhBVkVfbGliaW50bF9oCiNkZWZpbmUgRU5BQkxFX05MUwojZGVmaW5lIEhBVkVfbGFuZ2luZm9faAojZGVmaW5lIEhBVkVfcHJvZ25hbWUKI2RlZmluZSBIQVZFX29wZW5wdHkKI2RlZmluZSBIQVZFX25hbm9zbGVlcAojZGVmaW5lIEhBVkVfcGVyc29uYWxpdHkKI2RlZmluZSBIQVZFX3RtX2dtdG9mZgoKc3RhdGljIGNoYXIgKm5mc19zdHJlcnJvcihpbnQgc3RhdHVzKTsKCiNkZWZpbmUgTUFLRV9WRVJTSU9OKHAscSxyKQkoNjU1MzYqKHApICsgMjU2KihxKSArIChyKSkKI2RlZmluZSBNQVhfTkZTUFJPVCAoKG5mc19tb3VudF92ZXJzaW9uID49IDQpID8gMyA6IDIpCgplbnVtIHsKCUVYX0ZBSUwgPSAzMiwgICAgICAgLyogbW91bnQgZmFpbHVyZSAqLwoJRVhfQkcgPSAyNTYgICAgICAgIC8qIHJldHJ5IGluIGJhY2tncm91bmQgKGludGVybmFsIG9ubHkpICovCn07CgoKLyoKICogbmZzX21vdW50X3ZlcnNpb24gYWNjb3JkaW5nIHRvIHRoZSBzb3VyY2VzIHNlZW4gYXQgY29tcGlsZSB0aW1lLgogKi8Kc3RhdGljIGludCBuZnNfbW91bnRfdmVyc2lvbjsKCi8qCiAqIFVuZm9ydHVuYXRlbHksIHRoZSBrZXJuZWwgcHJpbnRzIGFubm95aW5nIGNvbnNvbGUgbWVzc2FnZXMKICogaW4gY2FzZSBvZiBhbiB1bmV4cGVjdGVkIG5mcyBtb3VudCB2ZXJzaW9uIChpbnN0ZWFkIG9mCiAqIGp1c3QgcmV0dXJuaW5nIHNvbWUgZXJyb3IpLiAgVGhlcmVmb3JlIHdlJ2xsIGhhdmUgdG8gdHJ5CiAqIGFuZCBmaWd1cmUgb3V0IHdoYXQgdmVyc2lvbiB0aGUga2VybmVsIGV4cGVjdHMuCiAqCiAqIFZhcmlhYmxlczoKICoJS0VSTkVMX05GU19NT1VOVF9WRVJTSU9OOiBrZXJuZWwgc291cmNlcyBhdCBjb21waWxlIHRpbWUKICoJTkZTX01PVU5UX1ZFUlNJT046IHRoZXNlIG5mc21vdW50IHNvdXJjZXMgYXQgY29tcGlsZSB0aW1lCiAqCW5mc19tb3VudF92ZXJzaW9uOiB2ZXJzaW9uIHRoaXMgc291cmNlIGFuZCBydW5uaW5nIGtlcm5lbCBjYW4gaGFuZGxlCiAqLwpzdGF0aWMgdm9pZApmaW5kX2tlcm5lbF9uZnNfbW91bnRfdmVyc2lvbih2b2lkKQp7CglzdGF0aWMgaW50IGtlcm5lbF92ZXJzaW9uID0gMDsKCglpZiAoa2VybmVsX3ZlcnNpb24pCgkJcmV0dXJuOwoKCW5mc19tb3VudF92ZXJzaW9uID0gTkZTX01PVU5UX1ZFUlNJT047IC8qIGRlZmF1bHQgKi8KCglrZXJuZWxfdmVyc2lvbiA9IGdldF9rZXJuZWxfcmV2aXNpb24oKTsKCWlmIChrZXJuZWxfdmVyc2lvbikgewoJCWlmIChrZXJuZWxfdmVyc2lvbiA8IE1BS0VfVkVSU0lPTigyLDEsMzIpKQoJCQluZnNfbW91bnRfdmVyc2lvbiA9IDE7CgkJZWxzZSBpZiAoa2VybmVsX3ZlcnNpb24gPCBNQUtFX1ZFUlNJT04oMiwyLDE4KSB8fAoJCQkJKGtlcm5lbF92ZXJzaW9uID49ICAgTUFLRV9WRVJTSU9OKDIsMywwKSAmJgoJCQkJIGtlcm5lbF92ZXJzaW9uIDwgTUFLRV9WRVJTSU9OKDIsMyw5OSkpKQoJCQluZnNfbW91bnRfdmVyc2lvbiA9IDM7CgkJZWxzZQoJCQluZnNfbW91bnRfdmVyc2lvbiA9IDQ7IC8qIHNpbmNlIDIuMy45OXByZTQgKi8KCX0KCWlmIChuZnNfbW91bnRfdmVyc2lvbiA+IE5GU19NT1VOVF9WRVJTSU9OKQoJCW5mc19tb3VudF92ZXJzaW9uID0gTkZTX01PVU5UX1ZFUlNJT047Cn0KCnN0YXRpYyBzdHJ1Y3QgcG1hcCAqCmdldF9tb3VudHBvcnQoc3RydWN0IHNvY2thZGRyX2luICpzZXJ2ZXJfYWRkciwKICAgICAgbG9uZyB1bnNpZ25lZCBwcm9nLAogICAgICBsb25nIHVuc2lnbmVkIHZlcnNpb24sCiAgICAgIGxvbmcgdW5zaWduZWQgcHJvdG8sCiAgICAgIGxvbmcgdW5zaWduZWQgcG9ydCkKewpzdHJ1Y3QgcG1hcGxpc3QgKnBtYXA7CnN0YXRpYyBzdHJ1Y3QgcG1hcCBwID0gezAsIDAsIDAsIDB9OwoKc2VydmVyX2FkZHItPnNpbl9wb3J0ID0gUE1BUFBPUlQ7CnBtYXAgPSBwbWFwX2dldG1hcHMoc2VydmVyX2FkZHIpOwoKaWYgKHZlcnNpb24gPiBNQVhfTkZTUFJPVCkKCXZlcnNpb24gPSBNQVhfTkZTUFJPVDsKaWYgKCFwcm9nKQoJcHJvZyA9IE1PVU5UUFJPRzsKcC5wbV9wcm9nID0gcHJvZzsKcC5wbV92ZXJzID0gdmVyc2lvbjsKcC5wbV9wcm90ID0gcHJvdG87CnAucG1fcG9ydCA9IHBvcnQ7Cgp3aGlsZSAocG1hcCkgewoJaWYgKHBtYXAtPnBtbF9tYXAucG1fcHJvZyAhPSBwcm9nKQoJCWdvdG8gbmV4dDsKCWlmICghdmVyc2lvbiAmJiBwLnBtX3ZlcnMgPiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMpCgkJZ290byBuZXh0OwoJaWYgKHZlcnNpb24gPiAyICYmIHBtYXAtPnBtbF9tYXAucG1fdmVycyAhPSB2ZXJzaW9uKQoJCWdvdG8gbmV4dDsKCWlmICh2ZXJzaW9uICYmIHZlcnNpb24gPD0gMiAmJiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgPiAyKQoJCWdvdG8gbmV4dDsKCWlmIChwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgPiBNQVhfTkZTUFJPVCB8fAoJICAgIChwcm90byAmJiBwLnBtX3Byb3QgJiYgcG1hcC0+cG1sX21hcC5wbV9wcm90ICE9IHByb3RvKSB8fAoJICAgIChwb3J0ICYmIHBtYXAtPnBtbF9tYXAucG1fcG9ydCAhPSBwb3J0KSkKCQlnb3RvIG5leHQ7CgltZW1jcHkoJnAsICZwbWFwLT5wbWxfbWFwLCBzaXplb2YocCkpOwpuZXh0OgoJcG1hcCA9IHBtYXAtPnBtbF9uZXh0Owp9CmlmICghcC5wbV92ZXJzKQoJcC5wbV92ZXJzID0gTU9VTlRWRVJTOwppZiAoIXAucG1fcG9ydCkKCXAucG1fcG9ydCA9IE1PVU5UUE9SVDsKaWYgKCFwLnBtX3Byb3QpCglwLnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKcmV0dXJuICZwOwp9CgppbnQgbmZzbW91bnQoY29uc3QgY2hhciAqc3BlYywgY29uc3QgY2hhciAqbm9kZSwgaW50ICpmbGFncywKCSAgICAgY2hhciAqKm1vdW50X29wdHMsIGludCBydW5uaW5nX2JnKQp7CglzdGF0aWMgY2hhciAqcHJldl9iZ19ob3N0OwoJY2hhciBob3N0ZGlyWzEwMjRdOwoJQ0xJRU5UICptY2xpZW50OwoJY2hhciAqaG9zdG5hbWU7CgljaGFyICpwYXRobmFtZTsKCWNoYXIgKm9sZF9vcHRzOwoJY2hhciAqbW91bnRob3N0PU5VTEw7CgljaGFyIG5ld19vcHRzWzEwMjRdOwoJc3RydWN0IHRpbWV2YWwgdG90YWxfdGltZW91dDsKCWVudW0gY2xudF9zdGF0IGNsbnRfc3RhdDsKCXN0cnVjdCBuZnNfbW91bnRfZGF0YSBkYXRhOwoJY2hhciAqb3B0LCAqb3B0ZXE7CglpbnQgdmFsOwoJc3RydWN0IGhvc3RlbnQgKmhwOwoJc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcl9hZGRyOwoJc3RydWN0IHNvY2thZGRyX2luIG1vdW50X3NlcnZlcl9hZGRyOwoJc3RydWN0IHBtYXAqIHBtX21udDsKCWludCBtc29jaywgZnNvY2s7CglzdHJ1Y3QgdGltZXZhbCByZXRyeV90aW1lb3V0OwoJdW5pb24gewoJCXN0cnVjdCBmaHN0YXR1cyBuZnN2MjsKCQlzdHJ1Y3QgbW91bnRyZXMzIG5mc3YzOwoJfSBzdGF0dXM7CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJY2hhciAqczsKCWludCBwb3J0OwoJaW50IG1vdW50cG9ydDsKCWludCBwcm90bzsKCWludCBiZzsKCWludCBzb2Z0OwoJaW50IGludHI7CglpbnQgcG9zaXg7CglpbnQgbm9jdG87CglpbnQgbm9hYzsKCWludCBub2xvY2s7CglpbnQgcmV0cnk7CglpbnQgdGNwOwoJaW50IG1vdW50cHJvZzsKCWludCBtb3VudHZlcnM7CglpbnQgbmZzcHJvZzsKCWludCBuZnN2ZXJzOwoJaW50IHJldHZhbDsKCXRpbWVfdCB0OwoJdGltZV90IHByZXZ0OwoJdGltZV90IHRpbWVvdXQ7CgoJZmluZF9rZXJuZWxfbmZzX21vdW50X3ZlcnNpb24oKTsKCglyZXR2YWwgPSBFWF9GQUlMOwoJbXNvY2sgPSBmc29jayA9IC0xOwoJbWNsaWVudCA9IE5VTEw7CglpZiAoc3RybGVuKHNwZWMpID49IHNpemVvZihob3N0ZGlyKSkgewoJCWJiX2Vycm9yX21zZygiZXhjZXNzaXZlbHkgbG9uZyBob3N0OmRpciBhcmd1bWVudCIpOwoJCWdvdG8gZmFpbDsKCX0KCXN0cmNweShob3N0ZGlyLCBzcGVjKTsKCWlmICgocyA9IHN0cmNocihob3N0ZGlyLCAnOicpKSkgewoJCWhvc3RuYW1lID0gaG9zdGRpcjsKCQlwYXRobmFtZSA9IHMgKyAxOwoJCSpzID0gJ1wwJzsKCQkvKiBJZ25vcmUgYWxsIGJ1dCBmaXJzdCBob3N0bmFtZSBpbiByZXBsaWNhdGVkIG1vdW50cwoJCSAgIHVudGlsIHRoZXkgY2FuIGJlIGZ1bGx5IHN1cHBvcnRlZC4gKG1hY2tAc2dpLmNvbSkgKi8KCQlpZiAoKHMgPSBzdHJjaHIoaG9zdGRpciwgJywnKSkpIHsKCQkJKnMgPSAnXDAnOwoJCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IG11bHRpcGxlIGhvc3RuYW1lcyBub3Qgc3VwcG9ydGVkIik7CgkJfQoJfSBlbHNlIHsKCQliYl9lcnJvcl9tc2coImRpcmVjdG9yeSB0byBtb3VudCBub3QgaW4gaG9zdDpkaXIgZm9ybWF0Iik7CgkJZ290byBmYWlsOwoJfQoKCXNlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwojaWZkZWYgSEFWRV9pbmV0X2F0b24KCWlmICghaW5ldF9hdG9uKGhvc3RuYW1lLCAmc2VydmVyX2FkZHIuc2luX2FkZHIpKQojZW5kaWYKCXsKCQlpZiAoKGhwID0gZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkpID09IE5VTEwpIHsKCQkJYmJfaGVycm9yX21zZygiJXMiLCBob3N0bmFtZSk7CgkJCWdvdG8gZmFpbDsKCQl9IGVsc2UgewoJCQlpZiAoaHAtPmhfbGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgewoJCQkJYmJfZXJyb3JfbXNnKCJnb3QgYmFkIGhwLT5oX2xlbmd0aCIpOwoJCQkJaHAtPmhfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKCQkJfQoJCQltZW1jcHkoJnNlcnZlcl9hZGRyLnNpbl9hZGRyLAoJCQkgICAgICAgaHAtPmhfYWRkciwgaHAtPmhfbGVuZ3RoKTsKCQl9Cgl9CgoJbWVtY3B5ICgmbW91bnRfc2VydmVyX2FkZHIsICZzZXJ2ZXJfYWRkciwgc2l6ZW9mIChtb3VudF9zZXJ2ZXJfYWRkcikpOwoKCS8qIGFkZCBJUCBhZGRyZXNzIHRvIG10YWIgb3B0aW9ucyBmb3IgdXNlIHdoZW4gdW5tb3VudGluZyAqLwoKCXMgPSBpbmV0X250b2Eoc2VydmVyX2FkZHIuc2luX2FkZHIpOwoJb2xkX29wdHMgPSAqbW91bnRfb3B0czsKCWlmICghb2xkX29wdHMpCgkJb2xkX29wdHMgPSAiIjsKCWlmIChzdHJsZW4ob2xkX29wdHMpICsgc3RybGVuKHMpICsgMTAgPj0gc2l6ZW9mKG5ld19vcHRzKSkgewoJCWJiX2Vycm9yX21zZygiZXhjZXNzaXZlbHkgbG9uZyBvcHRpb24gYXJndW1lbnQiKTsKCQlnb3RvIGZhaWw7Cgl9CglzcHJpbnRmKG5ld19vcHRzLCAiJXMlc2FkZHI9JXMiLAoJCW9sZF9vcHRzLCAqb2xkX29wdHMgPyAiLCIgOiAiIiwgcyk7CgkqbW91bnRfb3B0cyA9IGJiX3hzdHJkdXAobmV3X29wdHMpOwoKCS8qIFNldCBkZWZhdWx0IG9wdGlvbnMuCgkgKiByc2l6ZS93c2l6ZSAoYW5kIGJzaXplLCBmb3IgdmVyID49IDMpIGFyZSBsZWZ0IDAgaW4gb3JkZXIgdG8KCSAqIGxldCB0aGUga2VybmVsIGRlY2lkZS4KCSAqIHRpbWVvIGlzIGZpbGxlZCBpbiBhZnRlciB3ZSBrbm93IHdoZXRoZXIgaXQnbGwgYmUgVENQIG9yIFVEUC4gKi8KCW1lbXNldCgmZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKCWRhdGEucmV0cmFucwk9IDM7CglkYXRhLmFjcmVnbWluCT0gMzsKCWRhdGEuYWNyZWdtYXgJPSA2MDsKCWRhdGEuYWNkaXJtaW4JPSAzMDsKCWRhdGEuYWNkaXJtYXgJPSA2MDsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCWRhdGEubmFtbGVuCT0gTkFNRV9NQVg7CiNlbmRpZgoKCWJnID0gMDsKCXNvZnQgPSAwOwoJaW50ciA9IDA7Cglwb3NpeCA9IDA7Cglub2N0byA9IDA7Cglub2xvY2sgPSAwOwoJbm9hYyA9IDA7CglyZXRyeSA9IDEwMDAwOwkJLyogMTAwMDAgbWludXRlcyB+IDEgd2VlayAqLwoJdGNwID0gMDsKCgltb3VudHByb2cgPSBNT1VOVFBST0c7Cgltb3VudHZlcnMgPSAwOwoJcG9ydCA9IDA7Cgltb3VudHBvcnQgPSAwOwoJbmZzcHJvZyA9IE5GU19QUk9HUkFNOwoJbmZzdmVycyA9IDA7CgoJLyogcGFyc2Ugb3B0aW9ucyAqLwoKCWZvciAob3B0ID0gc3RydG9rKG9sZF9vcHRzLCAiLCIpOyBvcHQ7IG9wdCA9IHN0cnRvayhOVUxMLCAiLCIpKSB7CgkJaWYgKChvcHRlcSA9IHN0cmNocihvcHQsICc9JykpKSB7CgkJCXZhbCA9IGF0b2kob3B0ZXEgKyAxKTsKCQkJKm9wdGVxID0gJ1wwJzsKCQkJaWYgKCFzdHJjbXAob3B0LCAicnNpemUiKSkKCQkJCWRhdGEucnNpemUgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAid3NpemUiKSkKCQkJCWRhdGEud3NpemUgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidGltZW8iKSkKCQkJCWRhdGEudGltZW8gPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAicmV0cmFucyIpKQoJCQkJZGF0YS5yZXRyYW5zID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjcmVnbWluIikpCgkJCQlkYXRhLmFjcmVnbWluID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjcmVnbWF4IikpCgkJCQlkYXRhLmFjcmVnbWF4ID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjZGlybWluIikpCgkJCQlkYXRhLmFjZGlybWluID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjZGlybWF4IikpCgkJCQlkYXRhLmFjZGlybWF4ID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjdGltZW8iKSkgewoJCQkJZGF0YS5hY3JlZ21pbiA9IHZhbDsKCQkJCWRhdGEuYWNyZWdtYXggPSB2YWw7CgkJCQlkYXRhLmFjZGlybWluID0gdmFsOwoJCQkJZGF0YS5hY2Rpcm1heCA9IHZhbDsKCQkJfQoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInJldHJ5IikpCgkJCQlyZXRyeSA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJwb3J0IikpCgkJCQlwb3J0ID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vdW50cG9ydCIpKQoJCQkgICAgICAgIG1vdW50cG9ydCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudGhvc3QiKSkKCQkJICAgICAgICBtb3VudGhvc3Q9YmJfeHN0cm5kdXAob3B0ZXErMSwKCQkJCQkJICBzdHJjc3BuKG9wdGVxKzEsIiBcdFxuXHIsIikpOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vdW50cHJvZyIpKQoJCQkJbW91bnRwcm9nID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vdW50dmVycyIpKQoJCQkJbW91bnR2ZXJzID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm5mc3Byb2ciKSkKCQkJCW5mc3Byb2cgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAibmZzdmVycyIpIHx8CgkJCQkgIXN0cmNtcChvcHQsICJ2ZXJzIikpCgkJCQluZnN2ZXJzID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInByb3RvIikpIHsKCQkJCWlmICghc3RybmNtcChvcHRlcSsxLCAidGNwIiwgMykpCgkJCQkJdGNwID0gMTsKCQkJCWVsc2UgaWYgKCFzdHJuY21wKG9wdGVxKzEsICJ1ZHAiLCAzKSkKCQkJCQl0Y3AgPSAwOwoJCQkJZWxzZQoJCQkJCXByaW50ZihfKCJXYXJuaW5nOiBVbnJlY29nbml6ZWQgcHJvdG89IG9wdGlvbi5cbiIpKTsKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgIm5hbWxlbiIpKSB7CiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAyCgkJCQlpZiAobmZzX21vdW50X3ZlcnNpb24gPj0gMikKCQkJCQlkYXRhLm5hbWxlbiA9IHZhbDsKCQkJCWVsc2UKI2VuZGlmCgkJCQlwcmludGYoXygiV2FybmluZzogT3B0aW9uIG5hbWxlbiBpcyBub3Qgc3VwcG9ydGVkLlxuIikpOwoJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWRkciIpKQoJCQkJLyogaWdub3JlICovOwoJCQllbHNlIHsKCQkJCXByaW50ZihfKCJ1bmtub3duIG5mcyBtb3VudCBwYXJhbWV0ZXI6ICIKCQkJCSAgICAgICAiJXM9JWRcbiIpLCBvcHQsIHZhbCk7CgkJCQlnb3RvIGZhaWw7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCXZhbCA9IDE7CgkJCWlmICghc3RybmNtcChvcHQsICJubyIsIDIpKSB7CgkJCQl2YWwgPSAwOwoJCQkJb3B0ICs9IDI7CgkJCX0KCQkJaWYgKCFzdHJjbXAob3B0LCAiYmciKSkKCQkJCWJnID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImZnIikpCgkJCQliZyA9ICF2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic29mdCIpKQoJCQkJc29mdCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJoYXJkIikpCgkJCQlzb2Z0ID0gIXZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJpbnRyIikpCgkJCQlpbnRyID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInBvc2l4IikpCgkJCQlwb3NpeCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJjdG8iKSkKCQkJCW5vY3RvID0gIXZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhYyIpKQoJCQkJbm9hYyA9ICF2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidGNwIikpCgkJCQl0Y3AgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidWRwIikpCgkJCQl0Y3AgPSAhdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImxvY2siKSkgewoJCQkJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDMpCgkJCQkJbm9sb2NrID0gIXZhbDsKCQkJCWVsc2UKCQkJCQlwcmludGYoXygiV2FybmluZzogb3B0aW9uIG5vbG9jayBpcyBub3Qgc3VwcG9ydGVkLlxuIikpOwoJCQl9IGVsc2UgewoJCQkJcHJpbnRmKF8oInVua25vd24gbmZzIG1vdW50IG9wdGlvbjogIgoJCQkJCSAgICIlcyVzXG4iKSwgdmFsID8gIiIgOiAibm8iLCBvcHQpOwoJCQkJZ290byBmYWlsOwoJCQl9CgkJfQoJfQoJcHJvdG8gPSAodGNwKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CgoJZGF0YS5mbGFncyA9IChzb2Z0ID8gTkZTX01PVU5UX1NPRlQgOiAwKQoJCXwgKGludHIgPyBORlNfTU9VTlRfSU5UUiA6IDApCgkJfCAocG9zaXggPyBORlNfTU9VTlRfUE9TSVggOiAwKQoJCXwgKG5vY3RvID8gTkZTX01PVU5UX05PQ1RPIDogMCkKCQl8IChub2FjID8gTkZTX01PVU5UX05PQUMgOiAwKTsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCWlmIChuZnNfbW91bnRfdmVyc2lvbiA+PSAyKQoJCWRhdGEuZmxhZ3MgfD0gKHRjcCA/IE5GU19NT1VOVF9UQ1AgOiAwKTsKI2VuZGlmCiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAzCglpZiAobmZzX21vdW50X3ZlcnNpb24gPj0gMykKCQlkYXRhLmZsYWdzIHw9IChub2xvY2sgPyBORlNfTU9VTlRfTk9OTE0gOiAwKTsKI2VuZGlmCglpZiAobmZzdmVycyA+IE1BWF9ORlNQUk9UKSB7CgkJYmJfZXJyb3JfbXNnKCJORlN2JWQgbm90IHN1cHBvcnRlZCEiLCBuZnN2ZXJzKTsKCQlyZXR1cm4gMDsKCX0KCWlmIChtb3VudHZlcnMgPiBNQVhfTkZTUFJPVCkgewoJCWJiX2Vycm9yX21zZygiTkZTdiVkIG5vdCBzdXBwb3J0ZWQhIiwgbmZzdmVycyk7CgkJcmV0dXJuIDA7Cgl9CglpZiAobmZzdmVycyAmJiAhbW91bnR2ZXJzKQoJCW1vdW50dmVycyA9IChuZnN2ZXJzIDwgMykgPyAxIDogbmZzdmVyczsKCWlmIChuZnN2ZXJzICYmIG5mc3ZlcnMgPCBtb3VudHZlcnMpIHsKCQltb3VudHZlcnMgPSBuZnN2ZXJzOwoJfQoKCS8qIEFkanVzdCBvcHRpb25zIGlmIG5vbmUgc3BlY2lmaWVkICovCglpZiAoIWRhdGEudGltZW8pCgkJZGF0YS50aW1lbyA9IHRjcCA/IDcwIDogNzsKCiNpZmRlZiBORlNfTU9VTlRfREVCVUcKCXByaW50ZigicnNpemUgPSAlZCwgd3NpemUgPSAlZCwgdGltZW8gPSAlZCwgcmV0cmFucyA9ICVkXG4iLAoJCWRhdGEucnNpemUsIGRhdGEud3NpemUsIGRhdGEudGltZW8sIGRhdGEucmV0cmFucyk7CglwcmludGYoImFjcmVnIChtaW4sIG1heCkgPSAoJWQsICVkKSwgYWNkaXIgKG1pbiwgbWF4KSA9ICglZCwgJWQpXG4iLAoJCWRhdGEuYWNyZWdtaW4sIGRhdGEuYWNyZWdtYXgsIGRhdGEuYWNkaXJtaW4sIGRhdGEuYWNkaXJtYXgpOwoJcHJpbnRmKCJwb3J0ID0gJWQsIGJnID0gJWQsIHJldHJ5ID0gJWQsIGZsYWdzID0gJS44eFxuIiwKCQlwb3J0LCBiZywgcmV0cnksIGRhdGEuZmxhZ3MpOwoJcHJpbnRmKCJtb3VudHByb2cgPSAlZCwgbW91bnR2ZXJzID0gJWQsIG5mc3Byb2cgPSAlZCwgbmZzdmVycyA9ICVkXG4iLAoJCW1vdW50cHJvZywgbW91bnR2ZXJzLCBuZnNwcm9nLCBuZnN2ZXJzKTsKCXByaW50Zigic29mdCA9ICVkLCBpbnRyID0gJWQsIHBvc2l4ID0gJWQsIG5vY3RvID0gJWQsIG5vYWMgPSAlZFxuIiwKCQkoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9TT0ZUKSAhPSAwLAoJCShkYXRhLmZsYWdzICYgTkZTX01PVU5UX0lOVFIpICE9IDAsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfUE9TSVgpICE9IDAsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9DVE8pICE9IDAsCgkJKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9BQykgIT0gMCk7CiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAyCglwcmludGYoInRjcCA9ICVkXG4iLAoJCShkYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgIT0gMCk7CiNlbmRpZgojZW5kaWYKCglkYXRhLnZlcnNpb24gPSBuZnNfbW91bnRfdmVyc2lvbjsKCglpZiAoKmZsYWdzICYgTVNfUkVNT1VOVCkKCQlnb3RvIGNvcHlfZGF0YV9hbmRfcmV0dXJuOwoKCS8qCgkgKiBJZiB0aGUgcHJldmlvdXMgbW91bnQgb3BlcmF0aW9uIG9uIHRoZSBzYW1lIGhvc3Qgd2FzCgkgKiBiYWNrZ3JvdW5kZWQsIGFuZCB0aGUgImJnIiBmb3IgdGhpcyBtb3VudCBpcyBhbHNvIHNldCwKCSAqIGdpdmUgdXAgaW1tZWRpYXRlbHksIHRvIGF2b2lkIHRoZSBpbml0aWFsIHRpbWVvdXQuCgkgKi8KCWlmIChiZyAmJiAhcnVubmluZ19iZyAmJgoJICAgIHByZXZfYmdfaG9zdCAmJiBzdHJjbXAoaG9zdG5hbWUsIHByZXZfYmdfaG9zdCkgPT0gMCkgewoJCWlmIChyZXRyeSA+IDApCgkJCXJldHZhbCA9IEVYX0JHOwoJCXJldHVybiByZXR2YWw7Cgl9CgoJLyogY3JlYXRlIG1vdW50IGRlYW1vbiBjbGllbnQgKi8KCS8qIFNlZSBpZiB0aGUgbmZzIGhvc3QgPSBtb3VudCBob3N0LiAqLwoJaWYgKG1vdW50aG9zdCkgewoJICBpZiAobW91bnRob3N0WzBdID49ICcwJyAmJiBtb3VudGhvc3RbMF0gPD0gJzknKSB7CgkgICAgbW91bnRfc2VydmVyX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CgkgICAgbW91bnRfc2VydmVyX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKGhvc3RuYW1lKTsKCSAgfSBlbHNlIHsKCQkgIGlmICgoaHAgPSBnZXRob3N0YnluYW1lKG1vdW50aG9zdCkpID09IE5VTEwpIHsKCQkJICBiYl9oZXJyb3JfbXNnKCIlcyIsIG1vdW50aG9zdCk7CgkJCSAgZ290byBmYWlsOwoJCSAgfSBlbHNlIHsKCQkJICBpZiAoaHAtPmhfbGVuZ3RoID4gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgewoJCQkJICBiYl9lcnJvcl9tc2coImdvdCBiYWQgaHAtPmhfbGVuZ3RoPyIpOwoJCQkJICBocC0+aF9sZW5ndGggPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwoJCQkgIH0KCQkJICBtb3VudF9zZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKCQkJICBtZW1jcHkoJm1vdW50X3NlcnZlcl9hZGRyLnNpbl9hZGRyLAoJCQkJIGhwLT5oX2FkZHIsIGhwLT5oX2xlbmd0aCk7CgkJICB9CgkgIH0KCX0KCgkvKgoJICogVGhlIGZvbGxvd2luZyBsb29wIGltcGxlbWVudHMgdGhlIG1vdW50IHJldHJpZXMuIE9uIHRoZSBmaXJzdAoJICogY2FsbCwgInJ1bm5pbmdfYmciIGlzIDAuIFdoZW4gdGhlIG1vdW50IHRpbWVzIG91dCwgYW5kIHRoZQoJICogImJnIiBvcHRpb24gaXMgc2V0LCB0aGUgZXhpdCBzdGF0dXMgRVhfQkcgd2lsbCBiZSByZXR1cm5lZC4KCSAqIEZvciBhIGJhY2tncm91bmRlZCBtb3VudCwgdGhlcmUgd2lsbCBiZSBhIHNlY29uZCBjYWxsIGJ5IHRoZQoJICogY2hpbGQgcHJvY2VzcyB3aXRoICJydW5uaW5nX2JnIiBzZXQgdG8gMS4KCSAqCgkgKiBUaGUgY2FzZSB3aGVyZSB0aGUgbW91bnQgcG9pbnQgaXMgbm90IHByZXNlbnQgYW5kIHRoZSAiYmciCgkgKiBvcHRpb24gaXMgc2V0LCBpcyB0cmVhdGVkIGFzIGEgdGltZW91dC4gVGhpcyBpcyBkb25lIHRvCgkgKiBzdXBwb3J0IG5lc3RlZCBtb3VudHMuCgkgKgoJICogVGhlICJyZXRyeSIgY291bnQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGlzIHRoZSBudW1iZXIgb2YKCSAqIG1pbnV0ZXMgdG8gcmV0cnkgYmVmb3JlIGdpdmluZyB1cC4KCSAqCgkgKiBPbmx5IHRoZSBmaXJzdCBlcnJvciBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkLgoJICovCglyZXRyeV90aW1lb3V0LnR2X3NlYyA9IDM7CglyZXRyeV90aW1lb3V0LnR2X3VzZWMgPSAwOwoJdG90YWxfdGltZW91dC50dl9zZWMgPSAyMDsKCXRvdGFsX3RpbWVvdXQudHZfdXNlYyA9IDA7Cgl0aW1lb3V0ID0gdGltZShOVUxMKSArIDYwICogcmV0cnk7CglwcmV2dCA9IDA7Cgl0ID0gMzA7Cgl2YWwgPSAxOwoJZm9yICg7OykgewoJCWlmIChiZyAmJiBzdGF0KG5vZGUsICZzdGF0YnVmKSA9PSAtMSkgewoJCQlpZiAocnVubmluZ19iZykgewoJCQkJc2xlZXAodmFsKTsJLyogMSwgMiwgNCwgOCwgMTYsIDMwLCAuLi4gKi8KCQkJCXZhbCAqPSAyOwoJCQkJaWYgKHZhbCA+IDMwKQoJCQkJCXZhbCA9IDMwOwoJCQl9CgkJfSBlbHNlIHsKCQkJLyogYmUgY2FyZWZ1bCBub3QgdG8gdXNlIHRvbyBtYW55IENQVSBjeWNsZXMgKi8KCQkJaWYgKHQgLSBwcmV2dCA8IDMwKQoJCQkJc2xlZXAoMzApOwoKCQkJcG1fbW50ID0gZ2V0X21vdW50cG9ydCgmbW91bnRfc2VydmVyX2FkZHIsCgkJCQkgICAgICAgbW91bnRwcm9nLAoJCQkJICAgICAgIG1vdW50dmVycywKCQkJCSAgICAgICBwcm90bywKCQkJCSAgICAgICBtb3VudHBvcnQpOwoKCQkJLyogY29udGFjdCB0aGUgbW91bnQgZGFlbW9uIHZpYSBUQ1AgKi8KCQkJbW91bnRfc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwbV9tbnQtPnBtX3BvcnQpOwoJCQltc29jayA9IFJQQ19BTllTT0NLOwoKCQkJc3dpdGNoIChwbV9tbnQtPnBtX3Byb3QpIHsKCQkJY2FzZSBJUFBST1RPX1VEUDoKCQkJCW1jbGllbnQgPSBjbG50dWRwX2NyZWF0ZSgmbW91bnRfc2VydmVyX2FkZHIsCgkJCQkJCSBwbV9tbnQtPnBtX3Byb2csCgkJCQkJCSBwbV9tbnQtPnBtX3ZlcnMsCgkJCQkJCSByZXRyeV90aW1lb3V0LAoJCQkJCQkgJm1zb2NrKTsKCQkgIGlmIChtY2xpZW50KQoJCQkgIGJyZWFrOwoJCSAgbW91bnRfc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwbV9tbnQtPnBtX3BvcnQpOwoJCSAgbXNvY2sgPSBSUENfQU5ZU09DSzsKCQljYXNlIElQUFJPVE9fVENQOgoJCQltY2xpZW50ID0gY2xudHRjcF9jcmVhdGUoJm1vdW50X3NlcnZlcl9hZGRyLAoJCQkJCQkgcG1fbW50LT5wbV9wcm9nLAoJCQkJCQkgcG1fbW50LT5wbV92ZXJzLAoJCQkJCQkgJm1zb2NrLCAwLCAwKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJbWNsaWVudCA9IDA7CgkJCX0KCQkJaWYgKG1jbGllbnQpIHsKCQkJCS8qIHRyeSB0byBtb3VudCBob3N0bmFtZTpwYXRobmFtZSAqLwoJCQkJbWNsaWVudC0+Y2xfYXV0aCA9IGF1dGh1bml4X2NyZWF0ZV9kZWZhdWx0KCk7CgoJCQkvKiBtYWtlIHBvaW50ZXJzIGluIHhkcl9tb3VudHJlczMgTlVMTCBzbwoJCQkgKiB0aGF0IHhkcl9hcnJheSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB1cwoJCQkgKi8KCQkJbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdGF0dXMpKTsKCgkJCWlmIChwbV9tbnQtPnBtX3ZlcnMgPT0gMykKCQkJCWNsbnRfc3RhdCA9IGNsbnRfY2FsbChtY2xpZW50LCBNT1VOVFBST0MzX01OVCwKCQkJCQkJICAgICAgKHhkcnByb2NfdCkgeGRyX2RpcnBhdGgsCgkJCQkJCSAgICAgIChjYWRkcl90KSAmcGF0aG5hbWUsCgkJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9tb3VudHJlczMsCgkJCQkJCSAgICAgIChjYWRkcl90KSAmc3RhdHVzLAoJCQkJCXRvdGFsX3RpbWVvdXQpOwoJCQllbHNlCgkJCQljbG50X3N0YXQgPSBjbG50X2NhbGwobWNsaWVudCwgTU9VTlRQUk9DX01OVCwKCQkJCQkJICAgICAgKHhkcnByb2NfdCkgeGRyX2RpcnBhdGgsCgkJCQkJCSAgICAgIChjYWRkcl90KSAmcGF0aG5hbWUsCgkJCQkJCSAgICAgICh4ZHJwcm9jX3QpIHhkcl9maHN0YXR1cywKCQkJCQkJICAgICAgKGNhZGRyX3QpICZzdGF0dXMsCgkJCQkJCSAgICAgIHRvdGFsX3RpbWVvdXQpOwoKCQkJCWlmIChjbG50X3N0YXQgPT0gUlBDX1NVQ0NFU1MpCgkJCQkJYnJlYWs7CQkvKiB3ZSdyZSBkb25lICovCgkJCQlpZiAoZXJybm8gIT0gRUNPTk5SRUZVU0VEKSB7CgkJCQkJY2xudF9wZXJyb3IobWNsaWVudCwgIm1vdW50Iik7CgkJCQkJZ290byBmYWlsOwkvKiBkb24ndCByZXRyeSAqLwoJCQkJfQoJCQkJaWYgKCFydW5uaW5nX2JnICYmIHByZXZ0ID09IDApCgkJCQkJY2xudF9wZXJyb3IobWNsaWVudCwgIm1vdW50Iik7CgkJCQlhdXRoX2Rlc3Ryb3kobWNsaWVudC0+Y2xfYXV0aCk7CgkJCQljbG50X2Rlc3Ryb3kobWNsaWVudCk7CgkJCQltY2xpZW50ID0gMDsKCQkJCWNsb3NlKG1zb2NrKTsKCQkJfSBlbHNlIHsKCQkJCWlmICghcnVubmluZ19iZyAmJiBwcmV2dCA9PSAwKQoJCQkJCWNsbnRfcGNyZWF0ZWVycm9yKCJtb3VudCIpOwoJCQl9CgkJCXByZXZ0ID0gdDsKCQl9CgkJaWYgKCFiZykKCQkgICAgICAgIGdvdG8gZmFpbDsKCQlpZiAoIXJ1bm5pbmdfYmcpIHsKCQkJcHJldl9iZ19ob3N0ID0gYmJfeHN0cmR1cChob3N0bmFtZSk7CgkJCWlmIChyZXRyeSA+IDApCgkJCQlyZXR2YWwgPSBFWF9CRzsKCQkJZ290byBmYWlsOwoJCX0KCQl0ID0gdGltZShOVUxMKTsKCQlpZiAodCA+PSB0aW1lb3V0KQoJCQlnb3RvIGZhaWw7Cgl9CgluZnN2ZXJzID0gKHBtX21udC0+cG1fdmVycyA8IDIpID8gMiA6IHBtX21udC0+cG1fdmVyczsKCglpZiAobmZzdmVycyA9PSAyKSB7CgkJaWYgKHN0YXR1cy5uZnN2Mi5maHNfc3RhdHVzICE9IDApIHsKCQkJYmJfZXJyb3JfbXNnKCIlczolcyBmYWlsZWQsIHJlYXNvbiBnaXZlbiBieSBzZXJ2ZXI6ICVzIiwKCQkJCWhvc3RuYW1lLCBwYXRobmFtZSwKCQkJCW5mc19zdHJlcnJvcihzdGF0dXMubmZzdjIuZmhzX3N0YXR1cykpOwoJCQlnb3RvIGZhaWw7CgkJfQoJCW1lbWNweShkYXRhLnJvb3QuZGF0YSwKCQkgICAgICAgKGNoYXIgKikgc3RhdHVzLm5mc3YyLmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUsCgkJICAgICAgIE5GU19GSFNJWkUpOwojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNAoJCWRhdGEucm9vdC5zaXplID0gTkZTX0ZIU0laRTsKCQltZW1jcHkoZGF0YS5vbGRfcm9vdC5kYXRhLAoJCSAgICAgICAoY2hhciAqKSBzdGF0dXMubmZzdjIuZmhzdGF0dXNfdS5maHNfZmhhbmRsZSwKCQkgICAgICAgTkZTX0ZIU0laRSk7CiNlbmRpZgoJfSBlbHNlIHsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDQKCQlmaGFuZGxlMyAqbXlfZmhhbmRsZTsKCQlpZiAoc3RhdHVzLm5mc3YzLmZoc19zdGF0dXMgIT0gMCkgewoJCQliYl9lcnJvcl9tc2coIiVzOiVzIGZhaWxlZCwgcmVhc29uIGdpdmVuIGJ5IHNlcnZlcjogJXMiLAoJCQkJaG9zdG5hbWUsIHBhdGhuYW1lLAoJCQkJbmZzX3N0cmVycm9yKHN0YXR1cy5uZnN2My5maHNfc3RhdHVzKSk7CgkJCWdvdG8gZmFpbDsKCQl9CgkJbXlfZmhhbmRsZSA9ICZzdGF0dXMubmZzdjMubW91bnRyZXMzX3UubW91bnRpbmZvLmZoYW5kbGU7CgkJbWVtc2V0KGRhdGEub2xkX3Jvb3QuZGF0YSwgMCwgTkZTX0ZIU0laRSk7CgkJbWVtc2V0KCZkYXRhLnJvb3QsIDAsIHNpemVvZihkYXRhLnJvb3QpKTsKCQlkYXRhLnJvb3Quc2l6ZSA9IG15X2ZoYW5kbGUtPmZoYW5kbGUzX2xlbjsKCQltZW1jcHkoZGF0YS5yb290LmRhdGEsCgkJICAgICAgIChjaGFyICopIG15X2ZoYW5kbGUtPmZoYW5kbGUzX3ZhbCwKCQkgICAgICAgbXlfZmhhbmRsZS0+ZmhhbmRsZTNfbGVuKTsKCgkJZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsKI2VuZGlmCgl9CgoJLyogY3JlYXRlIG5mcyBzb2NrZXQgZm9yIGtlcm5lbCAqLwoKCWlmICh0Y3ApIHsKCQlpZiAobmZzX21vdW50X3ZlcnNpb24gPCAzKSB7CgkJCXByaW50ZihfKCJORlMgb3ZlciBUQ1AgaXMgbm90IHN1cHBvcnRlZC5cbiIpKTsKCQkJZ290byBmYWlsOwoJCX0KCQlmc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOwoJfSBlbHNlCgkJZnNvY2sgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOwoJaWYgKGZzb2NrIDwgMCkgewoJCXBlcnJvcihfKCJuZnMgc29ja2V0IikpOwoJCWdvdG8gZmFpbDsKCX0KCWlmIChiaW5kcmVzdnBvcnQoZnNvY2ssIDApIDwgMCkgewoJCXBlcnJvcihfKCJuZnMgYmluZHJlc3Zwb3J0IikpOwoJCWdvdG8gZmFpbDsKCX0KCWlmIChwb3J0ID09IDApIHsKCQlzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IFBNQVBQT1JUOwoJCXBvcnQgPSBwbWFwX2dldHBvcnQoJnNlcnZlcl9hZGRyLCBuZnNwcm9nLCBuZnN2ZXJzLAoJCQl0Y3AgPyBJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQKTsKCQlpZiAocG9ydCA9PSAwKQoJCQlwb3J0ID0gTkZTX1BPUlQ7CiNpZmRlZiBORlNfTU9VTlRfREVCVUcKCQllbHNlCgkJCXByaW50ZihfKCJ1c2VkIHBvcnRtYXBwZXIgdG8gZmluZCBORlMgcG9ydFxuIikpOwojZW5kaWYKCX0KI2lmZGVmIE5GU19NT1VOVF9ERUJVRwoJcHJpbnRmKF8oInVzaW5nIHBvcnQgJWQgZm9yIG5mcyBkZWFtb25cbiIpLCBwb3J0KTsKI2VuZGlmCglzZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwoJIC8qCgkgICogY29ubmVjdCgpIHRoZSBzb2NrZXQgZm9yIGtlcm5lbHMgMS4zLjEwIGFuZCBiZWxvdyBvbmx5LAoJICAqIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggbXVsdGlob21lZCBob3N0cy4KCSAgKiAtLVN3ZW4KCSAgKi8KCWlmIChnZXRfa2VybmVsX3JldmlzaW9uKCkgPD0gNjYzMTQKCSAgICAmJiBjb25uZWN0KGZzb2NrLCAoc3RydWN0IHNvY2thZGRyICopICZzZXJ2ZXJfYWRkciwKCQkgICAgICAgc2l6ZW9mIChzZXJ2ZXJfYWRkcikpIDwgMCkgewoJCXBlcnJvcihfKCJuZnMgY29ubmVjdCIpKTsKCQlnb3RvIGZhaWw7Cgl9CgoJLyogcHJlcGFyZSBkYXRhIHN0cnVjdHVyZSBmb3Iga2VybmVsICovCgoJZGF0YS5mZCA9IGZzb2NrOwoJbWVtY3B5KChjaGFyICopICZkYXRhLmFkZHIsIChjaGFyICopICZzZXJ2ZXJfYWRkciwgc2l6ZW9mKGRhdGEuYWRkcikpOwoJc3RybmNweShkYXRhLmhvc3RuYW1lLCBob3N0bmFtZSwgc2l6ZW9mKGRhdGEuaG9zdG5hbWUpKTsKCgkvKiBjbGVhbiB1cCAqLwoKCWF1dGhfZGVzdHJveShtY2xpZW50LT5jbF9hdXRoKTsKCWNsbnRfZGVzdHJveShtY2xpZW50KTsKCWNsb3NlKG1zb2NrKTsKY29weV9kYXRhX2FuZF9yZXR1cm46CgkqbW91bnRfb3B0cyA9IHhyZWFsbG9jKCptb3VudF9vcHRzLCBzaXplb2YoZGF0YSkpOwoJbWVtY3B5KCptb3VudF9vcHRzLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKCXJldHVybiAwOwoKCS8qIGFib3J0ICovCgpmYWlsOgoJaWYgKG1zb2NrICE9IC0xKSB7CgkJaWYgKG1jbGllbnQpIHsKCQkJYXV0aF9kZXN0cm95KG1jbGllbnQtPmNsX2F1dGgpOwoJCQljbG50X2Rlc3Ryb3kobWNsaWVudCk7CgkJfQoJCWNsb3NlKG1zb2NrKTsKCX0KCWlmIChmc29jayAhPSAtMSkKCQljbG9zZShmc29jayk7CglyZXR1cm4gcmV0dmFsOwp9CgovKgogKiBXZSBuZWVkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlcyBhbmQKICogdGhlIGxvY2FsIGVycm5vIHZhbHVlcyB3aGljaCBtYXkgbm90IGJlIHRoZSBzYW1lLgogKgogKiBBbmRyZWFzIFNjaHdhYiA8c2Nod2FiQExTNS5pbmZvcm1hdGlrLnVuaS1kb3J0bXVuZC5kZT46IGNoYW5nZSBlcnJubzoKICogImFmdGVyICNpbmNsdWRlIDxlcnJuby5oPiB0aGUgc3ltYm9sIGVycm5vIGlzIHJlc2VydmVkIGZvciBhbnkgdXNlLAogKiAgaXQgY2Fubm90IGV2ZW4gYmUgdXNlZCBhcyBhIHN0cnVjdCB0YWcgb3IgZmllbGQgbmFtZSIuCiAqLwoKI2lmbmRlZiBFRFFVT1QKI2RlZmluZSBFRFFVT1QJRU5PU1BDCiNlbmRpZgoKc3RhdGljIGNvbnN0IHN0cnVjdCB7CgllbnVtIG5mc19zdGF0IHN0YXQ7CglpbnQgZXJybnVtOwp9IG5mc19lcnJ0YmxbXSA9IHsKCXsgTkZTX09LLAkJMAkJfSwKCXsgTkZTRVJSX1BFUk0sCQlFUEVSTQkJfSwKCXsgTkZTRVJSX05PRU5ULAkJRU5PRU5UCQl9LAoJeyBORlNFUlJfSU8sCQlFSU8JCX0sCgl7IE5GU0VSUl9OWElPLAkJRU5YSU8JCX0sCgl7IE5GU0VSUl9BQ0NFUywJCUVBQ0NFUwkJfSwKCXsgTkZTRVJSX0VYSVNULAkJRUVYSVNUCQl9LAoJeyBORlNFUlJfTk9ERVYsCQlFTk9ERVYJCX0sCgl7IE5GU0VSUl9OT1RESVIsCUVOT1RESVIJCX0sCgl7IE5GU0VSUl9JU0RJUiwJCUVJU0RJUgkJfSwKI2lmZGVmIE5GU0VSUl9JTlZBTAoJeyBORlNFUlJfSU5WQUwsCQlFSU5WQUwJCX0sCS8qIHRoYXQgU3VuIGZvcmdvdCAqLwojZW5kaWYKCXsgTkZTRVJSX0ZCSUcsCQlFRkJJRwkJfSwKCXsgTkZTRVJSX05PU1BDLAkJRU5PU1BDCQl9LAoJeyBORlNFUlJfUk9GUywJCUVST0ZTCQl9LAoJeyBORlNFUlJfTkFNRVRPT0xPTkcsCUVOQU1FVE9PTE9ORwl9LAoJeyBORlNFUlJfTk9URU1QVFksCUVOT1RFTVBUWQl9LAoJeyBORlNFUlJfRFFVT1QsCQlFRFFVT1QJCX0sCgl7IE5GU0VSUl9TVEFMRSwJCUVTVEFMRQkJfSwKI2lmZGVmIEVXRkxVU0gKCXsgTkZTRVJSX1dGTFVTSCwJRVdGTFVTSAkJfSwKI2VuZGlmCgkvKiBUaHJvdyBpbiBzb21lIE5GU3YzIHZhbHVlcyBmb3IgZXZlbiBtb3JlIGZ1biAoSFAgcmV0dXJucyB0aGVzZSkgKi8KCXsgNzEsCQkJRVJFTU9URQkJfSwKCgl7IC0xLAkJCUVJTwkJfQp9OwoKc3RhdGljIGNoYXIgKm5mc19zdHJlcnJvcihpbnQgc3RhdHVzKQp7CglpbnQgaTsKCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOwoKCWZvciAoaSA9IDA7IG5mc19lcnJ0YmxbaV0uc3RhdCAhPSAtMTsgaSsrKSB7CgkJaWYgKG5mc19lcnJ0YmxbaV0uc3RhdCA9PSBzdGF0dXMpCgkJCXJldHVybiBzdHJlcnJvcihuZnNfZXJydGJsW2ldLmVycm51bSk7Cgl9CglzcHJpbnRmKGJ1ZiwgXygidW5rbm93biBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZTogJWQiKSwgc3RhdHVzKTsKCXJldHVybiBidWY7Cn0KCnN0YXRpYyBib29sX3QKeGRyX2ZoYW5kbGUgKFhEUiAqeGRycywgZmhhbmRsZSBvYmpwKQp7CgkgaWYgKCF4ZHJfb3BhcXVlICh4ZHJzLCBvYmpwLCBGSFNJWkUpKQoJCSByZXR1cm4gRkFMU0U7CglyZXR1cm4gVFJVRTsKfQoKYm9vbF90Cnhkcl9maHN0YXR1cyAoWERSICp4ZHJzLCBmaHN0YXR1cyAqb2JqcCkKewoJIGlmICgheGRyX3VfaW50ICh4ZHJzLCAmb2JqcC0+ZmhzX3N0YXR1cykpCgkJIHJldHVybiBGQUxTRTsKCXN3aXRjaCAob2JqcC0+ZmhzX3N0YXR1cykgewoJY2FzZSAwOgoJCSBpZiAoIXhkcl9maGFuZGxlICh4ZHJzLCBvYmpwLT5maHN0YXR1c191LmZoc19maGFuZGxlKSkKCQkJIHJldHVybiBGQUxTRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CglyZXR1cm4gVFJVRTsKfQoKYm9vbF90Cnhkcl9kaXJwYXRoIChYRFIgKnhkcnMsIGRpcnBhdGggKm9ianApCnsKCSBpZiAoIXhkcl9zdHJpbmcgKHhkcnMsIG9ianAsIE1OVFBBVEhMRU4pKQoJCSByZXR1cm4gRkFMU0U7CglyZXR1cm4gVFJVRTsKfQoKYm9vbF90Cnhkcl9maGFuZGxlMyAoWERSICp4ZHJzLCBmaGFuZGxlMyAqb2JqcCkKewoJIGlmICgheGRyX2J5dGVzICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+ZmhhbmRsZTNfdmFsLCAodW5zaWduZWQgaW50ICopICZvYmpwLT5maGFuZGxlM19sZW4sIEZIU0laRTMpKQoJCSByZXR1cm4gRkFMU0U7CglyZXR1cm4gVFJVRTsKfQoKYm9vbF90Cnhkcl9tb3VudHJlczNfb2sgKFhEUiAqeGRycywgbW91bnRyZXMzX29rICpvYmpwKQp7CgkgaWYgKCF4ZHJfZmhhbmRsZTMgKHhkcnMsICZvYmpwLT5maGFuZGxlKSkKCQkgcmV0dXJuIEZBTFNFOwoJIGlmICgheGRyX2FycmF5ICh4ZHJzLCAoY2hhciAqKikmb2JqcC0+YXV0aF9mbGF2b3Vycy5hdXRoX2ZsYXZvdXJzX3ZhbCwgKHVuc2lnbmVkIGludCAqKSAmb2JqcC0+YXV0aF9mbGF2b3Vycy5hdXRoX2ZsYXZvdXJzX2xlbiwgfjAsCgkJc2l6ZW9mIChpbnQpLCAoeGRycHJvY190KSB4ZHJfaW50KSkKCQkgcmV0dXJuIEZBTFNFOwoJcmV0dXJuIFRSVUU7Cn0KCmJvb2xfdAp4ZHJfbW91bnRzdGF0MyAoWERSICp4ZHJzLCBtb3VudHN0YXQzICpvYmpwKQp7CgkgaWYgKCF4ZHJfZW51bSAoeGRycywgKGVudW1fdCAqKSBvYmpwKSkKCQkgcmV0dXJuIEZBTFNFOwoJcmV0dXJuIFRSVUU7Cn0KCmJvb2xfdAp4ZHJfbW91bnRyZXMzIChYRFIgKnhkcnMsIG1vdW50cmVzMyAqb2JqcCkKewoJIGlmICgheGRyX21vdW50c3RhdDMgKHhkcnMsICZvYmpwLT5maHNfc3RhdHVzKSkKCQkgcmV0dXJuIEZBTFNFOwoJc3dpdGNoIChvYmpwLT5maHNfc3RhdHVzKSB7CgljYXNlIE1OVF9PSzoKCQkgaWYgKCF4ZHJfbW91bnRyZXMzX29rICh4ZHJzLCAmb2JqcC0+bW91bnRyZXMzX3UubW91bnRpbmZvKSkKCQkJIHJldHVybiBGQUxTRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CglyZXR1cm4gVFJVRTsKfQoK