LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJsYW5fY29tbW9uLmMKICogVmVyc2lvbjogICAgICAgMC45CiAqIERlc2NyaXB0aW9uOiAgIElyREEgTEFOIEFjY2VzcyBQcm90b2NvbCBJbXBsZW1lbnRhdGlvbgogKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCiAqIEF1dGhvcjogICAgICAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogQ3JlYXRlZCBhdDogICAgU3VuIEF1ZyAzMSAyMDoxNDozNyAxOTk3CiAqIE1vZGlmaWVkIGF0OiAgIFN1biBEZWMgMjYgMjE6NTM6MTAgMTk5OQogKiBNb2RpZmllZCBieTogICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIAogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk3LCAxOTk5IERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4sIAogKiAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogICAgIAogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAogKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzIAogKiAgICAgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgojaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KCiNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybG1wLmg+CiNpbmNsdWRlIDxuZXQvaXJkYS9pcmlhcC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvdGltZXIuaD4KCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9jb21tb24uaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2NsaWVudC5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJsYW5fcHJvdmlkZXIuaD4gCiNpbmNsdWRlIDxuZXQvaXJkYS9pcmxhbl9ldGguaD4KI2luY2x1ZGUgPG5ldC9pcmRhL2lybGFuX2ZpbHRlci5oPgoKCi8qIAogKiBTZW5kIGdyYXR1aXRvdXMgQVJQIHdoZW4gY29ubmVjdGVkIHRvIGEgbmV3IEFQIG9yIG5vdC4gTWF5IGJlIGEgY2xldmVyCiAqIHRoaW5nIHRvIGRvLCBidXQgZm9yIHNvbWUgcmVhc29uIHRoZSBtYWNoaW5lIGNyYXNoZXMgaWYgeW91IHVzZSBESENQLiBTbwogKiBsZXRzIG5vdCB1c2UgaXQgYnkgZGVmYXVsdC4KICovCiN1bmRlZiBDT05GSUdfSVJMQU5fU0VORF9HUkFUVUlUT1VTX0FSUAoKLyogZXh0ZXJuIGNoYXIgc3lzY3RsX2Rldm5hbWVbXTsgKi8KCi8qCiAqICBNYXN0ZXIgc3RydWN0dXJlCiAqLwpzdGF0aWMgTElTVF9IRUFEKGlybGFucyk7CgpzdGF0aWMgdm9pZCAqY2tleTsKc3RhdGljIHZvaWQgKnNrZXk7CgovKiBNb2R1bGUgcGFyYW1ldGVycyAqLwpzdGF0aWMgaW50IGV0aDsgICAvKiBVc2UgImV0aCIgb3IgImlybGFuIiBuYW1lIGZvciBkZXZpY2VzICovCnN0YXRpYyBpbnQgYWNjZXNzID0gQUNDRVNTX1BFRVI7IC8qIFBFRVIsIERJUkVDVCBvciBIT1NURUQgKi8KCiNpZmRlZiBDT05GSUdfUFJPQ19GUwpzdGF0aWMgY29uc3QgY2hhciAqaXJsYW5fYWNjZXNzW10gPSB7CgkiVU5LTk9XTiIsCgkiRElSRUNUIiwKCSJQRUVSIiwKCSJIT1NURUQiCn07CgpzdGF0aWMgY29uc3QgY2hhciAqaXJsYW5fbWVkaWFbXSA9IHsKCSJVTktOT1dOIiwKCSI4MDIuMyIsCgkiODAyLjUiCn07CgpleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2lyZGE7CgpzdGF0aWMgaW50IGlybGFuX3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlybGFuX2ZvcHMgPSB7Cgkub3duZXIJID0gVEhJU19NT0RVTEUsCgkub3BlbiAgICA9IGlybGFuX3NlcV9vcGVuLAoJLnJlYWQgICAgPSBzZXFfcmVhZCwKCS5sbHNlZWsgID0gc2VxX2xzZWVrLAoJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKfTsKCmV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaXJkYTsKI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCgpzdGF0aWMgc3RydWN0IGlybGFuX2NiICppcmxhbl9vcGVuKF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkcik7CnN0YXRpYyB2b2lkIF9faXJsYW5fY2xvc2Uoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKc3RhdGljIGludCBfX2lybGFuX2luc2VydF9wYXJhbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjaGFyICpwYXJhbSwgaW50IHR5cGUsIAoJCQkJX191OCB2YWx1ZV9ieXRlLCBfX3UxNiB2YWx1ZV9zaG9ydCwgCgkJCQlfX3U4ICp2YWx1ZV9hcnJheSwgX191MTYgdmFsdWVfbGVuKTsKc3RhdGljIHZvaWQgaXJsYW5fb3Blbl91bmljYXN0X2FkZHIoc3RydWN0IGlybGFuX2NiICpzZWxmKTsKc3RhdGljIHZvaWQgaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpOwp2b2lkIGlybGFuX2Nsb3NlX3RzYXBzKHN0cnVjdCBpcmxhbl9jYiAqc2VsZik7CgovKgogKiBGdW5jdGlvbiBpcmxhbl9pbml0ICh2b2lkKQogKgogKiAgICBJbml0aWFsaXplIElyTEFOIGxheWVyCiAqCiAqLwpzdGF0aWMgaW50IF9faW5pdCBpcmxhbl9pbml0KHZvaWQpCnsKCXN0cnVjdCBpcmxhbl9jYiAqbmV3OwoJX191MTYgaGludHM7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgojaWZkZWYgQ09ORklHX1BST0NfRlMKCXsgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwoJcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJpcmxhbiIsIDAsIHByb2NfaXJkYSk7CglpZiAoIXByb2MpIHsKCQlwcmludGsoS0VSTl9FUlIgImlybGFuX2luaXQ6IGNhbid0IGNyZWF0ZSAvcHJvYyBlbnRyeSFcbiIpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCXByb2MtPnByb2NfZm9wcyA9ICZpcmxhbl9mb3BzOwoJfQojZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCWhpbnRzID0gaXJsbXBfc2VydmljZV90b19oaW50KFNfTEFOKTsKCgkvKiBSZWdpc3RlciB3aXRoIElyTE1QIGFzIGEgY2xpZW50ICovCglja2V5ID0gaXJsbXBfcmVnaXN0ZXJfY2xpZW50KGhpbnRzLCAmaXJsYW5fY2xpZW50X2Rpc2NvdmVyeV9pbmRpY2F0aW9uLAoJCQkJICAgICBOVUxMLCBOVUxMKTsKCQoJLyogUmVnaXN0ZXIgd2l0aCBJckxNUCBhcyBhIHNlcnZpY2UgKi8KIAlza2V5ID0gaXJsbXBfcmVnaXN0ZXJfc2VydmljZShoaW50cyk7CgoJLyogU3RhcnQgdGhlIG1hc3RlciBJckxBTiBpbnN0YW5jZSAodGhlIG9ubHkgb25lIGZvciBub3cpICovCiAJbmV3ID0gaXJsYW5fb3BlbihERVZfQUREUl9BTlksIERFVl9BRERSX0FOWSk7CgoJLyogVGhlIG1hc3RlciB3aWxsIG9ubHkgb3BlbiBpdHMgKGxpc3RlbikgY29udHJvbCBUU0FQICovCglpcmxhbl9wcm92aWRlcl9vcGVuX2N0cmxfdHNhcChuZXcpOwoKCS8qIERvIHNvbWUgZmFzdCBkaXNjb3ZlcnkhICovCglpcmxtcF9kaXNjb3ZlcnlfcmVxdWVzdChESVNDT1ZFUllfREVGQVVMVF9TTE9UUyk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBpcmxhbl9jbGVhbnVwKHZvaWQpIAp7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsICpuZXh0OwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCWlybG1wX3VucmVnaXN0ZXJfY2xpZW50KGNrZXkpOwoJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNrZXkpOwoKI2lmZGVmIENPTkZJR19QUk9DX0ZTCglyZW1vdmVfcHJvY19lbnRyeSgiaXJsYW4iLCBwcm9jX2lyZGEpOwojZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KCgkvKiBDbGVhbnVwIGFueSBsZWZ0b3ZlciBuZXR3b3JrIGRldmljZXMgKi8KCXJ0bmxfbG9jaygpOwoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlbGYsIG5leHQsICZpcmxhbnMsIGRldl9saXN0KSB7CgkJX19pcmxhbl9jbG9zZShzZWxmKTsKCX0KCXJ0bmxfdW5sb2NrKCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX29wZW4gKHZvaWQpCiAqCiAqICAgIE9wZW4gbmV3IGluc3RhbmNlIG9mIGEgY2xpZW50L3Byb3ZpZGVyLCB3ZSBzaG91bGQgb25seSByZWdpc3RlciB0aGUgCiAqICAgIG5ldHdvcmsgZGV2aWNlIGlmIHRoaXMgaW5zdGFuY2UgaXMgbWVudCBmb3IgYSBwYXJ0aWN1bGFyIGNsaWVudC9wcm92aWRlcgogKi8Kc3RhdGljIHN0cnVjdCBpcmxhbl9jYiAqaXJsYW5fb3BlbihfX3UzMiBzYWRkciwgX191MzIgZGFkZHIpCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CglzdHJ1Y3QgaXJsYW5fY2IgKnNlbGY7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJLyogQ3JlYXRlIG5ldHdvcmsgZGV2aWNlIHdpdGggaXJsYW4gKi8KCWRldiA9IGFsbG9jX2lybGFuZGV2KGV0aCA/ICJldGglZCIgOiAiaXJsYW4lZCIpOwoJaWYgKCFkZXYpCgkJcmV0dXJuIE5VTEw7CgoJc2VsZiA9IGRldi0+cHJpdjsKCXNlbGYtPmRldiA9IGRldjsKCgkvKgoJICogIEluaXRpYWxpemUgbG9jYWwgZGV2aWNlIHN0cnVjdHVyZQoJICovCglzZWxmLT5tYWdpYyA9IElSTEFOX01BR0lDOwoJc2VsZi0+c2FkZHIgPSBzYWRkcjsKCXNlbGYtPmRhZGRyID0gZGFkZHI7CgoJLyogUHJvdmlkZXIgYWNjZXNzIGNhbiBvbmx5IGJlIFBFRVIsIERJUkVDVCwgb3IgSE9TVEVEICovCglzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9IGFjY2VzczsKCWlmIChhY2Nlc3MgPT0gQUNDRVNTX0RJUkVDVCkgewoJCS8qICAKCQkgKiBTaW5jZSB3ZSBhcmUgZW11bGF0aW5nIGFuIElyTEFOIHNldmVyIHdlIHdpbGwgaGF2ZSB0bwoJCSAqIGdpdmUgb3Vyc2VsZiBhbiBldGhlcm5ldCBhZGRyZXNzISAgCgkJICovCgkJZGV2LT5kZXZfYWRkclswXSA9IDB4NDA7CgkJZGV2LT5kZXZfYWRkclsxXSA9IDB4MDA7CgkJZGV2LT5kZXZfYWRkclsyXSA9IDB4MDA7CgkJZGV2LT5kZXZfYWRkclszXSA9IDB4MDA7CgkJZ2V0X3JhbmRvbV9ieXRlcyhkZXYtPmRldl9hZGRyKzQsIDEpOwoJCWdldF9yYW5kb21fYnl0ZXMoZGV2LT5kZXZfYWRkcis1LCAxKTsKCX0KCglzZWxmLT5tZWRpYSA9IE1FRElBXzgwMl8zOwoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSBMTV9VU0VSX1JFUVVFU1Q7Cglpbml0X3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7Cglpbml0X3RpbWVyKCZzZWxmLT5jbGllbnQua2lja190aW1lcik7Cglpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZWxmLT5vcGVuX3dhaXQpOwkKCQoJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2VsZi0+Y2xpZW50LnR4cSk7CgkKCWlybGFuX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIElSTEFOX0lETEUpOwoJaXJsYW5fbmV4dF9wcm92aWRlcl9zdGF0ZShzZWxmLCBJUkxBTl9JRExFKTsKCglpZiAocmVnaXN0ZXJfbmV0ZGV2KGRldikpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCByZWdpc3Rlcl9uZXRkZXYoKSBmYWlsZWQhXG4iLCAKCQkJICAgX19GVU5DVElPTl9fICk7CgkJc2VsZiA9IE5VTEw7CgkJZnJlZV9uZXRkZXYoZGV2KTsKCX0gZWxzZSB7CgkJcnRubF9sb2NrKCk7CgkJbGlzdF9hZGRfcmN1KCZzZWxmLT5kZXZfbGlzdCwgJmlybGFucyk7CgkJcnRubF91bmxvY2soKTsKCX0KCglyZXR1cm4gc2VsZjsKfQovKgogKiBGdW5jdGlvbiBfX2lybGFuX2Nsb3NlIChzZWxmKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGNsb3NlcyBhbmQgZGVhbGxvY2F0ZXMgdGhlIElyTEFOIGNsaWVudCBpbnN0YW5jZXMuIEJlIAogKiAgICBhd2FyZSB0aGF0IG90aGVyIGZ1bmN0aW9ucyB3aGljaCBjYWxscyBjbGllbnRfY2xvc2UoKSBtdXN0CiAqICAgIHJlbW92ZSBzZWxmIGZyb20gaXJsYW5zIGxpc3QgZmlyc3QuCiAqLwpzdGF0aWMgdm9pZCBfX2lybGFuX2Nsb3NlKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCUFTU0VSVF9SVE5MKCk7CglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCWRlbF90aW1lcl9zeW5jKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CglkZWxfdGltZXJfc3luYygmc2VsZi0+Y2xpZW50LmtpY2tfdGltZXIpOwoKCS8qIENsb3NlIGFsbCBvcGVuIGNvbm5lY3Rpb25zIGFuZCByZW1vdmUgVFNBUHMgKi8KCWlybGFuX2Nsb3NlX3RzYXBzKHNlbGYpOwoJCglpZiAoc2VsZi0+Y2xpZW50LmlyaWFwKSAKCQlpcmlhcF9jbG9zZShzZWxmLT5jbGllbnQuaXJpYXApOwoKCS8qIFJlbW92ZSBmcmFtZXMgcXVldWVkIG9uIHRoZSBjb250cm9sIGNoYW5uZWwgKi8KCXNrYl9xdWV1ZV9wdXJnZSgmc2VsZi0+Y2xpZW50LnR4cSk7CgoJLyogVW5yZWdpc3RlciBhbmQgZnJlZSBzZWxmIHZpYSBkZXN0cnVjdG9yICovCgl1bnJlZ2lzdGVyX25ldGRldmljZShzZWxmLT5kZXYpOwp9CgovKiBGaW5kIGFueSBpbnN0YW5jZSBvZiBpcmxhbiwgdXNlZCBmb3IgY2xpZW50IGRpc2NvdmVyeSB3YWtldXAgKi8Kc3RydWN0IGlybGFuX2NiICppcmxhbl9nZXRfYW55KHZvaWQpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZWxmLCAmaXJsYW5zLCBkZXZfbGlzdCkgewoJCXJldHVybiBzZWxmOwoJfQoJcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbiAoaW5zdGFuY2UsIHNhcCwgcW9zLCBtYXhfc2R1X3NpemUsIHNrYikKICoKICogICAgSGVyZSB3ZSByZWNlaXZlIHRoZSBjb25uZWN0IGluZGljYXRpb24gZm9yIHRoZSBkYXRhIGNoYW5uZWwKICoKICovCnN0YXRpYyB2b2lkIGlybGFuX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAoJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywKCQkJCSAgICAgX191MzIgbWF4X3NkdV9zaXplLAoJCQkJICAgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgCgkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IpCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCXRzYXAgPSAoc3RydWN0IHRzYXBfY2IgKikgc2FwOwoJCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoJSVJEQV9BU1NFUlQodHNhcCA9PSBzZWxmLT50c2FwX2RhdGEscmV0dXJuOyk7CgoJc2VsZi0+bWF4X3NkdV9zaXplID0gbWF4X3NkdV9zaXplOwoJc2VsZi0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOwoKCUlSREFfREVCVUcoMCwgIiVzOiBXZSBhcmUgbm93IGNvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CgoJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CgoJLyogSWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgc2tiIHRvICpib3RoKiBzdGF0ZSBtYWNoaW5lcywgeW91IHdpbGwKCSAqIG5lZWQgdG8gc2tiX2Nsb25lKCkgaXQsIHNvIHRoYXQgeW91IGRvbid0IGZyZWUgaXQgdHdpY2UuCgkgKiBBcyB0aGUgc3RhdGUgbWFjaGluZXMgZG9uJ3QgbmVlZCBpdCwgZ2l0IHJpZCBvZiBpdCBoZXJlLi4uCgkgKiBKZWFuIElJICovCglpZiAoc2tiKQoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCglpcmxhbl9kb19wcm92aWRlcl9ldmVudChzZWxmLCBJUkxBTl9EQVRBX0NPTk5FQ1RfSU5ESUNBVElPTiwgTlVMTCk7Cglpcmxhbl9kb19jbGllbnRfZXZlbnQoc2VsZiwgSVJMQU5fREFUQV9DT05ORUNUX0lORElDQVRJT04sIE5VTEwpOwoKCWlmIChzZWxmLT5wcm92aWRlci5hY2Nlc3NfdHlwZSA9PSBBQ0NFU1NfUEVFUikgewoJCS8qIAoJCSAqIERhdGEgY2hhbm5lbCBpcyBvcGVuLCBzbyB3ZSBhcmUgbm93IGFsbG93ZWQgdG8KCQkgKiBjb25maWd1cmUgdGhlIHJlbW90ZSBmaWx0ZXIgCgkJICovCgkJaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzZWxmKTsKCQlpcmxhbl9vcGVuX3VuaWNhc3RfYWRkcihzZWxmKTsKCX0KCS8qIFJlYWR5IHRvIHRyYW5zZmVyIEV0aGVybmV0IGZyYW1lcyAoYXQgbGFzdCkgKi8KCW5ldGlmX3N0YXJ0X3F1ZXVlKHNlbGYtPmRldik7IC8qIENsZWFyIHJlYXNvbiAqLwp9CgpzdGF0aWMgdm9pZCBpcmxhbl9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKCQkJCSAgc3RydWN0IHFvc19pbmZvICpxb3MsIAoJCQkJICBfX3UzMiBtYXhfc2R1X3NpemUsCgkJCQkgIF9fdTggbWF4X2hlYWRlcl9zaXplLCAKCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikgCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglzZWxmID0gKHN0cnVjdCBpcmxhbl9jYiAqKSBpbnN0YW5jZTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCXNlbGYtPm1heF9zZHVfc2l6ZSA9IG1heF9zZHVfc2l6ZTsKCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IG1heF9oZWFkZXJfc2l6ZTsKCgkvKiBUT0RPOiB3ZSBjb3VsZCBzZXQgdGhlIE1UVSBkZXBlbmRpbmcgb24gdGhlIG1heF9zZHVfc2l6ZSAqLwoKCUlSREFfREVCVUcoMCwgIiVzOiBXZSBhcmUgbm93IGNvbm5lY3RlZCFcbiIsIF9fRlVOQ1RJT05fXyk7CglkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKCgkvKiAKCSAqIERhdGEgY2hhbm5lbCBpcyBvcGVuLCBzbyB3ZSBhcmUgbm93IGFsbG93ZWQgdG8gY29uZmlndXJlIHRoZSByZW1vdGUKCSAqIGZpbHRlciAKCSAqLwoJaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzZWxmKTsKCWlybGFuX29wZW5fdW5pY2FzdF9hZGRyKHNlbGYpOwoJCgkvKiBPcGVuIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGZpbHRlciBieSBkZWZhdWx0ICovCiAJaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7CiAJaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIoc2VsZiwgVFJVRSk7CgoJLyogUmVhZHkgdG8gdHJhbnNmZXIgRXRoZXJuZXQgZnJhbWVzICovCgluZXRpZl9zdGFydF9xdWV1ZShzZWxmLT5kZXYpOwoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSAwOyAvKiBDbGVhciByZWFzb24gKi8KI2lmZGVmIENPTkZJR19JUkxBTl9TRU5EX0dSQVRVSVRPVVNfQVJQCglpcmxhbl9ldGhfc2VuZF9ncmF0dWl0b3VzX2FycCgmc2VsZi0+ZGV2KTsKI2VuZGlmCgl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlbGYtPm9wZW5fd2FpdCk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2NsaWVudF9kaXNjb25uZWN0X2luZGljYXRpb24gKGhhbmRsZSkKICoKICogICAgQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHRoZSBJclRUUCBsYXllci4gSW5kaWNhdGVzIGEgZGlzY29ubmVjdGlvbiBvZgogKiAgICB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gKGhhbmRsZSkKICovCnN0YXRpYyB2b2lkIGlybGFuX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwKCQkJCQl2b2lkICpzYXAsIExNX1JFQVNPTiByZWFzb24sIAoJCQkJCXN0cnVjdCBza19idWZmICp1c2VyZGF0YSkgCnsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCXN0cnVjdCB0c2FwX2NiICp0c2FwOwoKCUlSREFfREVCVUcoMCwgIiVzKCksIHJlYXNvbj0lZFxuIiwgX19GVU5DVElPTl9fICwgcmVhc29uKTsKCQoJc2VsZiA9IChzdHJ1Y3QgaXJsYW5fY2IgKikgaW5zdGFuY2U7Cgl0c2FwID0gKHN0cnVjdCB0c2FwX2NiICopIHNhcDsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwkKCUlSREFfQVNTRVJUKHRzYXAgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVCh0c2FwLT5tYWdpYyA9PSBUVFBfVFNBUF9NQUdJQywgcmV0dXJuOyk7CgkKCUlSREFfQVNTRVJUKHRzYXAgPT0gc2VsZi0+dHNhcF9kYXRhLCByZXR1cm47KTsKCglJUkRBX0RFQlVHKDIsICJJckxBTiwgZGF0YSBjaGFubmVsIGRpc2Nvbm5lY3RlZCBieSBwZWVyIVxuIik7CgoJLyogU2F2ZSByZWFzb24gc28gd2Uga25vdyBpZiB3ZSBzaG91bGQgdHJ5IHRvIHJlY29ubmVjdCBvciBub3QgKi8KCXNlbGYtPmRpc2Nvbm5lY3RfcmVhc29uID0gcmVhc29uOwoJCglzd2l0Y2ggKHJlYXNvbikgewoJY2FzZSBMTV9VU0VSX1JFUVVFU1Q6IC8qIFVzZXIgcmVxdWVzdCAqLwoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVzZXIgcmVxdWVzdGVkXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWNhc2UgTE1fTEFQX0RJU0NPTk5FQ1Q6IC8qIFVuZXhwZWN0ZWQgSXJMQVAgZGlzY29ubmVjdCAqLwoJCUlSREFfREVCVUcoMiwgIiVzKCksIFVuZXhwZWN0ZWQgSXJMQVAgZGlzY29ubmVjdFxuIiwgX19GVU5DVElPTl9fICk7CgkJYnJlYWs7CgljYXNlIExNX0NPTk5FQ1RfRkFJTFVSRTogLyogRmFpbGVkIHRvIGVzdGFibGlzaCBJckxBUCBjb25uZWN0aW9uICovCgkJSVJEQV9ERUJVRygyLCAiJXMoKSwgSXJMQVAgY29ubmVjdCBmYWlsZWRcbiIsIF9fRlVOQ1RJT05fXyApOwoJCWJyZWFrOwoJY2FzZSBMTV9MQVBfUkVTRVQ6ICAvKiBJckxBUCByZXNldCAqLwoJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTEFQIHJlc2V0XG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWNhc2UgTE1fSU5JVF9ESVNDT05ORUNUOgoJCUlSREFfREVCVUcoMiwgIiVzKCksIElyTE1QIGNvbm5lY3QgZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJSVJEQV9FUlJPUigiJXMoKSwgVW5rbm93biBkaXNjb25uZWN0IHJlYXNvblxuIiwgX19GVU5DVElPTl9fKTsKCQlicmVhazsKCX0KCQoJLyogSWYgeW91IHdhbnQgdG8gcGFzcyB0aGUgc2tiIHRvICpib3RoKiBzdGF0ZSBtYWNoaW5lcywgeW91IHdpbGwKCSAqIG5lZWQgdG8gc2tiX2Nsb25lKCkgaXQsIHNvIHRoYXQgeW91IGRvbid0IGZyZWUgaXQgdHdpY2UuCgkgKiBBcyB0aGUgc3RhdGUgbWFjaGluZXMgZG9uJ3QgbmVlZCBpdCwgZ2l0IHJpZCBvZiBpdCBoZXJlLi4uCgkgKiBKZWFuIElJICovCglpZiAodXNlcmRhdGEpCgkJZGV2X2tmcmVlX3NrYih1c2VyZGF0YSk7CgoJaXJsYW5fZG9fY2xpZW50X2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKCWlybGFuX2RvX3Byb3ZpZGVyX2V2ZW50KHNlbGYsIElSTEFOX0xNUF9ESVNDT05ORUNULCBOVUxMKTsKCQoJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZWxmLT5vcGVuX3dhaXQpOwp9Cgp2b2lkIGlybGFuX29wZW5fZGF0YV90c2FwKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHRzYXBfY2IgKnRzYXA7Cglub3RpZnlfdCBub3RpZnk7CgoJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCgkvKiBDaGVjayBpZiBhbHJlYWR5IG9wZW4gKi8KCWlmIChzZWxmLT50c2FwX2RhdGEpCgkJcmV0dXJuOwoKCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CgkKCW5vdGlmeS5kYXRhX2luZGljYXRpb24gICAgICAgPSBpcmxhbl9ldGhfcmVjZWl2ZTsKCW5vdGlmeS51ZGF0YV9pbmRpY2F0aW9uICAgICAgPSBpcmxhbl9ldGhfcmVjZWl2ZTsKCW5vdGlmeS5jb25uZWN0X2luZGljYXRpb24gICAgPSBpcmxhbl9jb25uZWN0X2luZGljYXRpb247Cglub3RpZnkuY29ubmVjdF9jb25maXJtICAgICAgID0gaXJsYW5fY29ubmVjdF9jb25maXJtOwogCW5vdGlmeS5mbG93X2luZGljYXRpb24gICAgICAgPSBpcmxhbl9ldGhfZmxvd19pbmRpY2F0aW9uOwoJbm90aWZ5LmRpc2Nvbm5lY3RfaW5kaWNhdGlvbiA9IGlybGFuX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbjsKCW5vdGlmeS5pbnN0YW5jZSAgICAgICAgICAgICAgPSBzZWxmOwoJc3RybGNweShub3RpZnkubmFtZSwgIklyTEFOIGRhdGEiLCBzaXplb2Yobm90aWZ5Lm5hbWUpKTsKCgl0c2FwID0gaXJ0dHBfb3Blbl90c2FwKExTQVBfQU5ZLCBERUZBVUxUX0lOSVRJQUxfQ1JFRElULCAmbm90aWZ5KTsKCWlmICghdHNhcCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIEdvdCBubyB0c2FwIVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuOwoJfQoJc2VsZi0+dHNhcF9kYXRhID0gdHNhcDsKCgkvKiAKCSAqICBUaGlzIGlzIHRoZSBkYXRhIFRTQVAgc2VsZWN0b3Igd2hpY2ggd2Ugd2lsbCBwYXNzIHRvIHRoZSBjbGllbnQKCSAqICB3aGVuIHRoZSBjbGllbnQgYXNrIGZvciBpdC4KCSAqLwoJc2VsZi0+c3RzYXBfc2VsX2RhdGEgPSBzZWxmLT50c2FwX2RhdGEtPnN0c2FwX3NlbDsKfQoKdm9pZCBpcmxhbl9jbG9zZV90c2FwcyhzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgoJLyogRGlzY29ubmVjdCBhbmQgY2xvc2UgYWxsIG9wZW4gVFNBUCBjb25uZWN0aW9ucyAqLwoJaWYgKHNlbGYtPnRzYXBfZGF0YSkgewoJCWlydHRwX2Rpc2Nvbm5lY3RfcmVxdWVzdChzZWxmLT50c2FwX2RhdGEsIE5VTEwsIFBfTk9STUFMKTsKCQlpcnR0cF9jbG9zZV90c2FwKHNlbGYtPnRzYXBfZGF0YSk7CgkJc2VsZi0+dHNhcF9kYXRhID0gTlVMTDsKCX0KCWlmIChzZWxmLT5jbGllbnQudHNhcF9jdHJsKSB7CgkJaXJ0dHBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYtPmNsaWVudC50c2FwX2N0cmwsIE5VTEwsIAoJCQkJCSBQX05PUk1BTCk7CgkJaXJ0dHBfY2xvc2VfdHNhcChzZWxmLT5jbGllbnQudHNhcF9jdHJsKTsKCQlzZWxmLT5jbGllbnQudHNhcF9jdHJsID0gTlVMTDsKCX0KCWlmIChzZWxmLT5wcm92aWRlci50c2FwX2N0cmwpIHsKCQlpcnR0cF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsLCBOVUxMLCAKCQkJCQkgUF9OT1JNQUwpOwoJCWlydHRwX2Nsb3NlX3RzYXAoc2VsZi0+cHJvdmlkZXIudHNhcF9jdHJsKTsKCQlzZWxmLT5wcm92aWRlci50c2FwX2N0cmwgPSBOVUxMOwoJfQoJc2VsZi0+ZGlzY29ubmVjdF9yZWFzb24gPSBMTV9VU0VSX1JFUVVFU1Q7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2lhc19yZWdpc3RlciAoc2VsZiwgdHNhcF9zZWwpCiAqCiAqICAgIFJlZ2lzdGVyIHdpdGggTE0tSUFTCiAqCiAqLwp2b2lkIGlybGFuX2lhc19yZWdpc3RlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIF9fdTggdHNhcF9zZWwpCnsKCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaWFzX3ZhbHVlICpuZXdfdmFsdWU7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCQoJLyogCgkgKiBDaGVjayBpZiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIGJ5IGEgcHJldmlvdXMgcHJvdmlkZXIuCgkgKiBJZiB0aGF0IGlzIHRoZSBjYXNlLCB3ZSBqdXN0IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQoJICovCglpZiAoIWlyaWFzX2ZpbmRfb2JqZWN0KCJJckxBTiIpKSB7CgkJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiSXJMQU4iLCBJQVNfSVJMQU5fSUQpOwoJCWlyaWFzX2FkZF9pbnRlZ2VyX2F0dHJpYihvYmosICJJckRBOlRpbnlUUDpMc2FwU2VsIiwgdHNhcF9zZWwsCgkJCQkJIElBU19LRVJORUxfQVRUUik7CgkJaXJpYXNfaW5zZXJ0X29iamVjdChvYmopOwoJfSBlbHNlIHsKCQluZXdfdmFsdWUgPSBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSh0c2FwX3NlbCk7CgkJaXJpYXNfb2JqZWN0X2NoYW5nZV9hdHRyaWJ1dGUoIklyTEFOIiwgIklyREE6VGlueVRQOkxzYXBTZWwiLAoJCQkJCSAgICAgIG5ld192YWx1ZSk7Cgl9CgkKICAgICAgICAvKiBSZWdpc3RlciBQblAgb2JqZWN0IG9ubHkgaWYgbm90IHJlZ2lzdGVyZWQgYmVmb3JlICovCiAgICAgICAgaWYgKCFpcmlhc19maW5kX29iamVjdCgiUG5QIikpIHsKCQlvYmogPSBpcmlhc19uZXdfb2JqZWN0KCJQblAiLCBJQVNfUE5QX0lEKTsKI2lmIDAKCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJOYW1lIiwgc3lzY3RsX2Rldm5hbWUsCgkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKI2Vsc2UKCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJOYW1lIiwgIkxpbnV4IiwgSUFTX0tFUk5FTF9BVFRSKTsKI2VuZGlmCgkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiRGV2aWNlSUQiLCAiSFdQMTlGMCIsCgkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKCQlpcmlhc19hZGRfaW50ZWdlcl9hdHRyaWIob2JqLCAiQ29tcENudCIsIDEsIElBU19LRVJORUxfQVRUUik7CgkJaWYgKHNlbGYtPnByb3ZpZGVyLmFjY2Vzc190eXBlID09IEFDQ0VTU19QRUVSKQoJCQlpcmlhc19hZGRfc3RyaW5nX2F0dHJpYihvYmosICJDb21wIzAxIiwgIlBOUDgzODkiLAoJCQkJCQlJQVNfS0VSTkVMX0FUVFIpOwoJCWVsc2UKCQkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiQ29tcCMwMSIsICJQTlA4Mjk0IiwKCQkJCQkJSUFTX0tFUk5FTF9BVFRSKTsKCgkJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiTWFudWZhY3R1cmVyIiwKCQkJCQkiTGludXgtSXJEQSBQcm9qZWN0IiwgSUFTX0tFUk5FTF9BVFRSKTsKCQlpcmlhc19pbnNlcnRfb2JqZWN0KG9iaik7Cgl9Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlIChzZWxmKQogKgogKiAgICBUcnkgdG8gc2VuZCB0aGUgbmV4dCBjb21tYW5kIGluIHRoZSBjb250cm9sIHRyYW5zbWl0IHF1ZXVlCiAqCiAqLwppbnQgaXJsYW5fcnVuX2N0cmxfdHhfcXVldWUoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCWlmIChpcmRhX2xvY2soJnNlbGYtPmNsaWVudC50eF9idXN5KSA9PSBGQUxTRSkKCQlyZXR1cm4gLUVCVVNZOwoKCXNrYiA9IHNrYl9kZXF1ZXVlKCZzZWxmLT5jbGllbnQudHhxKTsKCWlmICghc2tiKSB7CgkJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSBGQUxTRTsKCQlyZXR1cm4gMDsKCX0KCQoJLyogQ2hlY2sgdGhhdCBpdCdzIHJlYWxseSBwb3NzaWJsZSB0byBzZW5kIGNvbW1hbmRzICovCglpZiAoKHNlbGYtPmNsaWVudC50c2FwX2N0cmwgPT0gTlVMTCkgfHwgCgkgICAgKHNlbGYtPmNsaWVudC5zdGF0ZSA9PSBJUkxBTl9JRExFKSkgCgl7CgkJc2VsZi0+Y2xpZW50LnR4X2J1c3kgPSBGQUxTRTsKCQlkZXZfa2ZyZWVfc2tiKHNrYik7CgkJcmV0dXJuIC0xOwoJfQoJSVJEQV9ERUJVRygyLCAiJXMoKSwgc2VuZGluZyAuLi5cbiIsIF9fRlVOQ1RJT05fXyApOwoKCXJldHVybiBpcnR0cF9kYXRhX3JlcXVlc3Qoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fY3RybF9kYXRhX3JlcXVlc3QgKHNlbGYsIHNrYikKICoKICogICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoYXQgY29tbWFuZHMgb24gdGhlIGNvbnRyb2wgY2hhbm5lbCBpcyBiZWluZwogKiAgICBzZW50IGluIGEgY29tbWFuZC9yZXNwb25zZSBmYXNoaW9uCiAqLwpzdGF0aWMgdm9pZCBpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIHN0cnVjdCBza19idWZmICpza2IpCnsKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCS8qIFF1ZXVlIGNvbW1hbmQgKi8KCXNrYl9xdWV1ZV90YWlsKCZzZWxmLT5jbGllbnQudHhxLCBza2IpOwoKCS8qIFRyeSB0byBzZW5kIGNvbW1hbmQgKi8KCWlybGFuX3J1bl9jdHJsX3R4X3F1ZXVlKHNlbGYpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9nZXRfcHJvdmlkZXJfaW5mbyAoc2VsZikKICoKICogICAgU2VuZCBHZXQgUHJvdmlkZXIgSW5mb3JtYXRpb24gY29tbWFuZCB0byBwZWVyIElyTEFOIGxheWVyCiAqCiAqLwp2b2lkIGlybGFuX2dldF9wcm92aWRlcl9pbmZvKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoJCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCXNrYiA9IGRldl9hbGxvY19za2IoNjQpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKIAlmcmFtZVswXSA9IENNRF9HRVRfUFJPVklERVJfSU5GTzsKCWZyYW1lWzFdID0gMHgwMDsgICAgICAgICAgICAgICAgIC8qIFplcm8gcGFyYW1ldGVycyAqLwoJCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9vcGVuX2RhdGFfY2hhbm5lbCAoc2VsZikKICoKICogICAgU2VuZCBhbiBPcGVuIERhdGEgQ29tbWFuZCB0byBwcm92aWRlcgogKgogKi8Kdm9pZCBpcmxhbl9vcGVuX2RhdGFfY2hhbm5lbChzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpIAp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgkKCXNrYiA9IGRldl9hbGxvY19za2IoNjQpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCgkvKiBCdWlsZCBmcmFtZSAqLwogCWZyYW1lWzBdID0gQ01EX09QRU5fREFUQV9DSEFOTkVMOwoJZnJhbWVbMV0gPSAweDAyOyAvKiBUd28gcGFyYW1ldGVycyAqLwoKCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiTUVESUEiLCAiODAyLjMiKTsKCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiQUNDRVNTX1RZUEUiLCAiRElSRUNUIik7CgkvKiBpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1PREUiLCAiVU5SRUxJQUJMRSIpOyAqLwoKLyogCXNlbGYtPnVzZV91ZGF0YSA9IFRSVUU7ICovCgoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKdm9pZCBpcmxhbl9jbG9zZV9kYXRhX2NoYW5uZWwoc3RydWN0IGlybGFuX2NiICpzZWxmKSAKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoJCglJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoKCS8qIENoZWNrIGlmIHRoZSBUU0FQIGlzIHN0aWxsIHRoZXJlICovCglpZiAoc2VsZi0+Y2xpZW50LnRzYXBfY3RybCA9PSBOVUxMKQoJCXJldHVybjsKCglza2IgPSBkZXZfYWxsb2Nfc2tiKDY0KTsKCWlmICghc2tiKQoJCXJldHVybjsKCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQoJLyogQnVpbGQgZnJhbWUgKi8KIAlmcmFtZVswXSA9IENNRF9DTE9TRV9EQVRBX0NIQU47CglmcmFtZVsxXSA9IDB4MDE7IC8qIFR3byBwYXJhbWV0ZXJzICovCgoJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwoKCWlybGFuX2N0cmxfZGF0YV9yZXF1ZXN0KHNlbGYsIHNrYik7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX29wZW5fdW5pY2FzdF9hZGRyIChzZWxmKQogKgogKiAgICBNYWtlIElyTEFOIHByb3ZpZGVyIGFjY2VwdCBldGhlcm5ldCBmcmFtZXMgYWRkcmVzc2VkIHRvIHRoZSB1bmljYXN0IAogKiAgICBhZGRyZXNzLgogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fb3Blbl91bmljYXN0X2FkZHIoc3RydWN0IGlybGFuX2NiICpzZWxmKQp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CQoJCglza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCiAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KIAlpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iICwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwogCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiRElSRUNURUQiKTsKIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIkZJTFRFUiIpOyAKCQoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIgKHNlbGYsIHN0YXR1cykKICoKICogICAgTWFrZSBJckxBTiBwcm92aWRlciBhY2NlcHQgZXRoZXJuZXQgZnJhbWVzIGFkZHJlc3NlZCB0byB0aGUgYnJvYWRjYXN0CiAqICAgIGFkZHJlc3MuIEJlIGNhcmVmdWwgd2l0aCB0aGUgdXNlIG9mIHRoaXMgb25lLCBzaW5jZSB0aGVyZSBtYXkgYmUgYSBsb3QKICogICAgb2YgYnJvYWRjYXN0IHRyYWZmaWMgb3V0IHRoZXJlLiBXZSBjYW4gc3RpbGwgZnVuY3Rpb24gd2l0aG91dCB0aGlzCiAqICAgIG9uZSBidXQgdGhlbiBfd2VfIGhhdmUgdG8gaW5pdGlhdGUgYWxsIGNvbW11bmljYXRpb24gd2l0aCBvdGhlcgogKiAgICBob3N0cywgc2luY2UgQVJQIHJlcXVlc3QgZm9yIHRoaXMgaG9zdCB3aWxsIG5vdCBiZSBhbnN3ZXJlZC4KICovCnZvaWQgaXJsYW5fc2V0X2Jyb2FkY2FzdF9maWx0ZXIoc3RydWN0IGlybGFuX2NiICpzZWxmLCBpbnQgc3RhdHVzKSAKewoJc3RydWN0IHNrX2J1ZmYgKnNrYjsKCV9fdTggKmZyYW1lOwoJCglJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18gKTsKCglJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOwoJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybjspOwoJCiAJc2tiID0gZGV2X2FsbG9jX3NrYigxMjgpOwoJaWYgKCFza2IpCgkJcmV0dXJuOwoKCS8qIFJlc2VydmUgc3BhY2UgZm9yIFRUUCwgTE1QLCBhbmQgTEFQIGhlYWRlciAqLwoJc2tiX3Jlc2VydmUoc2tiLCBzZWxmLT5jbGllbnQubWF4X2hlYWRlcl9zaXplKTsKCXNrYl9wdXQoc2tiLCAyKTsKCQoJZnJhbWUgPSBza2ItPmRhdGE7CgkKIAlmcmFtZVswXSA9IENNRF9GSUxURVJfT1BFUkFUSU9OOwoJZnJhbWVbMV0gPSAweDAzOyAgICAgICAgICAgICAgICAgLyogVGhyZWUgcGFyYW1ldGVycyAqLwogCWlybGFuX2luc2VydF9ieXRlX3BhcmFtKHNrYiwgIkRBVEFfQ0hBTiIsIHNlbGYtPmR0c2FwX3NlbF9kYXRhKTsKIAlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9UWVBFIiwgIkJST0FEQ0FTVCIpOwoJaWYgKHN0YXR1cykKCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIkZJTFRFUiIpOyAKCWVsc2UKCQlpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIkZJTFRFUl9NT0RFIiwgIk5PTkUiKTsgCgoJaXJsYW5fY3RybF9kYXRhX3JlcXVlc3Qoc2VsZiwgc2tiKTsKfQoKLyoKICogRnVuY3Rpb24gaXJsYW5fc2V0X211bHRpY2FzdF9maWx0ZXIgKHNlbGYsIHN0YXR1cykKICoKICogICAgTWFrZSBJckxBTiBwcm92aWRlciBhY2NlcHQgZXRoZXJuZXQgZnJhbWVzIGFkZHJlc3NlZCB0byB0aGUgbXVsdGljYXN0CiAqICAgIGFkZHJlc3MuIAogKgogKi8Kdm9pZCBpcmxhbl9zZXRfbXVsdGljYXN0X2ZpbHRlcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYsIGludCBzdGF0dXMpIAp7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJX191OCAqZnJhbWU7CgkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgogCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKCWlmICghc2tiKQoJCXJldHVybjsKCQoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQogCWZyYW1lWzBdID0gQ01EX0ZJTFRFUl9PUEVSQVRJT047CglmcmFtZVsxXSA9IDB4MDM7ICAgICAgICAgICAgICAgICAvKiBUaHJlZSBwYXJhbWV0ZXJzICovCiAJaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc2tiLCAiREFUQV9DSEFOIiwgc2VsZi0+ZHRzYXBfc2VsX2RhdGEpOwogCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX1RZUEUiLCAiTVVMVElDQVNUIik7CglpZiAoc3RhdHVzKQoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiQUxMIik7IAoJZWxzZQoJCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX01PREUiLCAiTk9ORSIpOyAKCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9nZXRfdW5pY2FzdF9hZGRyIChzZWxmKQogKgogKiAgICBSZXRyaWV2ZXMgdGhlIHVuaWNhc3QgYWRkcmVzcyBmcm9tIHRoZSBJckxBTiBwcm92aWRlci4gVGhpcyBhZGRyZXNzCiAqICAgIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZGV2aWNlcyBzdHJ1Y3R1cmUsIHNvIHRoZSBldGhlcm5ldCBsYXllcgogKiAgICBjYW4gY29uc3RydWN0IGl0cyBwYWNrZXRzLgogKgogKi8Kc3RhdGljIHZvaWQgaXJsYW5fZ2V0X3VuaWNhc3RfYWRkcihzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYpCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQkKCUlSREFfREVCVUcoMiwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyApOwoKCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CglJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJUkxBTl9NQUdJQywgcmV0dXJuOyk7CgkKCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKCWlmICghc2tiKQoJCXJldHVybjsKCgkvKiBSZXNlcnZlIHNwYWNlIGZvciBUVFAsIExNUCwgYW5kIExBUCBoZWFkZXIgKi8KCXNrYl9yZXNlcnZlKHNrYiwgc2VsZi0+Y2xpZW50Lm1heF9oZWFkZXJfc2l6ZSk7Cglza2JfcHV0KHNrYiwgMik7CgkKCWZyYW1lID0gc2tiLT5kYXRhOwoJCiAJZnJhbWVbMF0gPSBDTURfRklMVEVSX09QRVJBVElPTjsKCWZyYW1lWzFdID0gMHgwMzsgICAgICAgICAgICAgICAgIC8qIFRocmVlIHBhcmFtZXRlcnMgKi8KIAlpcmxhbl9pbnNlcnRfYnl0ZV9wYXJhbShza2IsICJEQVRBX0NIQU4iLCBzZWxmLT5kdHNhcF9zZWxfZGF0YSk7CiAJaXJsYW5faW5zZXJ0X3N0cmluZ19wYXJhbShza2IsICJGSUxURVJfVFlQRSIsICJESVJFQ1RFRCIpOwogCWlybGFuX2luc2VydF9zdHJpbmdfcGFyYW0oc2tiLCAiRklMVEVSX09QRVJBVElPTiIsICJEWU5BTUlDIik7IAoJCglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpcmxhbl9nZXRfbWVkaWFfY2hhciAoc2VsZikKICoKICogICAgCiAqCiAqLwp2b2lkIGlybGFuX2dldF9tZWRpYV9jaGFyKHN0cnVjdCBpcmxhbl9jYiAqc2VsZikgCnsKCXN0cnVjdCBza19idWZmICpza2I7CglfX3U4ICpmcmFtZTsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgoJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElSTEFOX01BR0lDLCByZXR1cm47KTsKCQoJc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CglpZiAoIXNrYikKCQlyZXR1cm47CgoJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgVFRQLCBMTVAsIGFuZCBMQVAgaGVhZGVyICovCglza2JfcmVzZXJ2ZShza2IsIHNlbGYtPmNsaWVudC5tYXhfaGVhZGVyX3NpemUpOwoJc2tiX3B1dChza2IsIDIpOwoJCglmcmFtZSA9IHNrYi0+ZGF0YTsKCQoJLyogQnVpbGQgZnJhbWUgKi8KIAlmcmFtZVswXSA9IENNRF9HRVRfTUVESUFfQ0hBUjsKCWZyYW1lWzFdID0gMHgwMTsgLyogT25lIHBhcmFtZXRlciAqLwoJCglpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHNrYiwgIk1FRElBIiwgIjgwMi4zIik7Cglpcmxhbl9jdHJsX2RhdGFfcmVxdWVzdChzZWxmLCBza2IpOwp9CgovKgogKiBGdW5jdGlvbiBpbnNlcnRfYnl0ZV9wYXJhbSAoc2tiLCBwYXJhbSwgdmFsdWUpCiAqCiAqICAgIEluc2VydCBieXRlIHBhcmFtZXRlciBpbnRvIGZyYW1lCiAqCiAqLwppbnQgaXJsYW5faW5zZXJ0X2J5dGVfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIF9fdTggdmFsdWUpCnsKCXJldHVybiBfX2lybGFuX2luc2VydF9wYXJhbShza2IsIHBhcmFtLCBJUkxBTl9CWVRFLCB2YWx1ZSwgMCwgTlVMTCwgMCk7Cn0KCmludCBpcmxhbl9pbnNlcnRfc2hvcnRfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIF9fdTE2IHZhbHVlKQp7CglyZXR1cm4gX19pcmxhbl9pbnNlcnRfcGFyYW0oc2tiLCBwYXJhbSwgSVJMQU5fU0hPUlQsIDAsIHZhbHVlLCBOVUxMLCAwKTsKfQoKLyoKICogRnVuY3Rpb24gaW5zZXJ0X3N0cmluZyAoc2tiLCBwYXJhbSwgdmFsdWUpCiAqCiAqICAgIEluc2VydCBzdHJpbmcgcGFyYW1ldGVyIGludG8gZnJhbWUKICoKICovCmludCBpcmxhbl9pbnNlcnRfc3RyaW5nX3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKnBhcmFtLCBjaGFyICpzdHJpbmcpCnsKCWludCBzdHJpbmdfbGVuID0gc3RybGVuKHN0cmluZyk7CgoJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgcGFyYW0sIElSTEFOX0FSUkFZLCAwLCAwLCBzdHJpbmcsIAoJCQkJICAgIHN0cmluZ19sZW4pOwp9CgovKgogKiBGdW5jdGlvbiBpbnNlcnRfYXJyYXlfcGFyYW0oc2tiLCBwYXJhbSwgdmFsdWUsIGxlbl92YWx1ZSkKICoKICogICAgSW5zZXJ0IGFycmF5IHBhcmFtZXRlciBpbnRvIGZyYW1lCiAqCiAqLwppbnQgaXJsYW5faW5zZXJ0X2FycmF5X3BhcmFtKHN0cnVjdCBza19idWZmICpza2IsIGNoYXIgKm5hbWUsIF9fdTggKmFycmF5LAoJCQkgICAgIF9fdTE2IGFycmF5X2xlbikKewoJcmV0dXJuIF9faXJsYW5faW5zZXJ0X3BhcmFtKHNrYiwgbmFtZSwgSVJMQU5fQVJSQVksIDAsIDAsIGFycmF5LCAKCQkJCSAgICBhcnJheV9sZW4pOwp9CgovKgogKiBGdW5jdGlvbiBpbnNlcnRfcGFyYW0gKHNrYiwgcGFyYW0sIHZhbHVlLCBieXRlKQogKgogKiAgICBJbnNlcnQgcGFyYW1ldGVyIGF0IGVuZCBvZiBidWZmZXIsIHN0cnVjdHVyZSBvZiBhIHBhcmFtZXRlciBpczoKICoKICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogICAgfCBOYW1lIExlbmd0aFsxXSB8IFBhcmFtIE5hbWVbMS4uMjU1XSB8IFZhbCBMZW5ndGhbMl0gfCBWYWx1ZVswLi4xMDE2XXwKICogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnN0YXRpYyBpbnQgX19pcmxhbl9pbnNlcnRfcGFyYW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY2hhciAqcGFyYW0sIGludCB0eXBlLCAKCQkJCV9fdTggdmFsdWVfYnl0ZSwgX191MTYgdmFsdWVfc2hvcnQsIAoJCQkJX191OCAqdmFsdWVfYXJyYXksIF9fdTE2IHZhbHVlX2xlbikKewoJX191OCAqZnJhbWU7CglfX3U4IHBhcmFtX2xlbjsKCV9fdTE2IHRtcF9sZTsgLyogVGVtcG9yYXJ5IHZhbHVlIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0ICovCglpbnQgbj0wOwoJCglpZiAoc2tiID09IE5VTEwpIHsKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBHb3QgTlVMTCBza2JcbiIsIF9fRlVOQ1RJT05fXyApOwoJCXJldHVybiAwOwoJfQkKCglwYXJhbV9sZW4gPSBzdHJsZW4ocGFyYW0pOwoJc3dpdGNoICh0eXBlKSB7CgljYXNlIElSTEFOX0JZVEU6CgkJdmFsdWVfbGVuID0gMTsKCQlicmVhazsKCWNhc2UgSVJMQU5fU0hPUlQ6CgkJdmFsdWVfbGVuID0gMjsKCQlicmVhazsKCWNhc2UgSVJMQU5fQVJSQVk6CgkJSVJEQV9BU1NFUlQodmFsdWVfYXJyYXkgIT0gTlVMTCwgcmV0dXJuIDA7KTsKCQlJUkRBX0FTU0VSVCh2YWx1ZV9sZW4gPiAwLCByZXR1cm4gMDspOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlJUkRBX0RFQlVHKDIsICIlcygpLCBVbmtub3duIHBhcmFtZXRlciB0eXBlIVxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIDA7CgkJYnJlYWs7Cgl9CgkKCS8qIEluc2VydCBhdCBlbmQgb2Ygc2stYnVmZmVyICovCglmcmFtZSA9IHNrYi0+dGFpbDsKCgkvKiBNYWtlIHNwYWNlIGZvciBkYXRhICovCglpZiAoc2tiX3RhaWxyb29tKHNrYikgPCAocGFyYW1fbGVuK3ZhbHVlX2xlbiszKSkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIE5vIG1vcmUgc3BhY2UgYXQgZW5kIG9mIHNrYlxuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIDA7Cgl9CQoJc2tiX3B1dChza2IsIHBhcmFtX2xlbit2YWx1ZV9sZW4rMyk7CgkKCS8qIEluc2VydCBwYXJhbWV0ZXIgbGVuZ3RoICovCglmcmFtZVtuKytdID0gcGFyYW1fbGVuOwoJCgkvKiBJbnNlcnQgcGFyYW1ldGVyICovCgltZW1jcHkoZnJhbWUrbiwgcGFyYW0sIHBhcmFtX2xlbik7IG4gKz0gcGFyYW1fbGVuOwoJCgkvKiBJbnNlcnQgdmFsdWUgbGVuZ3RoICgyIGJ5dGUgbGl0dGxlIGVuZGlhbiBmb3JtYXQsIExTQiBmaXJzdCkgKi8KCXRtcF9sZSA9IGNwdV90b19sZTE2KHZhbHVlX2xlbik7CgltZW1jcHkoZnJhbWUrbiwgJnRtcF9sZSwgMik7IG4gKz0gMjsgLyogVG8gYXZvaWQgYWxpZ25tZW50IHByb2JsZW1zICovCgoJLyogSW5zZXJ0IHZhbHVlICovCglzd2l0Y2ggKHR5cGUpIHsKCWNhc2UgSVJMQU5fQllURToKCQlmcmFtZVtuKytdID0gdmFsdWVfYnl0ZTsKCQlicmVhazsKCWNhc2UgSVJMQU5fU0hPUlQ6CgkJdG1wX2xlID0gY3B1X3RvX2xlMTYodmFsdWVfc2hvcnQpOwoJCW1lbWNweShmcmFtZStuLCAmdG1wX2xlLCAyKTsgbiArPSAyOwoJCWJyZWFrOwoJY2FzZSBJUkxBTl9BUlJBWToKCQltZW1jcHkoZnJhbWUrbiwgdmFsdWVfYXJyYXksIHZhbHVlX2xlbik7IG4rPXZhbHVlX2xlbjsKCQlicmVhazsKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CglJUkRBX0FTU0VSVChuID09IChwYXJhbV9sZW4rdmFsdWVfbGVuKzMpLCByZXR1cm4gMDspOwoKCXJldHVybiBwYXJhbV9sZW4rdmFsdWVfbGVuKzM7Cn0KCi8qCiAqIEZ1bmN0aW9uIGlybGFuX2V4dHJhY3RfcGFyYW0gKGJ1ZiwgbmFtZSwgdmFsdWUsIGxlbikKICoKICogICAgRXh0cmFjdHMgYSBzaW5nbGUgcGFyYW1ldGVyIG5hbWUvdmFsdWUgcGFpciBmcm9tIGJ1ZmZlciBhbmQgdXBkYXRlcwogKiAgICB0aGUgYnVmZmVyIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIG5leHQgbmFtZS92YWx1ZSBwYWlyLiAKICovCmludCBpcmxhbl9leHRyYWN0X3BhcmFtKF9fdTggKmJ1ZiwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUsIF9fdTE2ICpsZW4pCnsKCV9fdTggbmFtZV9sZW47CglfX3UxNiB2YWxfbGVuOwoJaW50IG49MDsKCQoJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fICk7CgkKCS8qIGdldCBsZW5ndGggb2YgcGFyYW1ldGVyIG5hbWUgKDEgYnl0ZSkgKi8KCW5hbWVfbGVuID0gYnVmW24rK107CgkKCWlmIChuYW1lX2xlbiA+IDI1NCkgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIG5hbWVfbGVuID4gMjU0XG4iLCBfX0ZVTkNUSU9OX18gKTsKCQlyZXR1cm4gLVJTUF9JTlZBTElEX0NPTU1BTkRfRk9STUFUOwoJfQoJCgkvKiBnZXQgcGFyYW1ldGVyIG5hbWUgKi8KCW1lbWNweShuYW1lLCBidWYrbiwgbmFtZV9sZW4pOwoJbmFtZVtuYW1lX2xlbl0gPSAnXDAnOwoJbis9bmFtZV9sZW47CgkKCS8qICAKCSAqICBHZXQgbGVuZ3RoIG9mIHBhcmFtZXRlciB2YWx1ZSAoMiBieXRlcyBpbiBsaXR0bGUgZW5kaWFuIAoJICogIGZvcm1hdCkgCgkgKi8KCW1lbWNweSgmdmFsX2xlbiwgYnVmK24sIDIpOyAvKiBUbyBhdm9pZCBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KCWxlMTZfdG9fY3B1cygmdmFsX2xlbik7IG4rPTI7CgkKCWlmICh2YWxfbGVuID4gMTAxNikgewoJCUlSREFfREVCVUcoMiwgIiVzKCksIHBhcmFtZXRlciBsZW5ndGggdG8gbG9uZ1xuIiwgX19GVU5DVElPTl9fICk7CgkJcmV0dXJuIC1SU1BfSU5WQUxJRF9DT01NQU5EX0ZPUk1BVDsKCX0KCSpsZW4gPSB2YWxfbGVuOwoKCS8qIGdldCBwYXJhbWV0ZXIgdmFsdWUgKi8KCW1lbWNweSh2YWx1ZSwgYnVmK24sIHZhbF9sZW4pOwoJdmFsdWVbdmFsX2xlbl0gPSAnXDAnOwoJbis9dmFsX2xlbjsKCQoJSVJEQV9ERUJVRyg0LCAiUGFyYW1ldGVyOiAlcyAiLCBuYW1lKTsgCglJUkRBX0RFQlVHKDQsICJWYWx1ZTogJXNcbiIsIHZhbHVlKTsgCgoJcmV0dXJuIG47Cn0KCiNpZmRlZiBDT05GSUdfUFJPQ19GUwoKLyoKICogU3RhcnQgb2YgcmVhZGluZyAvcHJvYyBlbnRyaWVzLgogKiBSZXR1cm4gZW50cnkgYXQgcG9zLCAKICoJb3Igc3RhcnRfdG9rZW4gdG8gaW5kaWNhdGUgcHJpbnQgaGVhZGVyIGxpbmUKICoJb3IgTlVMTCBpZiBlbmQgb2YgZmlsZQogKi8Kc3RhdGljIHZvaWQgKmlybGFuX3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCnsKCWludCBpID0gMTsKCXN0cnVjdCBpcmxhbl9jYiAqc2VsZjsKCglyY3VfcmVhZF9sb2NrKCk7CglpZiAoKnBvcyA9PSAwKQoJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShzZWxmLCAmaXJsYW5zLCBkZXZfbGlzdCkgewoJCWlmICgqcG9zID09IGkpIAoJCQlyZXR1cm4gc2VsZjsKCQkrK2k7Cgl9CglyZXR1cm4gTlVMTDsKfQoKLyogUmV0dXJuIGVudHJ5IGFmdGVyIHYsIGFuZCBpbmNyZW1lbnQgcG9zICovCnN0YXRpYyB2b2lkICppcmxhbl9zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCnsKCXN0cnVjdCBsaXN0X2hlYWQgKm54dDsKCgkrKypwb3M7CglpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pIAoJCW54dCA9IGlybGFucy5uZXh0OwoJZWxzZQoJCW54dCA9ICgoc3RydWN0IGlybGFuX2NiICopdiktPmRldl9saXN0Lm5leHQ7CgoJcmV0dXJuIChueHQgPT0gJmlybGFucykgPyBOVUxMIAoJCTogbGlzdF9lbnRyeShueHQsIHN0cnVjdCBpcmxhbl9jYiwgZGV2X2xpc3QpOwp9CgovKiBFbmQgb2YgcmVhZGluZyAvcHJvYyBmaWxlICovCnN0YXRpYyB2b2lkIGlybGFuX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglyY3VfcmVhZF91bmxvY2soKTsKfQoKCi8qCiAqIFNob3cgb25lIGVudHJ5IGluIC9wcm9jIGZpbGUuCiAqLwpzdGF0aWMgaW50IGlybGFuX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQp7CglpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCgkJc2VxX3B1dHMoc2VxLCAiSXJMQU4gaW5zdGFuY2VzOlxuIik7CgllbHNlIHsKCQlzdHJ1Y3QgaXJsYW5fY2IgKnNlbGYgPSB2OwoJCQoJCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuIC0xOyk7CgkJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSVJMQU5fTUFHSUMsIHJldHVybiAtMTspOwoKCQlzZXFfcHJpbnRmKHNlcSwiaWZuYW1lOiAlcyxcbiIsCgkJCSAgICAgICBzZWxmLT5kZXYtPm5hbWUpOwoJCXNlcV9wcmludGYoc2VxLCJjbGllbnQgc3RhdGU6ICVzLCAiLAoJCQkgICAgICAgaXJsYW5fc3RhdGVbIHNlbGYtPmNsaWVudC5zdGF0ZV0pOwoJCXNlcV9wcmludGYoc2VxLCJwcm92aWRlciBzdGF0ZTogJXMsXG4iLAoJCQkgICAgICAgaXJsYW5fc3RhdGVbIHNlbGYtPnByb3ZpZGVyLnN0YXRlXSk7CgkJc2VxX3ByaW50ZihzZXEsInNhZGRyOiAlIzA4eCwgIiwKCQkJICAgICAgIHNlbGYtPnNhZGRyKTsKCQlzZXFfcHJpbnRmKHNlcSwiZGFkZHI6ICUjMDh4XG4iLAoJCQkgICAgICAgc2VsZi0+ZGFkZHIpOwoJCXNlcV9wcmludGYoc2VxLCJ2ZXJzaW9uOiAlZC4lZCxcbiIsCgkJCSAgICAgICBzZWxmLT52ZXJzaW9uWzFdLCBzZWxmLT52ZXJzaW9uWzBdKTsKCQlzZXFfcHJpbnRmKHNlcSwiYWNjZXNzIHR5cGU6ICVzXG4iLCAKCQkJICAgICAgIGlybGFuX2FjY2Vzc1tzZWxmLT5jbGllbnQuYWNjZXNzX3R5cGVdKTsKCQlzZXFfcHJpbnRmKHNlcSwibWVkaWE6ICVzXG4iLCAKCQkJICAgICAgIGlybGFuX21lZGlhW3NlbGYtPm1lZGlhXSk7CgkJCgkJc2VxX3ByaW50ZihzZXEsImxvY2FsIGZpbHRlcjpcbiIpOwoJCXNlcV9wcmludGYoc2VxLCJyZW1vdGUgZmlsdGVyOiAiKTsKCQlpcmxhbl9wcmludF9maWx0ZXIoc2VxLCBzZWxmLT5jbGllbnQuZmlsdGVyX3R5cGUpOwoJCXNlcV9wcmludGYoc2VxLCJ0eCBidXN5OiAlc1xuIiwgCgkJCSAgICAgICBuZXRpZl9xdWV1ZV9zdG9wcGVkKHNlbGYtPmRldikgPyAiVFJVRSIgOiAiRkFMU0UiKTsKCQkJCgkJc2VxX3B1dGMoc2VxLCdcbicpOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJsYW5fc2VxX29wcyA9IHsKCS5zdGFydCA9IGlybGFuX3NlcV9zdGFydCwKCS5uZXh0ICA9IGlybGFuX3NlcV9uZXh0LAoJLnN0b3AgID0gaXJsYW5fc2VxX3N0b3AsCgkuc2hvdyAgPSBpcmxhbl9zZXFfc2hvdywKfTsKCnN0YXRpYyBpbnQgaXJsYW5fc2VxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCnsKCXJldHVybiBzZXFfb3BlbihmaWxlLCAmaXJsYW5fc2VxX29wcyk7Cn0KI2VuZGlmCgpNT0RVTEVfQVVUSE9SKCJEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+Iik7Ck1PRFVMRV9ERVNDUklQVElPTigiVGhlIExpbnV4IElyREEgTEFOIHByb3RvY29sIik7IApNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfcGFyYW0oZXRoLCBib29sLCAwKTsKTU9EVUxFX1BBUk1fREVTQyhldGgsICJOYW1lIGRldmljZXMgZXRoWCAoMCkgb3IgaXJsYW5YICgxKSIpOwptb2R1bGVfcGFyYW0oYWNjZXNzLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGFjY2VzcywgIkFjY2VzcyB0eXBlIERJUkVDVD0xLCBQRUVSPTIsIEhPU1RFRD0zIik7Cgptb2R1bGVfaW5pdChpcmxhbl9pbml0KTsKbW9kdWxlX2V4aXQoaXJsYW5fY2xlYW51cCk7Cgo=