LyogcmFkZW9uX3N0YXRlLmMgLS0gU3RhdGUgc3VwcG9ydCBmb3IgUmFkZW9uIC0qLSBsaW51eC1jIC0qLSAqLwovKgogKiBDb3B5cmlnaHQgMjAwMCBWQSBMaW51eCBTeXN0ZW1zLCBJbmMuLCBGcmVtb250LCBDYWxpZm9ybmlhLgogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFBSRUNJU0lPTiBJTlNJR0hUIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCiAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAogKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKiAgICBHYXJldGggSHVnaGVzIDxnYXJldGhAdmFsaW51eC5jb20+CiAqICAgIEtldmluIEUuIE1hcnRpbiA8bWFydGluQHZhbGludXguY29tPgogKi8KCiNpbmNsdWRlICJkcm1QLmgiCiNpbmNsdWRlICJkcm0uaCIKI2luY2x1ZGUgImRybV9zYXJlYS5oIgojaW5jbHVkZSAicmFkZW9uX2RybS5oIgojaW5jbHVkZSAicmFkZW9uX2Rydi5oIgoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBjbGllbnQgc3RhdGUgY2hlY2tpbmcgYW5kIGZpeHVwCiAqLwoKc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRybV9yYWRlb25fcHJpdmF0ZV90ICoKCQkJCQkJICAgIGRldl9wcml2LAoJCQkJCQkgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKCQkJCQkJICAgIHUzMiAqb2Zmc2V0KQp7Cgl1MzIgb2ZmID0gKm9mZnNldDsKCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CgoJLyogSHJtIC4uLiB0aGUgc3Rvcnkgb2YgdGhlIG9mZnNldCAuLi4gU28gdGhpcyBmdW5jdGlvbiBjb252ZXJ0cwoJICogdGhlIHZhcmlvdXMgaWRlYXMgb2Ygd2hhdCB1c2VybGFuZCBjbGllbnRzIG1pZ2h0IGhhdmUgZm9yIGFuCgkgKiBvZmZzZXQgaW4gdGhlIGNhcmQgYWRkcmVzcyBzcGFjZSBpbnRvIGFuIG9mZnNldCBpbnRvIHRoZSBjYXJkCgkgKiBhZGRyZXNzIHNwYWNlIDopIFNvIHdpdGggYSBzYW5lIGNsaWVudCwgaXQgc2hvdWxkIGp1c3Qga2VlcAoJICogdGhlIHZhbHVlIGludGFjdCBhbmQganVzdCBkbyBzb21lIGJvdW5kYXJ5IGNoZWNraW5nLiBIb3dldmVyLAoJICogbm90IGFsbCBjbGllbnRzIGFyZSBzYW5lLiBTb21lIG9sZGVyIGNsaWVudHMgcGFzcyB1cyAwIGJhc2VkCgkgKiBvZmZzZXRzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgZnJhbWVidWZmZXIgYW5kIHNvbWUgbWF5CgkgKiBhc3N1bWUgdGhlIEFHUCBhcGVydHVyZSBpdCBhcHBlbmRlZCB0byB0aGUgZnJhbWVidWZmZXIsIHNvIHdlCgkgKiB0cnkgdG8gZGV0ZWN0IHRob3NlIGNhc2VzIGFuZCBmaXggdGhlbSB1cC4KCSAqCgkgKiBOb3RlOiBJdCBtaWdodCBiZSBhIGdvb2QgaWRlYSBoZXJlIHRvIG1ha2Ugc3VyZSB0aGUgb2Zmc2V0IGxhbmRzCgkgKiBpbiBzb21lICJhbGxvd2VkIiBhcmVhIHRvIHByb3RlY3QgdGhpbmdzIGxpa2UgdGhlIFBDSUUgR0FSVC4uLgoJICovCgoJLyogRmlyc3QsIHRoZSBiZXN0IGNhc2UsIHRoZSBvZmZzZXQgYWxyZWFkeSBsYW5kcyBpbiBlaXRoZXIgdGhlCgkgKiBmcmFtZWJ1ZmZlciBvciB0aGUgR0FSVCBtYXBwZWQgc3BhY2UKCSAqLwoJaWYgKChvZmYgPj0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uICYmCgkgICAgIG9mZiA8IChkZXZfcHJpdi0+ZmJfbG9jYXRpb24gKyBkZXZfcHJpdi0+ZmJfc2l6ZSkpIHx8CgkgICAgKG9mZiA+PSBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCAmJgoJICAgICBvZmYgPCAoZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKyBkZXZfcHJpdi0+Z2FydF9zaXplKSkpCgkJcmV0dXJuIDA7CgoJLyogT2ssIHRoYXQgZGlkbid0IGhhcHBlbi4uLiBub3cgY2hlY2sgaWYgd2UgaGF2ZSBhIHplcm8gYmFzZWQKCSAqIG9mZnNldCB0aGF0IGZpdHMgaW4gdGhlIGZyYW1lYnVmZmVyICsgZ2FydCBzcGFjZSwgYXBwbHkgdGhlCgkgKiBtYWdpYyBvZmZzZXQgd2UgZ2V0IGZyb20gU0VUUEFSQU0gb3IgY2FsY3VsYXRlZCBmcm9tIGZiX2xvY2F0aW9uCgkgKi8KCWlmIChvZmYgPCAoZGV2X3ByaXYtPmZiX3NpemUgKyBkZXZfcHJpdi0+Z2FydF9zaXplKSkgewoJCXJhZGVvbl9wcml2ID0gZmlscF9wcml2LT5kcml2ZXJfcHJpdjsKCQlvZmYgKz0gcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YTsKCX0KCgkvKiBGaW5hbGx5LCBhc3N1bWUgd2UgYWltZWQgYXQgYSBHQVJUIG9mZnNldCBpZiBiZXlvbmQgdGhlIGZiICovCglpZiAob2ZmID4gKGRldl9wcml2LT5mYl9sb2NhdGlvbiArIGRldl9wcml2LT5mYl9zaXplKSkKCQlvZmYgPSBvZmYgLSAoZGV2X3ByaXYtPmZiX2xvY2F0aW9uICsgZGV2X3ByaXYtPmZiX3NpemUpICsKCQkJZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQ7CgoJLyogTm93IHJlY2hlY2sgYW5kIGZhaWwgaWYgb3V0IG9mIGJvdW5kcyAqLwoJaWYgKChvZmYgPj0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uICYmCgkgICAgIG9mZiA8IChkZXZfcHJpdi0+ZmJfbG9jYXRpb24gKyBkZXZfcHJpdi0+ZmJfc2l6ZSkpIHx8CgkgICAgKG9mZiA+PSBkZXZfcHJpdi0+Z2FydF92bV9zdGFydCAmJgoJICAgICBvZmYgPCAoZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQgKyBkZXZfcHJpdi0+Z2FydF9zaXplKSkpIHsKCQlEUk1fREVCVUcoIm9mZnNldCBmaXhlZCB1cCB0byAweCV4XG4iLCBvZmYpOwoJCSpvZmZzZXQgPSBvZmY7CgkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwp9CgpzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXRzKGRybV9yYWRlb25fcHJpdmF0ZV90ICoKCQkJCQkJICAgICBkZXZfcHJpdiwKCQkJCQkJICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAoJCQkJCQkgICAgIGludCBpZCwgdTMyICpkYXRhKQp7Cglzd2l0Y2ggKGlkKSB7CgoJY2FzZSBSQURFT05fRU1JVF9QUF9NSVNDOgoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCSAgICAmZGF0YVsoUkFERU9OX1JCM0RfREVQVEhPRkZTRVQgLSBSQURFT05fUFBfTUlTQykgLyA0XSkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGRlcHRoIGJ1ZmZlciBvZmZzZXRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCQlicmVhazsKCgljYXNlIFJBREVPTl9FTUlUX1BQX0NOVEw6CgkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCgkJICAgICZkYXRhWyhSQURFT05fUkIzRF9DT0xPUk9GRlNFVCAtIFJBREVPTl9QUF9DTlRMKSAvIDRdKSkgewoJCQlEUk1fRVJST1IoIkludmFsaWQgY29sb3VyIGJ1ZmZlciBvZmZzZXRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCQlicmVhazsKCgljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8wOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfMToKCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzI6CgljYXNlIFIyMDBfRU1JVF9QUF9UWE9GRlNFVF8zOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhPRkZTRVRfNDoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYT0ZGU0VUXzU6CgkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgJmRhdGFbMF0pKSB7CgkJCURSTV9FUlJPUigiSW52YWxpZCBSMjAwIHRleHR1cmUgb2Zmc2V0XG4iKTsKCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQl9CgkJYnJlYWs7CgoJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8wOgoJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8xOgoJY2FzZSBSQURFT05fRU1JVF9QUF9UWEZJTFRFUl8yOgoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCSAgICAmZGF0YVsoUkFERU9OX1BQX1RYT0ZGU0VUXzAgLSBSQURFT05fUFBfVFhGSUxURVJfMCkgLyA0XSkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIFIxMDAgdGV4dHVyZSBvZmZzZXRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCQlicmVhazsKCgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzE6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzI6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzM6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzQ6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19PRkZTRVRTXzU6ewoJCQlpbnQgaTsKCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LAoJCQkJCQkJCSAgZmlscF9wcml2LAoJCQkJCQkJCSAgJmRhdGFbaV0pKSB7CgkJCQkJRFJNX0VSUk9SCgkJCQkJICAgICgiSW52YWxpZCBSMjAwIGN1YmljIHRleHR1cmUgb2Zmc2V0XG4iKTsKCQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCQkJfQoJCQl9CgkJCWJyZWFrOwoJCX0KCgljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDA6CgljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDE6CgljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX09GRlNFVFNfVDI6ewoJCQlpbnQgaTsKCQkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewoJCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LAoJCQkJCQkJCSAgZmlscF9wcml2LAoJCQkJCQkJCSAgJmRhdGFbaV0pKSB7CgkJCQkJRFJNX0VSUk9SCgkJCQkJICAgICgiSW52YWxpZCBSMTAwIGN1YmljIHRleHR1cmUgb2Zmc2V0XG4iKTsKCQkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCQkJfQoJCQl9CgkJfQoJCWJyZWFrOwoKCWNhc2UgUkFERU9OX0VNSVRfUkIzRF9DT0xPUlBJVENIOgoJY2FzZSBSQURFT05fRU1JVF9SRV9MSU5FX1BBVFRFUk46CgljYXNlIFJBREVPTl9FTUlUX1NFX0xJTkVfV0lEVEg6CgljYXNlIFJBREVPTl9FTUlUX1BQX0xVTV9NQVRSSVg6CgljYXNlIFJBREVPTl9FTUlUX1BQX1JPVF9NQVRSSVhfMDoKCWNhc2UgUkFERU9OX0VNSVRfUkIzRF9TVEVOQ0lMUkVGTUFTSzoKCWNhc2UgUkFERU9OX0VNSVRfU0VfVlBPUlRfWFNDQUxFOgoJY2FzZSBSQURFT05fRU1JVF9TRV9DTlRMOgoJY2FzZSBSQURFT05fRU1JVF9TRV9DTlRMX1NUQVRVUzoKCWNhc2UgUkFERU9OX0VNSVRfUkVfTUlTQzoKCWNhc2UgUkFERU9OX0VNSVRfUFBfQk9SREVSX0NPTE9SXzA6CgljYXNlIFJBREVPTl9FTUlUX1BQX0JPUkRFUl9DT0xPUl8xOgoJY2FzZSBSQURFT05fRU1JVF9QUF9CT1JERVJfQ09MT1JfMjoKCWNhc2UgUkFERU9OX0VNSVRfU0VfWkJJQVNfRkFDVE9SOgoJY2FzZSBSQURFT05fRU1JVF9TRV9UQ0xfT1VUUFVUX1ZUWF9GTVQ6CgljYXNlIFJBREVPTl9FTUlUX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVEOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMDoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzE6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF8yOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfMzoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzQ6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENCTEVORF81OgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDQkxFTkRfNjoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ0JMRU5EXzc6CgljYXNlIFIyMDBfRU1JVF9UQ0xfTElHSFRfTU9ERUxfQ1RMXzA6CgljYXNlIFIyMDBfRU1JVF9URkFDVE9SXzA6CgljYXNlIFIyMDBfRU1JVF9WVFhfRk1UXzA6CgljYXNlIFIyMDBfRU1JVF9WQVBfQ1RMOgoJY2FzZSBSMjAwX0VNSVRfTUFUUklYX1NFTEVDVF8wOgoJY2FzZSBSMjAwX0VNSVRfVEVYX1BST0NfQ1RMXzI6CgljYXNlIFIyMDBfRU1JVF9UQ0xfVUNQX1ZFUlRfQkxFTkRfQ1RMOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMDoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzE6CgljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl8yOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhGSUxURVJfMzoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYRklMVEVSXzQ6CgljYXNlIFIyMDBfRU1JVF9QUF9UWEZJTFRFUl81OgoJY2FzZSBSMjAwX0VNSVRfVlRFX0NOVEw6CgljYXNlIFIyMDBfRU1JVF9PVVRQVVRfVlRYX0NPTVBfU0VMOgoJY2FzZSBSMjAwX0VNSVRfUFBfVEFNX0RFQlVHMzoKCWNhc2UgUjIwMF9FTUlUX1BQX0NOVExfWDoKCWNhc2UgUjIwMF9FTUlUX1JCM0RfREVQVEhYWV9PRkZTRVQ6CgljYXNlIFIyMDBfRU1JVF9SRV9BVVhfU0NJU1NPUl9DTlRMOgoJY2FzZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8wOgoJY2FzZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8xOgoJY2FzZSBSMjAwX0VNSVRfUkVfU0NJU1NPUl9UTF8yOgoJY2FzZSBSMjAwX0VNSVRfU0VfVkFQX0NOVExfU1RBVFVTOgoJY2FzZSBSMjAwX0VNSVRfU0VfVlRYX1NUQVRFX0NOVEw6CgljYXNlIFIyMDBfRU1JVF9SRV9QT0lOVFNJWkU6CgljYXNlIFIyMDBfRU1JVF9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18wOgoJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfMToKCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzI6CgljYXNlIFIyMDBfRU1JVF9QUF9DVUJJQ19GQUNFU18zOgoJY2FzZSBSMjAwX0VNSVRfUFBfQ1VCSUNfRkFDRVNfNDoKCWNhc2UgUjIwMF9FTUlUX1BQX0NVQklDX0ZBQ0VTXzU6CgljYXNlIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzA6CgljYXNlIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzE6CgljYXNlIFJBREVPTl9FTUlUX1BQX1RFWF9TSVpFXzI6CgljYXNlIFIyMDBfRU1JVF9SQjNEX0JMRU5EQ09MT1I6CgljYXNlIFIyMDBfRU1JVF9UQ0xfUE9JTlRfU1BSSVRFX0NOVEw6CgljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzA6CgljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzE6CgljYXNlIFJBREVPTl9FTUlUX1BQX0NVQklDX0ZBQ0VTXzI6CgljYXNlIFIyMDBfRU1JVF9QUF9UUklfUEVSRl9DTlRMOgoJY2FzZSBSMjAwX0VNSVRfUFBfQUZTXzA6CgljYXNlIFIyMDBfRU1JVF9QUF9BRlNfMToKCWNhc2UgUjIwMF9FTUlUX0FURl9URkFDVE9SOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMDoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzE6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENUTEFMTF8yOgoJY2FzZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMzoKCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzQ6CgljYXNlIFIyMDBfRU1JVF9QUF9UWENUTEFMTF81OgoJY2FzZSBSMjAwX0VNSVRfVkFQX1BWU19DTlRMOgoJCS8qIFRoZXNlIHBhY2tldHMgZG9uJ3QgY29udGFpbiBtZW1vcnkgb2Zmc2V0cyAqLwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJRFJNX0VSUk9SKCJVbmtub3duIHN0YXRlIHBhY2tldCBJRCAlZFxuIiwgaWQpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fY2hlY2tfYW5kX2ZpeHVwX3BhY2tldDMoZHJtX3JhZGVvbl9wcml2YXRlX3QgKgoJCQkJCQkgICAgIGRldl9wcml2LAoJCQkJCQkgICAgIGRybV9maWxlX3QgKmZpbHBfcHJpdiwKCQkJCQkJICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKgoJCQkJCQkgICAgIGNtZGJ1ZiwKCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmNtZHN6KQp7Cgl1MzIgKmNtZCA9ICh1MzIgKikgY21kYnVmLT5idWY7CgoJKmNtZHN6ID0gMiArICgoY21kWzBdICYgUkFERU9OX0NQX1BBQ0tFVF9DT1VOVF9NQVNLKSA+PiAxNik7CgoJaWYgKChjbWRbMF0gJiAweGMwMDAwMDAwKSAhPSBSQURFT05fQ1BfUEFDS0VUMykgewoJCURSTV9FUlJPUigiTm90IGEgdHlwZSAzIHBhY2tldFxuIik7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglpZiAoNCAqICpjbWRzeiA+IGNtZGJ1Zi0+YnVmc3opIHsKCQlEUk1fRVJST1IoIlBhY2tldCBzaXplIGxhcmdlciB0aGFuIHNpemUgb2YgZGF0YSBwcm92aWRlZFxuIik7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCgkvKiBDaGVjayBjbGllbnQgc3RhdGUgYW5kIGZpeCBpdCB1cCBpZiBuZWNlc3NhcnkgKi8KCWlmIChjbWRbMF0gJiAweDgwMDApIHsJLyogTVNCIG9mIG9wY29kZTogbmV4dCBEV09SRCBHVUlfQ05UTCAqLwoJCXUzMiBvZmZzZXQ7CgoJCWlmIChjbWRbMV0gJiAoUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwKCQkJICAgICAgfCBSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCkpIHsKCQkJb2Zmc2V0ID0gY21kWzJdIDw8IDEwOwoJCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQKCQkJICAgIChkZXZfcHJpdiwgZmlscF9wcml2LCAmb2Zmc2V0KSkgewoJCQkJRFJNX0VSUk9SKCJJbnZhbGlkIGZpcnN0IHBhY2tldCBvZmZzZXRcbiIpOwoJCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQkJfQoJCQljbWRbMl0gPSAoY21kWzJdICYgMHhmZmMwMDAwMCkgfCBvZmZzZXQgPj4gMTA7CgkJfQoKCQlpZiAoKGNtZFsxXSAmIFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMKSAmJgoJCSAgICAoY21kWzFdICYgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwpKSB7CgkJCW9mZnNldCA9IGNtZFszXSA8PCAxMDsKCQkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0CgkJCSAgICAoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJm9mZnNldCkpIHsKCQkJCURSTV9FUlJPUigiSW52YWxpZCBzZWNvbmQgcGFja2V0IG9mZnNldFxuIik7CgkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCQl9CgkJCWNtZFszXSA9IChjbWRbM10gJiAweGZmYzAwMDAwKSB8IG9mZnNldCA+PiAxMDsKCQl9Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ1AgaGFyZHdhcmUgc3RhdGUgcHJvZ3JhbW1pbmcgZnVuY3Rpb25zCiAqLwoKc3RhdGljIF9faW5saW5lX18gdm9pZCByYWRlb25fZW1pdF9jbGlwX3JlY3QoZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKCQkJCQkgICAgIGRybV9jbGlwX3JlY3RfdCAqIGJveCkKewoJUklOR19MT0NBTFM7CgoJRFJNX0RFQlVHKCIgICBib3g6ICB4MT0lZCB5MT0lZCAgeDI9JWQgeTI9JWRcbiIsCgkJICBib3gtPngxLCBib3gtPnkxLCBib3gtPngyLCBib3gtPnkyKTsKCglCRUdJTl9SSU5HKDQpOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUkVfVE9QX0xFRlQsIDApKTsKCU9VVF9SSU5HKChib3gtPnkxIDw8IDE2KSB8IGJveC0+eDEpOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUkVfV0lEVEhfSEVJR0hULCAwKSk7CglPVVRfUklORygoKGJveC0+eTIgLSAxKSA8PCAxNikgfCAoYm94LT54MiAtIDEpKTsKCUFEVkFOQ0VfUklORygpOwp9CgovKiBFbWl0IDEuMSBzdGF0ZQogKi8Kc3RhdGljIGludCByYWRlb25fZW1pdF9zdGF0ZShkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAoJCQkgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCgkJCSAgICAgZHJtX3JhZGVvbl9jb250ZXh0X3JlZ3NfdCAqIGN0eCwKCQkJICAgICBkcm1fcmFkZW9uX3RleHR1cmVfcmVnc190ICogdGV4LAoJCQkgICAgIHVuc2lnbmVkIGludCBkaXJ0eSkKewoJUklOR19MT0NBTFM7CglEUk1fREVCVUcoImRpcnR5PTB4JTA4eFxuIiwgZGlydHkpOwoKCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfQ09OVEVYVCkgewoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgICZjdHgtPnJiM2RfZGVwdGhvZmZzZXQpKSB7CgkJCURSTV9FUlJPUigiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iKTsKCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQl9CgoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgICZjdHgtPnJiM2RfY29sb3JvZmZzZXQpKSB7CgkJCURSTV9FUlJPUigiSW52YWxpZCBkZXB0aCBidWZmZXIgb2Zmc2V0XG4iKTsKCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQl9CgoJCUJFR0lOX1JJTkcoMTQpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX01JU0MsIDYpKTsKCQlPVVRfUklORyhjdHgtPnBwX21pc2MpOwoJCU9VVF9SSU5HKGN0eC0+cHBfZm9nX2NvbG9yKTsKCQlPVVRfUklORyhjdHgtPnJlX3NvbGlkX2NvbG9yKTsKCQlPVVRfUklORyhjdHgtPnJiM2RfYmxlbmRjbnRsKTsKCQlPVVRfUklORyhjdHgtPnJiM2RfZGVwdGhvZmZzZXQpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF9kZXB0aHBpdGNoKTsKCQlPVVRfUklORyhjdHgtPnJiM2RfenN0ZW5jaWxjbnRsKTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9DTlRMLCAyKSk7CgkJT1VUX1JJTkcoY3R4LT5wcF9jbnRsKTsKCQlPVVRfUklORyhjdHgtPnJiM2RfY250bCk7CgkJT1VUX1JJTkcoY3R4LT5yYjNkX2NvbG9yb2Zmc2V0KTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SQjNEX0NPTE9SUElUQ0gsIDApKTsKCQlPVVRfUklORyhjdHgtPnJiM2RfY29sb3JwaXRjaCk7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9WRVJURk1UKSB7CgkJQkVHSU5fUklORygyKTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9DT09SRF9GTVQsIDApKTsKCQlPVVRfUklORyhjdHgtPnNlX2Nvb3JkX2ZtdCk7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9MSU5FKSB7CgkJQkVHSU5fUklORyg1KTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SRV9MSU5FX1BBVFRFUk4sIDEpKTsKCQlPVVRfUklORyhjdHgtPnJlX2xpbmVfcGF0dGVybik7CgkJT1VUX1JJTkcoY3R4LT5yZV9saW5lX3N0YXRlKTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9MSU5FX1dJRFRILCAwKSk7CgkJT1VUX1JJTkcoY3R4LT5zZV9saW5lX3dpZHRoKTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX0JVTVBNQVApIHsKCQlCRUdJTl9SSU5HKDUpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0xVTV9NQVRSSVgsIDApKTsKCQlPVVRfUklORyhjdHgtPnBwX2x1bV9tYXRyaXgpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX1JPVF9NQVRSSVhfMCwgMSkpOwoJCU9VVF9SSU5HKGN0eC0+cHBfcm90X21hdHJpeF8wKTsKCQlPVVRfUklORyhjdHgtPnBwX3JvdF9tYXRyaXhfMSk7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9NQVNLUykgewoJCUJFR0lOX1JJTkcoNCk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSywgMikpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF9zdGVuY2lscmVmbWFzayk7CgkJT1VUX1JJTkcoY3R4LT5yYjNkX3JvcGNudGwpOwoJCU9VVF9SSU5HKGN0eC0+cmIzZF9wbGFuZW1hc2spOwoJCUFEVkFOQ0VfUklORygpOwoJfQoKCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfVklFV1BPUlQpIHsKCQlCRUdJTl9SSU5HKDcpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSwgNSkpOwoJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfeHNjYWxlKTsKCQlPVVRfUklORyhjdHgtPnNlX3Zwb3J0X3hvZmZzZXQpOwoJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfeXNjYWxlKTsKCQlPVVRfUklORyhjdHgtPnNlX3Zwb3J0X3lvZmZzZXQpOwoJCU9VVF9SSU5HKGN0eC0+c2VfdnBvcnRfenNjYWxlKTsKCQlPVVRfUklORyhjdHgtPnNlX3Zwb3J0X3pvZmZzZXQpOwoJCUFEVkFOQ0VfUklORygpOwoJfQoKCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfU0VUVVApIHsKCQlCRUdJTl9SSU5HKDQpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX0NOVEwsIDApKTsKCQlPVVRfUklORyhjdHgtPnNlX2NudGwpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX0NOVExfU1RBVFVTLCAwKSk7CgkJT1VUX1JJTkcoY3R4LT5zZV9jbnRsX3N0YXR1cyk7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9NSVNDKSB7CgkJQkVHSU5fUklORygyKTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9SRV9NSVNDLCAwKSk7CgkJT1VUX1JJTkcoY3R4LT5yZV9taXNjKTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglpZiAoZGlydHkgJiBSQURFT05fVVBMT0FEX1RFWDApIHsKCQlpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwKCQkJCQkJICAmdGV4WzBdLnBwX3R4b2Zmc2V0KSkgewoJCQlEUk1fRVJST1IoIkludmFsaWQgdGV4dHVyZSBvZmZzZXQgZm9yIHVuaXQgMFxuIik7CgkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgkJfQoKCQlCRUdJTl9SSU5HKDkpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX1RYRklMVEVSXzAsIDUpKTsKCQlPVVRfUklORyh0ZXhbMF0ucHBfdHhmaWx0ZXIpOwoJCU9VVF9SSU5HKHRleFswXS5wcF90eGZvcm1hdCk7CgkJT1VUX1JJTkcodGV4WzBdLnBwX3R4b2Zmc2V0KTsKCQlPVVRfUklORyh0ZXhbMF0ucHBfdHhjYmxlbmQpOwoJCU9VVF9SSU5HKHRleFswXS5wcF90eGFibGVuZCk7CgkJT1VUX1JJTkcodGV4WzBdLnBwX3RmYWN0b3IpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8wLCAwKSk7CgkJT1VUX1JJTkcodGV4WzBdLnBwX2JvcmRlcl9jb2xvcik7CgkJQURWQU5DRV9SSU5HKCk7Cgl9CgoJaWYgKGRpcnR5ICYgUkFERU9OX1VQTE9BRF9URVgxKSB7CgkJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfb2Zmc2V0KGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgJnRleFsxXS5wcF90eG9mZnNldCkpIHsKCQkJRFJNX0VSUk9SKCJJbnZhbGlkIHRleHR1cmUgb2Zmc2V0IGZvciB1bml0IDFcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCgkJQkVHSU5fUklORyg5KTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9UWEZJTFRFUl8xLCA1KSk7CgkJT1VUX1JJTkcodGV4WzFdLnBwX3R4ZmlsdGVyKTsKCQlPVVRfUklORyh0ZXhbMV0ucHBfdHhmb3JtYXQpOwoJCU9VVF9SSU5HKHRleFsxXS5wcF90eG9mZnNldCk7CgkJT1VUX1JJTkcodGV4WzFdLnBwX3R4Y2JsZW5kKTsKCQlPVVRfUklORyh0ZXhbMV0ucHBfdHhhYmxlbmQpOwoJCU9VVF9SSU5HKHRleFsxXS5wcF90ZmFjdG9yKTsKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9QUF9CT1JERVJfQ09MT1JfMSwgMCkpOwoJCU9VVF9SSU5HKHRleFsxXS5wcF9ib3JkZXJfY29sb3IpOwoJCUFEVkFOQ0VfUklORygpOwoJfQoKCWlmIChkaXJ0eSAmIFJBREVPTl9VUExPQURfVEVYMikgewoJCWlmIChyYWRlb25fY2hlY2tfYW5kX2ZpeHVwX29mZnNldChkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgICZ0ZXhbMl0ucHBfdHhvZmZzZXQpKSB7CgkJCURSTV9FUlJPUigiSW52YWxpZCB0ZXh0dXJlIG9mZnNldCBmb3IgdW5pdCAyXG4iKTsKCQkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCQl9CgoJCUJFR0lOX1JJTkcoOSk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfVFhGSUxURVJfMiwgNSkpOwoJCU9VVF9SSU5HKHRleFsyXS5wcF90eGZpbHRlcik7CgkJT1VUX1JJTkcodGV4WzJdLnBwX3R4Zm9ybWF0KTsKCQlPVVRfUklORyh0ZXhbMl0ucHBfdHhvZmZzZXQpOwoJCU9VVF9SSU5HKHRleFsyXS5wcF90eGNibGVuZCk7CgkJT1VUX1JJTkcodGV4WzJdLnBwX3R4YWJsZW5kKTsKCQlPVVRfUklORyh0ZXhbMl0ucHBfdGZhY3Rvcik7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fUFBfQk9SREVSX0NPTE9SXzIsIDApKTsKCQlPVVRfUklORyh0ZXhbMl0ucHBfYm9yZGVyX2NvbG9yKTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglyZXR1cm4gMDsKfQoKLyogRW1pdCAxLjIgc3RhdGUKICovCnN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfc3RhdGUyKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCgkJCSAgICAgIGRybV9maWxlX3QgKiBmaWxwX3ByaXYsCgkJCSAgICAgIGRybV9yYWRlb25fc3RhdGVfdCAqIHN0YXRlKQp7CglSSU5HX0xPQ0FMUzsKCglpZiAoc3RhdGUtPmRpcnR5ICYgUkFERU9OX1VQTE9BRF9aQklBUykgewoJCUJFR0lOX1JJTkcoMyk7CgkJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfWkJJQVNfRkFDVE9SLCAxKSk7CgkJT1VUX1JJTkcoc3RhdGUtPmNvbnRleHQyLnNlX3piaWFzX2ZhY3Rvcik7CgkJT1VUX1JJTkcoc3RhdGUtPmNvbnRleHQyLnNlX3piaWFzX2NvbnN0YW50KTsKCQlBRFZBTkNFX1JJTkcoKTsKCX0KCglyZXR1cm4gcmFkZW9uX2VtaXRfc3RhdGUoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnN0YXRlLT5jb250ZXh0LAoJCQkJIHN0YXRlLT50ZXgsIHN0YXRlLT5kaXJ0eSk7Cn0KCi8qIE5ldyAoMS4zKSBzdGF0ZSBtZWNoYW5pc20uICAzIGNvbW1hbmRzIChwYWNrZXQsIHNjYWxhciwgdmVjdG9yKSBpbgogKiAxLjMgY21kYnVmZmVycyBhbGxvdyBhbGwgcHJldmlvdXMgc3RhdGUgdG8gYmUgdXBkYXRlZCBhcyB3ZWxsIGFzCiAqIHRoZSB0Y2wgc2NhbGFyIGFuZCB2ZWN0b3IgYXJlYXMuCiAqLwpzdGF0aWMgc3RydWN0IHsKCWludCBzdGFydDsKCWludCBsZW47Cgljb25zdCBjaGFyICpuYW1lOwp9IHBhY2tldFtSQURFT05fTUFYX1NUQVRFX1BBQ0tFVFNdID0gewoJe1JBREVPTl9QUF9NSVNDLCA3LCAiUkFERU9OX1BQX01JU0MifSwKCXtSQURFT05fUFBfQ05UTCwgMywgIlJBREVPTl9QUF9DTlRMIn0sCgl7UkFERU9OX1JCM0RfQ09MT1JQSVRDSCwgMSwgIlJBREVPTl9SQjNEX0NPTE9SUElUQ0gifSwKCXtSQURFT05fUkVfTElORV9QQVRURVJOLCAyLCAiUkFERU9OX1JFX0xJTkVfUEFUVEVSTiJ9LAoJe1JBREVPTl9TRV9MSU5FX1dJRFRILCAxLCAiUkFERU9OX1NFX0xJTkVfV0lEVEgifSwKCXtSQURFT05fUFBfTFVNX01BVFJJWCwgMSwgIlJBREVPTl9QUF9MVU1fTUFUUklYIn0sCgl7UkFERU9OX1BQX1JPVF9NQVRSSVhfMCwgMiwgIlJBREVPTl9QUF9ST1RfTUFUUklYXzAifSwKCXtSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSywgMywgIlJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLIn0sCgl7UkFERU9OX1NFX1ZQT1JUX1hTQ0FMRSwgNiwgIlJBREVPTl9TRV9WUE9SVF9YU0NBTEUifSwKCXtSQURFT05fU0VfQ05UTCwgMiwgIlJBREVPTl9TRV9DTlRMIn0sCgl7UkFERU9OX1NFX0NOVExfU1RBVFVTLCAxLCAiUkFERU9OX1NFX0NOVExfU1RBVFVTIn0sCgl7UkFERU9OX1JFX01JU0MsIDEsICJSQURFT05fUkVfTUlTQyJ9LAoJe1JBREVPTl9QUF9UWEZJTFRFUl8wLCA2LCAiUkFERU9OX1BQX1RYRklMVEVSXzAifSwKCXtSQURFT05fUFBfQk9SREVSX0NPTE9SXzAsIDEsICJSQURFT05fUFBfQk9SREVSX0NPTE9SXzAifSwKCXtSQURFT05fUFBfVFhGSUxURVJfMSwgNiwgIlJBREVPTl9QUF9UWEZJTFRFUl8xIn0sCgl7UkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xLCAxLCAiUkFERU9OX1BQX0JPUkRFUl9DT0xPUl8xIn0sCgl7UkFERU9OX1BQX1RYRklMVEVSXzIsIDYsICJSQURFT05fUFBfVFhGSUxURVJfMiJ9LAoJe1JBREVPTl9QUF9CT1JERVJfQ09MT1JfMiwgMSwgIlJBREVPTl9QUF9CT1JERVJfQ09MT1JfMiJ9LAoJe1JBREVPTl9TRV9aQklBU19GQUNUT1IsIDIsICJSQURFT05fU0VfWkJJQVNfRkFDVE9SIn0sCgl7UkFERU9OX1NFX1RDTF9PVVRQVVRfVlRYX0ZNVCwgMTEsICJSQURFT05fU0VfVENMX09VVFBVVF9WVFhfRk1UIn0sCgl7UkFERU9OX1NFX1RDTF9NQVRFUklBTF9FTU1JU1NJVkVfUkVELCAxNywKCQkgICAgIlJBREVPTl9TRV9UQ0xfTUFURVJJQUxfRU1NSVNTSVZFX1JFRCJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfMCwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMCJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfMSwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMSJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfMiwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMiJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfMywgNCwgIlIyMDBfUFBfVFhDQkxFTkRfMyJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfNCwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNCJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfNSwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNSJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfNiwgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNiJ9LAoJe1IyMDBfUFBfVFhDQkxFTkRfNywgNCwgIlIyMDBfUFBfVFhDQkxFTkRfNyJ9LAoJe1IyMDBfU0VfVENMX0xJR0hUX01PREVMX0NUTF8wLCA2LCAiUjIwMF9TRV9UQ0xfTElHSFRfTU9ERUxfQ1RMXzAifSwKCXtSMjAwX1BQX1RGQUNUT1JfMCwgNiwgIlIyMDBfUFBfVEZBQ1RPUl8wIn0sCgl7UjIwMF9TRV9WVFhfRk1UXzAsIDQsICJSMjAwX1NFX1ZUWF9GTVRfMCJ9LAoJe1IyMDBfU0VfVkFQX0NOVEwsIDEsICJSMjAwX1NFX1ZBUF9DTlRMIn0sCgl7UjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wLCA1LCAiUjIwMF9TRV9UQ0xfTUFUUklYX1NFTF8wIn0sCgl7UjIwMF9TRV9UQ0xfVEVYX1BST0NfQ1RMXzIsIDUsICJSMjAwX1NFX1RDTF9URVhfUFJPQ19DVExfMiJ9LAoJe1IyMDBfU0VfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCwgMSwgIlIyMDBfU0VfVENMX1VDUF9WRVJUX0JMRU5EX0NUTCJ9LAoJe1IyMDBfUFBfVFhGSUxURVJfMCwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMCJ9LAoJe1IyMDBfUFBfVFhGSUxURVJfMSwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMSJ9LAoJe1IyMDBfUFBfVFhGSUxURVJfMiwgNiwgIlIyMDBfUFBfVFhGSUxURVJfMiJ9LAoJe1IyMDBfUFBfVFhGSUxURVJfMywgNiwgIlIyMDBfUFBfVFhGSUxURVJfMyJ9LAoJe1IyMDBfUFBfVFhGSUxURVJfNCwgNiwgIlIyMDBfUFBfVFhGSUxURVJfNCJ9LAoJe1IyMDBfUFBfVFhGSUxURVJfNSwgNiwgIlIyMDBfUFBfVFhGSUxURVJfNSJ9LAoJe1IyMDBfUFBfVFhPRkZTRVRfMCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMCJ9LAoJe1IyMDBfUFBfVFhPRkZTRVRfMSwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMSJ9LAoJe1IyMDBfUFBfVFhPRkZTRVRfMiwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMiJ9LAoJe1IyMDBfUFBfVFhPRkZTRVRfMywgMSwgIlIyMDBfUFBfVFhPRkZTRVRfMyJ9LAoJe1IyMDBfUFBfVFhPRkZTRVRfNCwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNCJ9LAoJe1IyMDBfUFBfVFhPRkZTRVRfNSwgMSwgIlIyMDBfUFBfVFhPRkZTRVRfNSJ9LAoJe1IyMDBfU0VfVlRFX0NOVEwsIDEsICJSMjAwX1NFX1ZURV9DTlRMIn0sCgl7UjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCwgMSwKCSAiUjIwMF9TRV9UQ0xfT1VUUFVUX1ZUWF9DT01QX1NFTCJ9LAoJe1IyMDBfUFBfVEFNX0RFQlVHMywgMSwgIlIyMDBfUFBfVEFNX0RFQlVHMyJ9LAoJe1IyMDBfUFBfQ05UTF9YLCAxLCAiUjIwMF9QUF9DTlRMX1gifSwKCXtSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQsIDEsICJSMjAwX1JCM0RfREVQVEhYWV9PRkZTRVQifSwKCXtSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwsIDEsICJSMjAwX1JFX0FVWF9TQ0lTU09SX0NOVEwifSwKCXtSMjAwX1JFX1NDSVNTT1JfVExfMCwgMiwgIlIyMDBfUkVfU0NJU1NPUl9UTF8wIn0sCgl7UjIwMF9SRV9TQ0lTU09SX1RMXzEsIDIsICJSMjAwX1JFX1NDSVNTT1JfVExfMSJ9LAoJe1IyMDBfUkVfU0NJU1NPUl9UTF8yLCAyLCAiUjIwMF9SRV9TQ0lTU09SX1RMXzIifSwKCXtSMjAwX1NFX1ZBUF9DTlRMX1NUQVRVUywgMSwgIlIyMDBfU0VfVkFQX0NOVExfU1RBVFVTIn0sCgl7UjIwMF9TRV9WVFhfU1RBVEVfQ05UTCwgMSwgIlIyMDBfU0VfVlRYX1NUQVRFX0NOVEwifSwKCXtSMjAwX1JFX1BPSU5UU0laRSwgMSwgIlIyMDBfUkVfUE9JTlRTSVpFIn0sCgl7UjIwMF9TRV9UQ0xfSU5QVVRfVlRYX1ZFQ1RPUl9BRERSXzAsIDQsCgkJICAgICJSMjAwX1NFX1RDTF9JTlBVVF9WVFhfVkVDVE9SX0FERFJfMCJ9LAoJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfMCwgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMCJ9LAkvKiA2MSAqLwoJe1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzAsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8wIn0sIC8qIDYyICovCgl7UjIwMF9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU18xIn0sCgl7UjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMSwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzEifSwKCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzIsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzIifSwKCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8yLCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfMiJ9LAoJe1IyMDBfUFBfQ1VCSUNfRkFDRVNfMywgMSwgIlIyMDBfUFBfQ1VCSUNfRkFDRVNfMyJ9LAoJe1IyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzMsIDUsICJSMjAwX1BQX0NVQklDX09GRlNFVF9GMV8zIn0sCgl7UjIwMF9QUF9DVUJJQ19GQUNFU180LCAxLCAiUjIwMF9QUF9DVUJJQ19GQUNFU180In0sCgl7UjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNCwgNSwgIlIyMDBfUFBfQ1VCSUNfT0ZGU0VUX0YxXzQifSwKCXtSMjAwX1BQX0NVQklDX0ZBQ0VTXzUsIDEsICJSMjAwX1BQX0NVQklDX0ZBQ0VTXzUifSwKCXtSMjAwX1BQX0NVQklDX09GRlNFVF9GMV81LCA1LCAiUjIwMF9QUF9DVUJJQ19PRkZTRVRfRjFfNSJ9LAoJe1JBREVPTl9QUF9URVhfU0laRV8wLCAyLCAiUkFERU9OX1BQX1RFWF9TSVpFXzAifSwKCXtSQURFT05fUFBfVEVYX1NJWkVfMSwgMiwgIlJBREVPTl9QUF9URVhfU0laRV8xIn0sCgl7UkFERU9OX1BQX1RFWF9TSVpFXzIsIDIsICJSQURFT05fUFBfVEVYX1NJWkVfMiJ9LAoJe1IyMDBfUkIzRF9CTEVORENPTE9SLCAzLCAiUjIwMF9SQjNEX0JMRU5EQ09MT1IifSwKCXtSMjAwX1NFX1RDTF9QT0lOVF9TUFJJVEVfQ05UTCwgMSwgIlIyMDBfU0VfVENMX1BPSU5UX1NQUklURV9DTlRMIn0sCgl7UkFERU9OX1BQX0NVQklDX0ZBQ0VTXzAsIDEsICJSQURFT05fUFBfQ1VCSUNfRkFDRVNfMCJ9LAoJe1JBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCwgNSwgIlJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDBfMCJ9LAoJe1JBREVPTl9QUF9DVUJJQ19GQUNFU18xLCAxLCAiUkFERU9OX1BQX0NVQklDX0ZBQ0VTXzEifSwKCXtSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QxXzAsIDUsICJSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QxXzAifSwKCXtSQURFT05fUFBfQ1VCSUNfRkFDRVNfMiwgMSwgIlJBREVPTl9QUF9DVUJJQ19GQUNFU18yIn0sCgl7UkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wLCA1LCAiUkFERU9OX1BQX0NVQklDX09GRlNFVF9UMl8wIn0sCgl7UjIwMF9QUF9UUklfUEVSRiwgMiwgIlIyMDBfUFBfVFJJX1BFUkYifSwKCXtSMjAwX1BQX0FGU18wLCAzMiwgIlIyMDBfUFBfQUZTXzAifSwgICAgIC8qIDg1ICovCgl7UjIwMF9QUF9BRlNfMSwgMzIsICJSMjAwX1BQX0FGU18xIn0sCgl7UjIwMF9QUF9URkFDVE9SXzAsIDgsICJSMjAwX0FURl9URkFDVE9SIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8wLCA4LCAiUjIwMF9QUF9UWENUTEFMTF8wIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8xLCA4LCAiUjIwMF9QUF9UWENUTEFMTF8xIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8yLCA4LCAiUjIwMF9QUF9UWENUTEFMTF8yIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl8zLCA4LCAiUjIwMF9QUF9UWENUTEFMTF8zIn0sCgl7UjIwMF9QUF9UWEZJTFRFUl80LCA4LCAiUjIwMF9QUF9UWENUTEFMTF80In0sCgl7UjIwMF9QUF9UWEZJTFRFUl81LCA4LCAiUjIwMF9QUF9UWENUTEFMTF81In0sCgl7UjIwMF9WQVBfUFZTX0NOVExfMSwgMiwgIlIyMDBfVkFQX1BWU19DTlRMIn0sCn07CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZnVuY3Rpb25zCiAqLwoKc3RhdGljIHZvaWQgcmFkZW9uX2NsZWFyX2JveChkcm1fcmFkZW9uX3ByaXZhdGVfdCAqIGRldl9wcml2LAoJCQkgICAgIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLCBpbnQgciwgaW50IGcsIGludCBiKQp7Cgl1MzIgY29sb3I7CglSSU5HX0xPQ0FMUzsKCgl4ICs9IGRldl9wcml2LT5zYXJlYV9wcml2LT5ib3hlc1swXS54MTsKCXkgKz0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmJveGVzWzBdLnkxOwoKCXN3aXRjaCAoZGV2X3ByaXYtPmNvbG9yX2ZtdCkgewoJY2FzZSBSQURFT05fQ09MT1JfRk9STUFUX1JHQjU2NToKCQljb2xvciA9ICgoKHIgJiAweGY4KSA8PCA4KSB8CgkJCSAoKGcgJiAweGZjKSA8PCAzKSB8ICgoYiAmIDB4ZjgpID4+IDMpKTsKCQlicmVhazsKCWNhc2UgUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4ODoKCWRlZmF1bHQ6CgkJY29sb3IgPSAoKCgweGZmKSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOwoJCWJyZWFrOwoJfQoKCUJFR0lOX1JJTkcoNCk7CglSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CglPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9EUF9XUklURV9NQVNLLCAwKSk7CglPVVRfUklORygweGZmZmZmZmZmKTsKCUFEVkFOQ0VfUklORygpOwoKCUJFR0lOX1JJTkcoNik7CgoJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fQ05UTF9QQUlOVF9NVUxUSSwgNCkpOwoJT1VUX1JJTkcoUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAoJCSBSQURFT05fR01DX0JSVVNIX1NPTElEX0NPTE9SIHwKCQkgKGRldl9wcml2LT5jb2xvcl9mbXQgPDwgOCkgfAoJCSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CgkJIFJBREVPTl9ST1AzX1AgfCBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMpOwoKCWlmIChkZXZfcHJpdi0+cGFnZV9mbGlwcGluZyAmJiBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID09IDEpIHsKCQlPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0KTsKCX0gZWxzZSB7CgkJT1VUX1JJTkcoZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0KTsKCX0KCglPVVRfUklORyhjb2xvcik7CgoJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CglPVVRfUklORygodyA8PCAxNikgfCBoKTsKCglBRFZBTkNFX1JJTkcoKTsKfQoKc3RhdGljIHZvaWQgcmFkZW9uX2NwX3BlcmZvcm1hbmNlX2JveGVzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYpCnsKCS8qIENvbGxhcHNlIHZhcmlvdXMgdGhpbmdzIGludG8gYSB3YWl0IGZsYWcgLS0gdHJ5aW5nIHRvCgkgKiBndWVzcyBpZiB1c2Vyc3Bhc2Ugc2xlcHQgLS0gYmV0dGVyIGp1c3QgdG8gaGF2ZSB0aGVtIHRlbGwgdXMuCgkgKi8KCWlmIChkZXZfcHJpdi0+c3RhdHMubGFzdF9mcmFtZV9yZWFkcyA+IDEgfHwKCSAgICBkZXZfcHJpdi0+c3RhdHMubGFzdF9jbGVhcl9yZWFkcyA+IGRldl9wcml2LT5zdGF0cy5jbGVhcnMpIHsKCQlkZXZfcHJpdi0+c3RhdHMuYm94ZXMgfD0gUkFERU9OX0JPWF9XQUlUX0lETEU7Cgl9CgoJaWYgKGRldl9wcml2LT5zdGF0cy5mcmVlbGlzdF9sb29wcykgewoJCWRldl9wcml2LT5zdGF0cy5ib3hlcyB8PSBSQURFT05fQk9YX1dBSVRfSURMRTsKCX0KCgkvKiBQdXJwbGUgYm94IGZvciBwYWdlIGZsaXBwaW5nCgkgKi8KCWlmIChkZXZfcHJpdi0+c3RhdHMuYm94ZXMgJiBSQURFT05fQk9YX0ZMSVApCgkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgNCwgNCwgOCwgOCwgMjU1LCAwLCAyNTUpOwoKCS8qIFJlZCBib3ggaWYgd2UgaGF2ZSB0byB3YWl0IGZvciBpZGxlIGF0IGFueSBwb2ludAoJICovCglpZiAoZGV2X3ByaXYtPnN0YXRzLmJveGVzICYgUkFERU9OX0JPWF9XQUlUX0lETEUpCgkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgMTYsIDQsIDgsIDgsIDI1NSwgMCwgMCk7CgoJLyogQmx1ZSBib3g6IGxvc3QgY29udGV4dD8KCSAqLwoKCS8qIFllbGxvdyBib3ggZm9yIHRleHR1cmUgc3dhcHMKCSAqLwoJaWYgKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEKQoJCXJhZGVvbl9jbGVhcl9ib3goZGV2X3ByaXYsIDQwLCA0LCA4LCA4LCAyNTUsIDI1NSwgMCk7CgoJLyogR3JlZW4gYm94IGlmIGhhcmR3YXJlIG5ldmVyIGlkbGVzIChhcyBmYXIgYXMgd2UgY2FuIHRlbGwpCgkgKi8KCWlmICghKGRldl9wcml2LT5zdGF0cy5ib3hlcyAmIFJBREVPTl9CT1hfRE1BX0lETEUpKQoJCXJhZGVvbl9jbGVhcl9ib3goZGV2X3ByaXYsIDY0LCA0LCA4LCA4LCAwLCAyNTUsIDApOwoKCS8qIERyYXcgYmFycyBpbmRpY2F0aW5nIG51bWJlciBvZiBidWZmZXJzIGFsbG9jYXRlZAoJICogKG5vdCBhIGdyZWF0IG1lYXN1cmUsIGVhc2lseSBjb25mdXNlZCkKCSAqLwoJaWYgKGRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcykgewoJCWlmIChkZXZfcHJpdi0+c3RhdHMucmVxdWVzdGVkX2J1ZnMgPiAxMDApCgkJCWRldl9wcml2LT5zdGF0cy5yZXF1ZXN0ZWRfYnVmcyA9IDEwMDsKCgkJcmFkZW9uX2NsZWFyX2JveChkZXZfcHJpdiwgNCwgMTYsCgkJCQkgZGV2X3ByaXYtPnN0YXRzLnJlcXVlc3RlZF9idWZzLCA0LAoJCQkJIDE5NiwgMTI4LCAxMjgpOwoJfQoKCW1lbXNldCgmZGV2X3ByaXYtPnN0YXRzLCAwLCBzaXplb2YoZGV2X3ByaXYtPnN0YXRzKSk7Cgp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIENQIGNvbW1hbmQgZGlzcGF0Y2ggZnVuY3Rpb25zCiAqLwoKc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKGRybV9kZXZpY2VfdCAqIGRldiwKCQkJCSAgICAgZHJtX3JhZGVvbl9jbGVhcl90ICogY2xlYXIsCgkJCQkgICAgIGRybV9yYWRlb25fY2xlYXJfcmVjdF90ICogZGVwdGhfYm94ZXMpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKCWRybV9yYWRlb25fZGVwdGhfY2xlYXJfdCAqZGVwdGhfY2xlYXIgPSAmZGV2X3ByaXYtPmRlcHRoX2NsZWFyOwoJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwoJZHJtX2NsaXBfcmVjdF90ICpwYm94ID0gc2FyZWFfcHJpdi0+Ym94ZXM7Cgl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjbGVhci0+ZmxhZ3M7Cgl1MzIgcmIzZF9jbnRsID0gMCwgcmIzZF9zdGVuY2lscmVmbWFzayA9IDA7CglpbnQgaTsKCVJJTkdfTE9DQUxTOwoJRFJNX0RFQlVHKCJmbGFncyA9IDB4JXhcbiIsIGZsYWdzKTsKCglkZXZfcHJpdi0+c3RhdHMuY2xlYXJzKys7CgoJaWYgKGRldl9wcml2LT5wYWdlX2ZsaXBwaW5nICYmIGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkgewoJCXVuc2lnbmVkIGludCB0bXAgPSBmbGFnczsKCgkJZmxhZ3MgJj0gfihSQURFT05fRlJPTlQgfCBSQURFT05fQkFDSyk7CgkJaWYgKHRtcCAmIFJBREVPTl9GUk9OVCkKCQkJZmxhZ3MgfD0gUkFERU9OX0JBQ0s7CgkJaWYgKHRtcCAmIFJBREVPTl9CQUNLKQoJCQlmbGFncyB8PSBSQURFT05fRlJPTlQ7Cgl9CgoJaWYgKGZsYWdzICYgKFJBREVPTl9GUk9OVCB8IFJBREVPTl9CQUNLKSkgewoKCQlCRUdJTl9SSU5HKDQpOwoKCQkvKiBFbnN1cmUgdGhlIDNEIHN0cmVhbSBpcyBpZGxlIGJlZm9yZSBkb2luZyBhCgkJICogMkQgZmlsbCB0byBjbGVhciB0aGUgZnJvbnQgb3IgYmFjayBidWZmZXIuCgkJICovCgkJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOwoKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9EUF9XUklURV9NQVNLLCAwKSk7CgkJT1VUX1JJTkcoY2xlYXItPmNvbG9yX21hc2spOwoKCQlBRFZBTkNFX1JJTkcoKTsKCgkJLyogTWFrZSBzdXJlIHdlIHJlc3RvcmUgdGhlIDNEIHN0YXRlIG5leHQgdGltZS4KCQkgKi8KCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKCgkJZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgewoJCQlpbnQgeCA9IHBib3hbaV0ueDE7CgkJCWludCB5ID0gcGJveFtpXS55MTsKCQkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKCQkJaW50IGggPSBwYm94W2ldLnkyIC0geTsKCgkJCURSTV9ERUJVRygiZGlzcGF0Y2ggY2xlYXIgJWQsJWQtJWQsJWQgZmxhZ3MgMHgleFxuIiwKCQkJCSAgeCwgeSwgdywgaCwgZmxhZ3MpOwoKCQkJaWYgKGZsYWdzICYgUkFERU9OX0ZST05UKSB7CgkJCQlCRUdJTl9SSU5HKDYpOwoKCQkJCU9VVF9SSU5HKENQX1BBQ0tFVDMKCQkJCQkgKFJBREVPTl9DTlRMX1BBSU5UX01VTFRJLCA0KSk7CgkJCQlPVVRfUklORyhSQURFT05fR01DX0RTVF9QSVRDSF9PRkZTRVRfQ05UTCB8CgkJCQkJIFJBREVPTl9HTUNfQlJVU0hfU09MSURfQ09MT1IgfAoJCQkJCSAoZGV2X3ByaXYtPgoJCQkJCSAgY29sb3JfZm10IDw8IDgpIHwKCQkJCQkgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAoJCQkJCSBSQURFT05fUk9QM19QIHwKCQkJCQkgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTKTsKCgkJCQlPVVRfUklORyhkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0KTsKCQkJCU9VVF9SSU5HKGNsZWFyLT5jbGVhcl9jb2xvcik7CgoJCQkJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CgkJCQlPVVRfUklORygodyA8PCAxNikgfCBoKTsKCgkJCQlBRFZBTkNFX1JJTkcoKTsKCQkJfQoKCQkJaWYgKGZsYWdzICYgUkFERU9OX0JBQ0spIHsKCQkJCUJFR0lOX1JJTkcoNik7CgoJCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMwoJCQkJCSAoUkFERU9OX0NOVExfUEFJTlRfTVVMVEksIDQpKTsKCQkJCU9VVF9SSU5HKFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJCQkgUkFERU9OX0dNQ19CUlVTSF9TT0xJRF9DT0xPUiB8CgkJCQkJIChkZXZfcHJpdi0+CgkJCQkJICBjb2xvcl9mbXQgPDwgOCkgfAoJCQkJCSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CgkJCQkJIFJBREVPTl9ST1AzX1AgfAoJCQkJCSBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMpOwoKCQkJCU9VVF9SSU5HKGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCk7CgkJCQlPVVRfUklORyhjbGVhci0+Y2xlYXJfY29sb3IpOwoKCQkJCU9VVF9SSU5HKCh4IDw8IDE2KSB8IHkpOwoJCQkJT1VUX1JJTkcoKHcgPDwgMTYpIHwgaCk7CgoJCQkJQURWQU5DRV9SSU5HKCk7CgkJCX0KCQl9Cgl9CgoJLyogaHlwZXIgeiBjbGVhciAqLwoJLyogbm8gZG9jcyBhdmFpbGFibGUsIGJhc2VkIG9uIHJldmVyc2UgZW5nZW5lZXJpbmcgYnkgU3RlcGhhbmUgTWFyY2hlc2luICovCglpZiAoKGZsYWdzICYgKFJBREVPTl9ERVBUSCB8IFJBREVPTl9TVEVOQ0lMKSkKCSAgICAmJiAoZmxhZ3MgJiBSQURFT05fQ0xFQVJfRkFTVFopKSB7CgoJCWludCBpOwoJCWludCBkZXB0aHBpeHBlcmxpbmUgPQoJCSAgICBkZXZfcHJpdi0+ZGVwdGhfZm10ID09CgkJICAgIFJBREVPTl9ERVBUSF9GT1JNQVRfMTZCSVRfSU5UX1ogPyAoZGV2X3ByaXYtPmRlcHRoX3BpdGNoIC8KCQkJCQkJICAgICAgIDIpIDogKGRldl9wcml2LT4KCQkJCQkJCSAgICAgZGVwdGhfcGl0Y2ggLyA0KTsKCgkJdTMyIGNsZWFybWFzazsKCgkJdTMyIHRlbXBSQjNEX0RFUFRIQ0xFQVJWQUxVRSA9IGNsZWFyLT5jbGVhcl9kZXB0aCB8CgkJICAgICgoY2xlYXItPmRlcHRoX21hc2sgJiAweGZmKSA8PCAyNCk7CgoJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCgkJICogd2UgaGF2ZW4ndCB0b3VjaGVkIGFueSAibm9ybWFsIiBzdGF0ZSAtIHN0aWxsIG5lZWQgdGhpcz8KCQkgKi8KCQlkZXZfcHJpdi0+c2FyZWFfcHJpdi0+Y3R4X293bmVyID0gMDsKCgkJaWYgKChkZXZfcHJpdi0+ZmxhZ3MgJiBDSElQX0hBU19ISUVSWikKCQkgICAgJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpIHsKCQkJLyogRklYTUUgOiByZXZlcnNlIGVuZ2luZWVyIHRoYXQgZm9yIFJ4MDAgY2FyZHMgKi8KCQkJLyogRklYTUUgOiB0aGUgbWFzayBzdXBwb3NlZGx5IGNvbnRhaW5zIGxvdy1yZXMgeiB2YWx1ZXMuIFNvIGNhbid0IHNldAoJCQkgICBqdXN0IHRvIHRoZSBtYXggKDB4ZmY/IG9yIGFjdHVhbGx5IDB4M2ZmZj8pLCBuZWVkIHRvIHRha2UgeiBjbGVhcgoJCQkgICB2YWx1ZSBpbnRvIGFjY291bnQ/ICovCgkJCS8qIHBhdHRlcm4gc2VlbXMgdG8gd29yayBmb3IgcjEwMCwgdGhvdWdoIGdldCBzbGlnaHQKCQkJICAgcmVuZGVyaW5nIGVycm9ycyB3aXRoIGdseGdlYXJzLiBJZiBoaWVyeiBpcyBub3QgZW5hYmxlZCBmb3IgcjEwMCwKCQkJICAgb25seSA0IGJpdHMgd2hpY2ggaW5kaWNhdGUgY2xlYXIgKDE1LDE2LDMxLDMyLCBhbGwgemVybykgbWF0dGVyLCB0aGUKCQkJICAgb3RoZXIgb25lcyBhcmUgaWdub3JlZCwgYW5kIHRoZSBzYW1lIGNsZWFyIG1hc2sgY2FuIGJlIHVzZWQuIFRoYXQncwoJCQkgICB2ZXJ5IGRpZmZlcmVudCBiZWhhdmlvdXIgdGhhbiBSMjAwIHdoaWNoIG5lZWRzIGRpZmZlcmVudCBjbGVhciBtYXNrCgkJCSAgIGFuZCBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyIGlmIGhpZXJ6IGlzIGVuYWJsZWQgb3Igbm90ICE/IQoJCQkgKi8KCQkJY2xlYXJtYXNrID0gKDB4ZmYgPDwgMjIpIHwgKDB4ZmYgPDwgNikgfCAweDAwM2YwMDNmOwoJCX0gZWxzZSB7CgkJCS8qIGNsZWFyIG1hc2sgOiBjaG9vc2VzIHRoZSBjbGVhcmluZyBwYXR0ZXJuLgoJCQkgICBydjI1MDogY291bGQgYmUgdXNlZCB0byBjbGVhciBvbmx5IHBhcnRzIG9mIG1hY3JvdGlsZXMKCQkJICAgKGJ1dCB0aGF0IHdvdWxkIGdldCByZWFsbHkgY29tcGxpY2F0ZWQuLi4pPwoJCQkgICBiaXQgMCBhbmQgMSAoZWl0aGVyIG9yIGJvdGggb2YgdGhlbSA/IT8hKSBhcmUgdXNlZCB0bwoJCQkgICBub3QgY2xlYXIgdGlsZSAob3IgbWF5YmUgb25lIG9mIHRoZSBiaXRzIGluZGljYXRlcyBpZiB0aGUgdGlsZSBpcwoJCQkgICBjb21wcmVzc2VkIG9yIG5vdCksIGJpdCAyIGFuZCAzIHRvIG5vdCBjbGVhciB0aWxlIDEsLi4uLC4KCQkJICAgUGF0dGVybiBpcyBhcyBmb2xsb3dzOgoJCQkgICB8IDAsMSB8IDQsNSB8IDgsOSB8MTIsMTN8MTYsMTd8MjAsMjF8MjQsMjV8MjgsMjl8CgkJCSAgIGJpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJCQkgICB8IDIsMyB8IDYsNyB8MTAsMTF8MTQsMTV8MTgsMTl8MjIsMjN8MjYsMjd8MzAsMzF8CgkJCSAgIHJ2MTAwOiBjbGVhcm1hc2sgY292ZXJzIDJ4OCA0eDEgdGlsZXMsIGJ1dCBvbmUgY2xlYXIgc3RpbGwKCQkJICAgY292ZXJzIDI1NiBwaXhlbHMgPyE/CgkJCSAqLwoJCQljbGVhcm1hc2sgPSAweDA7CgkJfQoKCQlCRUdJTl9SSU5HKDgpOwoJCVJBREVPTl9XQUlUX1VOVElMXzJEX0lETEUoKTsKCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfREVQVEhDTEVBUlZBTFVFLAoJCQkgICAgIHRlbXBSQjNEX0RFUFRIQ0xFQVJWQUxVRSk7CgkJLyogd2hhdCBvZmZzZXQgaXMgdGhpcyBleGFjdGx5ID8gKi8KCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfWk1BU0tPRkZTRVQsIDApOwoJCS8qIG5lZWQgY3Rsc3RhdCwgb3RoZXJ3aXNlIGdldCBzb21lIHN0cmFuZ2UgYmxhY2sgZmxpY2tlcmluZyAqLwoJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9aQ0FDSEVfQ1RMU1RBVCwKCQkJICAgICBSQURFT05fUkIzRF9aQ19GTFVTSF9BTEwpOwoJCUFEVkFOQ0VfUklORygpOwoKCQlmb3IgKGkgPSAwOyBpIDwgbmJveDsgaSsrKSB7CgkJCWludCB0aWxlb2Zmc2V0LCBucnRpbGVzeCwgbnJ0aWxlc3ksIGo7CgkJCS8qIGl0IGxvb2tzIGxpa2UgcjIwMCBuZWVkcyBydi1zdHlsZSBjbGVhcnMsIGF0IGxlYXN0IGlmIGhpZXJ6IGlzIG5vdCBlbmFibGVkPyAqLwoJCQlpZiAoKGRldl9wcml2LT5mbGFncyAmIENISVBfSEFTX0hJRVJaKQoJCQkgICAgJiYgIShkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkpIHsKCQkJCS8qIEZJWE1FIDogZmlndXJlIHRoaXMgb3V0IGZvciByMjAwICh3aGVuIGhpZXJ6IGlzIGVuYWJsZWQpLiBPcgoJCQkJICAgbWF5YmUgcjIwMCBhY3R1YWxseSBkb2Vzbid0IG5lZWQgdG8gcHV0IHRoZSBsb3ctcmVzIHogdmFsdWUgaW50bwoJCQkJICAgdGhlIHRpbGUgY2FjaGUgbGlrZSByMTAwLCBidXQganVzdCBuZWVkcyB0byBjbGVhciB0aGUgaGktbGV2ZWwgei1idWZmZXI/CgkJCQkgICBXb3JrcyBmb3IgUjEwMCwgYm90aCB3aXRoIGhpZXJ6IGFuZCB3aXRob3V0LgoJCQkJICAgUjEwMCBzZWVtcyB0byBvcGVyYXRlIG9uIDJ4MSA4eDggdGlsZXMsIGJ1dC4uLgoJCQkJICAgb2RkOiBvZmZzZXQvbnJ0aWxlcyBuZWVkIHRvIGJlIDY0IHBpeCAoNCBibG9jaykgYWxpZ25lZD8gUG90ZW50aWFsbHkKCQkJCSAgIHByb2JsZW1hdGljIHdpdGggcmVzb2x1dGlvbnMgd2hpY2ggYXJlIG5vdCA2NCBwaXggYWxpZ25lZD8gKi8KCQkJCXRpbGVvZmZzZXQgPQoJCQkJICAgICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArCgkJCQkgICAgIHBib3hbaV0ueDEpID4+IDY7CgkJCQlucnRpbGVzeCA9CgkJCQkgICAgKChwYm94W2ldLngyICYgfjYzKSAtCgkJCQkgICAgIChwYm94W2ldLngxICYgfjYzKSkgPj4gNDsKCQkJCW5ydGlsZXN5ID0KCQkJCSAgICAocGJveFtpXS55MiA+PiAzKSAtIChwYm94W2ldLnkxID4+IDMpOwoJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CgkJCQkJQkVHSU5fUklORyg0KTsKCQkJCQlPVVRfUklORyhDUF9QQUNLRVQzCgkJCQkJCSAoUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyKSk7CgkJCQkJLyogZmlyc3QgdGlsZSAqLwoJCQkJCU9VVF9SSU5HKHRpbGVvZmZzZXQgKiA4KTsKCQkJCQkvKiB0aGUgbnVtYmVyIG9mIHRpbGVzIHRvIGNsZWFyICovCgkJCQkJT1VUX1JJTkcobnJ0aWxlc3ggKyA0KTsKCQkJCQkvKiBjbGVhciBtYXNrIDogY2hvb3NlcyB0aGUgY2xlYXJpbmcgcGF0dGVybi4gKi8KCQkJCQlPVVRfUklORyhjbGVhcm1hc2spOwoJCQkJCUFEVkFOQ0VfUklORygpOwoJCQkJCXRpbGVvZmZzZXQgKz0gZGVwdGhwaXhwZXJsaW5lID4+IDY7CgkJCQl9CgkJCX0gZWxzZSBpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IyMDApIHsKCQkJCS8qIHdvcmtzIGZvciBydjI1MC4gKi8KCQkJCS8qIGZpbmQgZmlyc3QgbWFjcm8gdGlsZSAoOHgyIDR4NCB6LXBpeGVscyBvbiBydjI1MCkgKi8KCQkJCXRpbGVvZmZzZXQgPQoJCQkJICAgICgocGJveFtpXS55MSA+PiAzKSAqIGRlcHRocGl4cGVybGluZSArCgkJCQkgICAgIHBib3hbaV0ueDEpID4+IDU7CgkJCQlucnRpbGVzeCA9CgkJCQkgICAgKHBib3hbaV0ueDIgPj4gNSkgLSAocGJveFtpXS54MSA+PiA1KTsKCQkJCW5ydGlsZXN5ID0KCQkJCSAgICAocGJveFtpXS55MiA+PiAzKSAtIChwYm94W2ldLnkxID4+IDMpOwoJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CgkJCQkJQkVHSU5fUklORyg0KTsKCQkJCQlPVVRfUklORyhDUF9QQUNLRVQzCgkJCQkJCSAoUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyKSk7CgkJCQkJLyogZmlyc3QgdGlsZSAqLwoJCQkJCS8qIGp1ZGdpbmcgYnkgdGhlIGZpcnN0IHRpbGUgb2Zmc2V0IG5lZWRlZCwgY291bGQgcG9zc2libHkKCQkJCQkgICBkaXJlY3RseSBhZGRyZXNzL2NsZWFyIDR4NCB0aWxlcyBpbnN0ZWFkIG9mIDh4MiAqIDR4NAoJCQkJCSAgIG1hY3JvIHRpbGVzLCB0aG91Z2ggd291bGQgc3RpbGwgbmVlZCBjbGVhciBtYXNrIGZvcgoJCQkJCSAgIHJpZ2h0L2JvdHRvbSBpZiB0cnVlbHkgNHg0IGdyYW51bGFyaXR5IGlzIGRlc2lyZWQgPyAqLwoJCQkJCU9VVF9SSU5HKHRpbGVvZmZzZXQgKiAxNik7CgkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLwoJCQkJCU9VVF9SSU5HKG5ydGlsZXN4ICsgMSk7CgkJCQkJLyogY2xlYXIgbWFzayA6IGNob29zZXMgdGhlIGNsZWFyaW5nIHBhdHRlcm4uICovCgkJCQkJT1VUX1JJTkcoY2xlYXJtYXNrKTsKCQkJCQlBRFZBTkNFX1JJTkcoKTsKCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA1OwoJCQkJfQoJCQl9IGVsc2UgewkvKiBydiAxMDAgKi8KCQkJCS8qIHJ2MTAwIG1pZ2h0IG5vdCBuZWVkIDY0IHBpeCBhbGlnbm1lbnQsIHdobyBrbm93cyAqLwoJCQkJLyogb2Zmc2V0cyBhcmUsIGhtbSwgd2VpcmQgKi8KCQkJCXRpbGVvZmZzZXQgPQoJCQkJICAgICgocGJveFtpXS55MSA+PiA0KSAqIGRlcHRocGl4cGVybGluZSArCgkJCQkgICAgIHBib3hbaV0ueDEpID4+IDY7CgkJCQlucnRpbGVzeCA9CgkJCQkgICAgKChwYm94W2ldLngyICYgfjYzKSAtCgkJCQkgICAgIChwYm94W2ldLngxICYgfjYzKSkgPj4gNDsKCQkJCW5ydGlsZXN5ID0KCQkJCSAgICAocGJveFtpXS55MiA+PiA0KSAtIChwYm94W2ldLnkxID4+IDQpOwoJCQkJZm9yIChqID0gMDsgaiA8PSBucnRpbGVzeTsgaisrKSB7CgkJCQkJQkVHSU5fUklORyg0KTsKCQkJCQlPVVRfUklORyhDUF9QQUNLRVQzCgkJCQkJCSAoUkFERU9OXzNEX0NMRUFSX1pNQVNLLCAyKSk7CgkJCQkJT1VUX1JJTkcodGlsZW9mZnNldCAqIDEyOCk7CgkJCQkJLyogdGhlIG51bWJlciBvZiB0aWxlcyB0byBjbGVhciAqLwoJCQkJCU9VVF9SSU5HKG5ydGlsZXN4ICsgNCk7CgkJCQkJLyogY2xlYXIgbWFzayA6IGNob29zZXMgdGhlIGNsZWFyaW5nIHBhdHRlcm4uICovCgkJCQkJT1VUX1JJTkcoY2xlYXJtYXNrKTsKCQkJCQlBRFZBTkNFX1JJTkcoKTsKCQkJCQl0aWxlb2Zmc2V0ICs9IGRlcHRocGl4cGVybGluZSA+PiA2OwoJCQkJfQoJCQl9CgkJfQoKCQkvKiBUT0RPIGRvbid0IGFsd2F5cyBjbGVhciBhbGwgaGktbGV2ZWwgeiB0aWxlcyAqLwoJCWlmICgoZGV2X3ByaXYtPmZsYWdzICYgQ0hJUF9IQVNfSElFUlopCgkJICAgICYmIChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkKCQkgICAgJiYgKGZsYWdzICYgUkFERU9OX1VTRV9ISUVSWikpCgkJCS8qIHIxMDAgYW5kIGNhcmRzIHdpdGhvdXQgaGllcmFyY2hpY2FsIHotYnVmZmVyIGhhdmUgbm8gaGlnaC1sZXZlbCB6LWJ1ZmZlciAqLwoJCQkvKiBGSVhNRSA6IHRoZSBtYXNrIHN1cHBvc2VkbHkgY29udGFpbnMgbG93LXJlcyB6IHZhbHVlcy4gU28gY2FuJ3Qgc2V0CgkJCSAgIGp1c3QgdG8gdGhlIG1heCAoMHhmZj8gb3IgYWN0dWFsbHkgMHgzZmZmPyksIG5lZWQgdG8gdGFrZSB6IGNsZWFyCgkJCSAgIHZhbHVlIGludG8gYWNjb3VudD8gKi8KCQl7CgkJCUJFR0lOX1JJTkcoNCk7CgkJCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OXzNEX0NMRUFSX0hJWiwgMikpOwoJCQlPVVRfUklORygweDApOwkvKiBGaXJzdCB0aWxlICovCgkJCU9VVF9SSU5HKDB4M2NjMCk7CgkJCU9VVF9SSU5HKCgweGZmIDw8IDIyKSB8ICgweGZmIDw8IDYpIHwgMHgwMDNmMDAzZik7CgkJCUFEVkFOQ0VfUklORygpOwoJCX0KCX0KCgkvKiBXZSBoYXZlIHRvIGNsZWFyIHRoZSBkZXB0aCBhbmQvb3Igc3RlbmNpbCBidWZmZXJzIGJ5CgkgKiByZW5kZXJpbmcgYSBxdWFkIGludG8ganVzdCB0aG9zZSBidWZmZXJzLiAgVGh1cywgd2UgaGF2ZSB0bwoJICogbWFrZSBzdXJlIHRoZSAzRCBlbmdpbmUgaXMgY29uZmlndXJlZCBjb3JyZWN0bHkuCgkgKi8KCWVsc2UgaWYgKChkZXZfcHJpdi0+bWljcm9jb2RlX3ZlcnNpb24gPT0gVUNPREVfUjIwMCkgJiYKCQkoZmxhZ3MgJiAoUkFERU9OX0RFUFRIIHwgUkFERU9OX1NURU5DSUwpKSkgewoKCQlpbnQgdGVtcFBQX0NOVEw7CgkJaW50IHRlbXBSRV9DTlRMOwoJCWludCB0ZW1wUkIzRF9DTlRMOwoJCWludCB0ZW1wUkIzRF9aU1RFTkNJTENOVEw7CgkJaW50IHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLOwoJCWludCB0ZW1wUkIzRF9QTEFORU1BU0s7CgkJaW50IHRlbXBTRV9DTlRMOwoJCWludCB0ZW1wU0VfVlRFX0NOVEw7CgkJaW50IHRlbXBTRV9WVFhfRk1UXzA7CgkJaW50IHRlbXBTRV9WVFhfRk1UXzE7CgkJaW50IHRlbXBTRV9WQVBfQ05UTDsKCQlpbnQgdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEw7CgoJCXRlbXBQUF9DTlRMID0gMDsKCQl0ZW1wUkVfQ05UTCA9IDA7CgoJCXRlbXBSQjNEX0NOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF9jbnRsOwoKCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF96c3RlbmNpbGNudGw7CgkJdGVtcFJCM0RfU1RFTkNJTFJFRk1BU0sgPSAweDA7CgoJCXRlbXBTRV9DTlRMID0gZGVwdGhfY2xlYXItPnNlX2NudGw7CgoJCS8qIERpc2FibGUgVENMICovCgoJCXRlbXBTRV9WQVBfQ05UTCA9ICgJLyogU0VfVkFQX0NOVExfX0ZPUkNFX1dfVE9fT05FX01BU0sgfCAgKi8KCQkJCQkgICgweDkgPDwKCQkJCQkgICBTRV9WQVBfQ05UTF9fVkZfTUFYX1ZUWF9OVU1fX1NISUZUKSk7CgoJCXRlbXBSQjNEX1BMQU5FTUFTSyA9IDB4MDsKCgkJdGVtcFJFX0FVWF9TQ0lTU09SX0NOVEwgPSAweDA7CgoJCXRlbXBTRV9WVEVfQ05UTCA9CgkJICAgIFNFX1ZURV9DTlRMX19WVFhfWFlfRk1UX01BU0sgfCBTRV9WVEVfQ05UTF9fVlRYX1pfRk1UX01BU0s7CgoJCS8qIFZlcnRleCBmb3JtYXQgKFgsIFksIFosIFcpICovCgkJdGVtcFNFX1ZUWF9GTVRfMCA9CgkJICAgIFNFX1ZUWF9GTVRfMF9fVlRYX1owX1BSRVNFTlRfTUFTSyB8CgkJICAgIFNFX1ZUWF9GTVRfMF9fVlRYX1cwX1BSRVNFTlRfTUFTSzsKCQl0ZW1wU0VfVlRYX0ZNVF8xID0gMHgwOwoKCQkvKgoJCSAqIERlcHRoIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCgkJICovCgkJaWYgKGZsYWdzICYgUkFERU9OX0RFUFRIKSB7CgkJCS8qIEVuYWJsZSBkZXB0aCBidWZmZXIgKi8KCQkJdGVtcFJCM0RfQ05UTCB8PSBSQURFT05fWl9FTkFCTEU7CgkJfSBlbHNlIHsKCQkJLyogRGlzYWJsZSBkZXB0aCBidWZmZXIgKi8KCQkJdGVtcFJCM0RfQ05UTCAmPSB+UkFERU9OX1pfRU5BQkxFOwoJCX0KCgkJLyoKCQkgKiBTdGVuY2lsIGJ1ZmZlciBzcGVjaWZpYyBlbmFibGVzCgkJICovCgkJaWYgKGZsYWdzICYgUkFERU9OX1NURU5DSUwpIHsKCQkJdGVtcFJCM0RfQ05UTCB8PSBSQURFT05fU1RFTkNJTF9FTkFCTEU7CgkJCXRlbXBSQjNEX1NURU5DSUxSRUZNQVNLID0gY2xlYXItPmRlcHRoX21hc2s7CgkJfSBlbHNlIHsKCQkJdGVtcFJCM0RfQ05UTCAmPSB+UkFERU9OX1NURU5DSUxfRU5BQkxFOwoJCQl0ZW1wUkIzRF9TVEVOQ0lMUkVGTUFTSyA9IDB4MDAwMDAwMDA7CgkJfQoKCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0NPTVBfWkJVRikgewoJCQl0ZW1wUkIzRF9aU1RFTkNJTENOVEwgfD0gUkFERU9OX1pfQ09NUFJFU1NJT05fRU5BQkxFIHwKCQkJICAgIFJBREVPTl9aX0RFQ09NUFJFU1NJT05fRU5BQkxFOwoJCX0KCQlpZiAoZmxhZ3MgJiBSQURFT05fVVNFX0hJRVJaKSB7CgkJCXRlbXBSQjNEX1pTVEVOQ0lMQ05UTCB8PSBSQURFT05fWl9ISUVSQVJDSFlfRU5BQkxFOwoJCX0KCgkJQkVHSU5fUklORygyNik7CgkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoKCQlPVVRfUklOR19SRUcoUkFERU9OX1BQX0NOVEwsIHRlbXBQUF9DTlRMKTsKCQlPVVRfUklOR19SRUcoUjIwMF9SRV9DTlRMLCB0ZW1wUkVfQ05UTCk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX0NOVEwsIHRlbXBSQjNEX0NOVEwpOwoJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9aU1RFTkNJTENOVEwsIHRlbXBSQjNEX1pTVEVOQ0lMQ05UTCk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1NURU5DSUxSRUZNQVNLLAoJCQkgICAgIHRlbXBSQjNEX1NURU5DSUxSRUZNQVNLKTsKCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfUExBTkVNQVNLLCB0ZW1wUkIzRF9QTEFORU1BU0spOwoJCU9VVF9SSU5HX1JFRyhSQURFT05fU0VfQ05UTCwgdGVtcFNFX0NOVEwpOwoJCU9VVF9SSU5HX1JFRyhSMjAwX1NFX1ZURV9DTlRMLCB0ZW1wU0VfVlRFX0NOVEwpOwoJCU9VVF9SSU5HX1JFRyhSMjAwX1NFX1ZUWF9GTVRfMCwgdGVtcFNFX1ZUWF9GTVRfMCk7CgkJT1VUX1JJTkdfUkVHKFIyMDBfU0VfVlRYX0ZNVF8xLCB0ZW1wU0VfVlRYX0ZNVF8xKTsKCQlPVVRfUklOR19SRUcoUjIwMF9TRV9WQVBfQ05UTCwgdGVtcFNFX1ZBUF9DTlRMKTsKCQlPVVRfUklOR19SRUcoUjIwMF9SRV9BVVhfU0NJU1NPUl9DTlRMLCB0ZW1wUkVfQVVYX1NDSVNTT1JfQ05UTCk7CgkJQURWQU5DRV9SSU5HKCk7CgoJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCgkJICovCgkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CgoJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKCgkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0KCQkJICogIHNldHMgdG9wLWxlZnQ/CgkJCSAqLwoJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CgoJCQlCRUdJTl9SSU5HKDE0KTsKCQkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSMjAwXzNEX0RSQVdfSU1NRF8yLCAxMikpOwoJCQlPVVRfUklORygoUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1QgfAoJCQkJICBSQURFT05fUFJJTV9XQUxLX1JJTkcgfAoJCQkJICAoMyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSkpOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMV0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMV0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0pOwoJCQlPVVRfUklORygweDNmODAwMDAwKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTJdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdKTsKCQkJT1VUX1JJTkcoMHgzZjgwMDAwMCk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gyXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSk7CgkJCU9VVF9SSU5HKDB4M2Y4MDAwMDApOwoJCQlBRFZBTkNFX1JJTkcoKTsKCQl9Cgl9IGVsc2UgaWYgKChmbGFncyAmIChSQURFT05fREVQVEggfCBSQURFT05fU1RFTkNJTCkpKSB7CgoJCWludCB0ZW1wUkIzRF9aU1RFTkNJTENOVEwgPSBkZXB0aF9jbGVhci0+cmIzZF96c3RlbmNpbGNudGw7CgoJCXJiM2RfY250bCA9IGRlcHRoX2NsZWFyLT5yYjNkX2NudGw7CgoJCWlmIChmbGFncyAmIFJBREVPTl9ERVBUSCkgewoJCQlyYjNkX2NudGwgfD0gUkFERU9OX1pfRU5BQkxFOwoJCX0gZWxzZSB7CgkJCXJiM2RfY250bCAmPSB+UkFERU9OX1pfRU5BQkxFOwoJCX0KCgkJaWYgKGZsYWdzICYgUkFERU9OX1NURU5DSUwpIHsKCQkJcmIzZF9jbnRsIHw9IFJBREVPTl9TVEVOQ0lMX0VOQUJMRTsKCQkJcmIzZF9zdGVuY2lscmVmbWFzayA9IGNsZWFyLT5kZXB0aF9tYXNrOwkvKiBtaXNuYW1lZCBmaWVsZCAqLwoJCX0gZWxzZSB7CgkJCXJiM2RfY250bCAmPSB+UkFERU9OX1NURU5DSUxfRU5BQkxFOwoJCQlyYjNkX3N0ZW5jaWxyZWZtYXNrID0gMHgwMDAwMDAwMDsKCQl9CgoJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfQ09NUF9aQlVGKSB7CgkJCXRlbXBSQjNEX1pTVEVOQ0lMQ05UTCB8PSBSQURFT05fWl9DT01QUkVTU0lPTl9FTkFCTEUgfAoJCQkgICAgUkFERU9OX1pfREVDT01QUkVTU0lPTl9FTkFCTEU7CgkJfQoJCWlmIChmbGFncyAmIFJBREVPTl9VU0VfSElFUlopIHsKCQkJdGVtcFJCM0RfWlNURU5DSUxDTlRMIHw9IFJBREVPTl9aX0hJRVJBUkNIWV9FTkFCTEU7CgkJfQoKCQlCRUdJTl9SSU5HKDEzKTsKCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CgoJCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1BQX0NOVEwsIDEpKTsKCQlPVVRfUklORygweDAwMDAwMDAwKTsKCQlPVVRfUklORyhyYjNkX2NudGwpOwoKCQlPVVRfUklOR19SRUcoUkFERU9OX1JCM0RfWlNURU5DSUxDTlRMLCB0ZW1wUkIzRF9aU1RFTkNJTENOVEwpOwoJCU9VVF9SSU5HX1JFRyhSQURFT05fUkIzRF9TVEVOQ0lMUkVGTUFTSywgcmIzZF9zdGVuY2lscmVmbWFzayk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9SQjNEX1BMQU5FTUFTSywgMHgwMDAwMDAwMCk7CgkJT1VUX1JJTkdfUkVHKFJBREVPTl9TRV9DTlRMLCBkZXB0aF9jbGVhci0+c2VfY250bCk7CgkJQURWQU5DRV9SSU5HKCk7CgoJCS8qIE1ha2Ugc3VyZSB3ZSByZXN0b3JlIHRoZSAzRCBzdGF0ZSBuZXh0IHRpbWUuCgkJICovCgkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmN0eF9vd25lciA9IDA7CgoJCWZvciAoaSA9IDA7IGkgPCBuYm94OyBpKyspIHsKCgkJCS8qIEZ1bm55IHRoYXQgdGhpcyBzaG91bGQgYmUgcmVxdWlyZWQgLS0KCQkJICogIHNldHMgdG9wLWxlZnQ/CgkJCSAqLwoJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CgoJCQlCRUdJTl9SSU5HKDE1KTsKCgkJCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OXzNEX0RSQVdfSU1NRCwgMTMpKTsKCQkJT1VUX1JJTkcoUkFERU9OX1ZUWF9aX1BSRVNFTlQgfAoJCQkJIFJBREVPTl9WVFhfUEtDT0xPUl9QUkVTRU5UKTsKCQkJT1VUX1JJTkcoKFJBREVPTl9QUklNX1RZUEVfUkVDVF9MSVNUIHwKCQkJCSAgUkFERU9OX1BSSU1fV0FMS19SSU5HIHwKCQkJCSAgUkFERU9OX01BT1NfRU5BQkxFIHwKCQkJCSAgUkFERU9OX1ZUWF9GTVRfUkFERU9OX01PREUgfAoJCQkJICAoMyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSkpOwoKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWDFdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfWTFdKTsKCQkJT1VUX1JJTkcoZGVwdGhfYm94ZXNbaV0udWlbQ0xFQVJfREVQVEhdKTsKCQkJT1VUX1JJTkcoMHgwKTsKCgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1gxXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX1kyXSk7CgkJCU9VVF9SSU5HKGRlcHRoX2JveGVzW2ldLnVpW0NMRUFSX0RFUFRIXSk7CgkJCU9VVF9SSU5HKDB4MCk7CgoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9YMl0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ZMl0pOwoJCQlPVVRfUklORyhkZXB0aF9ib3hlc1tpXS51aVtDTEVBUl9ERVBUSF0pOwoJCQlPVVRfUklORygweDApOwoKCQkJQURWQU5DRV9SSU5HKCk7CgkJfQoJfQoKCS8qIEluY3JlbWVudCB0aGUgY2xlYXIgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAoJICogd2FpdCBvbiB0aGlzIHZhbHVlIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBjbGVhciBpb2N0bC4gIFdlCgkgKiBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY2FyZCdzIHNvIGRhbW5lZCBmYXN0Li4uCgkgKi8KCWRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKys7CgoJQkVHSU5fUklORyg0KTsKCglSQURFT05fQ0xFQVJfQUdFKGRldl9wcml2LT5zYXJlYV9wcml2LT5sYXN0X2NsZWFyKTsKCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKCglBRFZBTkNFX1JJTkcoKTsKfQoKc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoZHJtX2RldmljZV90ICogZGV2KQp7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CglpbnQgbmJveCA9IHNhcmVhX3ByaXYtPm5ib3g7Cglkcm1fY2xpcF9yZWN0X3QgKnBib3ggPSBzYXJlYV9wcml2LT5ib3hlczsKCWludCBpOwoJUklOR19MT0NBTFM7CglEUk1fREVCVUcoIlxuIik7CgoJLyogRG8gc29tZSB0cml2aWFsIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuLi4KCSAqLwoJaWYgKGRldl9wcml2LT5kb19ib3hlcykKCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZGV2X3ByaXYpOwoKCS8qIFdhaXQgZm9yIHRoZSAzRCBzdHJlYW0gdG8gaWRsZSBiZWZvcmUgZGlzcGF0Y2hpbmcgdGhlIGJpdGJsdC4KCSAqIFRoaXMgd2lsbCBwcmV2ZW50IGRhdGEgY29ycnVwdGlvbiBiZXR3ZWVuIHRoZSB0d28gc3RyZWFtcy4KCSAqLwoJQkVHSU5fUklORygyKTsKCglSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CgoJQURWQU5DRV9SSU5HKCk7CgoJZm9yIChpID0gMDsgaSA8IG5ib3g7IGkrKykgewoJCWludCB4ID0gcGJveFtpXS54MTsKCQlpbnQgeSA9IHBib3hbaV0ueTE7CgkJaW50IHcgPSBwYm94W2ldLngyIC0geDsKCQlpbnQgaCA9IHBib3hbaV0ueTIgLSB5OwoKCQlEUk1fREVCVUcoImRpc3BhdGNoIHN3YXAgJWQsJWQtJWQsJWRcbiIsIHgsIHksIHcsIGgpOwoKCQlCRUdJTl9SSU5HKDcpOwoKCQlPVVRfUklORyhDUF9QQUNLRVQzKFJBREVPTl9DTlRMX0JJVEJMVF9NVUxUSSwgNSkpOwoJCU9VVF9SSU5HKFJBREVPTl9HTUNfU1JDX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJIFJBREVPTl9HTUNfRFNUX1BJVENIX09GRlNFVF9DTlRMIHwKCQkJIFJBREVPTl9HTUNfQlJVU0hfTk9ORSB8CgkJCSAoZGV2X3ByaXYtPmNvbG9yX2ZtdCA8PCA4KSB8CgkJCSBSQURFT05fR01DX1NSQ19EQVRBVFlQRV9DT0xPUiB8CgkJCSBSQURFT05fUk9QM19TIHwKCQkJIFJBREVPTl9EUF9TUkNfU09VUkNFX01FTU9SWSB8CgkJCSBSQURFT05fR01DX0NMUl9DTVBfQ05UTF9ESVMgfCBSQURFT05fR01DX1dSX01TS19ESVMpOwoKCQkvKiBNYWtlIHRoaXMgd29yayBldmVuIGlmIGZyb250ICYgYmFjayBhcmUgZmxpcHBlZDoKCQkgKi8KCQlpZiAoZGV2X3ByaXYtPmN1cnJlbnRfcGFnZSA9PSAwKSB7CgkJCU9VVF9SSU5HKGRldl9wcml2LT5iYWNrX3BpdGNoX29mZnNldCk7CgkJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOwoJCX0gZWxzZSB7CgkJCU9VVF9SSU5HKGRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQpOwoJCQlPVVRfUklORyhkZXZfcHJpdi0+YmFja19waXRjaF9vZmZzZXQpOwoJCX0KCgkJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CgkJT1VUX1JJTkcoKHggPDwgMTYpIHwgeSk7CgkJT1VUX1JJTkcoKHcgPDwgMTYpIHwgaCk7CgoJCUFEVkFOQ0VfUklORygpOwoJfQoKCS8qIEluY3JlbWVudCB0aGUgZnJhbWUgY291bnRlci4gIFRoZSBjbGllbnQtc2lkZSAzRCBkcml2ZXIgbXVzdAoJICogdGhyb3R0bGUgdGhlIGZyYW1lcmF0ZSBieSB3YWl0aW5nIGZvciB0aGlzIHZhbHVlIGJlZm9yZQoJICogcGVyZm9ybWluZyB0aGUgc3dhcGJ1ZmZlciBpb2N0bC4KCSAqLwoJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUrKzsKCglCRUdJTl9SSU5HKDQpOwoKCVJBREVPTl9GUkFNRV9BR0UoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUpOwoJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoKCUFEVkFOQ0VfUklORygpOwp9CgpzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fc2FyZWFfdCAqc2FyZWEgPSAoZHJtX3NhcmVhX3QgKikgZGV2X3ByaXYtPnNhcmVhLT5oYW5kbGU7CglpbnQgb2Zmc2V0ID0gKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgPT0gMSkKCSAgICA/IGRldl9wcml2LT5mcm9udF9vZmZzZXQgOiBkZXZfcHJpdi0+YmFja19vZmZzZXQ7CglSSU5HX0xPQ0FMUzsKCURSTV9ERUJVRygiJXM6IHBhZ2U9JWQgcGZDdXJyZW50UGFnZT0lZFxuIiwKCQkgIF9fRlVOQ1RJT05fXywKCQkgIGRldl9wcml2LT5jdXJyZW50X3BhZ2UsIGRldl9wcml2LT5zYXJlYV9wcml2LT5wZkN1cnJlbnRQYWdlKTsKCgkvKiBEbyBzb21lIHRyaXZpYWwgcGVyZm9ybWFuY2UgbW9uaXRvcmluZy4uLgoJICovCglpZiAoZGV2X3ByaXYtPmRvX2JveGVzKSB7CgkJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfRkxJUDsKCQlyYWRlb25fY3BfcGVyZm9ybWFuY2VfYm94ZXMoZGV2X3ByaXYpOwoJfQoKCS8qIFVwZGF0ZSB0aGUgZnJhbWUgb2Zmc2V0cyBmb3IgYm90aCBDUlRDcwoJICovCglCRUdJTl9SSU5HKDYpOwoKCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKCU9VVF9SSU5HX1JFRyhSQURFT05fQ1JUQ19PRkZTRVQsCgkJICAgICAoKHNhcmVhLT5mcmFtZS55ICogZGV2X3ByaXYtPmZyb250X3BpdGNoICsKCQkgICAgICAgc2FyZWEtPmZyYW1lLnggKiAoZGV2X3ByaXYtPmNvbG9yX2ZtdCAtIDIpKSAmIH43KQoJCSAgICAgKyBvZmZzZXQpOwoJT1VUX1JJTkdfUkVHKFJBREVPTl9DUlRDMl9PRkZTRVQsIGRldl9wcml2LT5zYXJlYV9wcml2LT5jcnRjMl9iYXNlCgkJICAgICArIG9mZnNldCk7CgoJQURWQU5DRV9SSU5HKCk7CgoJLyogSW5jcmVtZW50IHRoZSBmcmFtZSBjb3VudGVyLiAgVGhlIGNsaWVudC1zaWRlIDNEIGRyaXZlciBtdXN0CgkgKiB0aHJvdHRsZSB0aGUgZnJhbWVyYXRlIGJ5IHdhaXRpbmcgZm9yIHRoaXMgdmFsdWUgYmVmb3JlCgkgKiBwZXJmb3JtaW5nIHRoZSBzd2FwYnVmZmVyIGlvY3RsLgoJICovCglkZXZfcHJpdi0+c2FyZWFfcHJpdi0+bGFzdF9mcmFtZSsrOwoJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlID0KCSAgICAxIC0gZGV2X3ByaXYtPmN1cnJlbnRfcGFnZTsKCglCRUdJTl9SSU5HKDIpOwoKCVJBREVPTl9GUkFNRV9BR0UoZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZnJhbWUpOwoKCUFEVkFOQ0VfUklORygpOwp9CgpzdGF0aWMgaW50IGJhZF9wcmltX3ZlcnRleF9ucihpbnQgcHJpbWl0aXZlLCBpbnQgbnIpCnsKCXN3aXRjaCAocHJpbWl0aXZlICYgUkFERU9OX1BSSU1fVFlQRV9NQVNLKSB7CgljYXNlIFJBREVPTl9QUklNX1RZUEVfTk9ORToKCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9QT0lOVDoKCQlyZXR1cm4gbnIgPCAxOwoJY2FzZSBSQURFT05fUFJJTV9UWVBFX0xJTkU6CgkJcmV0dXJuIChuciAmIDEpIHx8IG5yID09IDA7CgljYXNlIFJBREVPTl9QUklNX1RZUEVfTElORV9TVFJJUDoKCQlyZXR1cm4gbnIgPCAyOwoJY2FzZSBSQURFT05fUFJJTV9UWVBFX1RSSV9MSVNUOgoJY2FzZSBSQURFT05fUFJJTV9UWVBFXzNWUlRfUE9JTlRfTElTVDoKCWNhc2UgUkFERU9OX1BSSU1fVFlQRV8zVlJUX0xJTkVfTElTVDoKCWNhc2UgUkFERU9OX1BSSU1fVFlQRV9SRUNUX0xJU1Q6CgkJcmV0dXJuIG5yICUgMyB8fCBuciA9PSAwOwoJY2FzZSBSQURFT05fUFJJTV9UWVBFX1RSSV9GQU46CgljYXNlIFJBREVPTl9QUklNX1RZUEVfVFJJX1NUUklQOgoJCXJldHVybiBuciA8IDM7CglkZWZhdWx0OgoJCXJldHVybiAxOwoJfQp9Cgp0eXBlZGVmIHN0cnVjdCB7Cgl1bnNpZ25lZCBpbnQgc3RhcnQ7Cgl1bnNpZ25lZCBpbnQgZmluaXNoOwoJdW5zaWduZWQgaW50IHByaW07Cgl1bnNpZ25lZCBpbnQgbnVtdmVydHM7Cgl1bnNpZ25lZCBpbnQgb2Zmc2V0OwoJdW5zaWduZWQgaW50IHZjX2Zvcm1hdDsKfSBkcm1fcmFkZW9uX3RjbF9wcmltX3Q7CgpzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRybV9kZXZpY2VfdCAqIGRldiwKCQkJCSAgICAgIGRybV9idWZfdCAqIGJ1ZiwKCQkJCSAgICAgIGRybV9yYWRlb25fdGNsX3ByaW1fdCAqIHByaW0pCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKCWludCBvZmZzZXQgPSBkZXZfcHJpdi0+Z2FydF9idWZmZXJzX29mZnNldCArIGJ1Zi0+b2Zmc2V0ICsgcHJpbS0+c3RhcnQ7CglpbnQgbnVtdmVydHMgPSAoaW50KXByaW0tPm51bXZlcnRzOwoJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwoJaW50IGkgPSAwOwoJUklOR19MT0NBTFM7CgoJRFJNX0RFQlVHKCJod3ByaW0gMHgleCB2Zm10IDB4JXggJWQuLiVkICVkIHZlcnRzXG4iLAoJCSAgcHJpbS0+cHJpbSwKCQkgIHByaW0tPnZjX2Zvcm1hdCwgcHJpbS0+c3RhcnQsIHByaW0tPmZpbmlzaCwgcHJpbS0+bnVtdmVydHMpOwoKCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIocHJpbS0+cHJpbSwgcHJpbS0+bnVtdmVydHMpKSB7CgkJRFJNX0VSUk9SKCJiYWQgcHJpbSAleCBudW12ZXJ0cyAlZFxuIiwKCQkJICBwcmltLT5wcmltLCBwcmltLT5udW12ZXJ0cyk7CgkJcmV0dXJuOwoJfQoKCWRvIHsKCQkvKiBFbWl0IHRoZSBuZXh0IGNsaXByZWN0ICovCgkJaWYgKGkgPCBuYm94KSB7CgkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdChkZXZfcHJpdiwgJnNhcmVhX3ByaXYtPmJveGVzW2ldKTsKCQl9CgoJCS8qIEVtaXQgdGhlIHZlcnRleCBidWZmZXIgcmVuZGVyaW5nIGNvbW1hbmRzICovCgkJQkVHSU5fUklORyg1KTsKCgkJT1VUX1JJTkcoQ1BfUEFDS0VUMyhSQURFT05fM0RfUk5EUl9HRU5fSU5EWF9QUklNLCAzKSk7CgkJT1VUX1JJTkcob2Zmc2V0KTsKCQlPVVRfUklORyhudW12ZXJ0cyk7CgkJT1VUX1JJTkcocHJpbS0+dmNfZm9ybWF0KTsKCQlPVVRfUklORyhwcmltLT5wcmltIHwgUkFERU9OX1BSSU1fV0FMS19MSVNUIHwKCQkJIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKCQkJIFJBREVPTl9WVFhfRk1UX1JBREVPTl9NT0RFIHwKCQkJIChudW12ZXJ0cyA8PCBSQURFT05fTlVNX1ZFUlRJQ0VTX1NISUZUKSk7CgoJCUFEVkFOQ0VfUklORygpOwoKCQlpKys7Cgl9IHdoaWxlIChpIDwgbmJveCk7Cn0KCnN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkcm1fZGV2aWNlX3QgKiBkZXYsIGRybV9idWZfdCAqIGJ1ZikKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fYnVmX3ByaXZfdCAqYnVmX3ByaXYgPSBidWYtPmRldl9wcml2YXRlOwoJUklOR19MT0NBTFM7CgoJYnVmX3ByaXYtPmFnZSA9ICsrZGV2X3ByaXYtPnNhcmVhX3ByaXYtPmxhc3RfZGlzcGF0Y2g7CgoJLyogRW1pdCB0aGUgdmVydGV4IGJ1ZmZlciBhZ2UgKi8KCUJFR0lOX1JJTkcoMik7CglSQURFT05fRElTUEFUQ0hfQUdFKGJ1Zl9wcml2LT5hZ2UpOwoJQURWQU5DRV9SSU5HKCk7CgoJYnVmLT5wZW5kaW5nID0gMTsKCWJ1Zi0+dXNlZCA9IDA7Cn0KCnN0YXRpYyB2b2lkIHJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChkcm1fZGV2aWNlX3QgKiBkZXYsCgkJCQkJZHJtX2J1Zl90ICogYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglSSU5HX0xPQ0FMUzsKCURSTV9ERUJVRygiaW5kaXJlY3Q6IGJ1Zj0lZCBzPTB4JXggZT0weCV4XG4iLCBidWYtPmlkeCwgc3RhcnQsIGVuZCk7CgoJaWYgKHN0YXJ0ICE9IGVuZCkgewoJCWludCBvZmZzZXQgPSAoZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQKCQkJICAgICAgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKCQlpbnQgZHdvcmRzID0gKGVuZCAtIHN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKCgkJLyogSW5kaXJlY3QgYnVmZmVyIGRhdGEgbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZgoJCSAqIGR3b3Jkcywgc28gaWYgd2UndmUgYmVlbiBnaXZlbiBhbiBvZGQgbnVtYmVyIHdlIG11c3QKCQkgKiBwYWQgdGhlIGRhdGEgd2l0aCBhIFR5cGUtMiBDUCBwYWNrZXQuCgkJICovCgkJaWYgKGR3b3JkcyAmIDEpIHsKCQkJdTMyICpkYXRhID0gKHUzMiAqKQoJCQkgICAgKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlCgkJCSAgICAgKyBidWYtPm9mZnNldCArIHN0YXJ0KTsKCQkJZGF0YVtkd29yZHMrK10gPSBSQURFT05fQ1BfUEFDS0VUMjsKCQl9CgoJCS8qIEZpcmUgb2ZmIHRoZSBpbmRpcmVjdCBidWZmZXIgKi8KCQlCRUdJTl9SSU5HKDMpOwoKCQlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9DUF9JQl9CQVNFLCAxKSk7CgkJT1VUX1JJTkcob2Zmc2V0KTsKCQlPVVRfUklORyhkd29yZHMpOwoKCQlBRFZBTkNFX1JJTkcoKTsKCX0KfQoKc3RhdGljIHZvaWQgcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGljZXMoZHJtX2RldmljZV90ICogZGV2LAoJCQkJICAgICAgIGRybV9idWZfdCAqIGVsdF9idWYsCgkJCQkgICAgICAgZHJtX3JhZGVvbl90Y2xfcHJpbV90ICogcHJpbSkKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwoJaW50IG9mZnNldCA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0ICsgcHJpbS0+b2Zmc2V0OwoJdTMyICpkYXRhOwoJaW50IGR3b3JkczsKCWludCBpID0gMDsKCWludCBzdGFydCA9IHByaW0tPnN0YXJ0ICsgUkFERU9OX0lOREVYX1BSSU1fT0ZGU0VUOwoJaW50IGNvdW50ID0gKHByaW0tPmZpbmlzaCAtIHN0YXJ0KSAvIHNpemVvZih1MTYpOwoJaW50IG5ib3ggPSBzYXJlYV9wcml2LT5uYm94OwoKCURSTV9ERUJVRygiaHdwcmltIDB4JXggdmZtdCAweCV4ICVkLi4lZCBvZmZzZXQ6ICV4IG5yICVkXG4iLAoJCSAgcHJpbS0+cHJpbSwKCQkgIHByaW0tPnZjX2Zvcm1hdCwKCQkgIHByaW0tPnN0YXJ0LCBwcmltLT5maW5pc2gsIHByaW0tPm9mZnNldCwgcHJpbS0+bnVtdmVydHMpOwoKCWlmIChiYWRfcHJpbV92ZXJ0ZXhfbnIocHJpbS0+cHJpbSwgY291bnQpKSB7CgkJRFJNX0VSUk9SKCJiYWQgcHJpbSAleCBjb3VudCAlZFxuIiwgcHJpbS0+cHJpbSwgY291bnQpOwoJCXJldHVybjsKCX0KCglpZiAoc3RhcnQgPj0gcHJpbS0+ZmluaXNoIHx8IChwcmltLT5zdGFydCAmIDB4NykpIHsKCQlEUk1fRVJST1IoImJ1ZmZlciBwcmltICVkXG4iLCBwcmltLT5wcmltKTsKCQlyZXR1cm47Cgl9CgoJZHdvcmRzID0gKHByaW0tPmZpbmlzaCAtIHByaW0tPnN0YXJ0ICsgMykgLyBzaXplb2YodTMyKTsKCglkYXRhID0gKHUzMiAqKSAoKGNoYXIgKilkZXYtPmFncF9idWZmZXJfbWFwLT5oYW5kbGUgKwoJCQllbHRfYnVmLT5vZmZzZXQgKyBwcmltLT5zdGFydCk7CgoJZGF0YVswXSA9IENQX1BBQ0tFVDMoUkFERU9OXzNEX1JORFJfR0VOX0lORFhfUFJJTSwgZHdvcmRzIC0gMik7CglkYXRhWzFdID0gb2Zmc2V0OwoJZGF0YVsyXSA9IHByaW0tPm51bXZlcnRzOwoJZGF0YVszXSA9IHByaW0tPnZjX2Zvcm1hdDsKCWRhdGFbNF0gPSAocHJpbS0+cHJpbSB8CgkJICAgUkFERU9OX1BSSU1fV0FMS19JTkQgfAoJCSAgIFJBREVPTl9DT0xPUl9PUkRFUl9SR0JBIHwKCQkgICBSQURFT05fVlRYX0ZNVF9SQURFT05fTU9ERSB8CgkJICAgKGNvdW50IDw8IFJBREVPTl9OVU1fVkVSVElDRVNfU0hJRlQpKTsKCglkbyB7CgkJaWYgKGkgPCBuYm94KQoJCQlyYWRlb25fZW1pdF9jbGlwX3JlY3QoZGV2X3ByaXYsICZzYXJlYV9wcml2LT5ib3hlc1tpXSk7CgoJCXJhZGVvbl9jcF9kaXNwYXRjaF9pbmRpcmVjdChkZXYsIGVsdF9idWYsCgkJCQkJICAgIHByaW0tPnN0YXJ0LCBwcmltLT5maW5pc2gpOwoKCQlpKys7Cgl9IHdoaWxlIChpIDwgbmJveCk7Cgp9CgojZGVmaW5lIFJBREVPTl9NQVhfVEVYVFVSRV9TSVpFIFJBREVPTl9CVUZGRVJfU0laRQoKc3RhdGljIGludCByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZShEUk1GSUxFIGZpbHAsCgkJCQkgICAgICBkcm1fZGV2aWNlX3QgKiBkZXYsCgkJCQkgICAgICBkcm1fcmFkZW9uX3RleHR1cmVfdCAqIHRleCwKCQkJCSAgICAgIGRybV9yYWRlb25fdGV4X2ltYWdlX3QgKiBpbWFnZSkKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKCWRybV9idWZfdCAqYnVmOwoJdTMyIGZvcm1hdDsKCXUzMiAqYnVmZmVyOwoJY29uc3QgdTggX191c2VyICpkYXRhOwoJaW50IHNpemUsIGR3b3JkcywgdGV4X3dpZHRoLCBibGl0X3dpZHRoLCBzcGl0Y2g7Cgl1MzIgaGVpZ2h0OwoJaW50IGk7Cgl1MzIgdGV4cGl0Y2gsIG1pY3JvdGlsZTsKCXUzMiBvZmZzZXQ7CglSSU5HX0xPQ0FMUzsKCglEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKCglpZiAocmFkZW9uX2NoZWNrX2FuZF9maXh1cF9vZmZzZXQoZGV2X3ByaXYsIGZpbHBfcHJpdiwgJnRleC0+b2Zmc2V0KSkgewoJCURSTV9FUlJPUigiSW52YWxpZCBkZXN0aW5hdGlvbiBvZmZzZXRcbiIpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJZGV2X3ByaXYtPnN0YXRzLmJveGVzIHw9IFJBREVPTl9CT1hfVEVYVFVSRV9MT0FEOwoKCS8qIEZsdXNoIHRoZSBwaXhlbCBjYWNoZS4gIFRoaXMgZW5zdXJlcyBubyBwaXhlbCBkYXRhIGdldHMgbWl4ZWQKCSAqIHVwIHdpdGggdGhlIHRleHR1cmUgZGF0YSBmcm9tIHRoZSBob3N0IGRhdGEgYmxpdCwgb3RoZXJ3aXNlCgkgKiBwYXJ0IG9mIHRoZSB0ZXh0dXJlIGltYWdlIG1heSBiZSBjb3JydXB0ZWQuCgkgKi8KCUJFR0lOX1JJTkcoNCk7CglSQURFT05fRkxVU0hfQ0FDSEUoKTsKCVJBREVPTl9XQUlUX1VOVElMX0lETEUoKTsKCUFEVkFOQ0VfUklORygpOwoKCS8qIFRoZSBjb21waWxlciB3b24ndCBvcHRpbWl6ZSBhd2F5IGEgZGl2aXNpb24gYnkgYSB2YXJpYWJsZSwKCSAqIGV2ZW4gaWYgdGhlIG9ubHkgbGVnYWwgdmFsdWVzIGFyZSBwb3dlcnMgb2YgdHdvLiAgVGh1cywgd2UnbGwKCSAqIHVzZSBhIHNoaWZ0IGluc3RlYWQuCgkgKi8KCXN3aXRjaCAodGV4LT5mb3JtYXQpIHsKCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I4ODg4OgoJY2FzZSBSQURFT05fVFhGT1JNQVRfUkdCQTg4ODg6CgkJZm9ybWF0ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9BUkdCODg4ODsKCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogNDsKCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogNDsKCQlicmVhazsKCWNhc2UgUkFERU9OX1RYRk9STUFUX0FJODg6CgljYXNlIFJBREVPTl9UWEZPUk1BVF9BUkdCMTU1NToKCWNhc2UgUkFERU9OX1RYRk9STUFUX1JHQjU2NToKCWNhc2UgUkFERU9OX1RYRk9STUFUX0FSR0I0NDQ0OgoJY2FzZSBSQURFT05fVFhGT1JNQVRfVllVWTQyMjoKCWNhc2UgUkFERU9OX1RYRk9STUFUX1lWWVU0MjI6CgkJZm9ybWF0ID0gUkFERU9OX0NPTE9SX0ZPUk1BVF9SR0I1NjU7CgkJdGV4X3dpZHRoID0gdGV4LT53aWR0aCAqIDI7CgkJYmxpdF93aWR0aCA9IGltYWdlLT53aWR0aCAqIDI7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9UWEZPUk1BVF9JODoKCWNhc2UgUkFERU9OX1RYRk9STUFUX1JHQjMzMjoKCQlmb3JtYXQgPSBSQURFT05fQ09MT1JfRk9STUFUX0NJODsKCQl0ZXhfd2lkdGggPSB0ZXgtPndpZHRoICogMTsKCQlibGl0X3dpZHRoID0gaW1hZ2UtPndpZHRoICogMTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJRFJNX0VSUk9SKCJpbnZhbGlkIHRleHR1cmUgZm9ybWF0ICVkXG4iLCB0ZXgtPmZvcm1hdCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCXNwaXRjaCA9IGJsaXRfd2lkdGggPj4gNjsKCWlmIChzcGl0Y2ggPT0gMCAmJiBpbWFnZS0+aGVpZ2h0ID4gMSkKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoKCXRleHBpdGNoID0gdGV4LT5waXRjaDsKCWlmICgodGV4cGl0Y2ggPDwgMjIpICYgUkFERU9OX0RTVF9USUxFX01JQ1JPKSB7CgkJbWljcm90aWxlID0gMTsKCQlpZiAodGV4X3dpZHRoIDwgNjQpIHsKCQkJdGV4cGl0Y2ggJj0gfihSQURFT05fRFNUX1RJTEVfTUlDUk8gPj4gMjIpOwoJCQkvKiB3ZSBnb3QgdGlsZWQgY29vcmRpbmF0ZXMsIHVudGlsZSB0aGVtICovCgkJCWltYWdlLT54ICo9IDI7CgkJfQoJfSBlbHNlCgkJbWljcm90aWxlID0gMDsKCglEUk1fREVCVUcoInRleD0lZHglZCBibGl0PSVkXG4iLCB0ZXhfd2lkdGgsIHRleC0+aGVpZ2h0LCBibGl0X3dpZHRoKTsKCglkbyB7CgkJRFJNX0RFQlVHKCJ0ZXg6IG9mcz0weCV4IHA9JWQgZj0lZCB4PSVoZCB5PSVoZCB3PSVoZCBoPSVoZFxuIiwKCQkJICB0ZXgtPm9mZnNldCA+PiAxMCwgdGV4LT5waXRjaCwgdGV4LT5mb3JtYXQsCgkJCSAgaW1hZ2UtPngsIGltYWdlLT55LCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpOwoKCQkvKiBNYWtlIGEgY29weSBvZiBzb21lIHBhcmFtZXRlcnMgaW4gY2FzZSB3ZSBoYXZlIHRvCgkJICogdXBkYXRlIHRoZW0gZm9yIGEgbXVsdGktcGFzcyB0ZXh0dXJlIGJsaXQuCgkJICovCgkJaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodDsKCQlkYXRhID0gKGNvbnN0IHU4IF9fdXNlciAqKWltYWdlLT5kYXRhOwoKCQlzaXplID0gaGVpZ2h0ICogYmxpdF93aWR0aDsKCgkJaWYgKHNpemUgPiBSQURFT05fTUFYX1RFWFRVUkVfU0laRSkgewoJCQloZWlnaHQgPSBSQURFT05fTUFYX1RFWFRVUkVfU0laRSAvIGJsaXRfd2lkdGg7CgkJCXNpemUgPSBoZWlnaHQgKiBibGl0X3dpZHRoOwoJCX0gZWxzZSBpZiAoc2l6ZSA8IDQgJiYgc2l6ZSA+IDApIHsKCQkJc2l6ZSA9IDQ7CgkJfSBlbHNlIGlmIChzaXplID09IDApIHsKCQkJcmV0dXJuIDA7CgkJfQoKCQlidWYgPSByYWRlb25fZnJlZWxpc3RfZ2V0KGRldik7CgkJaWYgKDAgJiYgIWJ1ZikgewoJCQlyYWRlb25fZG9fY3BfaWRsZShkZXZfcHJpdik7CgkJCWJ1ZiA9IHJhZGVvbl9mcmVlbGlzdF9nZXQoZGV2KTsKCQl9CgkJaWYgKCFidWYpIHsKCQkJRFJNX0RFQlVHKCJyYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZTogRUFHQUlOXG4iKTsKCQkJaWYgKERSTV9DT1BZX1RPX1VTRVIodGV4LT5pbWFnZSwgaW1hZ2UsIHNpemVvZigqaW1hZ2UpKSkKCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgkJCXJldHVybiBEUk1fRVJSKEVBR0FJTik7CgkJfQoKCQkvKiBEaXNwYXRjaCB0aGUgaW5kaXJlY3QgYnVmZmVyLgoJCSAqLwoJCWJ1ZmZlciA9CgkJICAgICh1MzIgKikgKChjaGFyICopZGV2LT5hZ3BfYnVmZmVyX21hcC0+aGFuZGxlICsgYnVmLT5vZmZzZXQpOwoJCWR3b3JkcyA9IHNpemUgLyA0OwoKI2RlZmluZSBSQURFT05fQ09QWV9NVChfYnVmLCBfZGF0YSwgX3dpZHRoKSBcCglkbyB7IFwKCQlpZiAoRFJNX0NPUFlfRlJPTV9VU0VSKF9idWYsIF9kYXRhLCAoX3dpZHRoKSkpIHtcCgkJCURSTV9FUlJPUigiRUZBVUxUIG9uIHBhZCwgJWQgYnl0ZXNcbiIsIChfd2lkdGgpKTsgXAoJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOyBcCgkJfSBcCgl9IHdoaWxlKDApCgoJCWlmIChtaWNyb3RpbGUpIHsKCQkJLyogdGV4dHVyZSBtaWNybyB0aWxpbmcgaW4gdXNlLCBtaW5pbXVtIHRleHR1cmUgd2lkdGggaXMgdGh1cyAxNiBieXRlcy4KCQkJICAgaG93ZXZlciwgd2UgY2Fubm90IHVzZSBibGl0dGVyIGRpcmVjdGx5IGZvciB0ZXh0dXJlIHdpZHRoIDwgNjQgYnl0ZXMsCgkJCSAgIHNpbmNlIG1pbmltdW0gdGV4IHBpdGNoIGlzIDY0IGJ5dGVzIGFuZCB3ZSBuZWVkIHRoaXMgdG8gbWF0Y2gKCQkJICAgdGhlIHRleHR1cmUgd2lkdGgsIG90aGVyd2lzZSB0aGUgYmxpdHRlciB3aWxsIHRpbGUgaXQgd3JvbmcuCgkJCSAgIFRodXMsIHRpbGluZyBtYW51YWxseSBpbiB0aGlzIGNhc2UuIEFkZGl0aW9uYWxseSwgbmVlZCB0byBzcGVjaWFsCgkJCSAgIGNhc2UgdGV4IGhlaWdodCA9IDEsIHNpbmNlIG91ciBhY3R1YWwgaW1hZ2Ugd2lsbCBoYXZlIGhlaWdodCAyCgkJCSAgIGFuZCB3ZSBuZWVkIHRvIGVuc3VyZSB3ZSBkb24ndCByZWFkIGJleW9uZCB0aGUgdGV4dHVyZSBzaXplCgkJCSAgIGZyb20gdXNlciBzcGFjZS4gKi8KCQkJaWYgKHRleC0+aGVpZ2h0ID09IDEpIHsKCQkJCWlmICh0ZXhfd2lkdGggPj0gNjQgfHwgdGV4X3dpZHRoIDw9IDE2KSB7CgkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyLCBkYXRhLAoJCQkJCQkoaW50KSh0ZXhfd2lkdGggKiBzaXplb2YodTMyKSkpOwoJCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPT0gMzIpIHsKCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIsIGRhdGEsIDE2KTsKCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIgKyA4LAoJCQkJCQkgICAgICAgZGF0YSArIDE2LCAxNik7CgkJCQl9CgkJCX0gZWxzZSBpZiAodGV4X3dpZHRoID49IDY0IHx8IHRleF93aWR0aCA9PSAxNikgewoJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyLCBkYXRhLAoJCQkJCSAgICAgICAoaW50KShkd29yZHMgKiBzaXplb2YodTMyKSkpOwoJCQl9IGVsc2UgaWYgKHRleF93aWR0aCA8IDE2KSB7CgkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkrKykgewoJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwgdGV4X3dpZHRoKTsKCQkJCQlidWZmZXIgKz0gNDsKCQkJCQlkYXRhICs9IHRleF93aWR0aDsKCQkJCX0KCQkJfSBlbHNlIGlmICh0ZXhfd2lkdGggPT0gMzIpIHsKCQkJCS8qIFRPRE86IG1ha2Ugc3VyZSB0aGlzIHdvcmtzIHdoZW4gbm90IGZpdHRpbmcgaW4gb25lIGJ1ZmZlcgoJCQkJICAgKGkuZS4gMzJieXRlcyB4IDIwNDguLi4pICovCgkJCQlmb3IgKGkgPSAwOyBpIDwgdGV4LT5oZWlnaHQ7IGkgKz0gMikgewoJCQkJCVJBREVPTl9DT1BZX01UKGJ1ZmZlciwgZGF0YSwgMTYpOwoJCQkJCWRhdGEgKz0gMTY7CgkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyICsgOCwgZGF0YSwgMTYpOwoJCQkJCWRhdGEgKz0gMTY7CgkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyICsgNCwgZGF0YSwgMTYpOwoJCQkJCWRhdGEgKz0gMTY7CgkJCQkJUkFERU9OX0NPUFlfTVQoYnVmZmVyICsgMTIsIGRhdGEsIDE2KTsKCQkJCQlkYXRhICs9IDE2OwoJCQkJCWJ1ZmZlciArPSAxNjsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCWlmICh0ZXhfd2lkdGggPj0gMzIpIHsKCQkJCS8qIFRleHR1cmUgaW1hZ2Ugd2lkdGggaXMgbGFyZ2VyIHRoYW4gdGhlIG1pbmltdW0sIHNvIHdlCgkJCQkgKiBjYW4gdXBsb2FkIGl0IGRpcmVjdGx5LgoJCQkJICovCgkJCQlSQURFT05fQ09QWV9NVChidWZmZXIsIGRhdGEsCgkJCQkJICAgICAgIChpbnQpKGR3b3JkcyAqIHNpemVvZih1MzIpKSk7CgkJCX0gZWxzZSB7CgkJCQkvKiBUZXh0dXJlIGltYWdlIHdpZHRoIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bSwgc28gd2UKCQkJCSAqIG5lZWQgdG8gcGFkIG91dCBlYWNoIGltYWdlIHNjYW5saW5lIHRvIHRoZSBtaW5pbXVtCgkJCQkgKiB3aWR0aC4KCQkJCSAqLwoJCQkJZm9yIChpID0gMDsgaSA8IHRleC0+aGVpZ2h0OyBpKyspIHsKCQkJCQlSQURFT05fQ09QWV9NVChidWZmZXIsIGRhdGEsIHRleF93aWR0aCk7CgkJCQkJYnVmZmVyICs9IDg7CgkJCQkJZGF0YSArPSB0ZXhfd2lkdGg7CgkJCQl9CgkJCX0KCQl9CgojdW5kZWYgUkFERU9OX0NPUFlfTVQKCQlidWYtPmZpbHAgPSBmaWxwOwoJCWJ1Zi0+dXNlZCA9IHNpemU7CgkJb2Zmc2V0ID0gZGV2X3ByaXYtPmdhcnRfYnVmZmVyc19vZmZzZXQgKyBidWYtPm9mZnNldDsKCQlCRUdJTl9SSU5HKDkpOwoJCU9VVF9SSU5HKENQX1BBQ0tFVDMoUkFERU9OX0NOVExfQklUQkxUX01VTFRJLCA1KSk7CgkJT1VUX1JJTkcoUkFERU9OX0dNQ19TUkNfUElUQ0hfT0ZGU0VUX0NOVEwgfAoJCQkgUkFERU9OX0dNQ19EU1RfUElUQ0hfT0ZGU0VUX0NOVEwgfAoJCQkgUkFERU9OX0dNQ19CUlVTSF9OT05FIHwKCQkJIChmb3JtYXQgPDwgOCkgfAoJCQkgUkFERU9OX0dNQ19TUkNfREFUQVRZUEVfQ09MT1IgfAoJCQkgUkFERU9OX1JPUDNfUyB8CgkJCSBSQURFT05fRFBfU1JDX1NPVVJDRV9NRU1PUlkgfAoJCQkgUkFERU9OX0dNQ19DTFJfQ01QX0NOVExfRElTIHwgUkFERU9OX0dNQ19XUl9NU0tfRElTKTsKCQlPVVRfUklORygoc3BpdGNoIDw8IDIyKSB8IChvZmZzZXQgPj4gMTApKTsKCQlPVVRfUklORygodGV4cGl0Y2ggPDwgMjIpIHwgKHRleC0+b2Zmc2V0ID4+IDEwKSk7CgkJT1VUX1JJTkcoMCk7CgkJT1VUX1JJTkcoKGltYWdlLT54IDw8IDE2KSB8IGltYWdlLT55KTsKCQlPVVRfUklORygoaW1hZ2UtPndpZHRoIDw8IDE2KSB8IGhlaWdodCk7CgkJUkFERU9OX1dBSVRfVU5USUxfMkRfSURMRSgpOwoJCUFEVkFOQ0VfUklORygpOwoKCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOwoKCQkvKiBVcGRhdGUgdGhlIGlucHV0IHBhcmFtZXRlcnMgZm9yIG5leHQgdGltZSAqLwoJCWltYWdlLT55ICs9IGhlaWdodDsKCQlpbWFnZS0+aGVpZ2h0IC09IGhlaWdodDsKCQlpbWFnZS0+ZGF0YSA9IChjb25zdCB1OCBfX3VzZXIgKilpbWFnZS0+ZGF0YSArIHNpemU7Cgl9IHdoaWxlIChpbWFnZS0+aGVpZ2h0ID4gMCk7CgoJLyogRmx1c2ggdGhlIHBpeGVsIGNhY2hlIGFmdGVyIHRoZSBibGl0IGNvbXBsZXRlcy4gIFRoaXMgZW5zdXJlcwoJICogdGhlIHRleHR1cmUgZGF0YSBpcyB3cml0dGVuIG91dCB0byBtZW1vcnkgYmVmb3JlIHJlbmRlcmluZwoJICogY29udGludWVzLgoJICovCglCRUdJTl9SSU5HKDQpOwoJUkFERU9OX0ZMVVNIX0NBQ0hFKCk7CglSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CglBRFZBTkNFX1JJTkcoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCByYWRlb25fY3BfZGlzcGF0Y2hfc3RpcHBsZShkcm1fZGV2aWNlX3QgKiBkZXYsIHUzMiAqIHN0aXBwbGUpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglpbnQgaTsKCVJJTkdfTE9DQUxTOwoJRFJNX0RFQlVHKCJcbiIpOwoKCUJFR0lOX1JJTkcoMzUpOwoKCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1JFX1NUSVBQTEVfQUREUiwgMCkpOwoJT1VUX1JJTkcoMHgwMDAwMDAwMCk7CgoJT1VUX1JJTkcoQ1BfUEFDS0VUMF9UQUJMRShSQURFT05fUkVfU1RJUFBMRV9EQVRBLCAzMSkpOwoJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKCQlPVVRfUklORyhzdGlwcGxlW2ldKTsKCX0KCglBRFZBTkNFX1JJTkcoKTsKfQoKc3RhdGljIHZvaWQgcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhpbnQgc3VyZl9pbmRleCwKCQkJCSAgICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdikKewoJaWYgKCFkZXZfcHJpdi0+bW1pbykKCQlyZXR1cm47CgoJcmFkZW9uX2RvX2NwX2lkbGUoZGV2X3ByaXYpOwoKCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfSU5GTyArIDE2ICogc3VyZl9pbmRleCwKCQkgICAgIGRldl9wcml2LT5zdXJmYWNlc1tzdXJmX2luZGV4XS5mbGFncyk7CglSQURFT05fV1JJVEUoUkFERU9OX1NVUkZBQ0UwX0xPV0VSX0JPVU5EICsgMTYgKiBzdXJmX2luZGV4LAoJCSAgICAgZGV2X3ByaXYtPnN1cmZhY2VzW3N1cmZfaW5kZXhdLmxvd2VyKTsKCVJBREVPTl9XUklURShSQURFT05fU1VSRkFDRTBfVVBQRVJfQk9VTkQgKyAxNiAqIHN1cmZfaW5kZXgsCgkJICAgICBkZXZfcHJpdi0+c3VyZmFjZXNbc3VyZl9pbmRleF0udXBwZXIpOwp9CgovKiBBbGxvY2F0ZXMgYSB2aXJ0dWFsIHN1cmZhY2UKICogZG9lc24ndCBhbHdheXMgYWxsb2NhdGUgYSByZWFsIHN1cmZhY2UsIHdpbGwgc3RyZXRjaCBhbiBleGlzdGluZwogKiBzdXJmYWNlIHdoZW4gcG9zc2libGUuCiAqCiAqIE5vdGUgdGhhdCByZWZjb3VudCBjYW4gYmUgYXQgbW9zdCAyLCBzaW5jZSBkdXJpbmcgYSBmcmVlIHJlZmNvdW50PTMKICogbWlnaHQgbWVhbiB3ZSBoYXZlIHRvIGFsbG9jYXRlIGEgbmV3IHN1cmZhY2Ugd2hpY2ggbWlnaHQgbm90IGFsd2F5cwogKiBiZSBhdmFpbGFibGUuCiAqIEZvciBleGFtcGxlIDogd2UgYWxsb2NhdGUgdGhyZWUgY29udGlnb3VzIHN1cmZhY2VzIEFCQy4gSWYgQiBpcwogKiBmcmVlZCwgd2Ugc3VkZGVubHkgbmVlZCB0d28gc3VyZmFjZXMgdG8gc3RvcmUgQSBhbmQgQywgd2hpY2ggbWlnaHQKICogbm90IGFsd2F5cyBiZSBhdmFpbGFibGUuCiAqLwpzdGF0aWMgaW50IGFsbG9jX3N1cmZhY2UoZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QgKm5ldywKCQkJIGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwgRFJNRklMRSBmaWxwKQp7CglzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSAqczsKCWludCBpOwoJaW50IHZpcnRfc3VyZmFjZV9pbmRleDsKCXVpbnQzMl90IG5ld191cHBlciwgbmV3X2xvd2VyOwoKCW5ld19sb3dlciA9IG5ldy0+YWRkcmVzczsKCW5ld191cHBlciA9IG5ld19sb3dlciArIG5ldy0+c2l6ZSAtIDE7CgoJLyogc2FuaXR5IGNoZWNrICovCglpZiAoKG5ld19sb3dlciA+PSBuZXdfdXBwZXIpIHx8IChuZXctPmZsYWdzID09IDApIHx8IChuZXctPnNpemUgPT0gMCkgfHwKCSAgICAoKG5ld191cHBlciAmIFJBREVPTl9TVVJGX0FERFJFU1NfRklYRURfTUFTSykgIT0KCSAgICAgUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKQoJICAgIHx8ICgobmV3X2xvd2VyICYgUkFERU9OX1NVUkZfQUREUkVTU19GSVhFRF9NQVNLKSAhPSAwKSkKCQlyZXR1cm4gLTE7CgoJLyogbWFrZSBzdXJlIHRoZXJlIGlzIG5vIG92ZXJsYXAgd2l0aCBleGlzdGluZyBzdXJmYWNlcyAqLwoJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgewoJCWlmICgoZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ICE9IDApICYmCgkJICAgICgoKG5ld19sb3dlciA+PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpICYmCgkJICAgICAgKG5ld19sb3dlciA8IGRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlcikpIHx8CgkJICAgICAoKG5ld19sb3dlciA8IGRldl9wcml2LT5zdXJmYWNlc1tpXS5sb3dlcikgJiYKCQkgICAgICAobmV3X3VwcGVyID4gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyKSkpKSB7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgoJLyogZmluZCBhIHZpcnR1YWwgc3VyZmFjZSAqLwoJZm9yIChpID0gMDsgaSA8IDIgKiBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspCgkJaWYgKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmZpbHAgPT0gMCkKCQkJYnJlYWs7CglpZiAoaSA9PSAyICogUkFERU9OX01BWF9TVVJGQUNFUykgewoJCXJldHVybiAtMTsKCX0KCXZpcnRfc3VyZmFjZV9pbmRleCA9IGk7CgoJLyogdHJ5IHRvIHJldXNlIGFuIGV4aXN0aW5nIHN1cmZhY2UgKi8KCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKCQkvKiBleHRlbmQgYmVmb3JlICovCgkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMSkgJiYKCQkgICAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgoJCSAgICAobmV3X3VwcGVyICsgMSA9PSBkZXZfcHJpdi0+c3VyZmFjZXNbaV0ubG93ZXIpKSB7CgkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOwoJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKCQkJcy0+bG93ZXIgPSBuZXdfbG93ZXI7CgkJCXMtPnVwcGVyID0gbmV3X3VwcGVyOwoJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CgkJCXMtPmZpbHAgPSBmaWxwOwoJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQrKzsKCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyID0gcy0+bG93ZXI7CgkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwgZGV2X3ByaXYpOwoJCQlyZXR1cm4gdmlydF9zdXJmYWNlX2luZGV4OwoJCX0KCgkJLyogZXh0ZW5kIGFmdGVyICovCgkJaWYgKChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMSkgJiYKCQkgICAgKG5ldy0+ZmxhZ3MgPT0gZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmZsYWdzKSAmJgoJCSAgICAobmV3X2xvd2VyID09IGRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlciArIDEpKSB7CgkJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW3ZpcnRfc3VyZmFjZV9pbmRleF0pOwoJCQlzLT5zdXJmYWNlX2luZGV4ID0gaTsKCQkJcy0+bG93ZXIgPSBuZXdfbG93ZXI7CgkJCXMtPnVwcGVyID0gbmV3X3VwcGVyOwoJCQlzLT5mbGFncyA9IG5ldy0+ZmxhZ3M7CgkJCXMtPmZpbHAgPSBmaWxwOwoJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQrKzsKCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnVwcGVyID0gcy0+dXBwZXI7CgkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwgZGV2X3ByaXYpOwoJCQlyZXR1cm4gdmlydF9zdXJmYWNlX2luZGV4OwoJCX0KCX0KCgkvKiBva2F5LCB3ZSBuZWVkIGEgbmV3IG9uZSAqLwoJZm9yIChpID0gMDsgaSA8IFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgewoJCWlmIChkZXZfcHJpdi0+c3VyZmFjZXNbaV0ucmVmY291bnQgPT0gMCkgewoJCQlzID0gJihkZXZfcHJpdi0+dmlydF9zdXJmYWNlc1t2aXJ0X3N1cmZhY2VfaW5kZXhdKTsKCQkJcy0+c3VyZmFjZV9pbmRleCA9IGk7CgkJCXMtPmxvd2VyID0gbmV3X2xvd2VyOwoJCQlzLT51cHBlciA9IG5ld191cHBlcjsKCQkJcy0+ZmxhZ3MgPSBuZXctPmZsYWdzOwoJCQlzLT5maWxwID0gZmlscDsKCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLnJlZmNvdW50ID0gMTsKCQkJZGV2X3ByaXYtPnN1cmZhY2VzW2ldLmxvd2VyID0gcy0+bG93ZXI7CgkJCWRldl9wcml2LT5zdXJmYWNlc1tpXS51cHBlciA9IHMtPnVwcGVyOwoJCQlkZXZfcHJpdi0+c3VyZmFjZXNbaV0uZmxhZ3MgPSBzLT5mbGFnczsKCQkJcmFkZW9uX2FwcGx5X3N1cmZhY2VfcmVncyhzLT5zdXJmYWNlX2luZGV4LCBkZXZfcHJpdik7CgkJCXJldHVybiB2aXJ0X3N1cmZhY2VfaW5kZXg7CgkJfQoJfQoKCS8qIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nICovCglyZXR1cm4gLTE7Cn0KCnN0YXRpYyBpbnQgZnJlZV9zdXJmYWNlKERSTUZJTEUgZmlscCwgZHJtX3JhZGVvbl9wcml2YXRlX3QgKiBkZXZfcHJpdiwKCQkJaW50IGxvd2VyKQp7CglzdHJ1Y3QgcmFkZW9uX3ZpcnRfc3VyZmFjZSAqczsKCWludCBpOwoJLyogZmluZCB0aGUgdmlydHVhbCBzdXJmYWNlICovCglmb3IgKGkgPSAwOyBpIDwgMiAqIFJBREVPTl9NQVhfU1VSRkFDRVM7IGkrKykgewoJCXMgPSAmKGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldKTsKCQlpZiAocy0+ZmlscCkgewoJCQlpZiAoKGxvd2VyID09IHMtPmxvd2VyKSAmJiAoZmlscCA9PSBzLT5maWxwKSkgewoJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS4KCQkJCSAgICBsb3dlciA9PSBzLT5sb3dlcikKCQkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0uCgkJCQkJICAgIGxvd2VyID0gcy0+dXBwZXI7CgoJCQkJaWYgKGRldl9wcml2LT5zdXJmYWNlc1tzLT5zdXJmYWNlX2luZGV4XS4KCQkJCSAgICB1cHBlciA9PSBzLT51cHBlcikKCQkJCQlkZXZfcHJpdi0+c3VyZmFjZXNbcy0+c3VyZmFjZV9pbmRleF0uCgkJCQkJICAgIHVwcGVyID0gcy0+bG93ZXI7CgoJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLnJlZmNvdW50LS07CgkJCQlpZiAoZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLgoJCQkJICAgIHJlZmNvdW50ID09IDApCgkJCQkJZGV2X3ByaXYtPnN1cmZhY2VzW3MtPnN1cmZhY2VfaW5kZXhdLgoJCQkJCSAgICBmbGFncyA9IDA7CgkJCQlzLT5maWxwID0gTlVMTDsKCQkJCXJhZGVvbl9hcHBseV9zdXJmYWNlX3JlZ3Mocy0+c3VyZmFjZV9pbmRleCwKCQkJCQkJCSAgZGV2X3ByaXYpOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQl9Cgl9CglyZXR1cm4gMTsKfQoKc3RhdGljIHZvaWQgcmFkZW9uX3N1cmZhY2VzX3JlbGVhc2UoRFJNRklMRSBmaWxwLAoJCQkJICAgIGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYpCnsKCWludCBpOwoJZm9yIChpID0gMDsgaSA8IDIgKiBSQURFT05fTUFYX1NVUkZBQ0VTOyBpKyspIHsKCQlpZiAoZGV2X3ByaXYtPnZpcnRfc3VyZmFjZXNbaV0uZmlscCA9PSBmaWxwKQoJCQlmcmVlX3N1cmZhY2UoZmlscCwgZGV2X3ByaXYsCgkJCQkgICAgIGRldl9wcml2LT52aXJ0X3N1cmZhY2VzW2ldLmxvd2VyKTsKCX0KfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKiBJT0NUTCBmdW5jdGlvbnMKICovCnN0YXRpYyBpbnQgcmFkZW9uX3N1cmZhY2VfYWxsb2MoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zdXJmYWNlX2FsbG9jX3QgYWxsb2M7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGFsbG9jLAoJCQkJIChkcm1fcmFkZW9uX3N1cmZhY2VfYWxsb2NfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YoYWxsb2MpKTsKCglpZiAoYWxsb2Nfc3VyZmFjZSgmYWxsb2MsIGRldl9wcml2LCBmaWxwKSA9PSAtMSkKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJZWxzZQoJCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9zdXJmYWNlX2ZyZWUoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdCBtZW1mcmVlOwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChtZW1mcmVlLCAoZHJtX3JhZGVvbl9zdXJmYWNlX2ZyZWVfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YobWVtZnJlZSkpOwoKCWlmIChmcmVlX3N1cmZhY2UoZmlscCwgZGV2X3ByaXYsIG1lbWZyZWUuYWRkcmVzcykpCgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCWVsc2UKCQlyZXR1cm4gMDsKfQoKc3RhdGljIGludCByYWRlb25fY3BfY2xlYXIoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Cglkcm1fcmFkZW9uX2NsZWFyX3QgY2xlYXI7Cglkcm1fcmFkZW9uX2NsZWFyX3JlY3RfdCBkZXB0aF9ib3hlc1tSQURFT05fTlJfU0FSRUFfQ0xJUFJFQ1RTXTsKCURSTV9ERUJVRygiXG4iKTsKCglMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoY2xlYXIsIChkcm1fcmFkZW9uX2NsZWFyX3QgX191c2VyICopIGRhdGEsCgkJCQkgc2l6ZW9mKGNsZWFyKSk7CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCgkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CgoJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmZGVwdGhfYm94ZXMsIGNsZWFyLmRlcHRoX2JveGVzLAoJCQkgICAgICAgc2FyZWFfcHJpdi0+bmJveCAqIHNpemVvZihkZXB0aF9ib3hlc1swXSkpKQoJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgoJcmFkZW9uX2NwX2Rpc3BhdGNoX2NsZWFyKGRldiwgJmNsZWFyLCBkZXB0aF9ib3hlcyk7CgoJQ09NTUlUX1JJTkcoKTsKCXJldHVybiAwOwp9CgovKiBOb3Qgc3VyZSB3aHkgdGhpcyBpc24ndCBzZXQgYWxsIHRoZSB0aW1lOgogKi8Kc3RhdGljIGludCByYWRlb25fZG9faW5pdF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglSSU5HX0xPQ0FMUzsKCglEUk1fREVCVUcoIlxuIik7CgoJQkVHSU5fUklORyg2KTsKCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX0NSVENfT0ZGU0VUX0NOVEwsIDApKTsKCU9VVF9SSU5HKFJBREVPTl9SRUFEKFJBREVPTl9DUlRDX09GRlNFVF9DTlRMKSB8CgkJIFJBREVPTl9DUlRDX09GRlNFVF9GTElQX0NOVEwpOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fQ1JUQzJfT0ZGU0VUX0NOVEwsIDApKTsKCU9VVF9SSU5HKFJBREVPTl9SRUFEKFJBREVPTl9DUlRDMl9PRkZTRVRfQ05UTCkgfAoJCSBSQURFT05fQ1JUQ19PRkZTRVRfRkxJUF9DTlRMKTsKCUFEVkFOQ0VfUklORygpOwoKCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMTsKCWRldl9wcml2LT5jdXJyZW50X3BhZ2UgPSAwOwoJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnBmQ3VycmVudFBhZ2UgPSBkZXZfcHJpdi0+Y3VycmVudF9wYWdlOwoKCXJldHVybiAwOwp9CgovKiBDYWxsZWQgd2hlbmV2ZXIgYSBjbGllbnQgZGllcywgZnJvbSBkcm1fcmVsZWFzZS4KICogTk9URTogIExvY2sgaXNuJ3QgbmVjZXNzYXJpbHkgaGVsZCB3aGVuIHRoaXMgaXMgY2FsbGVkIQogKi8Kc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcChkcm1fZGV2aWNlX3QgKiBkZXYpCnsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglEUk1fREVCVUcoIlxuIik7CgoJaWYgKGRldl9wcml2LT5jdXJyZW50X3BhZ2UgIT0gMCkKCQlyYWRlb25fY3BfZGlzcGF0Y2hfZmxpcChkZXYpOwoKCWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nID0gMDsKCXJldHVybiAwOwp9CgovKiBTd2FwcGluZyBhbmQgZmxpcHBpbmcgYXJlIGRpZmZlcmVudCBvcGVyYXRpb25zLCBuZWVkIGRpZmZlcmVudCBpb2N0bHMuCiAqIFRoZXkgY2FuICYgc2hvdWxkIGJlIGludGVybWl4ZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSAzZCB3aW5kb3dzLgogKi8Kc3RhdGljIGludCByYWRlb25fY3BfZmxpcChEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglEUk1fREVCVUcoIlxuIik7CgoJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglpZiAoIWRldl9wcml2LT5wYWdlX2ZsaXBwaW5nKQoJCXJhZGVvbl9kb19pbml0X3BhZ2VmbGlwKGRldik7CgoJcmFkZW9uX2NwX2Rpc3BhdGNoX2ZsaXAoZGV2KTsKCglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX3N3YXAoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7CglEUk1fREVCVUcoIlxuIik7CgoJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglpZiAoc2FyZWFfcHJpdi0+bmJveCA+IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFMpCgkJc2FyZWFfcHJpdi0+bmJveCA9IFJBREVPTl9OUl9TQVJFQV9DTElQUkVDVFM7CgoJcmFkZW9uX2NwX2Rpc3BhdGNoX3N3YXAoZGV2KTsKCWRldl9wcml2LT5zYXJlYV9wcml2LT5jdHhfb3duZXIgPSAwOwoKCUNPTU1JVF9SSU5HKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCByYWRlb25fY3BfdmVydGV4KERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9maWxlX3QgKmZpbHBfcHJpdjsKCWRybV9yYWRlb25fc2FyZWFfdCAqc2FyZWFfcHJpdiA9IGRldl9wcml2LT5zYXJlYV9wcml2OwoJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Cglkcm1fYnVmX3QgKmJ1ZjsKCWRybV9yYWRlb25fdmVydGV4X3QgdmVydGV4OwoJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHByaW07CgoJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CgoJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKGZpbHBfcHJpdiwgZmlscCk7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKHZlcnRleCwgKGRybV9yYWRlb25fdmVydGV4X3QgX191c2VyICopIGRhdGEsCgkJCQkgc2l6ZW9mKHZlcnRleCkpOwoKCURSTV9ERUJVRygicGlkPSVkIGluZGV4PSVkIGNvdW50PSVkIGRpc2NhcmQ9JWRcbiIsCgkJICBEUk1fQ1VSUkVOVFBJRCwgdmVydGV4LmlkeCwgdmVydGV4LmNvdW50LCB2ZXJ0ZXguZGlzY2FyZCk7CgoJaWYgKHZlcnRleC5pZHggPCAwIHx8IHZlcnRleC5pZHggPj0gZG1hLT5idWZfY291bnQpIHsKCQlEUk1fRVJST1IoImJ1ZmZlciBpbmRleCAlZCAob2YgJWQgbWF4KVxuIiwKCQkJICB2ZXJ0ZXguaWR4LCBkbWEtPmJ1Zl9jb3VudCAtIDEpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CglpZiAodmVydGV4LnByaW0gPCAwIHx8IHZlcnRleC5wcmltID4gUkFERU9OX1BSSU1fVFlQRV8zVlJUX0xJTkVfTElTVCkgewoJCURSTV9FUlJPUigiYnVmZmVyIHByaW0gJWRcbiIsIHZlcnRleC5wcmltKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CglWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOwoKCWlmIChidWYtPmZpbHAgIT0gZmlscCkgewoJCURSTV9FUlJPUigicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCgkJCSAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCWlmIChidWYtPnBlbmRpbmcpIHsKCQlEUk1fRVJST1IoInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIHZlcnRleC5pZHgpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJLyogQnVpbGQgdXAgYSBwcmltX3QgcmVjb3JkOgoJICovCglpZiAodmVydGV4LmNvdW50KSB7CgkJYnVmLT51c2VkID0gdmVydGV4LmNvdW50OwkvKiBub3QgdXNlZD8gKi8KCgkJaWYgKHNhcmVhX3ByaXYtPmRpcnR5ICYgflJBREVPTl9VUExPQURfQ0xJUFJFQ1RTKSB7CgkJCWlmIChyYWRlb25fZW1pdF9zdGF0ZShkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCSAgICAgICZzYXJlYV9wcml2LT5jb250ZXh0X3N0YXRlLAoJCQkJCSAgICAgIHNhcmVhX3ByaXYtPnRleF9zdGF0ZSwKCQkJCQkgICAgICBzYXJlYV9wcml2LT5kaXJ0eSkpIHsKCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc3RhdGUgZmFpbGVkXG4iKTsKCQkJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgkJCX0KCgkJCXNhcmVhX3ByaXYtPmRpcnR5ICY9IH4oUkFERU9OX1VQTE9BRF9URVgwSU1BR0VTIHwKCQkJCQkgICAgICAgUkFERU9OX1VQTE9BRF9URVgxSU1BR0VTIHwKCQkJCQkgICAgICAgUkFERU9OX1VQTE9BRF9URVgySU1BR0VTIHwKCQkJCQkgICAgICAgUkFERU9OX1JFUVVJUkVfUVVJRVNDRU5DRSk7CgkJfQoKCQlwcmltLnN0YXJ0ID0gMDsKCQlwcmltLmZpbmlzaCA9IHZlcnRleC5jb3VudDsJLyogdW51c2VkICovCgkJcHJpbS5wcmltID0gdmVydGV4LnByaW07CgkJcHJpbS5udW12ZXJ0cyA9IHZlcnRleC5jb3VudDsKCQlwcmltLnZjX2Zvcm1hdCA9IGRldl9wcml2LT5zYXJlYV9wcml2LT52Y19mb3JtYXQ7CgoJCXJhZGVvbl9jcF9kaXNwYXRjaF92ZXJ0ZXgoZGV2LCBidWYsICZwcmltKTsKCX0KCglpZiAodmVydGV4LmRpc2NhcmQpIHsKCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOwoJfQoKCUNPTU1JVF9SSU5HKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCByYWRlb25fY3BfaW5kaWNlcyhEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fZmlsZV90ICpmaWxwX3ByaXY7Cglkcm1fcmFkZW9uX3NhcmVhX3QgKnNhcmVhX3ByaXYgPSBkZXZfcHJpdi0+c2FyZWFfcHJpdjsKCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwoJZHJtX2J1Zl90ICpidWY7Cglkcm1fcmFkZW9uX2luZGljZXNfdCBlbHRzOwoJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHByaW07CglpbnQgY291bnQ7CgoJTE9DS19URVNUX1dJVEhfUkVUVVJOKGRldiwgZmlscCk7CgoJRFJNX0dFVF9QUklWX1dJVEhfUkVUVVJOKGZpbHBfcHJpdiwgZmlscCk7CgoJRFJNX0NPUFlfRlJPTV9VU0VSX0lPQ1RMKGVsdHMsIChkcm1fcmFkZW9uX2luZGljZXNfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YoZWx0cykpOwoKCURSTV9ERUJVRygicGlkPSVkIGluZGV4PSVkIHN0YXJ0PSVkIGVuZD0lZCBkaXNjYXJkPSVkXG4iLAoJCSAgRFJNX0NVUlJFTlRQSUQsIGVsdHMuaWR4LCBlbHRzLnN0YXJ0LCBlbHRzLmVuZCwgZWx0cy5kaXNjYXJkKTsKCglpZiAoZWx0cy5pZHggPCAwIHx8IGVsdHMuaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CgkJRFJNX0VSUk9SKCJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCgkJCSAgZWx0cy5pZHgsIGRtYS0+YnVmX2NvdW50IC0gMSk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCWlmIChlbHRzLnByaW0gPCAwIHx8IGVsdHMucHJpbSA+IFJBREVPTl9QUklNX1RZUEVfM1ZSVF9MSU5FX0xJU1QpIHsKCQlEUk1fRVJST1IoImJ1ZmZlciBwcmltICVkXG4iLCBlbHRzLnByaW0pOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglidWYgPSBkbWEtPmJ1Zmxpc3RbZWx0cy5pZHhdOwoKCWlmIChidWYtPmZpbHAgIT0gZmlscCkgewoJCURSTV9FUlJPUigicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCgkJCSAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCWlmIChidWYtPnBlbmRpbmcpIHsKCQlEUk1fRVJST1IoInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGVsdHMuaWR4KTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWNvdW50ID0gKGVsdHMuZW5kIC0gZWx0cy5zdGFydCkgLyBzaXplb2YodTE2KTsKCWVsdHMuc3RhcnQgLT0gUkFERU9OX0lOREVYX1BSSU1fT0ZGU0VUOwoKCWlmIChlbHRzLnN0YXJ0ICYgMHg3KSB7CgkJRFJNX0VSUk9SKCJtaXNhbGlnbmVkIGJ1ZmZlciAweCV4XG4iLCBlbHRzLnN0YXJ0KTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoJaWYgKGVsdHMuc3RhcnQgPCBidWYtPnVzZWQpIHsKCQlEUk1fRVJST1IoIm5vIGhlYWRlciAweCV4IC0gMHgleFxuIiwgZWx0cy5zdGFydCwgYnVmLT51c2VkKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWJ1Zi0+dXNlZCA9IGVsdHMuZW5kOwoKCWlmIChzYXJlYV9wcml2LT5kaXJ0eSAmIH5SQURFT05fVVBMT0FEX0NMSVBSRUNUUykgewoJCWlmIChyYWRlb25fZW1pdF9zdGF0ZShkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJICAgICAgJnNhcmVhX3ByaXYtPmNvbnRleHRfc3RhdGUsCgkJCQkgICAgICBzYXJlYV9wcml2LT50ZXhfc3RhdGUsCgkJCQkgICAgICBzYXJlYV9wcml2LT5kaXJ0eSkpIHsKCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zdGF0ZSBmYWlsZWRcbiIpOwoJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCX0KCgkJc2FyZWFfcHJpdi0+ZGlydHkgJj0gfihSQURFT05fVVBMT0FEX1RFWDBJTUFHRVMgfAoJCQkJICAgICAgIFJBREVPTl9VUExPQURfVEVYMUlNQUdFUyB8CgkJCQkgICAgICAgUkFERU9OX1VQTE9BRF9URVgySU1BR0VTIHwKCQkJCSAgICAgICBSQURFT05fUkVRVUlSRV9RVUlFU0NFTkNFKTsKCX0KCgkvKiBCdWlsZCB1cCBhIHByaW1fdCByZWNvcmQ6CgkgKi8KCXByaW0uc3RhcnQgPSBlbHRzLnN0YXJ0OwoJcHJpbS5maW5pc2ggPSBlbHRzLmVuZDsKCXByaW0ucHJpbSA9IGVsdHMucHJpbTsKCXByaW0ub2Zmc2V0ID0gMDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZG1hIGJ1ZmZlcnMgKi8KCXByaW0ubnVtdmVydHMgPSBSQURFT05fTUFYX1ZCX1ZFUlRTOwkvKiBkdWggKi8KCXByaW0udmNfZm9ybWF0ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnZjX2Zvcm1hdDsKCglyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkZXYsIGJ1ZiwgJnByaW0pOwoJaWYgKGVsdHMuZGlzY2FyZCkgewoJCXJhZGVvbl9jcF9kaXNjYXJkX2J1ZmZlcihkZXYsIGJ1Zik7Cgl9CgoJQ09NTUlUX1JJTkcoKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9jcF90ZXh0dXJlKERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9yYWRlb25fdGV4dHVyZV90IHRleDsKCWRybV9yYWRlb25fdGV4X2ltYWdlX3QgaW1hZ2U7CglpbnQgcmV0OwoKCUxPQ0tfVEVTVF9XSVRIX1JFVFVSTihkZXYsIGZpbHApOwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTCh0ZXgsIChkcm1fcmFkZW9uX3RleHR1cmVfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YodGV4KSk7CgoJaWYgKHRleC5pbWFnZSA9PSBOVUxMKSB7CgkJRFJNX0VSUk9SKCJudWxsIHRleHR1cmUgaW1hZ2UhXG4iKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJmltYWdlLAoJCQkgICAgICAgKGRybV9yYWRlb25fdGV4X2ltYWdlX3QgX191c2VyICopIHRleC5pbWFnZSwKCQkJICAgICAgIHNpemVvZihpbWFnZSkpKQoJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglyZXQgPSByYWRlb25fY3BfZGlzcGF0Y2hfdGV4dHVyZShmaWxwLCBkZXYsICZ0ZXgsICZpbWFnZSk7CgoJQ09NTUlUX1JJTkcoKTsKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX3N0aXBwbGUoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9zdGlwcGxlX3Qgc3RpcHBsZTsKCXUzMiBtYXNrWzMyXTsKCglMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoc3RpcHBsZSwgKGRybV9yYWRlb25fc3RpcHBsZV90IF9fdXNlciAqKSBkYXRhLAoJCQkJIHNpemVvZihzdGlwcGxlKSk7CgoJaWYgKERSTV9DT1BZX0ZST01fVVNFUigmbWFzaywgc3RpcHBsZS5tYXNrLCAzMiAqIHNpemVvZih1MzIpKSkKCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJcmFkZW9uX2NwX2Rpc3BhdGNoX3N0aXBwbGUoZGV2LCBtYXNrKTsKCglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX2luZGlyZWN0KERSTV9JT0NUTF9BUkdTKQp7CglEUk1fREVWSUNFOwoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9kZXZpY2VfZG1hX3QgKmRtYSA9IGRldi0+ZG1hOwoJZHJtX2J1Zl90ICpidWY7Cglkcm1fcmFkZW9uX2luZGlyZWN0X3QgaW5kaXJlY3Q7CglSSU5HX0xPQ0FMUzsKCglMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoaW5kaXJlY3QsCgkJCQkgKGRybV9yYWRlb25faW5kaXJlY3RfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YoaW5kaXJlY3QpKTsKCglEUk1fREVCVUcoImluZGlyZWN0OiBpZHg9JWQgcz0lZCBlPSVkIGQ9JWRcbiIsCgkJICBpbmRpcmVjdC5pZHgsIGluZGlyZWN0LnN0YXJ0LCBpbmRpcmVjdC5lbmQsIGluZGlyZWN0LmRpc2NhcmQpOwoKCWlmIChpbmRpcmVjdC5pZHggPCAwIHx8IGluZGlyZWN0LmlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgewoJCURSTV9FUlJPUigiYnVmZmVyIGluZGV4ICVkIChvZiAlZCBtYXgpXG4iLAoJCQkgIGluZGlyZWN0LmlkeCwgZG1hLT5idWZfY291bnQgLSAxKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWJ1ZiA9IGRtYS0+YnVmbGlzdFtpbmRpcmVjdC5pZHhdOwoKCWlmIChidWYtPmZpbHAgIT0gZmlscCkgewoJCURSTV9FUlJPUigicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCgkJCSAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCWlmIChidWYtPnBlbmRpbmcpIHsKCQlEUk1fRVJST1IoInNlbmRpbmcgcGVuZGluZyBidWZmZXIgJWRcbiIsIGluZGlyZWN0LmlkeCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglpZiAoaW5kaXJlY3Quc3RhcnQgPCBidWYtPnVzZWQpIHsKCQlEUk1fRVJST1IoInJldXNpbmcgaW5kaXJlY3Q6IHN0YXJ0PTB4JXggYWN0dWFsPTB4JXhcbiIsCgkJCSAgaW5kaXJlY3Quc3RhcnQsIGJ1Zi0+dXNlZCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglSSU5HX1NQQUNFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwoJVkJfQUdFX1RFU1RfV0lUSF9SRVRVUk4oZGV2X3ByaXYpOwoKCWJ1Zi0+dXNlZCA9IGluZGlyZWN0LmVuZDsKCgkvKiBXYWl0IGZvciB0aGUgM0Qgc3RyZWFtIHRvIGlkbGUgYmVmb3JlIHRoZSBpbmRpcmVjdCBidWZmZXIKCSAqIGNvbnRhaW5pbmcgMkQgYWNjZWxlcmF0aW9uIGNvbW1hbmRzIGlzIHByb2Nlc3NlZC4KCSAqLwoJQkVHSU5fUklORygyKTsKCglSQURFT05fV0FJVF9VTlRJTF8zRF9JRExFKCk7CgoJQURWQU5DRV9SSU5HKCk7CgoJLyogRGlzcGF0Y2ggdGhlIGluZGlyZWN0IGJ1ZmZlciBmdWxsIG9mIGNvbW1hbmRzIGZyb20gdGhlCgkgKiBYIHNlcnZlci4gIFRoaXMgaXMgaW5zZWN1cmUgYW5kIGlzIHRodXMgb25seSBhdmFpbGFibGUgdG8KCSAqIHByaXZpbGVnZWQgY2xpZW50cy4KCSAqLwoJcmFkZW9uX2NwX2Rpc3BhdGNoX2luZGlyZWN0KGRldiwgYnVmLCBpbmRpcmVjdC5zdGFydCwgaW5kaXJlY3QuZW5kKTsKCWlmIChpbmRpcmVjdC5kaXNjYXJkKSB7CgkJcmFkZW9uX2NwX2Rpc2NhcmRfYnVmZmVyKGRldiwgYnVmKTsKCX0KCglDT01NSVRfUklORygpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2NwX3ZlcnRleDIoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX2ZpbGVfdCAqZmlscF9wcml2OwoJZHJtX3JhZGVvbl9zYXJlYV90ICpzYXJlYV9wcml2ID0gZGV2X3ByaXYtPnNhcmVhX3ByaXY7Cglkcm1fZGV2aWNlX2RtYV90ICpkbWEgPSBkZXYtPmRtYTsKCWRybV9idWZfdCAqYnVmOwoJZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgdmVydGV4OwoJaW50IGk7Cgl1bnNpZ25lZCBjaGFyIGxhc3RzdGF0ZTsKCglMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKCglEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwodmVydGV4LCAoZHJtX3JhZGVvbl92ZXJ0ZXgyX3QgX191c2VyICopIGRhdGEsCgkJCQkgc2l6ZW9mKHZlcnRleCkpOwoKCURSTV9ERUJVRygicGlkPSVkIGluZGV4PSVkIGRpc2NhcmQ9JWRcbiIsCgkJICBEUk1fQ1VSUkVOVFBJRCwgdmVydGV4LmlkeCwgdmVydGV4LmRpc2NhcmQpOwoKCWlmICh2ZXJ0ZXguaWR4IDwgMCB8fCB2ZXJ0ZXguaWR4ID49IGRtYS0+YnVmX2NvdW50KSB7CgkJRFJNX0VSUk9SKCJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCgkJCSAgdmVydGV4LmlkeCwgZG1hLT5idWZfY291bnQgLSAxKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCVJJTkdfU1BBQ0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CglWQl9BR0VfVEVTVF9XSVRIX1JFVFVSTihkZXZfcHJpdik7CgoJYnVmID0gZG1hLT5idWZsaXN0W3ZlcnRleC5pZHhdOwoKCWlmIChidWYtPmZpbHAgIT0gZmlscCkgewoJCURSTV9FUlJPUigicHJvY2VzcyAlZCB1c2luZyBidWZmZXIgb3duZWQgYnkgJXBcbiIsCgkJCSAgRFJNX0NVUlJFTlRQSUQsIGJ1Zi0+ZmlscCk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglpZiAoYnVmLT5wZW5kaW5nKSB7CgkJRFJNX0VSUk9SKCJzZW5kaW5nIHBlbmRpbmcgYnVmZmVyICVkXG4iLCB2ZXJ0ZXguaWR4KTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWlmIChzYXJlYV9wcml2LT5uYm94ID4gUkFERU9OX05SX1NBUkVBX0NMSVBSRUNUUykKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoKCWZvciAobGFzdHN0YXRlID0gMHhmZiwgaSA9IDA7IGkgPCB2ZXJ0ZXgubnJfcHJpbXM7IGkrKykgewoJCWRybV9yYWRlb25fcHJpbV90IHByaW07CgkJZHJtX3JhZGVvbl90Y2xfcHJpbV90IHRjbHByaW07CgoJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJnByaW0sICZ2ZXJ0ZXgucHJpbVtpXSwgc2l6ZW9mKHByaW0pKSkKCQkJcmV0dXJuIERSTV9FUlIoRUZBVUxUKTsKCgkJaWYgKHByaW0uc3RhdGVpZHggIT0gbGFzdHN0YXRlKSB7CgkJCWRybV9yYWRlb25fc3RhdGVfdCBzdGF0ZTsKCgkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJnN0YXRlLAoJCQkJCSAgICAgICAmdmVydGV4LnN0YXRlW3ByaW0uc3RhdGVpZHhdLAoJCQkJCSAgICAgICBzaXplb2Yoc3RhdGUpKSkKCQkJCXJldHVybiBEUk1fRVJSKEVGQVVMVCk7CgoJCQlpZiAocmFkZW9uX2VtaXRfc3RhdGUyKGRldl9wcml2LCBmaWxwX3ByaXYsICZzdGF0ZSkpIHsKCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfc3RhdGUyIGZhaWxlZFxuIik7CgkJCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJCQl9CgoJCQlsYXN0c3RhdGUgPSBwcmltLnN0YXRlaWR4OwoJCX0KCgkJdGNscHJpbS5zdGFydCA9IHByaW0uc3RhcnQ7CgkJdGNscHJpbS5maW5pc2ggPSBwcmltLmZpbmlzaDsKCQl0Y2xwcmltLnByaW0gPSBwcmltLnByaW07CgkJdGNscHJpbS52Y19mb3JtYXQgPSBwcmltLnZjX2Zvcm1hdDsKCgkJaWYgKHByaW0ucHJpbSAmIFJBREVPTl9QUklNX1dBTEtfSU5EKSB7CgkJCXRjbHByaW0ub2Zmc2V0ID0gcHJpbS5udW12ZXJ0cyAqIDY0OwoJCQl0Y2xwcmltLm51bXZlcnRzID0gUkFERU9OX01BWF9WQl9WRVJUUzsJLyogZHVoICovCgoJCQlyYWRlb25fY3BfZGlzcGF0Y2hfaW5kaWNlcyhkZXYsIGJ1ZiwgJnRjbHByaW0pOwoJCX0gZWxzZSB7CgkJCXRjbHByaW0ubnVtdmVydHMgPSBwcmltLm51bXZlcnRzOwoJCQl0Y2xwcmltLm9mZnNldCA9IDA7CS8qIG5vdCB1c2VkICovCgoJCQlyYWRlb25fY3BfZGlzcGF0Y2hfdmVydGV4KGRldiwgYnVmLCAmdGNscHJpbSk7CgkJfQoKCQlpZiAoc2FyZWFfcHJpdi0+bmJveCA9PSAxKQoJCQlzYXJlYV9wcml2LT5uYm94ID0gMDsKCX0KCglpZiAodmVydGV4LmRpc2NhcmQpIHsKCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOwoJfQoKCUNPTU1JVF9SSU5HKCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCByYWRlb25fZW1pdF9wYWNrZXRzKGRybV9yYWRlb25fcHJpdmF0ZV90ICogZGV2X3ByaXYsCgkJCSAgICAgICBkcm1fZmlsZV90ICogZmlscF9wcml2LAoJCQkgICAgICAgZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAoJCQkgICAgICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCnsKCWludCBpZCA9IChpbnQpaGVhZGVyLnBhY2tldC5wYWNrZXRfaWQ7CglpbnQgc3osIHJlZzsKCWludCAqZGF0YSA9IChpbnQgKiljbWRidWYtPmJ1ZjsKCVJJTkdfTE9DQUxTOwoKCWlmIChpZCA+PSBSQURFT05fTUFYX1NUQVRFX1BBQ0tFVFMpCgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCglzeiA9IHBhY2tldFtpZF0ubGVuOwoJcmVnID0gcGFja2V0W2lkXS5zdGFydDsKCglpZiAoc3ogKiBzaXplb2YoaW50KSA+IGNtZGJ1Zi0+YnVmc3opIHsKCQlEUk1fRVJST1IoIlBhY2tldCBzaXplIHByb3ZpZGVkIGxhcmdlciB0aGFuIGRhdGEgcHJvdmlkZWRcbiIpOwoJCXJldHVybiBEUk1fRVJSKEVJTlZBTCk7Cgl9CgoJaWYgKHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0cyhkZXZfcHJpdiwgZmlscF9wcml2LCBpZCwgZGF0YSkpIHsKCQlEUk1fRVJST1IoIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iKTsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCUJFR0lOX1JJTkcoc3ogKyAxKTsKCU9VVF9SSU5HKENQX1BBQ0tFVDAocmVnLCAoc3ogLSAxKSkpOwoJT1VUX1JJTkdfVEFCTEUoZGF0YSwgc3opOwoJQURWQU5DRV9SSU5HKCk7CgoJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKCWNtZGJ1Zi0+YnVmc3ogLT0gc3ogKiBzaXplb2YoaW50KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgX19pbmxpbmVfXyBpbnQgcmFkZW9uX2VtaXRfc2NhbGFycyhkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCgkJCQkJICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCgkJCQkJICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKewoJaW50IHN6ID0gaGVhZGVyLnNjYWxhcnMuY291bnQ7CglpbnQgc3RhcnQgPSBoZWFkZXIuc2NhbGFycy5vZmZzZXQ7CglpbnQgc3RyaWRlID0gaGVhZGVyLnNjYWxhcnMuc3RyaWRlOwoJUklOR19MT0NBTFM7CgoJQkVHSU5fUklORygzICsgc3opOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVENMX1NDQUxBUl9JTkRYX1JFRywgMCkpOwoJT1VUX1JJTkcoc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9TQ0FMX0lORFhfRFdPUkRfU1RSSURFX1NISUZUKSk7CglPVVRfUklORyhDUF9QQUNLRVQwX1RBQkxFKFJBREVPTl9TRV9UQ0xfU0NBTEFSX0RBVEFfUkVHLCBzeiAtIDEpKTsKCU9VVF9SSU5HX1RBQkxFKGNtZGJ1Zi0+YnVmLCBzeik7CglBRFZBTkNFX1JJTkcoKTsKCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CgljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CglyZXR1cm4gMDsKfQoKLyogR29kIHRoaXMgaXMgdWdseQogKi8Kc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3NjYWxhcnMyKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKCQkJCQkgICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCgkJCQkJICAgZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYpCnsKCWludCBzeiA9IGhlYWRlci5zY2FsYXJzLmNvdW50OwoJaW50IHN0YXJ0ID0gKCh1bnNpZ25lZCBpbnQpaGVhZGVyLnNjYWxhcnMub2Zmc2V0KSArIDB4MTAwOwoJaW50IHN0cmlkZSA9IGhlYWRlci5zY2FsYXJzLnN0cmlkZTsKCVJJTkdfTE9DQUxTOwoKCUJFR0lOX1JJTkcoMyArIHN6KTsKCU9VVF9SSU5HKENQX1BBQ0tFVDAoUkFERU9OX1NFX1RDTF9TQ0FMQVJfSU5EWF9SRUcsIDApKTsKCU9VVF9SSU5HKHN0YXJ0IHwgKHN0cmlkZSA8PCBSQURFT05fU0NBTF9JTkRYX0RXT1JEX1NUUklERV9TSElGVCkpOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMF9UQUJMRShSQURFT05fU0VfVENMX1NDQUxBUl9EQVRBX1JFRywgc3ogLSAxKSk7CglPVVRfUklOR19UQUJMRShjbWRidWYtPmJ1Ziwgc3opOwoJQURWQU5DRV9SSU5HKCk7CgljbWRidWYtPmJ1ZiArPSBzeiAqIHNpemVvZihpbnQpOwoJY21kYnVmLT5idWZzeiAtPSBzeiAqIHNpemVvZihpbnQpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBfX2lubGluZV9fIGludCByYWRlb25fZW1pdF92ZWN0b3JzKGRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiwKCQkJCQkgIGRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlciwKCQkJCQkgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQp7CglpbnQgc3ogPSBoZWFkZXIudmVjdG9ycy5jb3VudDsKCWludCBzdGFydCA9IGhlYWRlci52ZWN0b3JzLm9mZnNldDsKCWludCBzdHJpZGUgPSBoZWFkZXIudmVjdG9ycy5zdHJpZGU7CglSSU5HX0xPQ0FMUzsKCglCRUdJTl9SSU5HKDUgKyBzeik7CglPVVRfUklOR19SRUcoUkFERU9OX1NFX1RDTF9TVEFURV9GTFVTSCwgMCk7CglPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9UQ0xfVkVDVE9SX0lORFhfUkVHLCAwKSk7CglPVVRfUklORyhzdGFydCB8IChzdHJpZGUgPDwgUkFERU9OX1ZFQ19JTkRYX09DVFdPUkRfU1RSSURFX1NISUZUKSk7CglPVVRfUklORyhDUF9QQUNLRVQwX1RBQkxFKFJBREVPTl9TRV9UQ0xfVkVDVE9SX0RBVEFfUkVHLCAoc3ogLSAxKSkpOwoJT1VUX1JJTkdfVEFCTEUoY21kYnVmLT5idWYsIHN6KTsKCUFEVkFOQ0VfUklORygpOwoKCWNtZGJ1Zi0+YnVmICs9IHN6ICogc2l6ZW9mKGludCk7CgljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3ZlY2xpbmVhcihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCgkJCQkJICBkcm1fcmFkZW9uX2NtZF9oZWFkZXJfdCBoZWFkZXIsCgkJCQkJICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKewoJaW50IHN6ID0gaGVhZGVyLnZlY2xpbmVhci5jb3VudCAqIDQ7CglpbnQgc3RhcnQgPSBoZWFkZXIudmVjbGluZWFyLmFkZHJfbG8gfCAoaGVhZGVyLnZlY2xpbmVhci5hZGRyX2hpIDw8IDgpOwoJUklOR19MT0NBTFM7CgogICAgICAgIGlmICghc3opCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICBpZiAoc3ogKiA0ID4gY21kYnVmLT5idWZzeikKICAgICAgICAgICAgICAgIHJldHVybiBEUk1fRVJSKEVJTlZBTCk7CgoJQkVHSU5fUklORyg1ICsgc3opOwoJT1VUX1JJTkdfUkVHKFJBREVPTl9TRV9UQ0xfU1RBVEVfRkxVU0gsIDApOwoJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVENMX1ZFQ1RPUl9JTkRYX1JFRywgMCkpOwoJT1VUX1JJTkcoc3RhcnQgfCAoMSA8PCBSQURFT05fVkVDX0lORFhfT0NUV09SRF9TVFJJREVfU0hJRlQpKTsKCU9VVF9SSU5HKENQX1BBQ0tFVDBfVEFCTEUoUkFERU9OX1NFX1RDTF9WRUNUT1JfREFUQV9SRUcsIChzeiAtIDEpKSk7CglPVVRfUklOR19UQUJMRShjbWRidWYtPmJ1Ziwgc3opOwoJQURWQU5DRV9SSU5HKCk7CgoJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKCWNtZGJ1Zi0+YnVmc3ogLT0gc3ogKiBzaXplb2YoaW50KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9lbWl0X3BhY2tldDMoZHJtX2RldmljZV90ICogZGV2LAoJCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKCQkJICAgICAgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQp7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJdW5zaWduZWQgaW50IGNtZHN6OwoJaW50IHJldDsKCVJJTkdfTE9DQUxTOwoKCURSTV9ERUJVRygiXG4iKTsKCglpZiAoKHJldCA9IHJhZGVvbl9jaGVja19hbmRfZml4dXBfcGFja2V0MyhkZXZfcHJpdiwgZmlscF9wcml2LAoJCQkJCQkgIGNtZGJ1ZiwgJmNtZHN6KSkpIHsKCQlEUk1fRVJST1IoIlBhY2tldCB2ZXJpZmljYXRpb24gZmFpbGVkXG4iKTsKCQlyZXR1cm4gcmV0OwoJfQoKCUJFR0lOX1JJTkcoY21kc3opOwoJT1VUX1JJTkdfVEFCTEUoY21kYnVmLT5idWYsIGNtZHN6KTsKCUFEVkFOQ0VfUklORygpOwoKCWNtZGJ1Zi0+YnVmICs9IGNtZHN6ICogNDsKCWNtZGJ1Zi0+YnVmc3ogLT0gY21kc3ogKiA0OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0M19jbGlwcmVjdChkcm1fZGV2aWNlX3QgKmRldiwKCQkJCQlkcm1fZmlsZV90ICpmaWxwX3ByaXYsCgkJCQkJZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90ICpjbWRidWYsCgkJCQkJaW50IG9yaWdfbmJveCkKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWRybV9jbGlwX3JlY3RfdCBib3g7Cgl1bnNpZ25lZCBpbnQgY21kc3o7CglpbnQgcmV0OwoJZHJtX2NsaXBfcmVjdF90IF9fdXNlciAqYm94ZXMgPSBjbWRidWYtPmJveGVzOwoJaW50IGkgPSAwOwoJUklOR19MT0NBTFM7CgoJRFJNX0RFQlVHKCJcbiIpOwoKCWlmICgocmV0ID0gcmFkZW9uX2NoZWNrX2FuZF9maXh1cF9wYWNrZXQzKGRldl9wcml2LCBmaWxwX3ByaXYsCgkJCQkJCSAgY21kYnVmLCAmY21kc3opKSkgewoJCURSTV9FUlJPUigiUGFja2V0IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIpOwoJCXJldHVybiByZXQ7Cgl9CgoJaWYgKCFvcmlnX25ib3gpCgkJZ290byBvdXQ7CgoJZG8gewoJCWlmIChpIDwgY21kYnVmLT5uYm94KSB7CgkJCWlmIChEUk1fQ09QWV9GUk9NX1VTRVIoJmJveCwgJmJveGVzW2ldLCBzaXplb2YoYm94KSkpCgkJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCQkvKiBGSVhNRSBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IHRpbWVzIHJvdW5kCgkJCSAqIHRoaXMgbG9vcCwgc2VuZCBhIFdBSVRfVU5USUxfM0RfSURMRSBiZWZvcmUKCQkJICogY2FsbGluZyBlbWl0X2NsaXBfcmVjdCgpLiBUaGlzIGZpeGVzIGEKCQkJICogbG9ja3VwIG9uIGZhc3QgbWFjaGluZXMgd2hlbiBzZW5kaW5nCgkJCSAqIHNldmVyYWwgY2xpcHJlY3RzIHdpdGggYSBjbWRidWYsIGFzIHdoZW4KCQkJICogd2F2aW5nIGEgMkQgd2luZG93IG92ZXIgYSAzRAoJCQkgKiB3aW5kb3cuIFNvbWV0aGluZyBpbiB0aGUgY29tbWFuZHMgZnJvbSB1c2VyCgkJCSAqIHNwYWNlIHNlZW1zIHRvIGhhbmcgdGhlIGNhcmQgd2hlbiB0aGV5J3JlCgkJCSAqIHNlbnQgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdy4gVGhhdCB3b3VsZCBiZQoJCQkgKiB0aGUgY29ycmVjdCBwbGFjZSB0byBmaXggaXQgYnV0IHRoaXMgd29ya3MKCQkJICogYXJvdW5kIGl0IHVudGlsIEkgY2FuIGZpZ3VyZSB0aGF0IG91dCAtIFRpbQoJCQkgKiBTbWl0aCAqLwoJCQlpZiAoaSkgewoJCQkJQkVHSU5fUklORygyKTsKCQkJCVJBREVPTl9XQUlUX1VOVElMXzNEX0lETEUoKTsKCQkJCUFEVkFOQ0VfUklORygpOwoJCQl9CgkJCXJhZGVvbl9lbWl0X2NsaXBfcmVjdChkZXZfcHJpdiwgJmJveCk7CgkJfQoKCQlCRUdJTl9SSU5HKGNtZHN6KTsKCQlPVVRfUklOR19UQUJMRShjbWRidWYtPmJ1ZiwgY21kc3opOwoJCUFEVkFOQ0VfUklORygpOwoKCX0gd2hpbGUgKCsraSA8IGNtZGJ1Zi0+bmJveCk7CglpZiAoY21kYnVmLT5uYm94ID09IDEpCgkJY21kYnVmLT5uYm94ID0gMDsKCiAgICAgIG91dDoKCWNtZGJ1Zi0+YnVmICs9IGNtZHN6ICogNDsKCWNtZGJ1Zi0+YnVmc3ogLT0gY21kc3ogKiA0OwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfd2FpdChkcm1fZGV2aWNlX3QgKiBkZXYsIGludCBmbGFncykKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCVJJTkdfTE9DQUxTOwoKCURSTV9ERUJVRygiJXM6ICV4XG4iLCBfX0ZVTkNUSU9OX18sIGZsYWdzKTsKCXN3aXRjaCAoZmxhZ3MpIHsKCWNhc2UgUkFERU9OX1dBSVRfMkQ6CgkJQkVHSU5fUklORygyKTsKCQlSQURFT05fV0FJVF9VTlRJTF8yRF9JRExFKCk7CgkJQURWQU5DRV9SSU5HKCk7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9XQUlUXzNEOgoJCUJFR0lOX1JJTkcoMik7CgkJUkFERU9OX1dBSVRfVU5USUxfM0RfSURMRSgpOwoJCUFEVkFOQ0VfUklORygpOwoJCWJyZWFrOwoJY2FzZSBSQURFT05fV0FJVF8yRCB8IFJBREVPTl9XQUlUXzNEOgoJCUJFR0lOX1JJTkcoMik7CgkJUkFERU9OX1dBSVRfVU5USUxfSURMRSgpOwoJCUFEVkFOQ0VfUklORygpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9jcF9jbWRidWYoRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX2ZpbGVfdCAqZmlscF9wcml2OwoJZHJtX2RldmljZV9kbWFfdCAqZG1hID0gZGV2LT5kbWE7Cglkcm1fYnVmX3QgKmJ1ZiA9IE5VTEw7CglpbnQgaWR4OwoJZHJtX3JhZGVvbl9rY21kX2J1ZmZlcl90IGNtZGJ1ZjsKCWRybV9yYWRlb25fY21kX2hlYWRlcl90IGhlYWRlcjsKCWludCBvcmlnX25ib3gsIG9yaWdfYnVmc3o7CgljaGFyICprYnVmID0gTlVMTDsKCglMT0NLX1RFU1RfV0lUSF9SRVRVUk4oZGV2LCBmaWxwKTsKCglEUk1fR0VUX1BSSVZfV0lUSF9SRVRVUk4oZmlscF9wcml2LCBmaWxwKTsKCglEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwoY21kYnVmLAoJCQkJIChkcm1fcmFkZW9uX2NtZF9idWZmZXJfdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YoY21kYnVmKSk7CgoJUklOR19TUEFDRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCVZCX0FHRV9URVNUX1dJVEhfUkVUVVJOKGRldl9wcml2KTsKCglpZiAoY21kYnVmLmJ1ZnN6ID4gNjQgKiAxMDI0IHx8IGNtZGJ1Zi5idWZzeiA8IDApIHsKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCS8qIEFsbG9jYXRlIGFuIGluLWtlcm5lbCBhcmVhIGFuZCBjb3B5IGluIHRoZSBjbWRidWYuICBEbyB0aGlzIHRvIGF2b2lkCgkgKiByYWNlcyBiZXR3ZWVuIGNoZWNraW5nIHZhbHVlcyBhbmQgdXNpbmcgdGhvc2UgdmFsdWVzIGluIG90aGVyIGNvZGUsCgkgKiBhbmQgc2ltcGx5IHRvIGF2b2lkIGEgbG90IG9mIGZ1bmN0aW9uIGNhbGxzIHRvIGNvcHkgaW4gZGF0YS4KCSAqLwoJb3JpZ19idWZzeiA9IGNtZGJ1Zi5idWZzejsKCWlmIChvcmlnX2J1ZnN6ICE9IDApIHsKCQlrYnVmID0gZHJtX2FsbG9jKGNtZGJ1Zi5idWZzeiwgRFJNX01FTV9EUklWRVIpOwoJCWlmIChrYnVmID09IE5VTEwpCgkJCXJldHVybiBEUk1fRVJSKEVOT01FTSk7CgkJaWYgKERSTV9DT1BZX0ZST01fVVNFUihrYnVmLCAodm9pZCBfX3VzZXIgKiljbWRidWYuYnVmLAoJCQkJICAgICAgIGNtZGJ1Zi5idWZzeikpIHsKCQkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOwoJCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJCX0KCQljbWRidWYuYnVmID0ga2J1ZjsKCX0KCglvcmlnX25ib3ggPSBjbWRidWYubmJveDsKCglpZiAoZGV2X3ByaXYtPm1pY3JvY29kZV92ZXJzaW9uID09IFVDT0RFX1IzMDApIHsKCQlpbnQgdGVtcDsKCQl0ZW1wID0gcjMwMF9kb19jcF9jbWRidWYoZGV2LCBmaWxwLCBmaWxwX3ByaXYsICZjbWRidWYpOwoKCQlpZiAob3JpZ19idWZzeiAhPSAwKQoJCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CgoJCXJldHVybiB0ZW1wOwoJfQoKCS8qIG1pY3JvY29kZV92ZXJzaW9uICE9IHIzMDAgKi8KCXdoaWxlIChjbWRidWYuYnVmc3ogPj0gc2l6ZW9mKGhlYWRlcikpIHsKCgkJaGVhZGVyLmkgPSAqKGludCAqKWNtZGJ1Zi5idWY7CgkJY21kYnVmLmJ1ZiArPSBzaXplb2YoaGVhZGVyKTsKCQljbWRidWYuYnVmc3ogLT0gc2l6ZW9mKGhlYWRlcik7CgoJCXN3aXRjaCAoaGVhZGVyLmhlYWRlci5jbWRfdHlwZSkgewoJCWNhc2UgUkFERU9OX0NNRF9QQUNLRVQ6CgkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9QQUNLRVRcbiIpOwoJCQlpZiAocmFkZW9uX2VtaXRfcGFja2V0cwoJCQkgICAgKGRldl9wcml2LCBmaWxwX3ByaXYsIGhlYWRlciwgJmNtZGJ1ZikpIHsKCQkJCURSTV9FUlJPUigicmFkZW9uX2VtaXRfcGFja2V0cyBmYWlsZWRcbiIpOwoJCQkJZ290byBlcnI7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUkFERU9OX0NNRF9TQ0FMQVJTOgoJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfU0NBTEFSU1xuIik7CgkJCWlmIChyYWRlb25fZW1pdF9zY2FsYXJzKGRldl9wcml2LCBoZWFkZXIsICZjbWRidWYpKSB7CgkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3NjYWxhcnMgZmFpbGVkXG4iKTsKCQkJCWdvdG8gZXJyOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJBREVPTl9DTURfVkVDVE9SUzoKCQkJRFJNX0RFQlVHKCJSQURFT05fQ01EX1ZFQ1RPUlNcbiIpOwoJCQlpZiAocmFkZW9uX2VtaXRfdmVjdG9ycyhkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmKSkgewoJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF92ZWN0b3JzIGZhaWxlZFxuIik7CgkJCQlnb3RvIGVycjsKCQkJfQoJCQlicmVhazsKCgkJY2FzZSBSQURFT05fQ01EX0RNQV9ESVNDQVJEOgoJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfRE1BX0RJU0NBUkRcbiIpOwoJCQlpZHggPSBoZWFkZXIuZG1hLmJ1Zl9pZHg7CgkJCWlmIChpZHggPCAwIHx8IGlkeCA+PSBkbWEtPmJ1Zl9jb3VudCkgewoJCQkJRFJNX0VSUk9SKCJidWZmZXIgaW5kZXggJWQgKG9mICVkIG1heClcbiIsCgkJCQkJICBpZHgsIGRtYS0+YnVmX2NvdW50IC0gMSk7CgkJCQlnb3RvIGVycjsKCQkJfQoKCQkJYnVmID0gZG1hLT5idWZsaXN0W2lkeF07CgkJCWlmIChidWYtPmZpbHAgIT0gZmlscCB8fCBidWYtPnBlbmRpbmcpIHsKCQkJCURSTV9FUlJPUigiYmFkIGJ1ZmZlciAlcCAlcCAlZFxuIiwKCQkJCQkgIGJ1Zi0+ZmlscCwgZmlscCwgYnVmLT5wZW5kaW5nKTsKCQkJCWdvdG8gZXJyOwoJCQl9CgoJCQlyYWRlb25fY3BfZGlzY2FyZF9idWZmZXIoZGV2LCBidWYpOwoJCQlicmVhazsKCgkJY2FzZSBSQURFT05fQ01EX1BBQ0tFVDM6CgkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9QQUNLRVQzXG4iKTsKCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldDMoZGV2LCBmaWxwX3ByaXYsICZjbWRidWYpKSB7CgkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3BhY2tldDMgZmFpbGVkXG4iKTsKCQkJCWdvdG8gZXJyOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJBREVPTl9DTURfUEFDS0VUM19DTElQOgoJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfUEFDS0VUM19DTElQXG4iKTsKCQkJaWYgKHJhZGVvbl9lbWl0X3BhY2tldDNfY2xpcHJlY3QKCQkJICAgIChkZXYsIGZpbHBfcHJpdiwgJmNtZGJ1Ziwgb3JpZ19uYm94KSkgewoJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9wYWNrZXQzX2NsaXAgZmFpbGVkXG4iKTsKCQkJCWdvdG8gZXJyOwoJCQl9CgkJCWJyZWFrOwoKCQljYXNlIFJBREVPTl9DTURfU0NBTEFSUzI6CgkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9TQ0FMQVJTMlxuIik7CgkJCWlmIChyYWRlb25fZW1pdF9zY2FsYXJzMihkZXZfcHJpdiwgaGVhZGVyLCAmY21kYnVmKSkgewoJCQkJRFJNX0VSUk9SKCJyYWRlb25fZW1pdF9zY2FsYXJzMiBmYWlsZWRcbiIpOwoJCQkJZ290byBlcnI7CgkJCX0KCQkJYnJlYWs7CgoJCWNhc2UgUkFERU9OX0NNRF9XQUlUOgoJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfV0FJVFxuIik7CgkJCWlmIChyYWRlb25fZW1pdF93YWl0KGRldiwgaGVhZGVyLndhaXQuZmxhZ3MpKSB7CgkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3dhaXQgZmFpbGVkXG4iKTsKCQkJCWdvdG8gZXJyOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgUkFERU9OX0NNRF9WRUNMSU5FQVI6CgkJCURSTV9ERUJVRygiUkFERU9OX0NNRF9WRUNMSU5FQVJcbiIpOwoJCQlpZiAocmFkZW9uX2VtaXRfdmVjbGluZWFyKGRldl9wcml2LCBoZWFkZXIsICZjbWRidWYpKSB7CgkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3ZlY2xpbmVhciBmYWlsZWRcbiIpOwoJCQkJZ290byBlcnI7CgkJCX0KCQkJYnJlYWs7CgoJCWRlZmF1bHQ6CgkJCURSTV9FUlJPUigiYmFkIGNtZF90eXBlICVkIGF0ICVwXG4iLAoJCQkJICBoZWFkZXIuaGVhZGVyLmNtZF90eXBlLAoJCQkJICBjbWRidWYuYnVmIC0gc2l6ZW9mKGhlYWRlcikpOwoJCQlnb3RvIGVycjsKCQl9Cgl9CgoJaWYgKG9yaWdfYnVmc3ogIT0gMCkKCQlkcm1fZnJlZShrYnVmLCBvcmlnX2J1ZnN6LCBEUk1fTUVNX0RSSVZFUik7CgoJRFJNX0RFQlVHKCJET05FXG4iKTsKCUNPTU1JVF9SSU5HKCk7CglyZXR1cm4gMDsKCiAgICAgIGVycjoKCWlmIChvcmlnX2J1ZnN6ICE9IDApCgkJZHJtX2ZyZWUoa2J1Ziwgb3JpZ19idWZzeiwgRFJNX01FTV9EUklWRVIpOwoJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKfQoKc3RhdGljIGludCByYWRlb25fY3BfZ2V0cGFyYW0oRFJNX0lPQ1RMX0FSR1MpCnsKCURSTV9ERVZJQ0U7Cglkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJZHJtX3JhZGVvbl9nZXRwYXJhbV90IHBhcmFtOwoJaW50IHZhbHVlOwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChwYXJhbSwgKGRybV9yYWRlb25fZ2V0cGFyYW1fdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2YocGFyYW0pKTsKCglEUk1fREVCVUcoInBpZD0lZFxuIiwgRFJNX0NVUlJFTlRQSUQpOwoKCXN3aXRjaCAocGFyYW0ucGFyYW0pIHsKCWNhc2UgUkFERU9OX1BBUkFNX0dBUlRfQlVGRkVSX09GRlNFVDoKCQl2YWx1ZSA9IGRldl9wcml2LT5nYXJ0X2J1ZmZlcnNfb2Zmc2V0OwoJCWJyZWFrOwoJY2FzZSBSQURFT05fUEFSQU1fTEFTVF9GUkFNRToKCQlkZXZfcHJpdi0+c3RhdHMubGFzdF9mcmFtZV9yZWFkcysrOwoJCXZhbHVlID0gR0VUX1NDUkFUQ0goMCk7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0RJU1BBVENIOgoJCXZhbHVlID0gR0VUX1NDUkFUQ0goMSk7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9QQVJBTV9MQVNUX0NMRUFSOgoJCWRldl9wcml2LT5zdGF0cy5sYXN0X2NsZWFyX3JlYWRzKys7CgkJdmFsdWUgPSBHRVRfU0NSQVRDSCgyKTsKCQlicmVhazsKCWNhc2UgUkFERU9OX1BBUkFNX0lSUV9OUjoKCQl2YWx1ZSA9IGRldi0+aXJxOwoJCWJyZWFrOwoJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9CQVNFOgoJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfdm1fc3RhcnQ7CgkJYnJlYWs7CgljYXNlIFJBREVPTl9QQVJBTV9SRUdJU1RFUl9IQU5ETEU6CgkJdmFsdWUgPSBkZXZfcHJpdi0+bW1pby0+b2Zmc2V0OwoJCWJyZWFrOwoJY2FzZSBSQURFT05fUEFSQU1fU1RBVFVTX0hBTkRMRToKCQl2YWx1ZSA9IGRldl9wcml2LT5yaW5nX3JwdHJfb2Zmc2V0OwoJCWJyZWFrOwojaWYgQklUU19QRVJfTE9ORyA9PSAzMgoJCS8qCgkJICogVGhpcyBpb2N0bCgpIGRvZXNuJ3Qgd29yayBvbiA2NC1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgaHdfbG9jayBpcyBhCgkJICogcG9pbnRlciB3aGljaCBjYW4ndCBmaXQgaW50byBhbiBpbnQtc2l6ZWQgdmFyaWFibGUuICBBY2NvcmRpbmcgdG8KCQkgKiBNaWNoZWwgRORuemVyLCB0aGUgaW9jdGwoKSBpcyBvbmx5IHVzZWQgb24gZW1iZWRkZWQgcGxhdGZvcm1zLCBzbwoJCSAqIG5vdCBzdXBwb3J0aW5nIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICBJZiB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5CgkJICogaXMgbmVlZGVkIG9uIDY0LWJpdCBwbGF0Zm9ybXMsIGEgbmV3IGlvY3RsKCkgd291bGQgaGF2ZSB0byBiZSBhZGRlZCwKCQkgKiBzbyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIGVtYmVkZGVkIHBsYXRmb3JtcyBjYW4gYmUKCQkgKiBtYWludGFpbmVkLiAgLS1kYXZpZG0gNC1GZWItMjAwNC4KCQkgKi8KCWNhc2UgUkFERU9OX1BBUkFNX1NBUkVBX0hBTkRMRToKCQkvKiBUaGUgbG9jayBpcyB0aGUgZmlyc3QgZHdvcmQgaW4gdGhlIHNhcmVhLiAqLwoJCXZhbHVlID0gKGxvbmcpZGV2LT5sb2NrLmh3X2xvY2s7CgkJYnJlYWs7CiNlbmRpZgoJY2FzZSBSQURFT05fUEFSQU1fR0FSVF9URVhfSEFORExFOgoJCXZhbHVlID0gZGV2X3ByaXYtPmdhcnRfdGV4dHVyZXNfb2Zmc2V0OwoJCWJyZWFrOwoJCgljYXNlIFJBREVPTl9QQVJBTV9DQVJEX1RZUEU6CgkJaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfUENJRSkKCQkJdmFsdWUgPSBSQURFT05fQ0FSRF9QQ0lFOwoJCWVsc2UgaWYgKGRldl9wcml2LT5mbGFncyAmIENISVBfSVNfQUdQKQoJCQl2YWx1ZSA9IFJBREVPTl9DQVJEX0FHUDsKCQllbHNlCgkJCXZhbHVlID0gUkFERU9OX0NBUkRfUENJOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOwoJfQoKCWlmIChEUk1fQ09QWV9UT19VU0VSKHBhcmFtLnZhbHVlLCAmdmFsdWUsIHNpemVvZihpbnQpKSkgewoJCURSTV9FUlJPUigiY29weV90b191c2VyXG4iKTsKCQlyZXR1cm4gRFJNX0VSUihFRkFVTFQpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHJhZGVvbl9jcF9zZXRwYXJhbShEUk1fSU9DVExfQVJHUykKewoJRFJNX0RFVklDRTsKCWRybV9yYWRlb25fcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cglkcm1fZmlsZV90ICpmaWxwX3ByaXY7Cglkcm1fcmFkZW9uX3NldHBhcmFtX3Qgc3A7CglzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2OwoKCURSTV9HRVRfUFJJVl9XSVRIX1JFVFVSTihmaWxwX3ByaXYsIGZpbHApOwoKCURSTV9DT1BZX0ZST01fVVNFUl9JT0NUTChzcCwgKGRybV9yYWRlb25fc2V0cGFyYW1fdCBfX3VzZXIgKikgZGF0YSwKCQkJCSBzaXplb2Yoc3ApKTsKCglzd2l0Y2ggKHNwLnBhcmFtKSB7CgljYXNlIFJBREVPTl9TRVRQQVJBTV9GQl9MT0NBVElPTjoKCQlyYWRlb25fcHJpdiA9IGZpbHBfcHJpdi0+ZHJpdmVyX3ByaXY7CgkJcmFkZW9uX3ByaXYtPnJhZGVvbl9mYl9kZWx0YSA9IGRldl9wcml2LT5mYl9sb2NhdGlvbiAtIHNwLnZhbHVlOwoJCWJyZWFrOwoJY2FzZSBSQURFT05fU0VUUEFSQU1fU1dJVENIX1RJTElORzoKCQlpZiAoc3AudmFsdWUgPT0gMCkgewoJCQlEUk1fREVCVUcoImNvbG9yIHRpbGluZyBkaXNhYmxlZFxuIik7CgkJCWRldl9wcml2LT5mcm9udF9waXRjaF9vZmZzZXQgJj0gflJBREVPTl9EU1RfVElMRV9NQUNSTzsKCQkJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0ICY9IH5SQURFT05fRFNUX1RJTEVfTUFDUk87CgkJCWRldl9wcml2LT5zYXJlYV9wcml2LT50aWxpbmdfZW5hYmxlZCA9IDA7CgkJfSBlbHNlIGlmIChzcC52YWx1ZSA9PSAxKSB7CgkJCURSTV9ERUJVRygiY29sb3IgdGlsaW5nIGVuYWJsZWRcbiIpOwoJCQlkZXZfcHJpdi0+ZnJvbnRfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKCQkJZGV2X3ByaXYtPmJhY2tfcGl0Y2hfb2Zmc2V0IHw9IFJBREVPTl9EU1RfVElMRV9NQUNSTzsKCQkJZGV2X3ByaXYtPnNhcmVhX3ByaXYtPnRpbGluZ19lbmFibGVkID0gMTsKCQl9CgkJYnJlYWs7CgljYXNlIFJBREVPTl9TRVRQQVJBTV9QQ0lHQVJUX0xPQ0FUSU9OOgoJCWRldl9wcml2LT5wY2lnYXJ0X29mZnNldCA9IHNwLnZhbHVlOwoJCWJyZWFrOwoJY2FzZSBSQURFT05fU0VUUEFSQU1fTkVXX01FTU1BUDoKCQlkZXZfcHJpdi0+bmV3X21lbW1hcCA9IHNwLnZhbHVlOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlEUk1fREVCVUcoIkludmFsaWQgcGFyYW1ldGVyICVkXG4iLCBzcC5wYXJhbSk7CgkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKCX0KCglyZXR1cm4gMDsKfQoKLyogV2hlbiBhIGNsaWVudCBkaWVzOgogKiAgICAtIENoZWNrIGZvciBhbmQgY2xlYW4gdXAgZmxpcHBlZCBwYWdlIHN0YXRlCiAqICAgIC0gRnJlZSBhbnkgYWxsb2NlZCBHQVJUIG1lbW9yeS4KICogICAgLSBGcmVlIGFueSBhbGxvY2VkIHJhZGVvbiBzdXJmYWNlcy4KICoKICogRFJNIGluZnJhc3RydWN0dXJlIHRha2VzIGNhcmUgb2YgcmVjbGFpbWluZyBkbWEgYnVmZmVycy4KICovCnZvaWQgcmFkZW9uX2RyaXZlcl9wcmVjbG9zZShkcm1fZGV2aWNlX3QgKiBkZXYsIERSTUZJTEUgZmlscCkKewoJaWYgKGRldi0+ZGV2X3ByaXZhdGUpIHsKCQlkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJCWlmIChkZXZfcHJpdi0+cGFnZV9mbGlwcGluZykgewoJCQlyYWRlb25fZG9fY2xlYW51cF9wYWdlZmxpcChkZXYpOwoJCX0KCQlyYWRlb25fbWVtX3JlbGVhc2UoZmlscCwgZGV2X3ByaXYtPmdhcnRfaGVhcCk7CgkJcmFkZW9uX21lbV9yZWxlYXNlKGZpbHAsIGRldl9wcml2LT5mYl9oZWFwKTsKCQlyYWRlb25fc3VyZmFjZXNfcmVsZWFzZShmaWxwLCBkZXZfcHJpdik7Cgl9Cn0KCnZvaWQgcmFkZW9uX2RyaXZlcl9sYXN0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2KQp7CglyYWRlb25fZG9fcmVsZWFzZShkZXYpOwp9CgppbnQgcmFkZW9uX2RyaXZlcl9vcGVuKGRybV9kZXZpY2VfdCAqIGRldiwgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdikKewoJZHJtX3JhZGVvbl9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBkcm1fcmFkZW9uX2RyaXZlcl9maWxlX2ZpZWxkcyAqcmFkZW9uX3ByaXY7CgoJRFJNX0RFQlVHKCJcbiIpOwoJcmFkZW9uX3ByaXYgPQoJICAgIChzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKikKCSAgICBkcm1fYWxsb2Moc2l6ZW9mKCpyYWRlb25fcHJpdiksIERSTV9NRU1fRklMRVMpOwoKCWlmICghcmFkZW9uX3ByaXYpCgkJcmV0dXJuIC1FTk9NRU07CgoJZmlscF9wcml2LT5kcml2ZXJfcHJpdiA9IHJhZGVvbl9wcml2OwoKCWlmIChkZXZfcHJpdikKCQlyYWRlb25fcHJpdi0+cmFkZW9uX2ZiX2RlbHRhID0gZGV2X3ByaXYtPmZiX2xvY2F0aW9uOwoJZWxzZQoJCXJhZGVvbl9wcml2LT5yYWRlb25fZmJfZGVsdGEgPSAwOwoJcmV0dXJuIDA7Cn0KCnZvaWQgcmFkZW9uX2RyaXZlcl9wb3N0Y2xvc2UoZHJtX2RldmljZV90ICogZGV2LCBkcm1fZmlsZV90ICogZmlscF9wcml2KQp7CglzdHJ1Y3QgZHJtX3JhZGVvbl9kcml2ZXJfZmlsZV9maWVsZHMgKnJhZGVvbl9wcml2ID0KCSAgICBmaWxwX3ByaXYtPmRyaXZlcl9wcml2OwoKCWRybV9mcmVlKHJhZGVvbl9wcml2LCBzaXplb2YoKnJhZGVvbl9wcml2KSwgRFJNX01FTV9GSUxFUyk7Cn0KCmRybV9pb2N0bF9kZXNjX3QgcmFkZW9uX2lvY3Rsc1tdID0gewoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NQX0lOSVQpXSA9IHtyYWRlb25fY3BfaW5pdCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVEFSVCldID0ge3JhZGVvbl9jcF9zdGFydCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9DUF9TVE9QKV0gPSB7cmFkZW9uX2NwX3N0b3AsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTRVQpXSA9IHtyYWRlb25fY3BfcmVzZXQsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWX0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfSURMRSldID0ge3JhZGVvbl9jcF9pZGxlLCBEUk1fQVVUSH0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fQ1BfUkVTVU1FKV0gPSB7cmFkZW9uX2NwX3Jlc3VtZSwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1JFU0VUKV0gPSB7cmFkZW9uX2VuZ2luZV9yZXNldCwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZVTExTQ1JFRU4pXSA9IHtyYWRlb25fZnVsbHNjcmVlbiwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NXQVApXSA9IHtyYWRlb25fY3Bfc3dhcCwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NMRUFSKV0gPSB7cmFkZW9uX2NwX2NsZWFyLCBEUk1fQVVUSH0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fVkVSVEVYKV0gPSB7cmFkZW9uX2NwX3ZlcnRleCwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElDRVMpXSA9IHtyYWRlb25fY3BfaW5kaWNlcywgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1RFWFRVUkUpXSA9IHtyYWRlb25fY3BfdGV4dHVyZSwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1NUSVBQTEUpXSA9IHtyYWRlb25fY3Bfc3RpcHBsZSwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lORElSRUNUKV0gPSB7cmFkZW9uX2NwX2luZGlyZWN0LCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX1ZFUlRFWDIpXSA9IHtyYWRlb25fY3BfdmVydGV4MiwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0NNREJVRildID0ge3JhZGVvbl9jcF9jbWRidWYsIERSTV9BVVRIfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9HRVRQQVJBTSldID0ge3JhZGVvbl9jcF9nZXRwYXJhbSwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZMSVApXSA9IHtyYWRlb25fY3BfZmxpcCwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0FMTE9DKV0gPSB7cmFkZW9uX21lbV9hbGxvYywgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0ZSRUUpXSA9IHtyYWRlb25fbWVtX2ZyZWUsIERSTV9BVVRIfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JTklUX0hFQVApXSA9IHtyYWRlb25fbWVtX2luaXRfaGVhcCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9JUlFfRU1JVCldID0ge3JhZGVvbl9pcnFfZW1pdCwgRFJNX0FVVEh9LAoJW0RSTV9JT0NUTF9OUihEUk1fUkFERU9OX0lSUV9XQUlUKV0gPSB7cmFkZW9uX2lycV93YWl0LCBEUk1fQVVUSH0sCglbRFJNX0lPQ1RMX05SKERSTV9SQURFT05fU0VUUEFSQU0pXSA9IHtyYWRlb25fY3Bfc2V0cGFyYW0sIERSTV9BVVRIfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVVJGX0FMTE9DKV0gPSB7cmFkZW9uX3N1cmZhY2VfYWxsb2MsIERSTV9BVVRIfSwKCVtEUk1fSU9DVExfTlIoRFJNX1JBREVPTl9TVVJGX0ZSRUUpXSA9IHtyYWRlb25fc3VyZmFjZV9mcmVlLCBEUk1fQVVUSH0KfTsKCmludCByYWRlb25fbWF4X2lvY3RsID0gRFJNX0FSUkFZX1NJWkUocmFkZW9uX2lvY3Rscyk7Cg==