getprop("ro.product.device") == "lime" || abort("E3004: This package is for \"lime\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/lime/lime:12/RKQ1.211130.001/V13.0.1.0.SJQINXM:user/release-keys");
ui_print("Target: Redmi/lime/lime:12/RKQ1.211130.001/V14.0.2.0.SJQINXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/lime/lime:12/RKQ1.211130.001/V13.0.1.0.SJQINXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/lime/lime:12/RKQ1.211130.001/V14.0.2.0.SJQINXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/lime/lime:12/RKQ1.211130.001/V13.0.1.0.SJQINXM:user/release-keys or Redmi/lime/lime:12/RKQ1.211130.001/V14.0.2.0.SJQINXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:56648cfc7b5bc7a475b684d14161fd873428baf8"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:fe8665fd030f7f9748d1bdffb04dc8b41689abf4")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:56648cfc7b5bc7a475b684d14161fd873428baf8"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:fe8665fd030f7f9748d1bdffb04dc8b41689abf4"),"\" has unexpected contents."));
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "70,1,32770,32969,79175,83233,83235,83249,83250,83317,98306,98505,163842,164041,213539,221162,221164,221187,221188,221325,229378,229577,294914,295113,303018,303273,305399,305403,305535,305547,305751,305757,309613,309617,309635,309649,310375,310387,311796,311802,404893,404895,404901,408399,408400,408401,408407,412301,412309,412321,412322,412415,440055,440616,564657,564828,565071,567116,567550,572284,578424,581892,753678,753680,786433,786448,812810,815574,828496,828669,828670") == "497f5279912ad6406159f48ddf4f2ab981511e7c" || 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"), "70,1,32770,32969,79175,83233,83235,83249,83250,83317,98306,98505,163842,164041,213539,221162,221164,221187,221188,221325,229378,229577,294914,295113,303018,303273,305399,305403,305535,305547,305751,305757,309613,309617,309635,309649,310375,310387,311796,311802,404893,404895,404901,408399,408400,408401,408407,412301,412309,412321,412322,412415,440055,440616,564657,564828,565071,567116,567550,572284,578424,581892,753678,753680,786433,786448,812810,815574,828496,828669,828670") && 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"), "18,1,32770,32843,98306,98379,163842,163915,229378,229451,294914,294987,295008,295009,300822,301783,306568,306642,306643") == "c5caa7b49d0af66fcbd646edbbfe2a03bd700c8c" || 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"), "18,1,32770,32843,98306,98379,163842,163915,229378,229451,294914,294987,295008,295009,300822,301783,306568,306642,306643") && 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"), "238,1,107,124,128,132,133,7497,7498,7643,7645,8214,8216,8486,8490,8509,8513,8514,8518,11361,11365,11368,11369,11378,11384,11385,11386,11402,11408,11409,11410,12255,12256,15586,15590,15621,15627,18152,18154,19437,19438,19441,19442,20091,20092,29719,29720,32768,32770,32860,32867,38320,38325,38498,38502,40809,40810,41415,42306,43753,43754,45728,45729,46113,46667,46680,46686,46687,46688,48528,48532,48541,48547,48548,49887,61561,61562,65536,65543,68490,68493,68550,68553,68567,68568,68580,68582,68654,68656,68684,68686,68729,68732,68743,68747,68960,68964,68975,68977,69765,69766,79335,79336,87075,87076,87613,87620,87888,87894,89291,89297,90412,90413,98304,98306,98396,98403,101770,101771,101852,101853,106962,106963,116403,116404,116411,116412,116415,116416,116546,116552,116553,116554,116567,116573,116574,116575,117391,117401,117410,117411,126500,126501,131072,131079,133157,134606,135517,135518,139089,139091,153334,153335,153414,153415,156578,156580,163840,163842,163932,163939,178918,178919,179306,179307,180352,180353,188135,188136,189610,189611,195033,195034,196608,196615,199379,199381,199390,199392,199400,199402,199411,199413,200207,200223,200226,200233,200241,200242,205806,205807,205998,206000,206002,206003,206029,206030,206032,206033,206526,206527,206661,206662,206786,206788,206790,206792,206802,206803,207364,207371,207379,207386,207427,207434,207460,207467,207492,207499,207519,207520,207534,207536,208745,229378,229468,294914,295004,295010,295011,327681,327687,360449,360455,369684,370812,376690,376777,376778") == "6f58179d1fc7a558f79867b176f5ebf555b0e66d" || 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"), "238,1,107,124,128,132,133,7497,7498,7643,7645,8214,8216,8486,8490,8509,8513,8514,8518,11361,11365,11368,11369,11378,11384,11385,11386,11402,11408,11409,11410,12255,12256,15586,15590,15621,15627,18152,18154,19437,19438,19441,19442,20091,20092,29719,29720,32768,32770,32860,32867,38320,38325,38498,38502,40809,40810,41415,42306,43753,43754,45728,45729,46113,46667,46680,46686,46687,46688,48528,48532,48541,48547,48548,49887,61561,61562,65536,65543,68490,68493,68550,68553,68567,68568,68580,68582,68654,68656,68684,68686,68729,68732,68743,68747,68960,68964,68975,68977,69765,69766,79335,79336,87075,87076,87613,87620,87888,87894,89291,89297,90412,90413,98304,98306,98396,98403,101770,101771,101852,101853,106962,106963,116403,116404,116411,116412,116415,116416,116546,116552,116553,116554,116567,116573,116574,116575,117391,117401,117410,117411,126500,126501,131072,131079,133157,134606,135517,135518,139089,139091,153334,153335,153414,153415,156578,156580,163840,163842,163932,163939,178918,178919,179306,179307,180352,180353,188135,188136,189610,189611,195033,195034,196608,196615,199379,199381,199390,199392,199400,199402,199411,199413,200207,200223,200226,200233,200241,200242,205806,205807,205998,206000,206002,206003,206029,206030,206032,206033,206526,206527,206661,206662,206786,206788,206790,206792,206802,206803,207364,207371,207379,207386,207427,207434,207460,207467,207492,207499,207519,207520,207534,207536,208745,229378,229468,294914,295004,295010,295011,327681,327687,360449,360455,369684,370812,376690,376777,376778") && 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("system_ext"), "94,1,62,27757,27758,28000,28002,28010,28014,28018,28019,28081,28087,28088,28755,28812,28831,28883,28891,28920,28926,28927,29876,29883,29889,29890,29891,30129,30141,30207,30213,30214,30215,30411,30417,30418,30419,30423,30429,30430,30431,30436,30437,30881,30890,30897,30898,30910,30916,30917,30918,30924,30930,30931,30932,30944,30950,30951,30952,30963,30964,30970,30976,30977,30978,30984,30985,30998,31004,31005,31006,31018,31024,31025,31032,31124,31131,31150,31151,31162,31387,31388,32129,32131,32353,32354,32770,32803,98306,98339,136340,136758,138928,138971,138972") == "73751562094653902a9f91042a96406573716c5d" || 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"), "94,1,62,27757,27758,28000,28002,28010,28014,28018,28019,28081,28087,28088,28755,28812,28831,28883,28891,28920,28926,28927,29876,29883,29889,29890,29891,30129,30141,30207,30213,30214,30215,30411,30417,30418,30419,30423,30429,30430,30431,30436,30437,30881,30890,30897,30898,30910,30916,30917,30918,30924,30930,30931,30932,30944,30950,30951,30952,30963,30964,30970,30976,30977,30978,30984,30985,30998,31004,31005,31006,31018,31024,31025,31032,31124,31131,31150,31151,31162,31387,31388,32129,32131,32353,32354,32770,32803,98306,98339,136340,136758,138928,138971,138972") && 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/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/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
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/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.600000, 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.");

# 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 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",":100663296:56648cfc7b5bc7a475b684d14161fd873428baf8"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:fe8665fd030f7f9748d1bdffb04dc8b41689abf4"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:fe8665fd030f7f9748d1bdffb04dc8b41689abf4")));

# ---- 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");
set_progress(1.000000);
