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_id2/sweet:11/RKQ1.210614.002/V816.0.16.0.THGIDXM:user/release-keys");
ui_print("Target: Redmi/sweet_id2/sweet:11/RKQ1.210614.002/V816.0.17.0.THGIDXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/sweet_id2/sweet:11/RKQ1.210614.002/V816.0.16.0.THGIDXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/sweet_id2/sweet:11/RKQ1.210614.002/V816.0.17.0.THGIDXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/sweet_id2/sweet:11/RKQ1.210614.002/V816.0.16.0.THGIDXM:user/release-keys or Redmi/sweet_id2/sweet:11/RKQ1.210614.002/V816.0.17.0.THGIDXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9b9cbe78c1bfcc5dad5643cf629864191e1fc2ed"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:5db1947752563f5688c2d736c48390e11f7cf834")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9b9cbe78c1bfcc5dad5643cf629864191e1fc2ed"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:5db1947752563f5688c2d736c48390e11f7cf834"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "6,0,12288,24576,36864,61440,350231") == "0607170c7142d72fcf4fb66292c7c99ad7d47c58" || 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"), "6,0,12288,24576,36864,61440,350231") && 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,122,133,135,142,143,223,229,237,238,2110,2112,2132,2133,2140,2142,2148,2149,2394,2396,2403,2404,2410,2412,2417,2418,2427,2429,2434,2435,2440,2442,2447,2448,2461,2463,2469,2470,2473,2474,2484,2486,2492,2493,3279,3280,5901,5902,14636,14637,15641,15643,15647,15649,15650,15651,15672,15673,15674,15675,15678,15679,15684,15685,15686,15687,15691,15692,15696,15697,15701,15702,15706,15707,15711,15712,15716,15717,15718,15719,15722,15724,15725,15726,15728,15730,15731,15732,15735,15736,15737,15738,15741,15742,15743,15744,15747,15748,15749,15750,15753,15754,15755,15756,15760,15761,15765,15766,15769,15771,15775,15776,15779,15781,15782,15783,15787,15788,15789,15790,15793,15794,15795,15796,15799,15800,15801,15802,15805,15806,15807,15808,15811,15813,15814,15815,15818,15819,15820,15821,15826,15827,15831,15832,15836,15837,15841,15842,15846,15847,16208,16209,17124,17130,32768,32770,32860,32888,58662,58663,59292,59294,59323,59325,59871,59872,60094,60095,65536,65558,81753,81754,81758,81760,81777,81778,81813,81814,81823,81824,81826,81827,81881,81882,81886,81887,81963,81964,81970,81971,81996,81997,82035,82036,82142,82143,82204,82205,82336,82340,82813,82814,82838,82839,82893,82894,83291,83292,83298,83299,83315,83316,83431,83432,83434,83436,83500,83501,83571,83572,83639,83640,83642,83643,83645,83655,83714,83715,83717,83719,83780,83781,83783,83784,83844,83845,83847,83848,83911,83912,83914,83915,83982,83983,83985,83986,84053,84054,84123,84124,84192,84193,84264,84265,84267,84268,84333,84334,84336,84337,84401,84402,84404,84405,84469,84470,84472,84473,84540,84541,84543,84544,84611,84612,84614,84615,84679,84680,84682,84683,84747,84748,84750,84751,84815,84816,84819,84820,84884,84885,84887,84888,84953,84954,84956,84957,84959,84960,85023,85024,85026,85027,85030,85032,88844,88845,94048,94049,94105,94106,94139,94140,94204,94205,94355,94356,94435,94436,94460,94461,94531,94532,94599,94600,94631,94632,94724,94725,94797,94798,94822,94823,94909,94910,94949,94950,94952,94953,94985,94986,95207,95208,95324,95325,95396,95397,95453,95454,95595,95596,95597,95598,95708,95709,95774,95775,95805,95806,95854,95855,95925,95926,96008,96009,96263,96265,96321,96322,96612,96616,96624,96626,96634,96637,96639,96643,96657,96658,96819,96825,96961,96965,96973,96974,96975,96976,97032,97034,97040,97042,97080,97105,97271,97281,98144,98306,98396,163842,163932,229378,229468,294914,295004,360465,360470,367441,368656,374500,374586,374587") == "7eb4d46d82e047e73b36ebf849179c3ed715d13f" || 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,122,133,135,142,143,223,229,237,238,2110,2112,2132,2133,2140,2142,2148,2149,2394,2396,2403,2404,2410,2412,2417,2418,2427,2429,2434,2435,2440,2442,2447,2448,2461,2463,2469,2470,2473,2474,2484,2486,2492,2493,3279,3280,5901,5902,14636,14637,15641,15643,15647,15649,15650,15651,15672,15673,15674,15675,15678,15679,15684,15685,15686,15687,15691,15692,15696,15697,15701,15702,15706,15707,15711,15712,15716,15717,15718,15719,15722,15724,15725,15726,15728,15730,15731,15732,15735,15736,15737,15738,15741,15742,15743,15744,15747,15748,15749,15750,15753,15754,15755,15756,15760,15761,15765,15766,15769,15771,15775,15776,15779,15781,15782,15783,15787,15788,15789,15790,15793,15794,15795,15796,15799,15800,15801,15802,15805,15806,15807,15808,15811,15813,15814,15815,15818,15819,15820,15821,15826,15827,15831,15832,15836,15837,15841,15842,15846,15847,16208,16209,17124,17130,32768,32770,32860,32888,58662,58663,59292,59294,59323,59325,59871,59872,60094,60095,65536,65558,81753,81754,81758,81760,81777,81778,81813,81814,81823,81824,81826,81827,81881,81882,81886,81887,81963,81964,81970,81971,81996,81997,82035,82036,82142,82143,82204,82205,82336,82340,82813,82814,82838,82839,82893,82894,83291,83292,83298,83299,83315,83316,83431,83432,83434,83436,83500,83501,83571,83572,83639,83640,83642,83643,83645,83655,83714,83715,83717,83719,83780,83781,83783,83784,83844,83845,83847,83848,83911,83912,83914,83915,83982,83983,83985,83986,84053,84054,84123,84124,84192,84193,84264,84265,84267,84268,84333,84334,84336,84337,84401,84402,84404,84405,84469,84470,84472,84473,84540,84541,84543,84544,84611,84612,84614,84615,84679,84680,84682,84683,84747,84748,84750,84751,84815,84816,84819,84820,84884,84885,84887,84888,84953,84954,84956,84957,84959,84960,85023,85024,85026,85027,85030,85032,88844,88845,94048,94049,94105,94106,94139,94140,94204,94205,94355,94356,94435,94436,94460,94461,94531,94532,94599,94600,94631,94632,94724,94725,94797,94798,94822,94823,94909,94910,94949,94950,94952,94953,94985,94986,95207,95208,95324,95325,95396,95397,95453,95454,95595,95596,95597,95598,95708,95709,95774,95775,95805,95806,95854,95855,95925,95926,96008,96009,96263,96265,96321,96322,96612,96616,96624,96626,96634,96637,96639,96643,96657,96658,96819,96825,96961,96965,96973,96974,96975,96976,97032,97034,97040,97042,97080,97105,97271,97281,98144,98306,98396,163842,163932,229378,229468,294914,295004,360465,360470,367441,368656,374500,374586,374587") && 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"), "46,0,36864,49152,73728,86016,135168,147456,184320,208896,233472,245760,258048,270336,319488,356352,368640,380928,393216,405504,417792,540672,552960,577536,602112,626688,675840,724992,737280,761856,786432,798720,835584,860160,872448,884736,897024,921600,933888,958464,970752,983040,1007616,1019904,1044480,1105920,1131705") == "7242e28887aba510af4f386e818840c0a075b26f" || 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"), "46,0,36864,49152,73728,86016,135168,147456,184320,208896,233472,245760,258048,270336,319488,356352,368640,380928,393216,405504,417792,540672,552960,577536,602112,626688,675840,724992,737280,761856,786432,798720,835584,860160,872448,884736,897024,921600,933888,958464,970752,983040,1007616,1019904,1044480,1105920,1131705") && 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") == "ebed2257ca4db5e369ebf57c3c761b486fa15364" || 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,185512") == "797e88666636b41a8f3eb60c74ad7a36d1e3caf3" || 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,185512") && 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") == "90901f275cc4712fc242509883e0d1ffe2e99f47" || 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 ---


# 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 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 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:9b9cbe78c1bfcc5dad5643cf629864191e1fc2ed"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:5db1947752563f5688c2d736c48390e11f7cf834"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:5db1947752563f5688c2d736c48390e11f7cf834")));

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