getprop("ro.product.device") == "olive" || abort("E3004: This package is for \"olive\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.2.0.QCNMIXM:user/release-keys");
ui_print("Target: Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.3.0.QCNMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.2.0.QCNMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.3.0.QCNMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.2.0.QCNMIXM:user/release-keys or Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.3.0.QCNMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:67108864:b12f96b687ed3ddbd2fcf6eb7212d0a7500996bf",
                      "EMMC:/dev/block/bootdevice/by-name/boot:67108864:980fed1c2330d10c7afff05332063ec350b00887") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:b12f96b687ed3ddbd2fcf6eb7212d0a7500996bf\" or \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:980fed1c2330d10c7afff05332063ec350b00887\" has unexpected contents.");
apply_patch_space(85065728) || abort("E3006: Not enough free space on /cache to apply patches.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/rpm:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8",
                      "EMMC:/dev/block/bootdevice/by-name/rpm:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/rpm:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8\" or \"EMMC:/dev/block/bootdevice/by-name/rpm:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8",
                      "EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8\" or \"EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/devcfg:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9",
                      "EMMC:/dev/block/bootdevice/by-name/devcfg:38076:2e5c5b8db744f808e002906a27178e4892116417") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/devcfg:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9\" or \"EMMC:/dev/block/bootdevice/by-name/devcfg:38076:2e5c5b8db744f808e002906a27178e4892116417\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9",
                      "EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:2e5c5b8db744f808e002906a27178e4892116417") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9\" or \"EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:2e5c5b8db744f808e002906a27178e4892116417\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/aboot:779460:c0f43a01dde0734308b5fc049c033d2520b24759",
                      "EMMC:/dev/block/bootdevice/by-name/aboot:779460:3f46143e482b9e4589b5ad2878e296daaa93a154") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/aboot:779460:c0f43a01dde0734308b5fc049c033d2520b24759\" or \"EMMC:/dev/block/bootdevice/by-name/aboot:779460:3f46143e482b9e4589b5ad2878e296daaa93a154\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/abootbak:779460:c0f43a01dde0734308b5fc049c033d2520b24759",
                      "EMMC:/dev/block/bootdevice/by-name/abootbak:779460:3f46143e482b9e4589b5ad2878e296daaa93a154") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/abootbak:779460:c0f43a01dde0734308b5fc049c033d2520b24759\" or \"EMMC:/dev/block/bootdevice/by-name/abootbak:779460:3f46143e482b9e4589b5ad2878e296daaa93a154\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:6c3c8fec7983d509c0d05b0f9a4ed1c4ecae309c",
                      "EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:a6ce9fadcc27f91622d5a861a99f60e545844552") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:6c3c8fec7983d509c0d05b0f9a4ed1c4ecae309c\" or \"EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:a6ce9fadcc27f91622d5a861a99f60e545844552\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/keymaster:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358",
                      "EMMC:/dev/block/bootdevice/by-name/keymaster:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/keymaster:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358\" or \"EMMC:/dev/block/bootdevice/by-name/keymaster:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358",
                      "EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358\" or \"EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:cdc4476cac9c2a184301878871a9fbdc010a706e",
                      "EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:fa0cc3b331061a482d4ed240e696e701c8aec44f") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:cdc4476cac9c2a184301878871a9fbdc010a706e\" or \"EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:fa0cc3b331061a482d4ed240e696e701c8aec44f\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/modem:134217728:e4b347d64a0900f3876f86cc74d69097232518ce",
                      "EMMC:/dev/block/bootdevice/by-name/modem:134217728:2521464fe3e491312a55d07df8ce339add22a9af") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/modem:134217728:e4b347d64a0900f3876f86cc74d69097232518ce\" or \"EMMC:/dev/block/bootdevice/by-name/modem:134217728:2521464fe3e491312a55d07df8ce339add22a9af\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/tz:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a",
                      "EMMC:/dev/block/bootdevice/by-name/tz:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/tz:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a\" or \"EMMC:/dev/block/bootdevice/by-name/tz:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a",
                      "EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a\" or \"EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/sbl1:408956:4838c32fda408feceb99abef2afcebffe4699e21",
                      "EMMC:/dev/block/bootdevice/by-name/sbl1:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/sbl1:408956:4838c32fda408feceb99abef2afcebffe4699e21\" or \"EMMC:/dev/block/bootdevice/by-name/sbl1:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:4838c32fda408feceb99abef2afcebffe4699e21",
                      "EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:4838c32fda408feceb99abef2afcebffe4699e21\" or \"EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:137b64f65ab2371c23a6c2721e6874c642b9c9a2",
                      "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:7c8a044c62d48b6cb8aaa54820c55522e1608d1e") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:137b64f65ab2371c23a6c2721e6874c642b9c9a2\" or \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:7c8a044c62d48b6cb8aaa54820c55522e1608d1e\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:f209434a564415aa23d0489b2aa79a192a83658d",
                      "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:90c7decfef0e27ca1c99826eb4ec5f18debc4f17") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:f209434a564415aa23d0489b2aa79a192a83658d\" or \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:90c7decfef0e27ca1c99826eb4ec5f18debc4f17\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "200,1,723,791,805,836,843,863,864,1124,1129,1131,1132,1238,1239,1719,1720,2408,2409,2411,2413,2414,2415,2430,2431,2612,2613,2657,2800,3782,3783,3785,3786,3790,3791,3799,3800,3801,3802,6275,6320,7329,7374,9127,9128,9130,9131,9535,9536,9538,9539,10532,10534,16473,16474,16607,16608,19377,19379,23679,25038,25603,25605,31348,32770,33053,33054,33559,34155,34855,34856,34858,34860,34919,34920,35053,35055,35215,35219,35227,35228,35236,35240,35245,35246,35268,35272,35276,35277,40151,40152,40164,40168,40172,40173,41385,41391,41423,41424,41430,41434,41438,41439,41444,41448,41452,41453,41567,41573,41578,41579,43750,43754,43783,43784,46780,46781,49359,49360,49390,49394,49398,49399,49496,49500,49504,65537,66042,98306,98589,98590,99095,131073,131578,163842,164125,164126,164631,196609,197114,229378,229661,229662,230167,262145,262650,294914,295197,295198,295703,327681,328186,360449,360954,368062,368204,393217,393722,425985,426490,458753,459258,480348,483900,483902,483936,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819485,819486,819991,851969,852474,875232,884736,884738,1146880,1146881,1161015,1179411,1179647,1179648") == "d6bce7137b4ebdbbc2a9978de998d7f200ea768b" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "200,1,723,791,805,836,843,863,864,1124,1129,1131,1132,1238,1239,1719,1720,2408,2409,2411,2413,2414,2415,2430,2431,2612,2613,2657,2800,3782,3783,3785,3786,3790,3791,3799,3800,3801,3802,6275,6320,7329,7374,9127,9128,9130,9131,9535,9536,9538,9539,10532,10534,16473,16474,16607,16608,19377,19379,23679,25038,25603,25605,31348,32770,33053,33054,33559,34155,34855,34856,34858,34860,34919,34920,35053,35055,35215,35219,35227,35228,35236,35240,35245,35246,35268,35272,35276,35277,40151,40152,40164,40168,40172,40173,41385,41391,41423,41424,41430,41434,41438,41439,41444,41448,41452,41453,41567,41573,41578,41579,43750,43754,43783,43784,46780,46781,49359,49360,49390,49394,49398,49399,49496,49500,49504,65537,66042,98306,98589,98590,99095,131073,131578,163842,164125,164126,164631,196609,197114,229378,229661,229662,230167,262145,262650,294914,295197,295198,295703,327681,328186,360449,360954,368062,368204,393217,393722,425985,426490,458753,459258,480348,483900,483902,483936,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819485,819486,819991,851969,852474,875232,884736,884738,1146880,1146881,1161015,1179411,1179647,1179648") && block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1("/dev/block/bootdevice/by-name/vendor", "64,1,525,602,610,620,624,629,630,711,715,720,721,726,727,990,994,999,1000,1002,1003,1227,1235,1243,1244,1287,1293,1300,25690,30278,30279,32676,32770,32864,32865,33370,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,291920,294912,294914,360448,360449,386991,393125,393215,393216") == "75624bced8239eda52de5234e8870bee334e5197" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "64,1,525,602,610,620,624,629,630,711,715,720,721,726,727,990,994,999,1000,1002,1003,1227,1235,1243,1244,1287,1293,1300,25690,30278,30279,32676,32770,32864,32865,33370,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,291920,294912,294914,360448,360449,386991,393125,393215,393216") && block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;

