LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fY29tbW9uLmMKICogVmVyc2lvbjogICAgICAgMC45CiAqIERlc2NyaXB0aW9uOiAgIElyREEgTEFOIEFjY2VzcyBQcm90b2NvbCBJbXBsZW1lbnRhdGlvbgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAzMSAyMDoxNDozNyAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMjYgMjE6NTM6MTAgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAogKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KCiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvZXJybm8uaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgojaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgoKI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcnR0cC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsbXAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS90aW1lci5oPgoKI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NvbW1vbi5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fY2xpZW50Lmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9wcm92aWRlci5oPiAKI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2V0aC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fZmlsdGVyLmg+CgoKLyogCiAqIFNlbmQgZ3JhdHVpdG91cyBBUlAgd2hlbiBjb25uZWN0ZWQgdG8gYSBuZXcgQVAgb3Igbm90LiBNYXkgYmUgYSBjbGV2ZXIKICogdGhpbmcgdG8gZG8sIGJ1dCBmb3Igc29tZSByZWFzb24gdGhlIG1hY2hpbmUgY3Jhc2hlcyBpZiB5b3UgdXNlIERIQ1AuIFNvCiAqIGxldHMgbm90IHVzZSBpdCBieSBkZWZhdWx0LgogKi8KI3VuZGVmIENPTkZJR19JUkxBTl9TRU5EX0dSQVRVSVRPVVNfQVJQCgovKiBleHRlcm4gY2hhciBzeXNjdGxfZGV2bmFtZVtdOyAqLwoKLyoKICogIE1hc3RlciBzdHJ1Y3R1cmUKICovCnN0YXRpYyBMSVNUX0hFQUQoaXJsYW5zKTsKCnN0YXRpYyB2b2lkICpja2V5OwpzdGF0aWMgdm9pZCAqc2tleTsKCi8qIE1vZHVsZSBwYXJhbWV0ZXJzICovCnN0YXRpYyBpbnQgZXRoOyAgIC8qIFVzZSAiZXRoIiBvciAiaXJsYW4iIG5hbWUgZm9yIGRldmljZXMgKi8Kc3RhdGljIGludCBhY2Nlc3MgPSBBQ0NFU1NfUEVFUjsgLyogUEVFUiwgRElSRUNUIG9yIEhPU1RFRCAqLwoKI2lmZGVmIENPTkZJR19QUk9DX0ZTCnN0YXRpYyBjb25zdCBjaGFyICppcmxhbl9hY2Nlc3NbXSA9IHsKCSJVTktOT1dOIiwKCSJESVJFQ1QiLAoJIlBFRVIiLAoJIkhPU1RFRCIKfTsKCnN0YXRpYyBjb25zdCBjaGFyICppcmxhbl9tZWRpYVtdID0gewoJIlVOS05PV04iLAoJIjgwMi4zIiwKCSI4MDIuNSIKfTsKCmV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXJkYTsKCnN0YXRpYyBpbnQgaXJsYW5fc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXJsYW5fZm9wcyA9IHsKCS5vd25lcgkgPSBUSElTX01PRFVMRSwKCS5vcGVuICAgID0gaXJsYW5fc2VxX29wZW4sCgkucmVhZCAgICA9IHNlcV9yZWFkLAoJLmxsc2VlayAgPSBzZXFfbHNlZWssCgkucmVsZWFzZSA9IHNlcV9yZWxlYXNlLAp9OwoKZXh0ZXJuIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19pcmRhOwojZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KCnN0YXRpYyBzdHJ1Y3QgaXJsYW5fY2IgKmlybGFuX29wZW4oX191MzIgc2FkZHIsIF9fdTMyIGRhZGRyKTsKc3RhdGljIHZvaWQgX19pcmxhbl9jbG9zZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOwpzdGF0aWMgaW50IF9faXJsYW5faW5zZXJ0X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBpbnQgdHlwZSwgCgkJCQlfX3U4IHZhbHVlX2J5dGUsIF9fdTE2IHZhbHVlX3Nob3J0LCAKCQkJCV9fdTggKnZhbHVlX2FycmF5LCBfX3UxNiB2YWx1ZV9sZW4pOwpzdGF0aWMgdm9pZCBpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOwpzdGF0aWMgdm9pZCBpcmxhbl9nZXRfdW5pY2FzdF9hZGRyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CnZvaWQgaXJsYW5fY2xvc2VfdHNhcHMoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2luaXQgKHZvaWQpCiAqCiAqICAgIEluaXRpYWxpemUgSXJMQU4gbGF5ZXIKICoKICovCnN0YXRpYyBpbnQgX19pbml0IGlybGFuX2luaXQodm9pZCkKewoJc3RydWN0IGlybGFuX2NiICpuZXc7CglfX3UxNiBoaW50czsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCiNpZmRlZiBDT05GSUdfUFJPQ19GUwoJeyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7Cglwcm9jID0gY3JlYXRlX3Byb2NfZW50cnkoImlybGFuIiwgMCwgcHJvY19pcmRhKTsKCWlmICghcHJvYykgewoJCXByaW50ayhLRVJOX0VSUiAiaXJsYW5faW5pdDogY2FuJ3QgY3JlYXRlIC9wcm9jIGVudHJ5IVxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcHJvYy0+cHJvY19mb3BzID0gJmlybGFuX2ZvcHM7Cgl9CiNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJaGludHMgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19MQU4pOwoKCS8qIFJlZ2lzdGVyIHdpdGggSXJMTVAgYXMgYSBjbGllbnQgKi8KCWNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9jbGllbnQoaGludHMsICZpcmxhbl9jbGllbnRfZGlzY292ZXJ5X2luZGljYXRpb24sCgkJCQkgICAgIE5VTEwsIE5VTEwpOwoJCgkvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgc2VydmljZSAqLwogCXNrZXkgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKCgkvKiBTdGFydCB0aGUgbWFzdGVyIElyTEFOIGluc3RhbmNlICh0aGUgb25seSBvbmUgZm9yIG5vdykgKi8KIAluZXcgPSBpcmxhbl9vcGVuKERFVl9BRERSX0FOWSwgREVWX0FERFJfQU5ZKTsKCgkvKiBUaGUgbWFzdGVyIHdpbGwgb25seSBvcGVuIGl0cyAobGlzdGVuKSBjb250cm9sIFRTQVAgKi8KCWlybGFuX3Byb3ZpZGVyX29wZW5fY3RybF90c2FwKG5ldyk7CgoJLyogRG8gc29tZSBmYXN0IGRpc2NvdmVyeSEgKi8KCWlybG1wX2Rpc2NvdmVyeV9yZXF1ZXN0KERJU0NPVkVSWV9ERUZBVUxUX1NMT1RTKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX19leGl0IGlybGFuX2NsZWFudXAodm9pZCkgCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgKm5leHQ7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJaXJsbXBfdW5yZWdpc3Rlcl9jbGllbnQoY2tleSk7CglpcmxtcF91bnJlZ2lzdGVyX3NlcnZpY2Uoc2tleSk7CgojaWZkZWYgQ09ORklHX1BST0NfRlMKCXJlbW92ZV9wcm9jX2VudHJ5KCJpcmxhbiIsIHByb2NfaXJkYSk7CiNlbmRpZiAvKiBDT05GSUdfUFJPQ19GUyAqLwoKCS8qIENsZWFudXAgYW55IGxlZnRvdmVyIG5ldHdvcmsgZGV2aWNlcyAqLwoJcnRubF9sb2NrKCk7CglsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2VsZiwgbmV4dCwgJmlybGFucywgZGV2X2xpc3QpIHsKCQlfX2lybGFuX2Nsb3NlKHNlbGYpOwoJfQoJcnRubF91bmxvY2soKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fb3BlbiAodm9pZCkKICoKICogICAgT3BlbiBuZXcgaW5zdGFuY2Ugb2YgYSBjbGllbnQvcHJvdmlkZXIsIHdlIHNob3VsZCBvbmx5IHJlZ2lzdGVyIHRoZSAKICogICAgbmV0d29yayBkZXZpY2UgaWYgdGhpcyBpbnN0YW5jZSBpcyBtZW50IGZvciBhIHBhcnRpY3VsYXIgY2xpZW50L3Byb3ZpZGVyCiAqLwpzdGF0aWMgc3RydWN0IGlybGFuX2NiICppcmxhbl9vcGVuKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkcikKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCgkvKiBDcmVhdGUgbmV0d29yayBkZXZpY2Ugd2l0aCBpcmxhbiAqLwoJZGV2ID0gYWxsb2NfaXJsYW5kZXYoZXRoID8gImV0aCVkIiA6ICJpcmxhbiVkIik7CglpZiAoIWRldikKCQlyZXR1cm4gTlVMTDsKCglzZWxmID0gZGV2LT5wcml2OwoJc2VsZi0+ZGV2ID0gZGV2OwoKCS8qCgkgKiAgSW5pdGlhbGl6ZSBsb2NhbCBkZXZpY2Ugc3RydWN0dXJlCgkgKi8KCXNlbGYtPm1hZ2ljID0gSVJMQU5fTUFHSUM7CglzZWxmLT5zYWRkciA9IHNhZGRyOwoJc2VsZi0+ZGFkZHIgPSBkYWRkcjsKCgkvKiBQcm92aWRlciBhY2Nlc3MgY2FuIG9ubHkgYmUgUEVFUiwgRElSRUNULCBvciBIT1NURUQgKi8KCXNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID0gYWNjZXNzOwoJaWYgKGFjY2VzcyA9PSBBQ0NFU1NfRElSRUNUKSB7CgkJLyogIAoJCSAqIFNpbmNlIHdlIGFyZSBlbXVsYXRpbmcgYW4gSXJMQU4gc2V2ZXIgd2Ugd2lsbCBoYXZlIHRvCgkJICogZ2l2ZSBvdXJzZWxmIGFuIGV0aGVybmV0IGFkZHJlc3MhICAKCQkgKi8KCQlkZXYtPmRldl9hZGRyWzBdID0gMHg0MDsKCQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMDsKCQlkZXYtPmRldl9hZGRyWzJdID0gMHgwMDsKCQlkZXYtPmRldl9hZGRyWzNdID0gMHgwMDsKCQlnZXRfcmFuZG9tX2J5dGVzKGRldi0+ZGV2X2FkZHIrNCwgMSk7CgkJZ2V0X3JhbmRvbV9ieXRlcyhkZXYtPmRldl9hZGRyKzUsIDEpOwoJfQoKCXNlbGYtPm1lZGlhID0gTUVESUFfODAyXzM7CglzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IExNX1VTRVJfUkVRVUVTVDsKCWluaXRfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCWluaXRfdGltZXIoJnNlbGYtPmNsaWVudC5raWNrX3RpbWVyKTsKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlbGYtPm9wZW5fd2FpdCk7CQoJCglza2JfcXVldWVfaGVhZF9pbml0KCZzZWxmLT5jbGllbnQudHhxKTsKCQoJaXJsYW5fbmV4dF9jbGllbnRfc3RhdGUoc2VsZiwgSVJMQU5fSURMRSk7Cglpcmxhbl9uZXh0X3Byb3ZpZGVyX3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoKCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIHJlZ2lzdGVyX25ldGRldigpIGZhaWxlZCFcbiIsIAoJCQkgICBfX0ZVTkNUSU9OX18gKTsKCQlzZWxmID0gTlVMTDsKCQlmcmVlX25ldGRldihkZXYpOwoJfSBlbHNlIHsKCQlydG5sX2xvY2soKTsKCQlsaXN0X2FkZF9yY3UoJnNlbGYtPmRldl9saXN0LCAmaXJsYW5zKTsKCQlydG5sX3VubG9jaygpOwoJfQoKCXJldHVybiBzZWxmOwp9Ci8qCiAqIEZ1bmN0aW9uIF9faXJsYW5fY2xvc2UgKHNlbGYpCiAqCiAqICAgIFRoaXMgZnVuY3Rpb24gY2xvc2VzIGFuZCBkZWFsbG9jYXRlcyB0aGUgSXJMQU4gY2xpZW50IGluc3RhbmNlcy4gQmUgCiAqICAgIGF3YXJlIHRoYXQgb3RoZXIgZnVuY3Rpb25zIHdoaWNoIGNhbGxzIGNsaWVudF9jbG9zZSgpIG11c3QKICogICAgcmVtb3ZlIHNlbGYgZnJvbSBpcmxhbnMgbGlzdCBmaXJzdC4KICovCnN0YXRpYyB2b2lkIF9faXJsYW5fY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQoJQVNTRVJUX1JUTkwoKTsKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJZGVsX3RpbWVyX3N5bmMoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCWRlbF90aW1lcl9zeW5jKCZzZWxmLT5jbGllbnQua2lja190aW1lcik7CgoJLyogQ2xvc2UgYWxsIG9wZW4gY29ubmVjdGlvbnMgYW5kIHJlbW92ZSBUU0FQcyAqLwoJaXJsYW5fY2xvc2VfdHNhcHMoc2VsZik7CgkKCWlmIChzZWxmLT5jbGllbnQuaXJpYXApIAoJCWlyaWFwX2Nsb3NlKHNlbGYtPmNsaWVudC5pcmlhcCk7CgoJLyogUmVtb3ZlIGZyYW1lcyBxdWV1ZWQgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCAqLwoJc2tiX3F1ZXVlX3B1cmdlKCZzZWxmLT5jbGllbnQudHhxKTsKCgkvKiBVbnJlZ2lzdGVyIGFuZCBmcmVlIHNlbGYgdmlhIGRlc3RydWN0b3IgKi8KCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHNlbGYtPmRldik7Cn0KCi8qIEZpbmQgYW55IGluc3RhbmNlIG9mIGlybGFuLCB1c2VkIGZvciBjbGllbnQgZGlzY292ZXJ5IHdha2V1cCAqLwpzdHJ1Y3QgaXJsYW5fY2IgKmlybGFuX2dldF9hbnkodm9pZCkKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoKCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHNlbGYsICZpcmxhbnMsIGRldl9saXN0KSB7CgkJcmV0dXJuIHNlbGY7Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY29ubmVjdF9pbmRpY2F0aW9uIChpbnN0YW5jZSwgc2FwLCBxb3MsIG1heF9zZHVfc2l6ZSwgc2tiKQogKgogKiAgICBIZXJlIHdlIHJlY2VpdmUgdGhlIGNvbm5lY3QgaW5kaWNhdGlvbiBmb3IgdGhlIGRhdGEgY2hhbm5lbAogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCgkJCQkgICAgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAoJCQkJICAgICBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLCAKCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJc3RydWN0IHRzYXBfY2IgKnRzYXA7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoJdHNhcCA9IChzdHJ1Y3QgdHNhcF9jYiAqKSBzYXA7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh0c2FwID09IHNlbGYtPnRzYXBfZGF0YSxyZXR1cm47KTsKCglzZWxmLT5tYXhfc2R1X3NpemUgPSBtYXhfc2R1X3NpemU7CglzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CgoJSVJEQV9ERUJVRygwLCAiJXM6IFdlIGFyZSBub3cgY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkvKiBJZiB5b3Ugd2FudCB0byBwYXNzIHRoZSBza2IgdG8gKmJvdGgqIHN0YXRlIG1hY2hpbmVzLCB5b3Ugd2lsbAoJICogbmVlZCB0byBza2JfY2xvbmUoKSBpdCwgc28gdGhhdCB5b3UgZG9uJ3QgZnJlZSBpdCB0d2ljZS4KCSAqIEFzIHRoZSBzdGF0ZSBtYWNoaW5lcyBkb24ndCBuZWVkIGl0LCBnaXQgcmlkIG9mIGl0IGhlcmUuLi4KCSAqIEplYW4gSUkgKi8KCWlmIChza2IpCgkJZGV2X2tmcmVlX3NrYihza2IpOwoKCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0RBVEFfQ09OTkVDVF9JTkRJQ0FUSU9OLCBOVUxMKTsKCWlybGFuX2RvX2NsaWVudF9ldmVudChzZWxmLCBJUkxBTl9EQVRBX0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7CgoJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKSB7CgkJLyogCgkJICogRGF0YSBjaGFubmVsIGlzIG9wZW4sIHNvIHdlIGFyZSBub3cgYWxsb3dlZCB0bwoJCSAqIGNvbmZpZ3VyZSB0aGUgcmVtb3RlIGZpbHRlciAKCQkgKi8KCQlpcmxhbl9nZXRfdW5pY2FzdF9hZGRyKHNlbGYpOwoJCWlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHNlbGYpOwoJfQoJLyogUmVhZHkgdG8gdHJhbnNmZXIgRXRoZXJuZXQgZnJhbWVzIChhdCBsYXN0KSAqLwoJbmV0aWZfc3RhcnRfcXVldWUoc2VsZi0+ZGV2KTsgLyogQ2xlYXIgcmVhc29uICovCn0KCnN0YXRpYyB2b2lkIGlybGFuX2Nvbm5lY3RfY29uZmlybSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgCgkJCQkgIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJCSAgX191OCBtYXhfaGVhZGVyX3NpemUsIAoJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSAKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoKCXNlbGYgPSAoc3RydWN0IGlybGFuX2NiICopIGluc3RhbmNlOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJc2VsZi0+bWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOwoJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOwoKCS8qIFRPRE86IHdlIGNvdWxkIHNldCB0aGUgTVRVIGRlcGVuZGluZyBvbiB0aGUgbWF4X3NkdV9zaXplICovCgoJSVJEQV9ERUJVRygwLCAiJXM6IFdlIGFyZSBub3cgY29ubmVjdGVkIVxuIiwgX19GVU5DVElPTl9fKTsKCWRlbF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOwoKCS8qIAoJICogRGF0YSBjaGFubmVsIGlzIG9wZW4sIHNvIHdlIGFyZSBub3cgYWxsb3dlZCB0byBjb25maWd1cmUgdGhlIHJlbW90ZQoJICogZmlsdGVyIAoJICovCglpcmxhbl9nZXRfdW5pY2FzdF9hZGRyKHNlbGYpOwoJaXJsYW5fb3Blbl91bmljYXN0X2FkZHIoc2VsZik7CgkKCS8qIE9wZW4gYnJvYWRjYXN0IGFuZCBtdWx0aWNhc3QgZmlsdGVyIGJ5IGRlZmF1bHQgKi8KIAlpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzZWxmLCBUUlVFKTsKIAlpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlcihzZWxmLCBUUlVFKTsKCgkvKiBSZWFkeSB0byB0cmFuc2ZlciBFdGhlcm5ldCBmcmFtZXMgKi8KCW5ldGlmX3N0YXJ0X3F1ZXVlKHNlbGYtPmRldik7CglzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IDA7IC8qIENsZWFyIHJlYXNvbiAqLwojaWZkZWYgQ09ORklHX0lSTEFOX1NFTkRfR1JBVFVJVE9VU19BUlAKCWlybGFuX2V0aF9zZW5kX2dyYXR1aXRvdXNfYXJwKCZzZWxmLT5kZXYpOwojZW5kaWYKCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc2VsZi0+b3Blbl93YWl0KTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY2xpZW50X2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlKQogKgogKiAgICBDYWxsYmFjayBmdW5jdGlvbiBmb3IgdGhlIElyVFRQIGxheWVyLiBJbmRpY2F0ZXMgYSBkaXNjb25uZWN0aW9uIG9mCiAqICAgIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiAoaGFuZGxlKQogKi8Kc3RhdGljIHZvaWQgaXJsYW5fZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLAoJCQkJCXZvaWQgKnNhcCwgTE1fUkVBU09OIHJlYXNvbiwgCgkJCQkJc3RydWN0IHNrX2J1ZmYgKnVzZXJkYXRhKSAKewoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoJc3RydWN0IHRzYXBfY2IgKnRzYXA7CgoJSVJEQV9ERUJVRygwLCAiJXMoKSwgcmVhc29uPSVkXG4iLCBfX0ZVTkNUSU9OX18gLCByZWFzb24pOwoJCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQoJSVJEQV9BU1NFUlQodHNhcCAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHRzYXAtPm1hZ2ljID09IFRUUF9UU0FQX01BR0lDLCByZXR1cm47KTsKCQoJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT50c2FwX2RhdGEsIHJldHVybjspOwoKCUlSREFfREVCVUcoMiwgIklyTEFOLCBkYXRhIGNoYW5uZWwgZGlzY29ubmVjdGVkIGJ5IHBlZXIhXG4iKTsKCgkvKiBTYXZlIHJlYXNvbiBzbyB3ZSBrbm93IGlmIHdlIHNob3VsZCB0cnkgdG8gcmVjb25uZWN0IG9yIG5vdCAqLwoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSByZWFzb247CgkKCXN3aXRjaCAocmVhc29uKSB7CgljYXNlIExNX1VTRVJfUkVRVUVTVDogLyogVXNlciByZXF1ZXN0ICovCgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVXNlciByZXF1ZXN0ZWRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfRElTQ09OTkVDVDogLyogVW5leHBlY3RlZCBJckxBUCBkaXNjb25uZWN0ICovCgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgVW5leHBlY3RlZCBJckxBUCBkaXNjb25uZWN0XG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWNhc2UgTE1fQ09OTkVDVF9GQUlMVVJFOiAvKiBGYWlsZWQgdG8gZXN0YWJsaXNoIElyTEFQIGNvbm5lY3Rpb24gKi8KCQlJUkRBX0RFQlVHKDIsICIlcygpLCBJckxBUCBjb25uZWN0IGZhaWxlZFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CgljYXNlIExNX0xBUF9SRVNFVDogIC8qIElyTEFQIHJlc2V0ICovCgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMQVAgcmVzZXRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJY2FzZSBMTV9JTklUX0RJU0NPTk5FQ1Q6CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMTVAgY29ubmVjdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0VSUk9SKCIlcygpLCBVbmtub3duIGRpc2Nvbm5lY3QgcmVhc29uXG4iLCBfX0ZVTkNUSU9OX18pOwoJCWJyZWFrOwoJfQoJCgkvKiBJZiB5b3Ugd2FudCB0byBwYXNzIHRoZSBza2IgdG8gKmJvdGgqIHN0YXRlIG1hY2hpbmVzLCB5b3Ugd2lsbAoJICogbmVlZCB0byBza2JfY2xvbmUoKSBpdCwgc28gdGhhdCB5b3UgZG9uJ3QgZnJlZSBpdCB0d2ljZS4KCSAqIEFzIHRoZSBzdGF0ZSBtYWNoaW5lcyBkb24ndCBuZWVkIGl0LCBnaXQgcmlkIG9mIGl0IGhlcmUuLi4KCSAqIEplYW4gSUkgKi8KCWlmICh1c2VyZGF0YSkKCQlkZXZfa2ZyZWVfc2tiKHVzZXJkYXRhKTsKCglpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOwoJaXJsYW5fZG9fcHJvdmlkZXJfZXZlbnQoc2VsZiwgSVJMQU5fTE1QX0RJU0NPTk5FQ1QsIE5VTEwpOwoJCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7Cn0KCnZvaWQgaXJsYW5fb3Blbl9kYXRhX3RzYXAoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3QgdHNhcF9jYiAqdHNhcDsKCW5vdGlmeV90IG5vdGlmeTsKCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCS8qIENoZWNrIGlmIGFscmVhZHkgb3BlbiAqLwoJaWYgKHNlbGYtPnRzYXBfZGF0YSkKCQlyZXR1cm47CgoJaXJkYV9ub3RpZnlfaW5pdCgmbm90aWZ5KTsKCQoJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlybGFuX2V0aF9yZWNlaXZlOwoJbm90aWZ5LnVkYXRhX2luZGljYXRpb24gICAgICA9IGlybGFuX2V0aF9yZWNlaXZlOwoJbm90aWZ5LmNvbm5lY3RfaW5kaWNhdGlvbiAgICA9IGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5jb25uZWN0X2NvbmZpcm0gICAgICAgPSBpcmxhbl9jb25uZWN0X2NvbmZpcm07CiAJbm90aWZ5LmZsb3dfaW5kaWNhdGlvbiAgICAgICA9IGlybGFuX2V0aF9mbG93X2luZGljYXRpb247Cglub3RpZnkuZGlzY29ubmVjdF9pbmRpY2F0aW9uID0gaXJsYW5fZGlzY29ubmVjdF9pbmRpY2F0aW9uOwoJbm90aWZ5Lmluc3RhbmNlICAgICAgICAgICAgICA9IHNlbGY7CglzdHJsY3B5KG5vdGlmeS5uYW1lLCAiSXJMQU4gZGF0YSIsIHNpemVvZihub3RpZnkubmFtZSkpOwoKCXRzYXAgPSBpcnR0cF9vcGVuX3RzYXAoTFNBUF9BTlksIERFRkFVTFRfSU5JVElBTF9DUkVESVQsICZub3RpZnkpOwoJaWYgKCF0c2FwKSB7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgR290IG5vIHRzYXAhXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlyZXR1cm47Cgl9CglzZWxmLT50c2FwX2RhdGEgPSB0c2FwOwoKCS8qIAoJICogIFRoaXMgaXMgdGhlIGRhdGEgVFNBUCBzZWxlY3RvciB3aGljaCB3ZSB3aWxsIHBhc3MgdG8gdGhlIGNsaWVudAoJICogIHdoZW4gdGhlIGNsaWVudCBhc2sgZm9yIGl0LgoJICovCglzZWxmLT5zdHNhcF9zZWxfZGF0YSA9IHNlbGYtPnRzYXBfZGF0YS0+c3RzYXBfc2VsOwp9Cgp2b2lkIGlybGFuX2Nsb3NlX3RzYXBzKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBEaXNjb25uZWN0IGFuZCBjbG9zZSBhbGwgb3BlbiBUU0FQIGNvbm5lY3Rpb25zICovCglpZiAoc2VsZi0+dHNhcF9kYXRhKSB7CgkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPnRzYXBfZGF0YSwgTlVMTCwgUF9OT1JNQUwpOwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+dHNhcF9kYXRhKTsKCQlzZWxmLT50c2FwX2RhdGEgPSBOVUxMOwoJfQoJaWYgKHNlbGYtPmNsaWVudC50c2FwX2N0cmwpIHsKCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgTlVMTCwgCgkJCQkJIFBfTk9STUFMKTsKCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPmNsaWVudC50c2FwX2N0cmwpOwoJCXNlbGYtPmNsaWVudC50c2FwX2N0cmwgPSBOVUxMOwoJfQoJaWYgKHNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCkgewoJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwsIE5VTEwsIAoJCQkJCSBQX05PUk1BTCk7CgkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwpOwoJCXNlbGYtPnByb3ZpZGVyLnRzYXBfY3RybCA9IE5VTEw7Cgl9CglzZWxmLT5kaXNjb25uZWN0X3JlYXNvbiA9IExNX1VTRVJfUkVRVUVTVDsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5faWFzX3JlZ2lzdGVyIChzZWxmLCB0c2FwX3NlbCkKICoKICogICAgUmVnaXN0ZXIgd2l0aCBMTS1JQVMKICoKICovCnZvaWQgaXJsYW5faWFzX3JlZ2lzdGVyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgX191OCB0c2FwX3NlbCkKewoJc3RydWN0IGlhc19vYmplY3QgKm9iajsKCXN0cnVjdCBpYXNfdmFsdWUgKm5ld192YWx1ZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoJCgkvKiAKCSAqIENoZWNrIGlmIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgYnkgYSBwcmV2aW91cyBwcm92aWRlci4KCSAqIElmIHRoYXQgaXMgdGhlIGNhc2UsIHdlIGp1c3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCgkgKi8KCWlmICghaXJpYXNfZmluZF9vYmplY3QoIklyTEFOIikpIHsKCQlvYmogPSBpcmlhc19uZXdfb2JqZWN0KCJJckxBTiIsIElBU19JUkxBTl9JRCk7CgkJaXJpYXNfYWRkX2ludGVnZXJfYXR0cmliKG9iaiwgIklyREE6VGlueVRQOkxzYXBTZWwiLCB0c2FwX3NlbCwKCQkJCQkgSUFTX0tFUk5FTF9BVFRSKTsKCQlpcmlhc19pbnNlcnRfb2JqZWN0KG9iaik7Cgl9IGVsc2UgewoJCW5ld192YWx1ZSA9IGlyaWFzX25ld19pbnRlZ2VyX3ZhbHVlKHRzYXBfc2VsKTsKCQlpcmlhc19vYmplY3RfY2hhbmdlX2F0dHJpYnV0ZSgiSXJMQU4iLCAiSXJEQTpUaW55VFA6THNhcFNlbCIsCgkJCQkJICAgICAgbmV3X3ZhbHVlKTsKCX0KCQogICAgICAgIC8qIFJlZ2lzdGVyIFBuUCBvYmplY3Qgb25seSBpZiBub3QgcmVnaXN0ZXJlZCBiZWZvcmUgKi8KICAgICAgICBpZiAoIWlyaWFzX2ZpbmRfb2JqZWN0KCJQblAiKSkgewoJCW9iaiA9IGlyaWFzX25ld19vYmplY3QoIlBuUCIsIElBU19QTlBfSUQpOwojaWYgMAoJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIk5hbWUiLCBzeXNjdGxfZGV2bmFtZSwKCQkJCQlJQVNfS0VSTkVMX0FUVFIpOwojZWxzZQoJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIk5hbWUiLCAiTGludXgiLCBJQVNfS0VSTkVMX0FUVFIpOwojZW5kaWYKCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJEZXZpY2VJRCIsICJIV1AxOUYwIiwKCQkJCQlJQVNfS0VSTkVMX0FUVFIpOwoJCWlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihvYmosICJDb21wQ250IiwgMSwgSUFTX0tFUk5FTF9BVFRSKTsKCQlpZiAoc2VsZi0+cHJvdmlkZXIuYWNjZXNzX3R5cGUgPT0gQUNDRVNTX1BFRVIpCgkJCWlyaWFzX2FkZF9zdHJpbmdfYXR0cmliKG9iaiwgIkNvbXAjMDEiLCAiUE5QODM4OSIsCgkJCQkJCUlBU19LRVJORUxfQVRUUik7CgkJZWxzZQoJCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJDb21wIzAxIiwgIlBOUDgyOTQiLAoJCQkJCQlJQVNfS0VSTkVMX0FUVFIpOwoKCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJNYW51ZmFjdHVyZXIiLAoJCQkJCSJMaW51eC1JckRBIFByb2plY3QiLCBJQVNfS0VSTkVMX0FUVFIpOwoJCWlyaWFzX2luc2VydF9vYmplY3Qob2JqKTsKCX0KfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fcnVuX2N0cmxfdHhfcXVldWUgKHNlbGYpCiAqCiAqICAgIFRyeSB0byBzZW5kIHRoZSBuZXh0IGNvbW1hbmQgaW4gdGhlIGNvbnRyb2wgdHJhbnNtaXQgcXVldWUKICoKICovCmludCBpcmxhbl9ydW5fY3RybF90eF9xdWV1ZShzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICpza2I7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJaWYgKGlyZGFfbG9jaygmc2VsZi0+Y2xpZW50LnR4X2J1c3kpID09IEZBTFNFKQoJCXJldHVybiAtRUJVU1k7CgoJc2tiID0gc2tiX2RlcXVldWUoJnNlbGYtPmNsaWVudC50eHEpOwoJaWYgKCFza2IpIHsKCQlzZWxmLT5jbGllbnQudHhfYnVzeSA9IEZBTFNFOwoJCXJldHVybiAwOwoJfQoJCgkvKiBDaGVjayB0aGF0IGl0J3MgcmVhbGx5IHBvc3NpYmxlIHRvIHNlbmQgY29tbWFuZHMgKi8KCWlmICgoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9PSBOVUxMKSB8fCAKCSAgICAoc2VsZi0+Y2xpZW50LnN0YXRlID09IElSTEFOX0lETEUpKSAKCXsKCQlzZWxmLT5jbGllbnQudHhfYnVzeSA9IEZBTFNFOwoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCQlyZXR1cm4gLTE7Cgl9CglJUkRBX0RFQlVHKDIsICIlcygpLCBzZW5kaW5nIC4uLlxuIiwgX19GVU5DVElPTl9fICk7CgoJcmV0dXJuIGlydHRwX2RhdGFfcmVxdWVzdChzZWxmLT5jbGllbnQudHNhcF9jdHJsLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdCAoc2VsZiwgc2tiKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIG1ha2VzIHN1cmUgdGhhdCBjb21tYW5kcyBvbiB0aGUgY29udHJvbCBjaGFubmVsIGlzIGJlaW5nCiAqICAgIHNlbnQgaW4gYSBjb21tYW5kL3Jlc3BvbnNlIGZhc2hpb24KICovCnN0YXRpYyB2b2lkIGlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKewoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJLyogUXVldWUgY29tbWFuZCAqLwoJc2tiX3F1ZXVlX3RhaWwoJnNlbGYtPmNsaWVudC50eHEsIHNrYik7CgoJLyogVHJ5IHRvIHNlbmQgY29tbWFuZCAqLwoJaXJsYW5fcnVuX2N0cmxfdHhfcXVldWUoc2VsZik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2dldF9wcm92aWRlcl9pbmZvIChzZWxmKQogKgogKiAgICBTZW5kIEdldCBQcm92aWRlciBJbmZvcm1hdGlvbiBjb21tYW5kIHRvIHBlZXIgSXJMQU4gbGF5ZXIKICoKICovCnZvaWQgaXJsYW5fZ2V0X3Byb3ZpZGVyX2luZm8oc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQogCWZyYW1lWzBdID0gQ01EX0dFVF9QUk9WSURFUl9JTkZPOwoJZnJhbWVbMV0gPSAweDAwOyAgICAgICAgICAgICAgICAgLyogWmVybyBwYXJhbWV0ZXJzICovCgkKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX29wZW5fZGF0YV9jaGFubmVsIChzZWxmKQogKgogKiAgICBTZW5kIGFuIE9wZW4gRGF0YSBDb21tYW5kIHRvIHByb3ZpZGVyCiAqCiAqLwp2b2lkIGlybGFuX29wZW5fZGF0YV9jaGFubmVsKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikgCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCQoJc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKCS8qIEJ1aWxkIGZyYW1lICovCiAJZnJhbWVbMF0gPSBDTURfT1BFTl9EQVRBX0NIQU5ORUw7CglmcmFtZVsxXSA9IDB4MDI7IC8qIFR3byBwYXJhbWV0ZXJzICovCgoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJNRURJQSIsICI4MDIuMyIpOwoJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJBQ0NFU1NfVFlQRSIsICJESVJFQ1QiKTsKCS8qIGlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTU9ERSIsICJVTlJFTElBQkxFIik7ICovCgovKiAJc2VsZi0+dXNlX3VkYXRhID0gVFJVRTsgKi8KCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9Cgp2b2lkIGlybGFuX2Nsb3NlX2RhdGFfY2hhbm5lbChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpIAp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJLyogQ2hlY2sgaWYgdGhlIFRTQVAgaXMgc3RpbGwgdGhlcmUgKi8KCWlmIChzZWxmLT5jbGllbnQudHNhcF9jdHJsID09IE5VTEwpCgkJcmV0dXJuOwoKCXNrYiA9IGRldl9hbGxvY19za2IoNjQpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCgkvKiBCdWlsZCBmcmFtZSAqLwogCWZyYW1lWzBdID0gQ01EX0NMT1NFX0RBVEFfQ0hBTjsKCWZyYW1lWzFdID0gMHgwMTsgLyogVHdvIHBhcmFtZXRlcnMgKi8KCglpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CgoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fb3Blbl91bmljYXN0X2FkZHIgKHNlbGYpCiAqCiAqICAgIE1ha2UgSXJMQU4gcHJvdmlkZXIgYWNjZXB0IGV0aGVybmV0IGZyYW1lcyBhZGRyZXNzZWQgdG8gdGhlIHVuaWNhc3QgCiAqICAgIGFkZHJlc3MuCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsJCgkKCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKCWlmICghc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwogCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIgLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CiAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpOwogCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiRklMVEVSIik7IAoJCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlciAoc2VsZiwgc3RhdHVzKQogKgogKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSBicm9hZGNhc3QKICogICAgYWRkcmVzcy4gQmUgY2FyZWZ1bCB3aXRoIHRoZSB1c2Ugb2YgdGhpcyBvbmUsIHNpbmNlIHRoZXJlIG1heSBiZSBhIGxvdAogKiAgICBvZiBicm9hZGNhc3QgdHJhZmZpYyBvdXQgdGhlcmUuIFdlIGNhbiBzdGlsbCBmdW5jdGlvbiB3aXRob3V0IHRoaXMKICogICAgb25lIGJ1dCB0aGVuIF93ZV8gaGF2ZSB0byBpbml0aWF0ZSBhbGwgY29tbXVuaWNhdGlvbiB3aXRoIG90aGVyCiAqICAgIGhvc3RzLCBzaW5jZSBBUlAgcmVxdWVzdCBmb3IgdGhpcyBob3N0IHdpbGwgbm90IGJlIGFuc3dlcmVkLgogKi8Kdm9pZCBpcmxhbl9zZXRfYnJvYWRjYXN0X2ZpbHRlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCBzdGF0dXMpIAp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgkKIAlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQogCWZyYW1lWzBdID0gQ01EX0ZJTFRFUl9PUEVSQVRJT047CglmcmFtZVsxXSA9IDB4MDM7ICAgICAgICAgICAgICAgICAvKiBUaHJlZSBwYXJhbWV0ZXJzICovCiAJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwogCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiQlJPQURDQVNUIik7CglpZiAoc3RhdHVzKQoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiRklMVEVSIik7IAoJZWxzZQoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOyAKCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlciAoc2VsZiwgc3RhdHVzKQogKgogKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSBtdWx0aWNhc3QKICogICAgYWRkcmVzcy4gCiAqCiAqLwp2b2lkIGlybGFuX3NldF9tdWx0aWNhc3RfZmlsdGVyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZiwgaW50IHN0YXR1cykgCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCiAJc2tiID0gZGV2X2FsbG9jX3NrYigxMjgpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoJCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCiAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KIAlpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CiAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJNVUxUSUNBU1QiKTsKCWlmIChzdGF0dXMpCgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJBTEwiKTsgCgllbHNlCgkJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfTU9ERSIsICJOT05FIik7IAoKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2dldF91bmljYXN0X2FkZHIgKHNlbGYpCiAqCiAqICAgIFJldHJpZXZlcyB0aGUgdW5pY2FzdCBhZGRyZXNzIGZyb20gdGhlIElyTEFOIHByb3ZpZGVyLiBUaGlzIGFkZHJlc3MKICogICAgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBkZXZpY2VzIHN0cnVjdHVyZSwgc28gdGhlIGV0aGVybmV0IGxheWVyCiAqICAgIGNhbiBjb25zdHJ1Y3QgaXRzIHBhY2tldHMuCiAqCiAqLwpzdGF0aWMgdm9pZCBpcmxhbl9nZXRfdW5pY2FzdF9hZGRyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoJCQoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCQoJc2tiID0gZGV2X2FsbG9jX3NrYigxMjgpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwogCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIkRJUkVDVEVEIik7CiAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfT1BFUkFUSU9OIiwgIkRZTkFNSUMiKTsgCgkKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2dldF9tZWRpYV9jaGFyIChzZWxmKQogKgogKiAgICAKICoKICovCnZvaWQgaXJsYW5fZ2V0X21lZGlhX2NoYXIoc3RydWN0IGlybGFuX2NiICpzZWxmKSAKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoJCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoJCglza2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKCWlmICghc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCgkvKiBCdWlsZCBmcmFtZSAqLwogCWZyYW1lWzBdID0gQ01EX0dFVF9NRURJQV9DSEFSOwoJZnJhbWVbMV0gPSAweDAxOyAvKiBPbmUgcGFyYW1ldGVyICovCgkKCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTUVESUEiLCAiODAyLjMiKTsKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGluc2VydF9ieXRlX3BhcmFtIChza2IsIHBhcmFtLCB2YWx1ZSkKICoKICogICAgSW5zZXJ0IGJ5dGUgcGFyYW1ldGVyIGludG8gZnJhbWUKICoKICovCmludCBpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgX191OCB2YWx1ZSkKewoJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgcGFyYW0sIElSTEFOX0JZVEUsIHZhbHVlLCAwLCBOVUxMLCAwKTsKfQoKaW50IGlybGFuX2luc2VydF9zaG9ydF9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgX191MTYgdmFsdWUpCnsKCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIHBhcmFtLCBJUkxBTl9TSE9SVCwgMCwgdmFsdWUsIE5VTEwsIDApOwp9CgovKgogKiBGdW5jdGlvbiBpbnNlcnRfc3RyaW5nIChza2IsIHBhcmFtLCB2YWx1ZSkKICoKICogICAgSW5zZXJ0IHN0cmluZyBwYXJhbWV0ZXIgaW50byBmcmFtZQogKgogKi8KaW50IGlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIGNoYXIgKnN0cmluZykKewoJaW50IHN0cmluZ19sZW4gPSBzdHJsZW4oc3RyaW5nKTsKCglyZXR1cm4gX19pcmxhbl9pbnNlcnRfcGFyYW0oc2tiLCBwYXJhbSwgSVJMQU5fQVJSQVksIDAsIDAsIHN0cmluZywgCgkJCQkgICAgc3RyaW5nX2xlbik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGluc2VydF9hcnJheV9wYXJhbShza2IsIHBhcmFtLCB2YWx1ZSwgbGVuX3ZhbHVlKQogKgogKiAgICBJbnNlcnQgYXJyYXkgcGFyYW1ldGVyIGludG8gZnJhbWUKICoKICovCmludCBpcmxhbl9pbnNlcnRfYXJyYXlfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqbmFtZSwgX191OCAqYXJyYXksCgkJCSAgICAgX191MTYgYXJyYXlfbGVuKQp7CglyZXR1cm4gX19pcmxhbl9pbnNlcnRfcGFyYW0oc2tiLCBuYW1lLCBJUkxBTl9BUlJBWSwgMCwgMCwgYXJyYXksIAoJCQkJICAgIGFycmF5X2xlbik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGluc2VydF9wYXJhbSAoc2tiLCBwYXJhbSwgdmFsdWUsIGJ5dGUpCiAqCiAqICAgIEluc2VydCBwYXJhbWV0ZXIgYXQgZW5kIG9mIGJ1ZmZlciwgc3RydWN0dXJlIG9mIGEgcGFyYW1ldGVyIGlzOgogKgogKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAgICB8IE5hbWUgTGVuZ3RoWzFdIHwgUGFyYW0gTmFtZVsxLi4yNTVdIHwgVmFsIExlbmd0aFsyXSB8IFZhbHVlWzAuLjEwMTZdfAogKiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIGludCBfX2lybGFuX2luc2VydF9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgaW50IHR5cGUsIAoJCQkJX191OCB2YWx1ZV9ieXRlLCBfX3UxNiB2YWx1ZV9zaG9ydCwgCgkJCQlfX3U4ICp2YWx1ZV9hcnJheSwgX191MTYgdmFsdWVfbGVuKQp7CglfX3U4ICpmcmFtZTsKCV9fdTggcGFyYW1fbGVuOwoJX191MTYgdG1wX2xlOyAvKiBUZW1wb3JhcnkgdmFsdWUgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQgKi8KCWludCBuPTA7CgkKCWlmIChza2IgPT0gTlVMTCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBOVUxMIHNrYlxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIDA7Cgl9CQoKCXBhcmFtX2xlbiA9IHN0cmxlbihwYXJhbSk7Cglzd2l0Y2ggKHR5cGUpIHsKCWNhc2UgSVJMQU5fQllURToKCQl2YWx1ZV9sZW4gPSAxOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9TSE9SVDoKCQl2YWx1ZV9sZW4gPSAyOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9BUlJBWToKCQlJUkRBX0FTU0VSVCh2YWx1ZV9hcnJheSAhPSBOVUxMLCByZXR1cm4gMDspOwoJCUlSREFfQVNTRVJUKHZhbHVlX2xlbiA+IDAsIHJldHVybiAwOyk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVua25vd24gcGFyYW1ldGVyIHR5cGUhXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlyZXR1cm4gMDsKCQlicmVhazsKCX0KCQoJLyogSW5zZXJ0IGF0IGVuZCBvZiBzay1idWZmZXIgKi8KCWZyYW1lID0gc2tiLT50YWlsOwoKCS8qIE1ha2Ugc3BhY2UgZm9yIGRhdGEgKi8KCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IChwYXJhbV9sZW4rdmFsdWVfbGVuKzMpKSB7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgTm8gbW9yZSBzcGFjZSBhdCBlbmQgb2Ygc2tiXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlyZXR1cm4gMDsKCX0JCglza2JfcHV0KHNrYiwgcGFyYW1fbGVuK3ZhbHVlX2xlbiszKTsKCQoJLyogSW5zZXJ0IHBhcmFtZXRlciBsZW5ndGggKi8KCWZyYW1lW24rK10gPSBwYXJhbV9sZW47CgkKCS8qIEluc2VydCBwYXJhbWV0ZXIgKi8KCW1lbWNweShmcmFtZStuLCBwYXJhbSwgcGFyYW1fbGVuKTsgbiArPSBwYXJhbV9sZW47CgkKCS8qIEluc2VydCB2YWx1ZSBsZW5ndGggKDIgYnl0ZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCwgTFNCIGZpcnN0KSAqLwoJdG1wX2xlID0gY3B1X3RvX2xlMTYodmFsdWVfbGVuKTsKCW1lbWNweShmcmFtZStuLCAmdG1wX2xlLCAyKTsgbiArPSAyOyAvKiBUbyBhdm9pZCBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KCgkvKiBJbnNlcnQgdmFsdWUgKi8KCXN3aXRjaCAodHlwZSkgewoJY2FzZSBJUkxBTl9CWVRFOgoJCWZyYW1lW24rK10gPSB2YWx1ZV9ieXRlOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9TSE9SVDoKCQl0bXBfbGUgPSBjcHVfdG9fbGUxNih2YWx1ZV9zaG9ydCk7CgkJbWVtY3B5KGZyYW1lK24sICZ0bXBfbGUsIDIpOyBuICs9IDI7CgkJYnJlYWs7CgljYXNlIElSTEFOX0FSUkFZOgoJCW1lbWNweShmcmFtZStuLCB2YWx1ZV9hcnJheSwgdmFsdWVfbGVuKTsgbis9dmFsdWVfbGVuOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCUlSREFfQVNTRVJUKG4gPT0gKHBhcmFtX2xlbit2YWx1ZV9sZW4rMyksIHJldHVybiAwOyk7CgoJcmV0dXJuIHBhcmFtX2xlbit2YWx1ZV9sZW4rMzsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fZXh0cmFjdF9wYXJhbSAoYnVmLCBuYW1lLCB2YWx1ZSwgbGVuKQogKgogKiAgICBFeHRyYWN0cyBhIHNpbmdsZSBwYXJhbWV0ZXIgbmFtZS92YWx1ZSBwYWlyIGZyb20gYnVmZmVyIGFuZCB1cGRhdGVzCiAqICAgIHRoZSBidWZmZXIgcG9pbnRlciB0byBwb2ludCB0byB0aGUgbmV4dCBuYW1lL3ZhbHVlIHBhaXIuIAogKi8KaW50IGlybGFuX2V4dHJhY3RfcGFyYW0oX191OCAqYnVmLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwgX191MTYgKmxlbikKewoJX191OCBuYW1lX2xlbjsKCV9fdTE2IHZhbF9sZW47CglpbnQgbj0wOwoJCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQoJLyogZ2V0IGxlbmd0aCBvZiBwYXJhbWV0ZXIgbmFtZSAoMSBieXRlKSAqLwoJbmFtZV9sZW4gPSBidWZbbisrXTsKCQoJaWYgKG5hbWVfbGVuID4gMjU0KSB7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgbmFtZV9sZW4gPiAyNTRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiAtUlNQX0lOVkFMSURfQ09NTUFORF9GT1JNQVQ7Cgl9CgkKCS8qIGdldCBwYXJhbWV0ZXIgbmFtZSAqLwoJbWVtY3B5KG5hbWUsIGJ1ZituLCBuYW1lX2xlbik7CgluYW1lW25hbWVfbGVuXSA9ICdcMCc7CgluKz1uYW1lX2xlbjsKCQoJLyogIAoJICogIEdldCBsZW5ndGggb2YgcGFyYW1ldGVyIHZhbHVlICgyIGJ5dGVzIGluIGxpdHRsZSBlbmRpYW4gCgkgKiAgZm9ybWF0KSAKCSAqLwoJbWVtY3B5KCZ2YWxfbGVuLCBidWYrbiwgMik7IC8qIFRvIGF2b2lkIGFsaWdubWVudCBwcm9ibGVtcyAqLwoJbGUxNl90b19jcHVzKCZ2YWxfbGVuKTsgbis9MjsKCQoJaWYgKHZhbF9sZW4gPiAxMDE2KSB7CgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgcGFyYW1ldGVyIGxlbmd0aCB0byBsb25nXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlyZXR1cm4gLVJTUF9JTlZBTElEX0NPTU1BTkRfRk9STUFUOwoJfQoJKmxlbiA9IHZhbF9sZW47CgoJLyogZ2V0IHBhcmFtZXRlciB2YWx1ZSAqLwoJbWVtY3B5KHZhbHVlLCBidWYrbiwgdmFsX2xlbik7Cgl2YWx1ZVt2YWxfbGVuXSA9ICdcMCc7CgluKz12YWxfbGVuOwoJCglJUkRBX0RFQlVHKDQsICJQYXJhbWV0ZXI6ICVzICIsIG5hbWUpOyAKCUlSREFfREVCVUcoNCwgIlZhbHVlOiAlc1xuIiwgdmFsdWUpOyAKCglyZXR1cm4gbjsKfQoKI2lmZGVmIENPTkZJR19QUk9DX0ZTCgovKgogKiBTdGFydCBvZiByZWFkaW5nIC9wcm9jIGVudHJpZXMuCiAqIFJldHVybiBlbnRyeSBhdCBwb3MsIAogKglvciBzdGFydF90b2tlbiB0byBpbmRpY2F0ZSBwcmludCBoZWFkZXIgbGluZQogKglvciBOVUxMIGlmIGVuZCBvZiBmaWxlCiAqLwpzdGF0aWMgdm9pZCAqaXJsYW5fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKewoJaW50IGkgPSAxOwoJc3RydWN0IGlybGFuX2NiICpzZWxmOwoKCXJjdV9yZWFkX2xvY2soKTsKCWlmICgqcG9zID09IDApCgkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlbGYsICZpcmxhbnMsIGRldl9saXN0KSB7CgkJaWYgKCpwb3MgPT0gaSkgCgkJCXJldHVybiBzZWxmOwoJCSsraTsKCX0KCXJldHVybiBOVUxMOwp9CgovKiBSZXR1cm4gZW50cnkgYWZ0ZXIgdiwgYW5kIGluY3JlbWVudCBwb3MgKi8Kc3RhdGljIHZvaWQgKmlybGFuX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKewoJc3RydWN0IGxpc3RfaGVhZCAqbnh0OwoKCSsrKnBvczsKCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgCgkJbnh0ID0gaXJsYW5zLm5leHQ7CgllbHNlCgkJbnh0ID0gKChzdHJ1Y3QgaXJsYW5fY2IgKil2KS0+ZGV2X2xpc3QubmV4dDsKCglyZXR1cm4gKG54dCA9PSAmaXJsYW5zKSA/IE5VTEwgCgkJOiBsaXN0X2VudHJ5KG54dCwgc3RydWN0IGlybGFuX2NiLCBkZXZfbGlzdCk7Cn0KCi8qIEVuZCBvZiByZWFkaW5nIC9wcm9jIGZpbGUgKi8Kc3RhdGljIHZvaWQgaXJsYW5fc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCXJjdV9yZWFkX3VubG9jaygpOwp9CgoKLyoKICogU2hvdyBvbmUgZW50cnkgaW4gL3Byb2MgZmlsZS4KICovCnN0YXRpYyBpbnQgaXJsYW5fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCnsKCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikKCQlzZXFfcHV0cyhzZXEsICJJckxBTiBpbnN0YW5jZXM6XG4iKTsKCWVsc2UgewoJCXN0cnVjdCBpcmxhbl9jYiAqc2VsZiA9IHY7CgkJCgkJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKCQlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuIC0xOyk7CgoJCXNlcV9wcmludGYoc2VxLCJpZm5hbWU6ICVzLFxuIiwKCQkJICAgICAgIHNlbGYtPmRldi0+bmFtZSk7CgkJc2VxX3ByaW50ZihzZXEsImNsaWVudCBzdGF0ZTogJXMsICIsCgkJCSAgICAgICBpcmxhbl9zdGF0ZVsgc2VsZi0+Y2xpZW50LnN0YXRlXSk7CgkJc2VxX3ByaW50ZihzZXEsInByb3ZpZGVyIHN0YXRlOiAlcyxcbiIsCgkJCSAgICAgICBpcmxhbl9zdGF0ZVsgc2VsZi0+cHJvdmlkZXIuc3RhdGVdKTsKCQlzZXFfcHJpbnRmKHNlcSwic2FkZHI6ICUjMDh4LCAiLAoJCQkgICAgICAgc2VsZi0+c2FkZHIpOwoJCXNlcV9wcmludGYoc2VxLCJkYWRkcjogJSMwOHhcbiIsCgkJCSAgICAgICBzZWxmLT5kYWRkcik7CgkJc2VxX3ByaW50ZihzZXEsInZlcnNpb246ICVkLiVkLFxuIiwKCQkJICAgICAgIHNlbGYtPnZlcnNpb25bMV0sIHNlbGYtPnZlcnNpb25bMF0pOwoJCXNlcV9wcmludGYoc2VxLCJhY2Nlc3MgdHlwZTogJXNcbiIsIAoJCQkgICAgICAgaXJsYW5fYWNjZXNzW3NlbGYtPmNsaWVudC5hY2Nlc3NfdHlwZV0pOwoJCXNlcV9wcmludGYoc2VxLCJtZWRpYTogJXNcbiIsIAoJCQkgICAgICAgaXJsYW5fbWVkaWFbc2VsZi0+bWVkaWFdKTsKCQkKCQlzZXFfcHJpbnRmKHNlcSwibG9jYWwgZmlsdGVyOlxuIik7CgkJc2VxX3ByaW50ZihzZXEsInJlbW90ZSBmaWx0ZXI6ICIpOwoJCWlybGFuX3ByaW50X2ZpbHRlcihzZXEsIHNlbGYtPmNsaWVudC5maWx0ZXJfdHlwZSk7CgkJc2VxX3ByaW50ZihzZXEsInR4IGJ1c3k6ICVzXG4iLCAKCQkJICAgICAgIG5ldGlmX3F1ZXVlX3N0b3BwZWQoc2VsZi0+ZGV2KSA/ICJUUlVFIiA6ICJGQUxTRSIpOwoJCQkKCQlzZXFfcHV0YyhzZXEsJ1xuJyk7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBpcmxhbl9zZXFfb3BzID0gewoJLnN0YXJ0ID0gaXJsYW5fc2VxX3N0YXJ0LAoJLm5leHQgID0gaXJsYW5fc2VxX25leHQsCgkuc3RvcCAgPSBpcmxhbl9zZXFfc3RvcCwKCS5zaG93ICA9IGlybGFuX3NlcV9zaG93LAp9OwoKc3RhdGljIGludCBpcmxhbl9zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcmxhbl9zZXFfb3BzKTsKfQojZW5kaWYKCk1PRFVMRV9BVVRIT1IoIkRhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJUaGUgTGludXggSXJEQSBMQU4gcHJvdG9jb2wiKTsgCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCm1vZHVsZV9wYXJhbShldGgsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGV0aCwgIk5hbWUgZGV2aWNlcyBldGhYICgwKSBvciBpcmxhblggKDEpIik7Cm1vZHVsZV9wYXJhbShhY2Nlc3MsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoYWNjZXNzLCAiQWNjZXNzIHR5cGUgRElSRUNUPTEsIFBFRVI9MiwgSE9TVEVEPTMiKTsKCm1vZHVsZV9pbml0KGlybGFuX2luaXQpOwptb2R1bGVfZXhpdChpcmxhbl9jbGVhbnVwKTsKCg==