getprop("ro.product.device") == "sweet" || abort("E3004: This package is for \"sweet\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/sweet_eea2/sweet:11/RKQ1.210614.002/V816.0.21.0.THGEUXM:user/release-keys");
ui_print("Target: Redmi/sweet_eea2/sweet:11/RKQ1.210614.002/V816.0.23.0.THGEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/sweet_eea2/sweet:11/RKQ1.210614.002/V816.0.21.0.THGEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/sweet_eea2/sweet:11/RKQ1.210614.002/V816.0.23.0.THGEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/sweet_eea2/sweet:11/RKQ1.210614.002/V816.0.21.0.THGEUXM:user/release-keys or Redmi/sweet_eea2/sweet:11/RKQ1.210614.002/V816.0.23.0.THGEUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:89bde7cec9b6239e713f572ba6e23834bb673b6e"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b361a3d876a12f4a45bf6d927ed16647061cf22b")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:89bde7cec9b6239e713f572ba6e23834bb673b6e"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b361a3d876a12f4a45bf6d927ed16647061cf22b"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "2,0,350404") == "cce706ae0a7933077c621407760806f7f26b12a8" || 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"), "2,0,350404") && 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"), "410,1,121,132,134,141,142,222,228,236,237,2109,2111,2131,2132,2139,2141,2147,2148,2393,2395,2402,2403,2409,2411,2416,2417,2426,2428,2433,2434,2439,2441,2446,2447,2460,2462,2468,2469,2472,2473,2483,2485,2491,2492,3278,3279,5900,5901,14635,14636,15640,15642,15646,15648,15649,15650,15671,15672,15673,15674,15677,15678,15683,15684,15685,15686,15690,15691,15695,15696,15700,15701,15705,15706,15710,15711,15715,15716,15717,15718,15721,15723,15724,15725,15727,15729,15730,15731,15734,15735,15736,15737,15740,15741,15742,15743,15746,15747,15748,15749,15752,15753,15754,15755,15759,15760,15764,15765,15768,15770,15774,15775,15778,15780,15781,15782,15786,15787,15788,15789,15792,15793,15794,15795,15798,15799,15800,15801,15804,15805,15806,15807,15810,15812,15813,15814,15817,15818,15819,15820,15825,15826,15830,15831,15835,15836,15840,15841,15845,15846,16207,16208,17123,17129,32768,32770,32859,32887,58660,58661,59290,59292,59321,59323,59869,59870,60092,60093,65536,65558,81751,81752,81756,81758,81775,81776,81811,81812,81821,81822,81824,81825,81879,81880,81884,81885,81961,81962,81968,81969,81994,81995,82033,82034,82140,82141,82202,82203,82334,82338,82811,82812,82836,82837,82891,82892,83289,83290,83296,83297,83313,83314,83430,83431,83433,83435,83499,83500,83570,83571,83638,83639,83641,83642,83644,83654,83713,83714,83716,83718,83779,83780,83782,83783,83843,83844,83846,83847,83910,83911,83913,83914,83981,83982,83984,83985,84052,84053,84122,84123,84191,84192,84263,84264,84266,84267,84332,84333,84335,84336,84400,84401,84403,84404,84468,84469,84471,84472,84539,84540,84542,84543,84610,84611,84613,84614,84678,84679,84681,84682,84746,84747,84749,84750,84814,84815,84818,84819,84883,84884,84886,84887,84952,84953,84955,84956,84958,84959,85022,85023,85025,85026,85029,85031,88843,88844,94047,94048,94104,94105,94138,94139,94203,94204,94354,94355,94434,94435,94459,94460,94530,94531,94598,94599,94630,94631,94723,94724,94796,94797,94821,94822,94908,94909,94948,94949,94951,94952,94984,94985,95206,95207,95323,95324,95395,95396,95452,95453,95594,95595,95596,95597,95707,95708,95773,95774,95804,95805,95853,95854,95924,95925,96007,96008,96262,96264,96320,96321,96611,96615,96623,96625,96633,96636,96638,96642,96656,96657,96818,96824,96960,96964,96972,96973,96974,96975,97031,97033,97039,97041,97079,97104,97270,97280,98143,98306,98395,163842,163931,229378,229467,294914,295003,360465,360470,367322,368543,374386,374472,374473") == "69b9a551e74293e7ecfa279ba2a377d8fef94d7b" || 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"), "410,1,121,132,134,141,142,222,228,236,237,2109,2111,2131,2132,2139,2141,2147,2148,2393,2395,2402,2403,2409,2411,2416,2417,2426,2428,2433,2434,2439,2441,2446,2447,2460,2462,2468,2469,2472,2473,2483,2485,2491,2492,3278,3279,5900,5901,14635,14636,15640,15642,15646,15648,15649,15650,15671,15672,15673,15674,15677,15678,15683,15684,15685,15686,15690,15691,15695,15696,15700,15701,15705,15706,15710,15711,15715,15716,15717,15718,15721,15723,15724,15725,15727,15729,15730,15731,15734,15735,15736,15737,15740,15741,15742,15743,15746,15747,15748,15749,15752,15753,15754,15755,15759,15760,15764,15765,15768,15770,15774,15775,15778,15780,15781,15782,15786,15787,15788,15789,15792,15793,15794,15795,15798,15799,15800,15801,15804,15805,15806,15807,15810,15812,15813,15814,15817,15818,15819,15820,15825,15826,15830,15831,15835,15836,15840,15841,15845,15846,16207,16208,17123,17129,32768,32770,32859,32887,58660,58661,59290,59292,59321,59323,59869,59870,60092,60093,65536,65558,81751,81752,81756,81758,81775,81776,81811,81812,81821,81822,81824,81825,81879,81880,81884,81885,81961,81962,81968,81969,81994,81995,82033,82034,82140,82141,82202,82203,82334,82338,82811,82812,82836,82837,82891,82892,83289,83290,83296,83297,83313,83314,83430,83431,83433,83435,83499,83500,83570,83571,83638,83639,83641,83642,83644,83654,83713,83714,83716,83718,83779,83780,83782,83783,83843,83844,83846,83847,83910,83911,83913,83914,83981,83982,83984,83985,84052,84053,84122,84123,84191,84192,84263,84264,84266,84267,84332,84333,84335,84336,84400,84401,84403,84404,84468,84469,84471,84472,84539,84540,84542,84543,84610,84611,84613,84614,84678,84679,84681,84682,84746,84747,84749,84750,84814,84815,84818,84819,84883,84884,84886,84887,84952,84953,84955,84956,84958,84959,85022,85023,85025,85026,85029,85031,88843,88844,94047,94048,94104,94105,94138,94139,94203,94204,94354,94355,94434,94435,94459,94460,94530,94531,94598,94599,94630,94631,94723,94724,94796,94797,94821,94822,94908,94909,94948,94949,94951,94952,94984,94985,95206,95207,95323,95324,95395,95396,95452,95453,95594,95595,95596,95597,95707,95708,95773,95774,95804,95805,95853,95854,95924,95925,96007,96008,96262,96264,96320,96321,96611,96615,96623,96625,96633,96636,96638,96642,96656,96657,96818,96824,96960,96964,96972,96973,96974,96975,97031,97033,97039,97041,97079,97104,97270,97280,98143,98306,98395,163842,163931,229378,229467,294914,295003,360465,360470,367322,368543,374386,374472,374473") && 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"), "42,0,49152,61440,86016,98304,147456,159744,184320,208896,233472,282624,356352,393216,405504,417792,430080,442368,454656,466944,479232,589824,602112,626688,651264,675840,724992,774144,786432,811008,847872,860160,897024,958464,970752,995328,1007616,1019904,1044480,1056768,1069056,1130496,1159974") == "b7c60447d42adc8332ccfe8ca090d44faade266e" || 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"), "42,0,49152,61440,86016,98304,147456,159744,184320,208896,233472,282624,356352,393216,405504,417792,430080,442368,454656,466944,479232,589824,602112,626688,651264,675840,724992,774144,786432,811008,847872,860160,897024,958464,970752,995328,1007616,1019904,1044480,1056768,1069056,1130496,1159974") && 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,14,33,34,35,36,44,45,323,324,327,336,352,353") == "3cee9a2a2d63cbad00570b0734fa90130edecf1d" || 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,14,33,34,35,36,44,45,323,324,327,336,352,353") && 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"), "6,0,12288,24576,86016,98304,185557") == "cb931f060c22a5d98a0452ae034d760909549c3b" || 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"), "6,0,12288,24576,86016,98304,185557") && 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;
if (range_sha1(map_partition("mi_ext"), "2,0,647") == "8efe7d549d114d0d9e2c809839b29099b77103a0" || block_image_verify(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat")) then
ui_print("Verified mi_ext image...");
else
ifelse (block_image_recover(map_partition("mi_ext"), "2,0,647") && block_image_verify(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat"), ui_print("mi_ext recovered successfully."), abort("E2004: mi_ext partition fails to recover"));
endif;

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


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
package_extract_file("firmware-update/km41.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
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/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
package_extract_file("firmware-update/km41.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


# 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 system

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

# Patch partition mi_ext

ui_print("Patching mi_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat") ||
  abort("E2001: Failed to update mi_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:89bde7cec9b6239e713f572ba6e23834bb673b6e"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b361a3d876a12f4a45bf6d927ed16647061cf22b"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b361a3d876a12f4a45bf6d927ed16647061cf22b")));

# ---- 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);