# ---- start making changes here ----


# ---- radio update tasks ----

ui_print("Patching firmware images...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/rpm:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8",
                "EMMC:/dev/block/bootdevice/by-name/rpm:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268",
                package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpm:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268");
patch_partition("EMMC:/dev/block/bootdevice/by-name/devcfg:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9",
                "EMMC:/dev/block/bootdevice/by-name/devcfg:38076:2e5c5b8db744f808e002906a27178e4892116417",
                package_extract_file("patch/firmware-update/devcfg.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/devcfg:38076:2e5c5b8db744f808e002906a27178e4892116417");
patch_partition("EMMC:/dev/block/bootdevice/by-name/aboot:779460:c0f43a01dde0734308b5fc049c033d2520b24759",
                "EMMC:/dev/block/bootdevice/by-name/aboot:779460:3f46143e482b9e4589b5ad2878e296daaa93a154",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/aboot:779460:3f46143e482b9e4589b5ad2878e296daaa93a154");
patch_partition("EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:6c3c8fec7983d509c0d05b0f9a4ed1c4ecae309c",
                "EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:a6ce9fadcc27f91622d5a861a99f60e545844552",
                package_extract_file("patch/firmware-update/cmnlib64_30.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:a6ce9fadcc27f91622d5a861a99f60e545844552");
patch_partition("EMMC:/dev/block/bootdevice/by-name/keymaster:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358",
                "EMMC:/dev/block/bootdevice/by-name/keymaster:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4",
                package_extract_file("patch/firmware-update/km4.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/keymaster:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4");
patch_partition("EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:cdc4476cac9c2a184301878871a9fbdc010a706e",
                "EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:fa0cc3b331061a482d4ed240e696e701c8aec44f",
                package_extract_file("patch/firmware-update/cmnlib_30.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:fa0cc3b331061a482d4ed240e696e701c8aec44f");
patch_partition("EMMC:/dev/block/bootdevice/by-name/modem:134217728:e4b347d64a0900f3876f86cc74d69097232518ce",
                "EMMC:/dev/block/bootdevice/by-name/modem:134217728:2521464fe3e491312a55d07df8ce339add22a9af",
                package_extract_file("patch/firmware-update/NON-HLOS.bin.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/modem:134217728:2521464fe3e491312a55d07df8ce339add22a9af");
patch_partition("EMMC:/dev/block/bootdevice/by-name/tz:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a",
                "EMMC:/dev/block/bootdevice/by-name/tz:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf",
                package_extract_file("patch/firmware-update/tz.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/tz:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf");
patch_partition("EMMC:/dev/block/bootdevice/by-name/sbl1:408956:4838c32fda408feceb99abef2afcebffe4699e21",
                "EMMC:/dev/block/bootdevice/by-name/sbl1:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118",
                package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118");
patch_partition("EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8",
                "EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268",
                package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268");
patch_partition("EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9",
                "EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:2e5c5b8db744f808e002906a27178e4892116417",
                package_extract_file("patch/firmware-update/devcfg.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:2e5c5b8db744f808e002906a27178e4892116417");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abootbak:779460:c0f43a01dde0734308b5fc049c033d2520b24759",
                "EMMC:/dev/block/bootdevice/by-name/abootbak:779460:3f46143e482b9e4589b5ad2878e296daaa93a154",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abootbak:779460:3f46143e482b9e4589b5ad2878e296daaa93a154");
patch_partition("EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358",
                "EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4",
                package_extract_file("patch/firmware-update/km4.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4");
patch_partition("EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a",
                "EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf",
                package_extract_file("patch/firmware-update/tz.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf");
patch_partition("EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:4838c32fda408feceb99abef2afcebffe4699e21",
                "EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118",
                package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:67108864:b12f96b687ed3ddbd2fcf6eb7212d0a7500996bf",
                "EMMC:/dev/block/bootdevice/by-name/boot:67108864:980fed1c2330d10c7afff05332063ec350b00887",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:67108864:980fed1c2330d10c7afff05332063ec350b00887");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/rpm:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8",
                "EMMC:/dev/block/bootdevice/by-name/rpm:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268",
                package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpm:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268");
patch_partition("EMMC:/dev/block/bootdevice/by-name/devcfg:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9",
                "EMMC:/dev/block/bootdevice/by-name/devcfg:38076:2e5c5b8db744f808e002906a27178e4892116417",
                package_extract_file("patch/firmware-update/devcfg.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/devcfg:38076:2e5c5b8db744f808e002906a27178e4892116417");
patch_partition("EMMC:/dev/block/bootdevice/by-name/aboot:779460:c0f43a01dde0734308b5fc049c033d2520b24759",
                "EMMC:/dev/block/bootdevice/by-name/aboot:779460:3f46143e482b9e4589b5ad2878e296daaa93a154",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/aboot:779460:3f46143e482b9e4589b5ad2878e296daaa93a154");
patch_partition("EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:6c3c8fec7983d509c0d05b0f9a4ed1c4ecae309c",
                "EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:a6ce9fadcc27f91622d5a861a99f60e545844552",
                package_extract_file("patch/firmware-update/cmnlib64_30.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/cmnlib64:265016:a6ce9fadcc27f91622d5a861a99f60e545844552");
patch_partition("EMMC:/dev/block/bootdevice/by-name/keymaster:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358",
                "EMMC:/dev/block/bootdevice/by-name/keymaster:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4",
                package_extract_file("patch/firmware-update/km4.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/keymaster:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4");
patch_partition("EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:cdc4476cac9c2a184301878871a9fbdc010a706e",
                "EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:fa0cc3b331061a482d4ed240e696e701c8aec44f",
                package_extract_file("patch/firmware-update/cmnlib_30.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/cmnlib:205672:fa0cc3b331061a482d4ed240e696e701c8aec44f");
patch_partition("EMMC:/dev/block/bootdevice/by-name/modem:134217728:e4b347d64a0900f3876f86cc74d69097232518ce",
                "EMMC:/dev/block/bootdevice/by-name/modem:134217728:2521464fe3e491312a55d07df8ce339add22a9af",
                package_extract_file("patch/firmware-update/NON-HLOS.bin.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/modem:134217728:2521464fe3e491312a55d07df8ce339add22a9af");
patch_partition("EMMC:/dev/block/bootdevice/by-name/tz:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a",
                "EMMC:/dev/block/bootdevice/by-name/tz:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf",
                package_extract_file("patch/firmware-update/tz.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/tz:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf");
patch_partition("EMMC:/dev/block/bootdevice/by-name/sbl1:408956:4838c32fda408feceb99abef2afcebffe4699e21",
                "EMMC:/dev/block/bootdevice/by-name/sbl1:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118",
                package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118");
patch_partition("EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:bb73f80f177df2c32bfa3d78c63e081e64e69fa8",
                "EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268",
                package_extract_file("patch/firmware-update/rpm.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/rpmbak:169092:8d20d35e0f312d89bdd54002d4c6ab41a421b268");
patch_partition("EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:ef352c47c90f826d08c7921116e45a3fb59d13e9",
                "EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:2e5c5b8db744f808e002906a27178e4892116417",
                package_extract_file("patch/firmware-update/devcfg.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/devcfgbak:38076:2e5c5b8db744f808e002906a27178e4892116417");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abootbak:779460:c0f43a01dde0734308b5fc049c033d2520b24759",
                "EMMC:/dev/block/bootdevice/by-name/abootbak:779460:3f46143e482b9e4589b5ad2878e296daaa93a154",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abootbak:779460:3f46143e482b9e4589b5ad2878e296daaa93a154");
patch_partition("EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:15d8b47aec535f75e76929246ae5a6e8d8bc8358",
                "EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4",
                package_extract_file("patch/firmware-update/km4.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/keymasterbak:319776:10eb6c5134bd1da882c43c53ffefcf64e62434f4");
patch_partition("EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:d7c6239c68fe467acb2631bfb1e0625a5371db1a",
                "EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf",
                package_extract_file("patch/firmware-update/tz.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/tzbak:1527680:c450c9f350ccf6b6d79beedb41ef41383a5f4cdf");
patch_partition("EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:4838c32fda408feceb99abef2afcebffe4699e21",
                "EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118",
                package_extract_file("patch/firmware-update/sbl1.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/sbl1bak:408956:2e67c97b60374922da1dddeb8fc49b3910d1e118");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_progress(0.100000, 2);

# ---- radio update tasks 2 ----

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/splash.img", "/dev/block/bootdevice/by-name/splash");
patch_partition("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:137b64f65ab2371c23a6c2721e6874c642b9c9a2",
                "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:7c8a044c62d48b6cb8aaa54820c55522e1608d1e",
                package_extract_file("patch/firmware-update/dtbo.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:7c8a044c62d48b6cb8aaa54820c55522e1608d1e");
patch_partition("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:f209434a564415aa23d0489b2aa79a192a83658d",
                "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:90c7decfef0e27ca1c99826eb4ec5f18debc4f17",
                package_extract_file("patch/firmware-update/vbmeta.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:90c7decfef0e27ca1c99826eb4ec5f18debc4f17");
