getprop("ro.product.device") == "cmi" || abort("E3004: This package is for \"cmi\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/cmi/cmi:11/RKQ1.200826.002/V12.5.5.0.RJACNXM:user/release-keys");
ui_print("Target: Xiaomi/cmi/cmi:11/RKQ1.200826.002/V12.5.6.0.RJACNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/cmi/cmi:11/RKQ1.200826.002/V12.5.5.0.RJACNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/cmi/cmi:11/RKQ1.200826.002/V12.5.6.0.RJACNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/cmi/cmi:11/RKQ1.200826.002/V12.5.5.0.RJACNXM:user/release-keys or Xiaomi/cmi/cmi:11/RKQ1.200826.002/V12.5.6.0.RJACNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:d3bff09eba67eb915363a322cd9dbfc49df092b1"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7ddf55e73b6572087e7e612a9ba17d24706e0990")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:d3bff09eba67eb915363a322cd9dbfc49df092b1"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7ddf55e73b6572087e7e612a9ba17d24706e0990"),"\" has unexpected contents."));
apply_patch_space(170594304) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "318,1,30,37,50,52,56,1989,1990,2015,2016,2050,96562,97634,97893,98042,98284,98304,98320,98630,444070,458752,458766,461295,472526,473276,473277,473288,473289,473295,473296,491520,491534,495463,745028,745041,745049,745055,745056,745062,745063,745068,745069,745083,745084,745090,745091,745094,745095,745100,745101,745108,745109,745111,745112,745116,745117,745121,745122,745126,745134,745144,745159,745162,745163,745173,745208,745212,745214,745228,745248,745261,745274,745283,745286,745288,745295,745300,745301,745303,745304,745308,745309,745314,745315,745320,745321,745325,745326,745331,745332,745336,745337,745342,745343,745347,745348,745351,745352,745359,745360,745364,745365,745376,745377,745381,745382,745386,745387,745392,745393,745395,745396,745402,745403,745404,745405,745410,745411,745414,745415,745427,745437,745443,745444,745447,745448,745449,745450,745454,745455,745456,745457,745472,745473,745475,745476,745477,745478,745481,745482,745487,745488,745500,745501,745504,745505,745506,745507,745509,745510,745511,745512,745513,745514,745515,745516,745517,745518,745519,745520,745521,745522,745524,745525,745526,745527,745529,745530,745532,745533,745534,745535,745536,745537,745539,745540,745543,745544,745545,745546,745547,745548,745550,745551,745552,745553,745555,745556,745557,745558,745559,745560,745563,745564,745568,745569,745572,745573,745575,745576,745578,745579,745581,745582,745583,745584,745586,745588,745591,745592,745595,745596,745598,745599,745606,745607,745621,745622,745626,745627,745629,745630,745636,745640,745647,745648,745655,745656,745658,745659,745664,745665,745677,745678,745683,745684,745687,745688,745705,745706,745708,745709,745714,745715,745722,745723,745724,745725,745727,745728,745733,745734,745739,745740,745746,745747,745758,745759,745761,745762,745766,745767,745776,745777,745787,745788,745792,745793,745796,745797,745811,745812,745815,745816,745829,745830,745832,745833,745837,745838,745841,745842,745845,745846,745849,745850,745852,745864,745874,745898,745901,745911,745922,745942,745965,745975,746328,746331,746433,746434,746470,746475,746489,746511,746541,746544,746612,746616,746641,746662,746677,950275,950286,980158,983040,983041,983127,998642") == "e208df418d1568fcaf9ee002dc071c7c60d5c32d" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "318,1,30,37,50,52,56,1989,1990,2015,2016,2050,96562,97634,97893,98042,98284,98304,98320,98630,444070,458752,458766,461295,472526,473276,473277,473288,473289,473295,473296,491520,491534,495463,745028,745041,745049,745055,745056,745062,745063,745068,745069,745083,745084,745090,745091,745094,745095,745100,745101,745108,745109,745111,745112,745116,745117,745121,745122,745126,745134,745144,745159,745162,745163,745173,745208,745212,745214,745228,745248,745261,745274,745283,745286,745288,745295,745300,745301,745303,745304,745308,745309,745314,745315,745320,745321,745325,745326,745331,745332,745336,745337,745342,745343,745347,745348,745351,745352,745359,745360,745364,745365,745376,745377,745381,745382,745386,745387,745392,745393,745395,745396,745402,745403,745404,745405,745410,745411,745414,745415,745427,745437,745443,745444,745447,745448,745449,745450,745454,745455,745456,745457,745472,745473,745475,745476,745477,745478,745481,745482,745487,745488,745500,745501,745504,745505,745506,745507,745509,745510,745511,745512,745513,745514,745515,745516,745517,745518,745519,745520,745521,745522,745524,745525,745526,745527,745529,745530,745532,745533,745534,745535,745536,745537,745539,745540,745543,745544,745545,745546,745547,745548,745550,745551,745552,745553,745555,745556,745557,745558,745559,745560,745563,745564,745568,745569,745572,745573,745575,745576,745578,745579,745581,745582,745583,745584,745586,745588,745591,745592,745595,745596,745598,745599,745606,745607,745621,745622,745626,745627,745629,745630,745636,745640,745647,745648,745655,745656,745658,745659,745664,745665,745677,745678,745683,745684,745687,745688,745705,745706,745708,745709,745714,745715,745722,745723,745724,745725,745727,745728,745733,745734,745739,745740,745746,745747,745758,745759,745761,745762,745766,745767,745776,745777,745787,745788,745792,745793,745796,745797,745811,745812,745815,745816,745829,745830,745832,745833,745837,745838,745841,745842,745845,745846,745849,745850,745852,745864,745874,745898,745901,745911,745922,745942,745965,745975,746328,746331,746433,746434,746470,746475,746489,746511,746541,746544,746612,746616,746641,746662,746677,950275,950286,980158,983040,983041,983127,998642") && block_image_verify(map_partition("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(map_partition("vendor"), "80,1,27,37,41,46,47,125,133,139,140,1814,1818,1831,2296,2301,2305,2309,2310,2316,2322,2323,2324,2329,2335,2336,2337,2581,2585,2590,2591,2593,2597,7978,7979,8508,8509,8515,8516,12353,12354,12356,12357,12446,12447,19849,19851,19854,19855,19858,19859,19861,19862,19864,19865,19888,19889,19925,19929,19979,19980,19991,19997,19998,19999,20002,20008,20009,20010,20013,20014,20019,20020,20055,425998,426002,453534,454915,462126,462228,462229") == "32571de70b65fa4f0409ea0231dcb9ba614072ea" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "80,1,27,37,41,46,47,125,133,139,140,1814,1818,1831,2296,2301,2305,2309,2310,2316,2322,2323,2324,2329,2335,2336,2337,2581,2585,2590,2591,2593,2597,7978,7979,8508,8509,8515,8516,12353,12354,12356,12357,12446,12447,19849,19851,19854,19855,19858,19859,19861,19862,19864,19865,19888,19889,19925,19929,19979,19980,19991,19997,19998,19999,20002,20008,20009,20010,20013,20014,20019,20020,20055,425998,426002,453534,454915,462126,462228,462229") && block_image_verify(map_partition("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;
if (range_sha1(map_partition("product"), "20,1,21,26,27,29,30,146,150,154,155,167,173,174,65547,65548,82034,82281,83588,83621,83622") == "cb256de551700d565f262d5b789608197e8bd4f5" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
ifelse (block_image_recover(map_partition("product"), "20,1,21,26,27,29,30,146,150,154,155,167,173,174,65547,65548,82034,82281,83588,83621,83622") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "14,1,6,2019,2025,2026,2027,2035,2255,2257,2258,32231,32745,32767,32768") == "c4d531ea4a69dc51175fc9d926f4c03256122508" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "14,1,6,2019,2025,2026,2027,2035,2255,2257,2258,32231,32745,32767,32768") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "130,1,29,36,40,44,45,51,57,58,59,73,79,80,81,139,143,148,149,155,161,162,163,357,361,365,366,369,373,378,379,382,383,389,395,396,397,419,425,426,427,1138,1142,1160,1161,1165,1171,1172,1173,1175,1176,1187,1193,1194,1195,1205,1206,1211,1215,1219,1220,1224,1230,1234,1235,1242,1248,1249,1250,1262,1268,1269,1270,1272,1279,1285,1292,1297,1304,1334,1341,1360,1367,1385,1390,1407,1414,1430,1431,1522,1524,1527,1528,1540,1541,1542,1543,1544,1545,1552,1553,1576,1577,1607,1608,1622,1627,1630,1633,1636,1639,1642,1644,1648,1649,1653,1656,1661,1662,1665,1672,1676,1679,1680,98325,98326,100872,101179,102787,102822,102823") == "457362e60c332004ac64c0775102ebb3c0b7e7e3" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "130,1,29,36,40,44,45,51,57,58,59,73,79,80,81,139,143,148,149,155,161,162,163,357,361,365,366,369,373,378,379,382,383,389,395,396,397,419,425,426,427,1138,1142,1160,1161,1165,1171,1172,1173,1175,1176,1187,1193,1194,1195,1205,1206,1211,1215,1219,1220,1224,1230,1234,1235,1242,1248,1249,1250,1262,1268,1269,1270,1272,1279,1285,1292,1297,1304,1334,1341,1360,1367,1385,1390,1407,1414,1430,1431,1522,1524,1527,1528,1540,1541,1542,1543,1544,1545,1552,1553,1576,1577,1607,1608,1622,1627,1630,1633,1636,1639,1642,1644,1648,1649,1653,1656,1661,1662,1665,1672,1676,1679,1680,98325,98326,100872,101179,102787,102822,102823") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

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


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/xbl_config_5.elf", "/dev/block/bootdevice/by-name/xbl_config_5");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/xbl_5.elf", "/dev/block/bootdevice/by-name/xbl_5");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/xbl_config_4.elf", "/dev/block/bootdevice/by-name/xbl_config_4");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/xbl_4.elf", "/dev/block/bootdevice/by-name/xbl_4");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");

# --- Start patching dynamic partitions ---


# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.500000, 0);
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:d3bff09eba67eb915363a322cd9dbfc49df092b1"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7ddf55e73b6572087e7e612a9ba17d24706e0990"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7ddf55e73b6572087e7e612a9ba17d24706e0990")));

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");

# ---- update tasks: exaid part 2----


package_extract_file("exaid.img", "/dev/block/bootdevice/by-name/exaid");
    
set_progress(1.000000);
