LyoKICogYWJzdHJhY3Rpb24gb2YgdGhlIHNwaSBpbnRlcmZhY2Ugb2YgSG9wZVJmIHJmNjkgcmFkaW8gbW9kdWxlCiAqCiAqIENvcHlyaWdodCAoQykgMjAxNiBXb2xmLUVudHdpY2tsdW5nZW4KICoJTWFyY3VzIFdvbGYgPGxpbnV4QHdvbGYtZW50d2lja2x1bmdlbi5kZT4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICovCgovKiBlbmFibGUgcHJvc2EgZGVidWcgaW5mbyAqLwojdW5kZWYgREVCVUcKLyogZW5hYmxlIHByaW50IG9mIHZhbHVlcyBvbiByZWcgYWNjZXNzICovCiN1bmRlZiBERUJVR19WQUxVRVMKLyogZW5hYmxlIHByaW50IG9mIHZhbHVlcyBvbiBmaWZvIGFjY2VzcyAqLwojdW5kZWYgREVCVUdfRklGT19BQ0NFU1MKCiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgoKI2luY2x1ZGUgInJmNjkuaCIKI2luY2x1ZGUgInJmNjlfcmVnaXN0ZXJzLmgiCgojZGVmaW5lIEZfT1NDCSAgMzIwMDAwMDAgLyogaW4gSHogKi8KI2RlZmluZSBGSUZPX1NJWkUgNjYgCSAgIC8qIGluIGJ5dGUgKi8KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgojZGVmaW5lIFJFQURfUkVHKHgpCXJmNjlfcmVhZF9yZWcgKHNwaSwgeCkKI2RlZmluZSBXUklURV9SRUcoeCx5KQlyZjY5X3dyaXRlX3JlZyhzcGksIHgsIHkpCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW50IHJmNjlfc2V0X21vZGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBtb2RlIG1vZGUpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBtb2RlIik7CgkjZW5kaWYKCglzd2l0Y2ggKG1vZGUpIHsKCWNhc2UgdHJhbnNtaXQ6CSAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT1BNT0RFLCAoUkVBRF9SRUcoUkVHX09QTU9ERSkgJiB+TUFTS19PUE1PREVfTU9ERSkgfCBPUE1PREVfTU9ERV9UUkFOU01JVCk7CgljYXNlIHJlY2VpdmU6CSAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT1BNT0RFLCAoUkVBRF9SRUcoUkVHX09QTU9ERSkgJiB+TUFTS19PUE1PREVfTU9ERSkgfCBPUE1PREVfTU9ERV9SRUNFSVZFKTsKCWNhc2Ugc3ludGhlc2l6ZXI6IHJldHVybiBXUklURV9SRUcoUkVHX09QTU9ERSwgKFJFQURfUkVHKFJFR19PUE1PREUpICYgfk1BU0tfT1BNT0RFX01PREUpIHwgT1BNT0RFX01PREVfU1lOVEhFU0laRVIpOwoJY2FzZSBzdGFuZGJ5OgkgIHJldHVybiBXUklURV9SRUcoUkVHX09QTU9ERSwgKFJFQURfUkVHKFJFR19PUE1PREUpICYgfk1BU0tfT1BNT0RFX01PREUpIHwgT1BNT0RFX01PREVfU1RBTkRCWSk7CgljYXNlIG1vZGVfc2xlZXA6ICByZXR1cm4gV1JJVEVfUkVHKFJFR19PUE1PREUsIChSRUFEX1JFRyhSRUdfT1BNT0RFKSAmIH5NQVNLX09QTU9ERV9NT0RFKSB8IE9QTU9ERV9NT0RFX1NMRUVQKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3ZSBhcmUgdXNpbmcgcGFja2V0IG1vZGUsIHNvIHRoaXMgY2hlY2sgaXMgbm90IHJlYWxseSBuZWVkZWQKCS8vIGJ1dCB3YWl0aW5nIGZvciBtb2RlIHJlYWR5IGlzIG5lY2Vzc2FyeSB3aGVuIGdvaW5nIGZyb20gc2xlZXAgYmVjYXVzZSB0aGUgRklGTyBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBmcm9tIHByZXZpb3VzIG1vZGUKCS8vd2hpbGUgKF9tb2RlID09IFJGNjlfTU9ERV9TTEVFUCAmJiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBSRl9JUlFGTEFHUzFfTU9ERVJFQURZKSA9PSAweDAwKTsgLy8gV2FpdCBmb3IgTW9kZVJlYWR5Cgp9CgppbnQgcmY2OV9zZXRfZGF0YV9tb2RlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZGF0YU1vZGUgZGF0YU1vZGUpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBkYXRhIG1vZGUiKTsKCSNlbmRpZgoKCXN3aXRjaCAoZGF0YU1vZGUpIHsKCWNhc2UgcGFja2V0OgkJcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9ERSkgfCBEQVRBTU9EVUxfTU9ERV9QQUNLRVQpOwoJY2FzZSBjb250aW51b3VzOglyZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RFKSB8IERBVEFNT0RVTF9NT0RFX0NPTlRJTlVPVVMpOwoJY2FzZSBjb250aW51b3VzTm9TeW5jOiAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9ERSkgfCBEQVRBTU9EVUxfTU9ERV9DT05USU5VT1VTX05PU1lOQyk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9tb2R1bGF0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbW9kdWxhdGlvbiBtb2R1bGF0aW9uKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogbW9kdWxhdGlvbiIpOwoJI2VuZGlmCgoJc3dpdGNoIChtb2R1bGF0aW9uKSB7CgljYXNlIE9PSzogICByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1RZUEUpIHwgREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRV9PT0spOwoJY2FzZSBGU0s6ICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9UWVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1RZUEVfRlNLKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKZW51bSBtb2R1bGF0aW9uIHJmNjlfZ2V0X21vZHVsYXRpb24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKewoJdTggY3VycmVudFZhbHVlOwoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZ2V0OiBtb2RlIik7CgkjZW5kaWYKCgljdXJyZW50VmFsdWUgPSBSRUFEX1JFRyhSRUdfREFUQU1PRFVMKTsKCglzd2l0Y2ggKGN1cnJlbnRWYWx1ZSAmIE1BU0tfREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRSA+PiAzKSB7IC8vIFRPRE8gaW1wcm92ZW1lbnQ6IGNoYW5nZSAzIHRvIGRlZmluZQoJY2FzZSBEQVRBTU9EVUxfTU9EVUxBVElPTl9UWVBFX09PSzogcmV0dXJuIE9PSzsKCWNhc2UgREFUQU1PRFVMX01PRFVMQVRJT05fVFlQRV9GU0s6IHJldHVybiBGU0s7CglkZWZhdWx0OgkJCSAgICByZXR1cm4gdW5kZWZpbmVkOwoJfQp9CgppbnQgcmY2OV9zZXRfbW9kdWxhdGlvbl9zaGFwaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbW9kU2hhcGluZyBtb2RTaGFwaW5nKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogbW9kIHNoYXBpbmciKTsKCSNlbmRpZgoKCWlmIChyZjY5X2dldF9tb2R1bGF0aW9uKHNwaSkgPT0gRlNLKSB7CgkJc3dpdGNoIChtb2RTaGFwaW5nKSB7CgkJY2FzZSBzaGFwaW5nT2ZmOiByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFX05PTkUpOwoJCWNhc2Ugc2hhcGluZzFfMDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV8xXzApOwoJCWNhc2Ugc2hhcGluZzBfNTogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV8wXzMpOwoJCWNhc2Ugc2hhcGluZzBfMzogcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV8wXzUpOwoJCWRlZmF1bHQ6CgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCX0gZWxzZSB7CgkJc3dpdGNoIChtb2RTaGFwaW5nKSB7CgkJY2FzZSBzaGFwaW5nT2ZmOiByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFX05PTkUpOwoJCWNhc2Ugc2hhcGluZ0JSOgkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfREFUQU1PRFVMLCAoUkVBRF9SRUcoUkVHX0RBVEFNT0RVTCkgJiB+TUFTS19EQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRSkgfCBEQVRBTU9EVUxfTU9EVUxBVElPTl9TSEFQRV9CUik7CgkJY2FzZSBzaGFwaW5nMkJSOiByZXR1cm4gV1JJVEVfUkVHKFJFR19EQVRBTU9EVUwsIChSRUFEX1JFRyhSRUdfREFUQU1PRFVMKSAmIH5NQVNLX0RBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFKSB8IERBVEFNT0RVTF9NT0RVTEFUSU9OX1NIQVBFXzJCUik7CgkJZGVmYXVsdDoKCQkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJfQp9CgppbnQgcmY2OV9zZXRfYml0X3JhdGUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTE2IGJpdFJhdGUpCnsKCWludCByZXR2YWw7Cgl1MzIgYml0UmF0ZV9taW47Cgl1MzIgYml0UmF0ZV9yZWc7Cgl1OCBtc2I7Cgl1OCBsc2I7CgoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGJpdCByYXRlIik7CgkjZW5kaWYKCgkvLyBjaGVjayBpbnB1dCB2YWx1ZQoJYml0UmF0ZV9taW4gPSBGX09TQyAvIDgzODg2MDg7IC8vIDgzODg2MDggPSAyXjIzOwoJaWYgKGJpdFJhdGUgPCBiaXRSYXRlX21pbikgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0Qml0UmF0ZTogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIGNhbGN1bGF0ZSByZWcgc2V0dGluZ3MKCWJpdFJhdGVfcmVnID0gKEZfT1NDIC8gYml0UmF0ZSk7CgoJbXNiID0gKGJpdFJhdGVfcmVnJjB4ZmYwMCkgICA+PiAgODsKCWxzYiA9IChiaXRSYXRlX3JlZyYweGZmKTsKCgkvLyB0cmFuc21pdCB0byBSRiA2OQoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19CSVRSQVRFX01TQiwgbXNiKTsKCWlmIChyZXR2YWwpICByZXR1cm4gcmV0dmFsOwoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19CSVRSQVRFX0xTQiwgbHNiKTsKCWlmIChyZXR2YWwpICByZXR1cm4gcmV0dmFsOwoKCXJldHVybiAwOwp9CgppbnQgcmY2OV9zZXRfZGV2aWF0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHUzMiBkZXZpYXRpb24pCnsKCWludCByZXR2YWw7Ci8vCXUzMiBmX21heDsgVE9ETzogQWJo5G5naWdrZWl0IHZvbiBCaXRyYXRlIGJlYWNodGVuISEKCXU2NCBmX3JlZzsKCXU2NCBmX3N0ZXA7Cgl1OCBtc2I7Cgl1OCBsc2I7Cgl1NjQgZmFjdG9yID0gMTAwMDAwMDsgLy8gdG8gaW1wcm92ZSBwcmVjaXNpb24gb2YgY2FsY3VsYXRpb24KCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogZGV2aWF0aW9uIik7CgkjZW5kaWYKCglpZiAoZGV2aWF0aW9uIDwgNjAwIHx8IGRldmlhdGlvbiA+IDUwMDAwMCkgeyAvL1RPRE86IEFiaORuZ2lna2VpdCB2b24gQml0cmF0ZSBiZWFjaHRlbiEhCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXRfZGV2aWF0aW9uOiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gY2FsY3VsYXQgZiBzdGVwCglmX3N0ZXAgPSBGX09TQyAqIGZhY3RvcjsKCWRvX2RpdihmX3N0ZXAsIDUyNDI4OCk7IC8vICA1MjQyODggPSAyXjE5CgoJLy8gY2FsY3VsYXRlIHJlZ2lzdGVyIHNldHRpbmdzCglmX3JlZyA9IGRldmlhdGlvbiAqIGZhY3RvcjsKCWRvX2RpdihmX3JlZyAgLCBmX3N0ZXApOwoKCW1zYiA9IChmX3JlZyYweGZmMDApICAgPj4gIDg7Cglsc2IgPSAoZl9yZWcmMHhmZik7CgoJLy8gY2hlY2sgbXNiCglpZiAobXNiICYgfkZERVZNQVNCX01BU0spIHsKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldF9kZXZpYXRpb246IGVyciBpbiBjYWxjIG9mIG1zYiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIHdyaXRlIHRvIGNoaXAKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRkRFVl9NU0IsIG1zYik7CglpZiAocmV0dmFsKSAgcmV0dXJuIHJldHZhbDsKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRkRFVl9MU0IsIGxzYik7CglpZiAocmV0dmFsKSAgcmV0dXJuIHJldHZhbDsKCglyZXR1cm4gMDsKfQoKaW50IHJmNjlfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1MzIgZnJlcXVlbmN5KQp7CglpbnQgcmV0dmFsOwoJdTMyIGZfbWF4OwoJdTY0IGZfcmVnOwoJdTY0IGZfc3RlcDsKCXU4IG1zYjsKCXU4IG1pZDsKCXU4IGxzYjsKCXU2NCBmYWN0b3IgPSAxMDAwMDAwOyAvLyB0byBpbXByb3ZlIHByZWNpc2lvbiBvZiBjYWxjdWxhdGlvbgoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBmcmVxdWVuY3kiKTsKCSNlbmRpZgoKCS8vIGNhbGN1bGF0IGYgc3RlcAoJZl9zdGVwID0gRl9PU0MgKiBmYWN0b3I7Cglkb19kaXYoZl9zdGVwLCA1MjQyODgpOyAvLyAgNTI0Mjg4ID0gMl4xOQoKCS8vIGNoZWNrIGlucHV0IHZhbHVlCglmX21heCA9IGRpdl91NjQoZl9zdGVwICogODM4ODYwOCwgZmFjdG9yKTsKCWlmIChmcmVxdWVuY3kgPiBmX21heCkgewoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0RnJlcXVlbmN5OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gY2FsY3VsYXRlIHJlZyBzZXR0aW5ncwoJZl9yZWcgPSBmcmVxdWVuY3kgKiBmYWN0b3I7Cglkb19kaXYoZl9yZWcgICwgZl9zdGVwKTsKCgltc2IgPSAoZl9yZWcmMHhmZjAwMDApID4+IDE2OwoJbWlkID0gKGZfcmVnJjB4ZmYwMCkgICA+PiAgODsKCWxzYiA9IChmX3JlZyYweGZmKTsKCgkvLyB3cml0ZSB0byBjaGlwCglyZXR2YWwgPSBXUklURV9SRUcoUkVHX0ZSRl9NU0IsIG1zYik7CglpZiAocmV0dmFsKSAgcmV0dXJuIHJldHZhbDsKCXJldHZhbCA9IFdSSVRFX1JFRyhSRUdfRlJGX01JRCwgbWlkKTsKCWlmIChyZXR2YWwpICByZXR1cm4gcmV0dmFsOwoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19GUkZfTFNCLCBsc2IpOwoJaWYgKHJldHZhbCkgIHJldHVybiByZXR2YWw7CgoJcmV0dXJuIDA7Cn0KCmludCByZjY5X3NldF9hbXBsaWZpZXJfMChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYW1wICMwIik7CgkjZW5kaWYKCglzd2l0Y2gob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgfCAgTUFTS19QQUxFVkVMX1BBMCkgKTsKCWNhc2Ugb3B0aW9uT2ZmOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpICYgfk1BU0tfUEFMRVZFTF9QQTApICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hbXBsaWZpZXJfMShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYW1wICMxIik7CgkjZW5kaWYKCglzd2l0Y2gob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgfCAgTUFTS19QQUxFVkVMX1BBMSkgKTsKCWNhc2Ugb3B0aW9uT2ZmOiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpICYgfk1BU0tfUEFMRVZFTF9QQTEpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hbXBsaWZpZXJfMihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIG9wdGlvbk9uT2ZmIG9wdGlvbk9uT2ZmKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYW1wICMyIik7CgkjZW5kaWYKCglzd2l0Y2gob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBTEVWRUwsIChSRUFEX1JFRyhSRUdfUEFMRVZFTCkgfCAgTUFTS19QQUxFVkVMX1BBMikgKTsKCWNhc2Ugb3B0aW9uT2ZmOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUxFVkVMLCAoUkVBRF9SRUcoUkVHX1BBTEVWRUwpICYgfk1BU0tfUEFMRVZFTF9QQTIpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9vdXRwdXRfcG93ZXJfbGV2ZWwoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggcG93ZXJMZXZlbCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHBvd2VyIGxldmVsIik7CgkjZW5kaWYKCglwb3dlckxldmVsICs9MTg7IC8vIFRPRE8gQWJo5G5naWdrZWl0IHZvbiBQQTAsMSwyIHNldHRpbmcKCgkvLyBjaGVjayBpbnB1dCB2YWx1ZQoJaWYgKHBvd2VyTGV2ZWwgPiAweDFmKSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFMRVZFTCwgKFJFQURfUkVHKFJFR19QQUxFVkVMKSAmIH5NQVNLX1BBTEVWRUxfT1VUUFVUX1BPV0VSKSB8IHBvd2VyTGV2ZWwpOwp9CgppbnQgcmY2OV9zZXRfcGFfcmFtcChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIHBhUmFtcCBwYVJhbXApCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBwYSByYW1wIik7CgkjZW5kaWYKCglzd2l0Y2gocGFSYW1wKSB7CgljYXNlIHJhbXAzNDAwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8zNDAwKTsKCWNhc2UgcmFtcDIwMDA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzIwMDApOwoJY2FzZSByYW1wMTAwMDoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMTAwMCk7CgljYXNlIHJhbXA1MDA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzUwMCk7CgljYXNlIHJhbXAyNTA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzI1MCk7CgljYXNlIHJhbXAxMjU6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzEyNSk7CgljYXNlIHJhbXAxMDA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzEwMCk7CgljYXNlIHJhbXA2MjoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfNjIpOwoJY2FzZSByYW1wNTA6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzUwKTsKCWNhc2UgcmFtcDQwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF80MCk7CgljYXNlIHJhbXAzMToJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMzEpOwoJY2FzZSByYW1wMjU6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzI1KTsKCWNhc2UgcmFtcDIwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8yMCk7CgljYXNlIHJhbXAxNToJcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFSQU1QLCBQQVJBTVBfMTUpOwoJY2FzZSByYW1wMTI6CXJldHVybiBXUklURV9SRUcoUkVHX1BBUkFNUCwgUEFSQU1QXzEyKTsKCWNhc2UgcmFtcDEwOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQVJBTVAsIFBBUkFNUF8xMCk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hbnRlbm5hX2ltcGVkYW5jZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGFudGVubmFJbXBlZGFuY2UgYW50ZW5uYUltcGVkYW5jZSkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGFudGVubmEgaW1wZWRhbmNlIik7CgkjZW5kaWYKCglzd2l0Y2goYW50ZW5uYUltcGVkYW5jZSkgewoJY2FzZSBmaWZ0eU9obToJICAgIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKFJFQURfUkVHKFJFR19MTkEpICYgfk1BU0tfTE5BX1pJTikgKTsKCWNhc2UgdHdvaHVuZHJldE9obTogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoUkVBRF9SRUcoUkVHX0xOQSkgfCAgTUFTS19MTkFfWklOKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfbG5hX2dhaW4oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBsbmFHYWluIGxuYUdhaW4pCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBsbmEgZ2FpbiIpOwoJI2VuZGlmCgoJc3dpdGNoKGxuYUdhaW4pIHsKCWNhc2UgYXV0b21hdGljOgkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX0FVVE8pICk7CgljYXNlIG1heDoJIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKCAoUkVBRF9SRUcoUkVHX0xOQSkgJiB+TUFTS19MTkFfR0FJTikgJiBMTkFfR0FJTl9NQVgpICk7CgljYXNlIG1heE1pbnVzNjogIHJldHVybiBXUklURV9SRUcoUkVHX0xOQSwgKCAoUkVBRF9SRUcoUkVHX0xOQSkgJiB+TUFTS19MTkFfR0FJTikgJiBMTkFfR0FJTl9NQVhfTUlOVVNfNikgKTsKCWNhc2UgbWF4TWludXMxMjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU18xMikgKTsKCWNhc2UgbWF4TWludXMyNDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU18yNCkgKTsKCWNhc2UgbWF4TWludXMzNjogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU18zNikgKTsKCWNhc2UgbWF4TWludXM0ODogcmV0dXJuIFdSSVRFX1JFRyhSRUdfTE5BLCAoIChSRUFEX1JFRyhSRUdfTE5BKSAmIH5NQVNLX0xOQV9HQUlOKSAmIExOQV9HQUlOX01BWF9NSU5VU180OCkgKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKZW51bSBsbmFHYWluIHJmNjlfZ2V0X2xuYV9nYWluKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCnsKCXU4IGN1cnJlbnRWYWx1ZTsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgImdldDogbG5hIGdhaW4iKTsKCSNlbmRpZgoKCWN1cnJlbnRWYWx1ZSA9IFJFQURfUkVHKFJFR19MTkEpOwoKCXN3aXRjaCAoY3VycmVudFZhbHVlICYgTUFTS19MTkFfQ1VSUkVOVF9HQUlOID4+IDMpIHsgLy8gaW1wcm92ZW1lbnQ6IGNoYW5nZSAzIHRvIGRlZmluZQoJY2FzZSBMTkFfR0FJTl9BVVRPOgkgICAgcmV0dXJuIGF1dG9tYXRpYzsKCWNhc2UgTE5BX0dBSU5fTUFYOgkgICAgcmV0dXJuIG1heDsKCWNhc2UgTE5BX0dBSU5fTUFYX01JTlVTXzY6ICByZXR1cm4gbWF4TWludXM2OwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfMTI6IHJldHVybiBtYXhNaW51czEyOwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfMjQ6IHJldHVybiBtYXhNaW51czI0OwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfMzY6IHJldHVybiBtYXhNaW51czM2OwoJY2FzZSBMTkFfR0FJTl9NQVhfTUlOVVNfNDg6IHJldHVybiBtYXhNaW51czQ4OwoJZGVmYXVsdDoJCSAgICByZXR1cm4gdW5kZWZpbmVkOwoJfQp9CgppbnQgcmY2OV9zZXRfZGNfY3V0X29mZl9mcmVxdWVuY3lfaW50ZXJuKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkgLHU4IHJlZywgZW51bSBkY2NQZXJjZW50IGRjY1BlcmNlbnQpCnsKCXN3aXRjaCAoZGNjUGVyY2VudCkgewoJY2FzZSBkY2MxNlBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoIChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzE2X1BFUkNFTlQpICk7CgljYXNlIGRjYzhQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ184X1BFUkNFTlQpICk7CgljYXNlIGRjYzRQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ180X1BFUkNFTlQpICk7CgljYXNlIGRjYzJQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ18yX1BFUkNFTlQpICk7CgljYXNlIGRjYzFQZXJjZW50OglyZXR1cm4gV1JJVEVfUkVHKHJlZywgKCAoUkVBRF9SRUcocmVnKSAmIH5NQVNLX0JXX0RDQ19GUkVRKSB8IEJXX0RDQ18xX1BFUkNFTlQpICk7CgljYXNlIGRjYzBfNVBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoIChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzBfNV9QRVJDRU5UKSApOwoJY2FzZSBkY2MwXzI1UGVyY2VudDoJcmV0dXJuIFdSSVRFX1JFRyhyZWcsICggKFJFQURfUkVHKHJlZykgJiB+TUFTS19CV19EQ0NfRlJFUSkgfCBCV19EQ0NfMF8yNV9QRVJDRU5UKSApOwoJY2FzZSBkY2MwXzEyNVBlcmNlbnQ6CXJldHVybiBXUklURV9SRUcocmVnLCAoIChSRUFEX1JFRyhyZWcpICYgfk1BU0tfQldfRENDX0ZSRVEpIHwgQldfRENDXzBfMTI1X1BFUkNFTlQpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9kY19jdXRfb2ZmX2ZyZXF1ZW5jeShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGRjY1BlcmNlbnQgZGNjUGVyY2VudCkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGN1dCBvZmYgZnJlcSIpOwoJI2VuZGlmCgoJcmV0dXJuIHJmNjlfc2V0X2RjX2N1dF9vZmZfZnJlcXVlbmN5X2ludGVybihzcGksIFJFR19SWEJXLCBkY2NQZXJjZW50KTsKfQoKaW50IHJmNjlfc2V0X2RjX2N1dF9vZmZfZnJlcXVlbmN5X2R1cmluZ19hZmMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBkY2NQZXJjZW50IGRjY1BlcmNlbnQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBjdXQgb2ZmIGZyZXEgZHVyaW5nIGFmYyIpOwoJI2VuZGlmCgoJcmV0dXJuIHJmNjlfc2V0X2RjX2N1dF9vZmZfZnJlcXVlbmN5X2ludGVybihzcGksIFJFR19BRkNCVywgZGNjUGVyY2VudCk7Cn0KCnN0YXRpYyBpbnQgcmY2OV9zZXRfYmFuZHdpZHRoX2ludGVybihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCByZWcsCgkJCQkgICAgIGVudW0gbWFudGlzc2UgbWFudGlzc2UsIHU4IGV4cG9uZW50KQp7Cgl1OCBuZXdWYWx1ZTsKCgkvLyBjaGVjayB2YWx1ZSBmb3IgbWFudGlzc2UgYW5kIGV4cG9uZW50CglpZiAoZXhwb25lbnQgPiA3KSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglpZiAoKG1hbnRpc3NlICE9IG1hbnRpc3NlMTYpICYmCgkgICAgKG1hbnRpc3NlICE9IG1hbnRpc3NlMjApICYmCgkgICAgKG1hbnRpc3NlICE9IG1hbnRpc3NlMjQpKSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyByZWFkIG9sZCB2YWx1ZQoJbmV3VmFsdWUgPSBSRUFEX1JFRyhyZWcpOwoKCS8vICJkZWxldGUiIG1hbnRpc3NlIGFuZCBleHBvbmVudCA9IGp1c3Qga2VlcCB0aGUgRENDIHNldHRpbmcKCW5ld1ZhbHVlID0gbmV3VmFsdWUgJiBNQVNLX0JXX0RDQ19GUkVROwoKCS8vIGFkZCBuZXcgbWFudGlzc2UKCXN3aXRjaChtYW50aXNzZSkgewoJY2FzZSBtYW50aXNzZTE2OiBuZXdWYWx1ZSA9IG5ld1ZhbHVlIHwgQldfTUFOVF8xNjsJYnJlYWs7CgljYXNlIG1hbnRpc3NlMjA6IG5ld1ZhbHVlID0gbmV3VmFsdWUgfCBCV19NQU5UXzIwOwlicmVhazsKCWNhc2UgbWFudGlzc2UyNDogbmV3VmFsdWUgPSBuZXdWYWx1ZSB8IEJXX01BTlRfMjQ7CWJyZWFrOwoJfQoKCS8vIGFkZCBuZXcgZXhwb25lbnQKCW5ld1ZhbHVlID0gbmV3VmFsdWUgfCBleHBvbmVudDsKCgkvLyB3cml0ZSBiYWNrCglyZXR1cm4gV1JJVEVfUkVHKHJlZywgbmV3VmFsdWUpOwp9CgppbnQgcmY2OV9zZXRfYmFuZHdpZHRoKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbWFudGlzc2UgbWFudGlzc2UsIHU4IGV4cG9uZW50KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYmFuZCB3aWR0aCIpOwoJI2VuZGlmCgoJcmV0dXJuIHJmNjlfc2V0X2JhbmR3aWR0aF9pbnRlcm4oc3BpLCBSRUdfUlhCVywgbWFudGlzc2UsIGV4cG9uZW50KTsKfQoKaW50IHJmNjlfc2V0X2JhbmR3aWR0aF9kdXJpbmdfYWZjKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gbWFudGlzc2UgbWFudGlzc2UsIHU4IGV4cG9uZW50KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogYmFuZCB3aWR0aCBkdXJpbmcgYWZjIik7CgkjZW5kaWYKCglyZXR1cm4gcmY2OV9zZXRfYmFuZHdpZHRoX2ludGVybihzcGksIFJFR19BRkNCVywgbWFudGlzc2UsIGV4cG9uZW50KTsKfQoKaW50IHJmNjlfc2V0X29va190aHJlc2hvbGRfdHlwZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIHRocmVzaG9sZFR5cGUgdGhyZXNob2xkVHlwZSkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHRocmVzaG9sZCB0eXBlIik7CgkjZW5kaWYKCglzd2l0Y2ggKHRocmVzaG9sZFR5cGUpIHsKCWNhc2UgZml4ZWQ6CXJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNUWVBFKSB8IE9PS1BFQUtfVEhSRVNIVFlQRV9GSVhFRCkgKTsKCWNhc2UgcGVhazoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKCAoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU1RZUEUpIHwgT09LUEVBS19USFJFU0hUWVBFX1BFQUspICk7CgljYXNlIGF2ZXJhZ2U6CXJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNUWVBFKSB8IE9PS1BFQUtfVEhSRVNIVFlQRV9BVkVSQUdFKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfb29rX3RocmVzaG9sZF9zdGVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gdGhyZXNob2xkU3RlcCB0aHJlc2hvbGRTdGVwKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogdGhyZXNob2xkIHN0ZXAiKTsKCSNlbmRpZgoKCXN3aXRjaCAodGhyZXNob2xkU3RlcCkgewoJY2FzZSBzdGVwXzBfNWRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMF81X0RCKSApOwoJY2FzZSBzdGVwXzFfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMV8wX0RCKSApOwoJY2FzZSBzdGVwXzFfNWRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMV81X0RCKSApOwoJY2FzZSBzdGVwXzJfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfMl8wX0RCKSApOwoJY2FzZSBzdGVwXzNfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfM18wX0RCKSApOwoJY2FzZSBzdGVwXzRfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfNF8wX0RCKSApOwoJY2FzZSBzdGVwXzVfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfNV8wX0RCKSApOwoJY2FzZSBzdGVwXzZfMGRiOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTU1RFUCkgfCBPT0tQRUFLX1RIUkVTSFNURVBfNl8wX0RCKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfb29rX3RocmVzaG9sZF9kZWMoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSB0aHJlc2hvbGREZWNyZW1lbnQgdGhyZXNob2xkRGVjcmVtZW50KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogdGhyZXNob2xkIGRlY3JlbWVudCIpOwoJI2VuZGlmCgoJc3dpdGNoICh0aHJlc2hvbGREZWNyZW1lbnQpIHsKCWNhc2UgZGVjX2V2ZXJ5OHRoOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX0VWRVJZXzhUSCkgKTsKCWNhc2UgZGVjX2V2ZXJ5NHRoOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX0VWRVJZXzRUSCkgKTsKCWNhc2UgZGVjX2V2ZXJ5Mm5kOiByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX0VWRVJZXzJORCkgKTsKCWNhc2UgZGVjX29uY2U6CSAgIHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNERUMpIHwgT09LUEVBS19USFJFU0hERUNfT05DRSkgKTsKCWNhc2UgZGVjX3R3aWNlOgkgICByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDX1RXSUNFKSApOwoJY2FzZSBkZWNfNHRpbWVzOiAgIHJldHVybiBXUklURV9SRUcoUkVHX09PS1BFQUssICggKFJFQURfUkVHKFJFR19PT0tQRUFLKSAmIH5NQVNLX09PS1BFQUtfVEhSRVNERUMpIHwgT09LUEVBS19USFJFU0hERUNfNF9USU1FUykgKTsKCWNhc2UgZGVjXzh0aW1lczogICByZXR1cm4gV1JJVEVfUkVHKFJFR19PT0tQRUFLLCAoIChSRUFEX1JFRyhSRUdfT09LUEVBSykgJiB+TUFTS19PT0tQRUFLX1RIUkVTREVDKSB8IE9PS1BFQUtfVEhSRVNIREVDXzhfVElNRVMpICk7CgljYXNlIGRlY18xNnRpbWVzOiAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfT09LUEVBSywgKCAoUkVBRF9SRUcoUkVHX09PS1BFQUspICYgfk1BU0tfT09LUEVBS19USFJFU0RFQykgfCBPT0tQRUFLX1RIUkVTSERFQ18xNl9USU1FUykgKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X2Rpb19tYXBwaW5nKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IERJT051bWJlciwgdTggdmFsdWUpCnsKCXU4IG1hc2s7Cgl1OCBzaGlmdDsKCXU4IHJlZ2FkZHI7Cgl1OCByZWdWYWx1ZTsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogRElPIG1hcHBpbmciKTsKCSNlbmRpZgoKCXN3aXRjaCAoRElPTnVtYmVyKSB7CgljYXNlIDA6IG1hc2s9TUFTS19ESU8wOyBzaGlmdD1TSElGVF9ESU8wOyByZWdhZGRyPVJFR19ESU9NQVBQSU5HMTsgYnJlYWs7CgljYXNlIDE6IG1hc2s9TUFTS19ESU8xOyBzaGlmdD1TSElGVF9ESU8xOyByZWdhZGRyPVJFR19ESU9NQVBQSU5HMTsgYnJlYWs7CgljYXNlIDI6IG1hc2s9TUFTS19ESU8yOyBzaGlmdD1TSElGVF9ESU8yOyByZWdhZGRyPVJFR19ESU9NQVBQSU5HMTsgYnJlYWs7CgljYXNlIDM6IG1hc2s9TUFTS19ESU8zOyBzaGlmdD1TSElGVF9ESU8zOyByZWdhZGRyPVJFR19ESU9NQVBQSU5HMTsgYnJlYWs7CgljYXNlIDQ6IG1hc2s9TUFTS19ESU80OyBzaGlmdD1TSElGVF9ESU80OyByZWdhZGRyPVJFR19ESU9NQVBQSU5HMjsgYnJlYWs7CgljYXNlIDU6IG1hc2s9TUFTS19ESU81OyBzaGlmdD1TSElGVF9ESU81OyByZWdhZGRyPVJFR19ESU9NQVBQSU5HMjsgYnJlYWs7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLy8gcmVhZCByZWcKCXJlZ1ZhbHVlPVJFQURfUkVHKHJlZ2FkZHIpOwoJLy8gZGVsZXRlIG9sZCB2YWx1ZQoJcmVnVmFsdWUgPSByZWdWYWx1ZSAmIH5tYXNrOwoJLy8gYWRkIG5ldyB2YWx1ZQoJcmVnVmFsdWUgPSByZWdWYWx1ZSB8IHZhbHVlIDw8IHNoaWZ0OwoJLy8gd3JpdGUgYmFjawoJcmV0dXJuIFdSSVRFX1JFRyhyZWdhZGRyLHJlZ1ZhbHVlKTsKfQoKYm9vbCByZjY5X2dldF9mbGFnKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZmxhZyBmbGFnKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgImdldDogZmxhZyIpOwoJI2VuZGlmCgoJc3dpdGNoKGZsYWcpIHsKCWNhc2UgbW9kZVN3aXRjaENvbXBsZXRlZDogICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9NT0RFX1JFQURZKTsKCWNhc2UgcmVhZHlUb1JlY2VpdmU6CSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9SWF9SRUFEWSk7CgljYXNlIHJlYWR5VG9TZW5kOgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfVFhfUkVBRFkpOwoJY2FzZSBwbGxMb2NrZWQ6CQkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzEpICYgTUFTS19JUlFGTEFHUzFfUExMX0xPQ0spOwoJY2FzZSByc3NpRXhjZWVkZWRUaHJlc2hvbGQ6ICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MxKSAmIE1BU0tfSVJRRkxBR1MxX1JTU0kpOwoJY2FzZSB0aW1lb3V0OgkJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MxKSAmIE1BU0tfSVJRRkxBR1MxX1RJTUVPVVQpOwoJY2FzZSBhdXRvbW9kZToJCSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9BVVRPTU9ERSk7CgljYXNlIHN5bmNBZGRyZXNzTWF0Y2g6CSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMSkgJiBNQVNLX0lSUUZMQUdTMV9TWU5DX0FERFJFU1NfTUFUQ0gpOwoJY2FzZSBmaWZvRnVsbDoJCSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9GSUZPX0ZVTEwpOwovKgljYXNlIGZpZm9Ob3RFbXB0eToJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX0ZJRk9fTk9UX0VNUFRZKTsgKi8KCWNhc2UgZmlmb0VtcHR5OgkJICAgICAgcmV0dXJuICEoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9GSUZPX05PVF9FTVBUWSk7CgljYXNlIGZpZm9MZXZlbEJlbG93VGhyZXNob2xkOiByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfRklGT19MRVZFTCk7CgljYXNlIGZpZm9PdmVycnVuOgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfRklGT19PVkVSUlVOKTsKCWNhc2UgcGFja2V0U2VudDoJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX1BBQ0tFVF9TRU5UKTsKCWNhc2UgcGF5bG9hZFJlYWR5OgkgICAgICByZXR1cm4gKFJFQURfUkVHKFJFR19JUlFGTEFHUzIpICYgTUFTS19JUlFGTEFHUzJfUEFZTE9BRF9SRUFEWSk7CgljYXNlIGNyY09rOgkJICAgICAgcmV0dXJuIChSRUFEX1JFRyhSRUdfSVJRRkxBR1MyKSAmIE1BU0tfSVJRRkxBR1MyX0NSQ19PSyk7CgljYXNlIGJhdHRlcnlMb3c6CSAgICAgIHJldHVybiAoUkVBRF9SRUcoUkVHX0lSUUZMQUdTMikgJiBNQVNLX0lSUUZMQUdTMl9MT1dfQkFUKTsKCWRlZmF1bHQ6CQkgICAgICByZXR1cm4gZmFsc2U7Cgl9Cn0KCmludCByZjY5X3Jlc2V0X2ZsYWcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBmbGFnIGZsYWcpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVzZXQ6IGZsYWciKTsKCSNlbmRpZgoKCXN3aXRjaChmbGFnKSB7CgljYXNlIHJzc2lFeGNlZWRlZFRocmVzaG9sZDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfSVJRRkxBR1MxLCBNQVNLX0lSUUZMQUdTMV9SU1NJKTsKCWNhc2Ugc3luY0FkZHJlc3NNYXRjaDoJICAgIHJldHVybiBXUklURV9SRUcoUkVHX0lSUUZMQUdTMSwgTUFTS19JUlFGTEFHUzFfU1lOQ19BRERSRVNTX01BVENIKTsKCWNhc2UgZmlmb092ZXJydW46CSAgICByZXR1cm4gV1JJVEVfUkVHKFJFR19JUlFGTEFHUzIsIE1BU0tfSVJRRkxBR1MyX0ZJRk9fT1ZFUlJVTik7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9yc3NpX3RocmVzaG9sZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCB0aHJlc2hvbGQpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiByc3NpIHRocmVzaG9sZCIpOwoJI2VuZGlmCgoJLyogbm8gdmFsdWUgY2hlY2sgbmVlZGVkIC0gdTggZXhhY3RseSBtYXRjaGVzIHJlZ2lzdGVyIHNpemUgKi8KCglyZXR1cm4gV1JJVEVfUkVHKFJFR19SU1NJVEhSRVNILCB0aHJlc2hvbGQpOwp9CgppbnQgcmY2OV9zZXRfcnhfc3RhcnRfdGltZW91dChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCB0aW1lb3V0KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3RhcnQgdGltZW91dCIpOwoJI2VuZGlmCgoJLyogbm8gdmFsdWUgY2hlY2sgbmVlZGVkIC0gdTggZXhhY3RseSBtYXRjaGVzIHJlZ2lzdGVyIHNpemUgKi8KCglyZXR1cm4gV1JJVEVfUkVHKFJFR19SWFRJTUVPVVQxLCB0aW1lb3V0KTsKfQoKaW50IHJmNjlfc2V0X3Jzc2lfdGltZW91dChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCB0aW1lb3V0KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogcnNzaSB0aW1lb3V0Iik7CgkjZW5kaWYKCgkvKiBubyB2YWx1ZSBjaGVjayBuZWVkZWQgLSB1OCBleGFjdGx5IG1hdGNoZXMgcmVnaXN0ZXIgc2l6ZSAqLwoKCXJldHVybiBXUklURV9SRUcoUkVHX1JYVElNRU9VVDIsIHRpbWVvdXQpOwp9CgppbnQgcmY2OV9zZXRfcHJlYW1ibGVfbGVuZ3RoKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHUxNiBwcmVhbWJsZUxlbmd0aCkKewoJaW50IHJldHZhbDsKCXU4IG1zYiwgbHNiOwoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBwcmVhbWJsZSBsZW5ndGgiKTsKCSNlbmRpZgoKCS8qIG5vIHZhbHVlIGNoZWNrIG5lZWRlZCAtIHUxNiBleGFjdGx5IG1hdGNoZXMgcmVnaXN0ZXIgc2l6ZSAqLwoKCS8qIGNhbGN1bGF0ZSByZWcgc2V0dGluZ3MgKi8KCW1zYiA9IChwcmVhbWJsZUxlbmd0aCYweGZmMDApICAgPj4gIDg7Cglsc2IgPSAocHJlYW1ibGVMZW5ndGgmMHhmZik7CgoJLyogdHJhbnNtaXQgdG8gY2hpcCAqLwoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19QUkVBTUJMRV9NU0IsIG1zYik7CglpZiAocmV0dmFsKSByZXR1cm4gcmV0dmFsOwoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19QUkVBTUJMRV9MU0IsIGxzYik7CgoJcmV0dXJuIHJldHZhbDsKfQoKaW50IHJmNjlfc2V0X3N5bmNfZW5hYmxlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gb3B0aW9uT25PZmYgb3B0aW9uT25PZmYpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBzeW5jIGVuYWJsZSIpOwoJI2VuZGlmCgoJc3dpdGNoKG9wdGlvbk9uT2ZmKSB7CgljYXNlIG9wdGlvbk9uOglyZXR1cm4gV1JJVEVfUkVHKFJFR19TWU5DX0NPTkZJRywgKFJFQURfUkVHKFJFR19TWU5DX0NPTkZJRykgfCAgTUFTS19TWU5DX0NPTkZJR19TWU5DX09OKSApOwoJY2FzZSBvcHRpb25PZmY6CXJldHVybiBXUklURV9SRUcoUkVHX1NZTkNfQ09ORklHLCAoUkVBRF9SRUcoUkVHX1NZTkNfQ09ORklHKSAmIH5NQVNLX1NZTkNfQ09ORklHX1NZTkNfT04pICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9maWZvX2ZpbGxfY29uZGl0aW9uKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gZmlmb0ZpbGxDb25kaXRpb24gZmlmb0ZpbGxDb25kaXRpb24pCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBmaWZvIGZpbGwgY29uZGl0aW9uIik7CgkjZW5kaWYKCglzd2l0Y2goZmlmb0ZpbGxDb25kaXRpb24pIHsKCWNhc2UgYWx3YXlzOgkJIHJldHVybiBXUklURV9SRUcoUkVHX1NZTkNfQ09ORklHLCAoUkVBRF9SRUcoUkVHX1NZTkNfQ09ORklHKSB8ICBNQVNLX1NZTkNfQ09ORklHX0ZJRk9fRklMTF9DT05ESVRJT04pICk7CgljYXNlIGFmdGVyU3luY0ludGVycnVwdDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfU1lOQ19DT05GSUcsIChSRUFEX1JFRyhSRUdfU1lOQ19DT05GSUcpICYgfk1BU0tfU1lOQ19DT05GSUdfRklGT19GSUxMX0NPTkRJVElPTikgKTsKCWRlZmF1bHQ6CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KfQoKaW50IHJmNjlfc2V0X3N5bmNfc2l6ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBzeW5jU2l6ZSkKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IHN5bmMgc2l6ZSIpOwoJI2VuZGlmCgoJLy8gY2hlY2sgaW5wdXQgdmFsdWUKCWlmIChzeW5jU2l6ZSA+IDB4MDcpIHsKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIHdyaXRlIHZhbHVlCglyZXR1cm4gV1JJVEVfUkVHKFJFR19TWU5DX0NPTkZJRywgKFJFQURfUkVHKFJFR19TWU5DX0NPTkZJRykgJiB+TUFTS19TWU5DX0NPTkZJR19TWU5DX1NJWkUpIHwgKHN5bmNTaXplIDw8IDMpICk7Cn0KCmludCByZjY5X3NldF9zeW5jX3RvbGVyYW5jZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBzeW5jVG9sZXJhbmNlKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3luYyB0b2xlcmFuY2UiKTsKCSNlbmRpZgoKCS8vIGNoZWNrIGlucHV0IHZhbHVlCglpZiAoc3luY1RvbGVyYW5jZSA+IDB4MDcpIHsKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8vIHdyaXRlIHZhbHVlCglyZXR1cm4gV1JJVEVfUkVHKFJFR19TWU5DX0NPTkZJRywgKFJFQURfUkVHKFJFR19TWU5DX0NPTkZJRykgJiB+TUFTS19TWU5DX0NPTkZJR19TWU5DX1NJWkUpIHwgc3luY1RvbGVyYW5jZSk7Cn0KCmludCByZjY5X3NldF9zeW5jX3ZhbHVlcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBzeW5jVmFsdWVzWzhdKQp7CglpbnQgcmV0dmFsID0gMDsKCgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogc3luYyB2YWx1ZXMiKTsKCSNlbmRpZgoKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTEsIHN5bmNWYWx1ZXNbMF0pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFMiwgc3luY1ZhbHVlc1sxXSk7CglyZXR2YWwgKz0gV1JJVEVfUkVHKFJFR19TWU5DVkFMVUUzLCBzeW5jVmFsdWVzWzJdKTsKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTQsIHN5bmNWYWx1ZXNbM10pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFNSwgc3luY1ZhbHVlc1s0XSk7CglyZXR2YWwgKz0gV1JJVEVfUkVHKFJFR19TWU5DVkFMVUU2LCBzeW5jVmFsdWVzWzVdKTsKCXJldHZhbCArPSBXUklURV9SRUcoUkVHX1NZTkNWQUxVRTcsIHN5bmNWYWx1ZXNbNl0pOwoJcmV0dmFsICs9IFdSSVRFX1JFRyhSRUdfU1lOQ1ZBTFVFOCwgc3luY1ZhbHVlc1s3XSk7CgoJcmV0dXJuIHJldHZhbDsKfQoKaW50IHJmNjlfc2V0X3BhY2tldF9mb3JtYXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBwYWNrZXRGb3JtYXQgcGFja2V0Rm9ybWF0KQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogcGFja2V0IGZvcm1hdCIpOwoJI2VuZGlmCgoJc3dpdGNoKHBhY2tldEZvcm1hdCkgewoJY2FzZSBwYWNrZXRMZW5ndGhWYXI6IHJldHVybiBXUklURV9SRUcoUkVHX1BBQ0tFVENPTkZJRzEsIChSRUFEX1JFRyhSRUdfUEFDS0VUQ09ORklHMSkgfCAgTUFTS19QQUNLRVRDT05GSUcxX1BBS0VUX0ZPUk1BVF9WQVJJQUJMRSkgKTsKCWNhc2UgcGFja2V0TGVuZ3RoRml4OiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpICYgfk1BU0tfUEFDS0VUQ09ORklHMV9QQUtFVF9GT1JNQVRfVkFSSUFCTEUpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9jcmNfZW5hYmxlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIGVudW0gb3B0aW9uT25PZmYgb3B0aW9uT25PZmYpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBjcmMgZW5hYmxlIik7CgkjZW5kaWYKCglzd2l0Y2gob3B0aW9uT25PZmYpIHsKCWNhc2Ugb3B0aW9uT246CXJldHVybiBXUklURV9SRUcoUkVHX1BBQ0tFVENPTkZJRzEsIChSRUFEX1JFRyhSRUdfUEFDS0VUQ09ORklHMSkgfCAgTUFTS19QQUNLRVRDT05GSUcxX0NSQ19PTikgKTsKCWNhc2Ugb3B0aW9uT2ZmOglyZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpICYgfk1BU0tfUEFDS0VUQ09ORklHMV9DUkNfT04pICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9hZHJlc3NGaWx0ZXJpbmcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSBhZGRyZXNzRmlsdGVyaW5nIGFkZHJlc3NGaWx0ZXJpbmcpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBhZGRyZXNzIGZpbHRlcmluZyIpOwoJI2VuZGlmCgoJc3dpdGNoIChhZGRyZXNzRmlsdGVyaW5nKSB7CgljYXNlIGZpbHRlcmluZ09mZjoJICAgICByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoIChSRUFEX1JFRyhSRUdfUEFDS0VUQ09ORklHMSkgJiB+TUFTS19QQUNLRVRDT05GSUcxX0FERFJFU1NGSUxURVJJTkcpIHwgUEFDS0VUQ09ORklHMV9BRERSRVNTRklMVEVSSU5HX09GRikgKTsKCWNhc2Ugbm9kZUFkZHJlc3M6CSAgICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfUEFDS0VUQ09ORklHMSwgKCAoUkVBRF9SRUcoUkVHX1BBQ0tFVENPTkZJRzEpICYgfk1BU0tfUEFDS0VUQ09ORklHMV9BRERSRVNTRklMVEVSSU5HKSB8IFBBQ0tFVENPTkZJRzFfQUREUkVTU0ZJTFRFUklOR19OT0RFKSApOwoJY2FzZSBub2RlT3JCcm9hZGNhc3RBZGRyZXNzOiByZXR1cm4gV1JJVEVfUkVHKFJFR19QQUNLRVRDT05GSUcxLCAoIChSRUFEX1JFRyhSRUdfUEFDS0VUQ09ORklHMSkgJiB+TUFTS19QQUNLRVRDT05GSUcxX0FERFJFU1NGSUxURVJJTkcpIHwgUEFDS0VUQ09ORklHMV9BRERSRVNTRklMVEVSSU5HX05PREVCUk9BRENBU1QpICk7CglkZWZhdWx0OgoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBpbGxlZ2FsIGlucHV0IHBhcmFtIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9Cn0KCmludCByZjY5X3NldF9wYXlsb2FkX2xlbmd0aChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBwYXlsb2FkTGVuZ3RoKQp7CgkjaWZkZWYgREVCVUcKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogcGF5bG9hZCBsZW5ndGgiKTsKCSNlbmRpZgoKCXJldHVybiBXUklURV9SRUcoUkVHX1BBWUxPQURfTEVOR1RILCBwYXlsb2FkTGVuZ3RoKTsKfQoKdTggIHJmNjlfZ2V0X3BheWxvYWRfbGVuZ3RoKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAiZ2V0OiBwYXlsb2FkIGxlbmd0aCIpOwoJI2VuZGlmCgoJcmV0dXJuICh1OCkgUkVBRF9SRUcoUkVHX1BBWUxPQURfTEVOR1RIKTsKfQoKaW50IHJmNjlfc2V0X25vZGVfYWRkcmVzcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBub2RlQWRkcmVzcykKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IG5vZGUgYWRkcmVzcyIpOwoJI2VuZGlmCgoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfTk9ERUFEUlMsIG5vZGVBZGRyZXNzKTsKfQoKaW50IHJmNjlfc2V0X2Jyb2FkY2FzdF9hZGRyZXNzKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4IGJyb2FkY2FzdEFkZHJlc3MpCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBicm9hZGNhc3QgYWRkcmVzcyIpOwoJI2VuZGlmCgoJcmV0dXJuIFdSSVRFX1JFRyhSRUdfQlJPQURDQVNUQURSUywgYnJvYWRjYXN0QWRkcmVzcyk7Cn0KCmludCByZjY5X3NldF90eF9zdGFydF9jb25kaXRpb24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgZW51bSB0eFN0YXJ0Q29uZGl0aW9uIHR4U3RhcnRDb25kaXRpb24pCnsKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBzdGFydCBjb25kaXRpb24iKTsKCSNlbmRpZgoKCXN3aXRjaCh0eFN0YXJ0Q29uZGl0aW9uKSB7CgljYXNlIGZpZm9MZXZlbDoJICAgcmV0dXJuIFdSSVRFX1JFRyhSRUdfRklGT19USFJFU0gsIChSRUFEX1JFRyhSRUdfRklGT19USFJFU0gpICYgfk1BU0tfRklGT19USFJFU0hfVFhTVEFSVCkgKTsKCWNhc2UgZmlmb05vdEVtcHR5OiByZXR1cm4gV1JJVEVfUkVHKFJFR19GSUZPX1RIUkVTSCwgKFJFQURfUkVHKFJFR19GSUZPX1RIUkVTSCkgfCAgTUFTS19GSUZPX1RIUkVTSF9UWFNUQVJUKSApOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgppbnQgcmY2OV9zZXRfZmlmb190aHJlc2hvbGQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggdGhyZXNob2xkKQp7CglpbnQgcmV0dmFsOwoKCSNpZmRlZiBERUJVRwoJCWRldl9kYmcoJnNwaS0+ZGV2LCAic2V0OiBmaWZvIHRocmVzaG9sZCIpOwoJI2VuZGlmCgoJLy8gY2hlY2sgaW5wdXQgdmFsdWUKCWlmICh0aHJlc2hvbGQgJiAweDgwKSB7CgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGlsbGVnYWwgaW5wdXQgcGFyYW0iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvLyB3cml0ZSB2YWx1ZQoJcmV0dmFsID0gV1JJVEVfUkVHKFJFR19GSUZPX1RIUkVTSCwgKFJFQURfUkVHKFJFR19GSUZPX1RIUkVTSCkgJiB+TUFTS19GSUZPX1RIUkVTSF9WQUxVRSkgfCB0aHJlc2hvbGQpOwoJaWYgKHJldHZhbCkKCQlyZXR1cm4gcmV0dmFsOwoKCS8vIGFjY2VzcyB0aGUgZmlmbyB0byBhY3RpdmF0ZSBuZXcgdGhyZXNob2xkCglyZXR1cm4gcmY2OV9yZWFkX2ZpZm8gKHNwaSwgKHU4KikgJnJldHZhbCwgMSk7IC8vIHJldHZhbCB1c2VkIGFzIGJ1ZmZlcgp9CgppbnQgcmY2OV9zZXRfZGFnYyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBlbnVtIGRhZ2MgZGFnYykKewoJI2lmZGVmIERFQlVHCgkJZGV2X2RiZygmc3BpLT5kZXYsICJzZXQ6IGRhZ2MiKTsKCSNlbmRpZgoKCXN3aXRjaChkYWdjKSB7CgljYXNlIG5vcm1hbE1vZGU6CQkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfVEVTVERBR0MsIERBR0NfTk9STUFMKTsKCWNhc2UgaW1wcm92ZToJCQkgcmV0dXJuIFdSSVRFX1JFRyhSRUdfVEVTVERBR0MsIERBR0NfSU1QUk9WRURfTE9XQkVUQTApOwoJY2FzZSBpbXByb3ZlNExvd01vZHVsYXRpb25JbmRleDogcmV0dXJuIFdSSVRFX1JFRyhSRUdfVEVTVERBR0MsIERBR0NfSU1QUk9WRURfTE9XQkVUQTEpOwoJZGVmYXVsdDoKCQlkZXZfZGJnKCZzcGktPmRldiwgInNldDogaWxsZWdhbCBpbnB1dCBwYXJhbSIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKaW50IHJmNjlfcmVhZF9maWZvIChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKewoJI2lmZGVmIERFQlVHX0ZJRk9fQUNDRVNTCgkJaW50IGk7CgkjZW5kaWYKCXN0cnVjdCBzcGlfdHJhbnNmZXIgdHJhbnNmZXI7Cgl1OCBsb2NhbF9idWZmZXJbRklGT19TSVpFICsgMV07CglpbnQgcmV0dmFsOwoKCWlmIChzaXplID4gRklGT19TSVpFKSB7CgkJI2lmZGVmIERFQlVHCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCBmaWZvOiBwYXNzZWQgaW4gYnVmZmVyIGJpZ2dlciB0aGVuIGludGVybmFsIGJ1ZmZlciBcbiIpOwoJCSNlbmRpZgoJCXJldHVybiAtRU1TR1NJWkU7Cgl9CgoJLyogcHJlcGFyZSBhIGJpZGlyZWN0aW9uYWwgdHJhbnNmZXIgKi8KCWxvY2FsX2J1ZmZlclswXSA9IFJFR19GSUZPOwoJbWVtc2V0KCZ0cmFuc2ZlciwgMCwgc2l6ZW9mKHRyYW5zZmVyKSk7CiAgCXRyYW5zZmVyLnR4X2J1ZiA9IGxvY2FsX2J1ZmZlcjsKICAJdHJhbnNmZXIucnhfYnVmID0gbG9jYWxfYnVmZmVyOwoJdHJhbnNmZXIubGVuCT0gc2l6ZSsxOwoKCXJldHZhbCA9IHNwaV9zeW5jX3RyYW5zZmVyKHNwaSwgJnRyYW5zZmVyLCAxKTsKCgkjaWZkZWYgREVCVUdfRklGT19BQ0NFU1MKCQlmb3IgKGk9MDsgaTxzaXplOyBpKyspCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiJWQgLSAweCV4XG4iLCBpLCBsb2NhbF9idWZmZXJbaSsxXSk7CgkjZW5kaWYKCgltZW1jcHkoYnVmZmVyLCAmbG9jYWxfYnVmZmVyWzFdLCBzaXplKTsgIC8vIFRPRE86IG9obmUgbWVtY29weSB35HJlIHNjaPZuZXIKCglyZXR1cm4gcmV0dmFsOwp9CgppbnQgcmY2OV93cml0ZV9maWZvKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHU4ICpidWZmZXIsIHVuc2lnbmVkIGludCBzaXplKQp7CgkjaWZkZWYgREVCVUdfRklGT19BQ0NFU1MKCQlpbnQgaTsKCSNlbmRpZgoJY2hhciBzcGlfYWRkcmVzcyA9IFJFR19GSUZPIHwgV1JJVEVfQklUOwoJdTggbG9jYWxfYnVmZmVyW0ZJRk9fU0laRSArIDFdOwoKCWlmIChzaXplID4gRklGT19TSVpFKSB7CgkJI2lmZGVmIERFQlVHCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCBmaWZvOiBwYXNzZWQgaW4gYnVmZmVyIGJpZ2dlciB0aGVuIGludGVybmFsIGJ1ZmZlciBcbiIpOwoJCSNlbmRpZgoJCXJldHVybiAtRU1TR1NJWkU7Cgl9CgoJbG9jYWxfYnVmZmVyWzBdID0gc3BpX2FkZHJlc3M7CgltZW1jcHkoJmxvY2FsX2J1ZmZlclsxXSwgYnVmZmVyLCBzaXplKTsgIC8vIFRPRE86IG9obmUgbWVtY29weSB35HJlIHNjaPZuZXIKCgkjaWZkZWYgREVCVUdfRklGT19BQ0NFU1MKCQlmb3IgKGk9MDsgaTxzaXplOyBpKyspCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAiMHgleFxuIixidWZmZXJbaV0pOwoJI2VuZGlmCgoJcmV0dXJuIHNwaV93cml0ZSAoc3BpLCBsb2NhbF9idWZmZXIsIHNpemUgKyAxKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCnU4IHJmNjlfcmVhZF9yZWcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdTggYWRkcikKewoJaW50IHJldHZhbDsKCglyZXR2YWwgPSBzcGlfdzhyOChzcGksIGFkZHIpOwoKCSNpZmRlZiBERUJVR19WQUxVRVMKCQlpZiAocmV0dmFsIDwgMCkKCQkJLyogc2hvdWxkIG5ldmVyIGhhcHBlbiwgc2luY2Ugd2UgYWxyZWFkeSBjaGVja2VkLAoJCQkgKiB0aGF0IG1vZHVsZSBpcyBjb25uZWN0ZWQuIFRoZXJlZm9yZSBubyBlcnJvcgoJCQkgKiBoYW5kbGluZywganVzdCBhbiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLi4uCgkJCSAqLwoJCQlkZXZfZGJnKCZzcGktPmRldiwgInJlYWQgMHgleCBGQUlMRURcbiIsCgkJCQlhZGRyKTsKCQllbHNlCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAicmVhZCAweCV4IGZyb20gcmVnIDB4JXhcbiIsCgkJCQlyZXR2YWwsCgkJCQlhZGRyKTsKCSNlbmRpZgoKCXJldHVybiByZXR2YWw7Cn0KCmludCByZjY5X3dyaXRlX3JlZyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCB1OCBhZGRyLCB1OCB2YWx1ZSkKewoJaW50IHJldHZhbDsKCWNoYXIgYnVmZmVyWzJdOwoKCWJ1ZmZlclswXSA9IGFkZHIgfCBXUklURV9CSVQ7CglidWZmZXJbMV0gPSB2YWx1ZTsKCglyZXR2YWwgPSBzcGlfd3JpdGUoc3BpLCAmYnVmZmVyLCAyKTsKCgkjaWZkZWYgREVCVUdfVkFMVUVTCgkJaWYgKHJldHZhbCA8IDApCgkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4sIHNpbmNlIHdlIGFscmVhZHkgY2hlY2tlZCwKCQkJICogdGhhdCBtb2R1bGUgaXMgY29ubmVjdGVkLiBUaGVyZWZvcmUgbm8gZXJyb3IKCQkJICogaGFuZGxpbmcsIGp1c3QgYW4gb3B0aW9uYWwgZXJyb3IgbWVzc2FnZS4uLgoJCQkgKi8KCQkJZGV2X2RiZygmc3BpLT5kZXYsICJ3cml0ZSAweCV4IHRvIDB4JXggRkFJTEVEXG4iLAoJCQkJdmFsdWUsCgkJCQlhZGRyKTsKCQllbHNlCgkJCWRldl9kYmcoJnNwaS0+ZGV2LCAid3JvdGUgMHgleCB0byByZWcgMHgleFxuIiwKCQkJCXZhbHVlLAoJCQkJYWRkcik7CgkjZW5kaWYKCglyZXR1cm4gcmV0dmFsOwp9CgoK