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_ru2/sweet:11/RKQ1.210614.002/V816.0.25.0.THGRUXM:user/release-keys");
ui_print("Target: Redmi/sweet_ru2/sweet:11/RKQ1.210614.002/V816.0.26.0.THGRUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/sweet_ru2/sweet:11/RKQ1.210614.002/V816.0.25.0.THGRUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/sweet_ru2/sweet:11/RKQ1.210614.002/V816.0.26.0.THGRUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/sweet_ru2/sweet:11/RKQ1.210614.002/V816.0.25.0.THGRUXM:user/release-keys or Redmi/sweet_ru2/sweet:11/RKQ1.210614.002/V816.0.26.0.THGRUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:020324f55595996ade14a759fd4690326fa01647"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:35e6f6ed24b67a7378ec8e0c78c2bdc10ae79914")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:020324f55595996ade14a759fd4690326fa01647"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:35e6f6ed24b67a7378ec8e0c78c2bdc10ae79914"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "16,0,36864,61440,73728,98304,110592,122880,147456,159744,172032,221184,270336,294912,307200,331776,350261") == "e668301252dcb35b227435de339310f32fd3b597" || 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"), "16,0,36864,61440,73728,98304,110592,122880,147456,159744,172032,221184,270336,294912,307200,331776,350261") && 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,1488,1489,2115,2117,2137,2138,2145,2147,2153,2154,2399,2401,2408,2409,2415,2417,2422,2423,2432,2434,2439,2440,2445,2447,2452,2453,2466,2468,2474,2475,2478,2479,2489,2491,2497,2498,3284,3285,5906,5907,14641,14642,15646,15648,15652,15654,15655,15656,15677,15678,15679,15680,15683,15684,15689,15690,15691,15692,15696,15697,15701,15702,15706,15707,15711,15712,15716,15717,15721,15722,15723,15724,15727,15729,15730,15731,15733,15735,15736,15737,15740,15741,15742,15743,15746,15747,15748,15749,15752,15753,15754,15755,15758,15759,15760,15761,15765,15766,15770,15771,15774,15776,15780,15781,15784,15786,15787,15788,15792,15793,15794,15795,15798,15799,15800,15801,15804,15805,15806,15807,15810,15811,15812,15813,15816,15818,15819,15820,15823,15824,15825,15826,15831,15832,15836,15837,15841,15842,15846,15847,15851,15852,16213,16214,17129,17135,32768,32770,32859,32887,58666,58667,59296,59298,59327,59329,59875,59876,60098,60099,65536,65558,81757,81758,81762,81764,81781,81782,81817,81818,81827,81828,81830,81831,81885,81886,81890,81891,81967,81968,81974,81975,82000,82001,82039,82040,82146,82147,82208,82209,82340,82344,82817,82818,82842,82843,82897,82898,83295,83296,83302,83303,83319,83320,83435,83436,83438,83440,83504,83505,83575,83576,83643,83644,83646,83647,83649,83659,83718,83719,83721,83723,83784,83785,83787,83788,83848,83849,83851,83852,83915,83916,83918,83919,83986,83987,83989,83990,84057,84058,84127,84128,84196,84197,84268,84269,84271,84272,84337,84338,84340,84341,84405,84406,84408,84409,84473,84474,84476,84477,84544,84545,84547,84548,84615,84616,84618,84619,84683,84684,84686,84687,84751,84752,84754,84755,84819,84820,84823,84824,84888,84889,84891,84892,84957,84958,84960,84961,84963,84964,85027,85028,85030,85031,85034,85036,88848,88849,94052,94053,94109,94110,94143,94144,94208,94209,94359,94360,94439,94440,94464,94465,94535,94536,94603,94604,94635,94636,94728,94729,94801,94802,94826,94827,94913,94914,94953,94954,94956,94957,94989,94990,95211,95212,95328,95329,95400,95401,95457,95458,95599,95600,95601,95602,95712,95713,95778,95779,95809,95810,95858,95859,95929,95930,96012,96013,96267,96269,96325,96326,96616,96620,96628,96630,96638,96641,96643,96647,96661,96662,96823,96829,96965,96969,96977,96978,96979,96980,97036,97038,97044,97046,97084,97109,98148,98306,98395,163842,163931,229378,229467,294914,295003,360465,360470,367139,368359,374198,374285,374286") == "e12d9beb0adfcc0a972d1e2c8acf6c463e5acbce" || 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,1488,1489,2115,2117,2137,2138,2145,2147,2153,2154,2399,2401,2408,2409,2415,2417,2422,2423,2432,2434,2439,2440,2445,2447,2452,2453,2466,2468,2474,2475,2478,2479,2489,2491,2497,2498,3284,3285,5906,5907,14641,14642,15646,15648,15652,15654,15655,15656,15677,15678,15679,15680,15683,15684,15689,15690,15691,15692,15696,15697,15701,15702,15706,15707,15711,15712,15716,15717,15721,15722,15723,15724,15727,15729,15730,15731,15733,15735,15736,15737,15740,15741,15742,15743,15746,15747,15748,15749,15752,15753,15754,15755,15758,15759,15760,15761,15765,15766,15770,15771,15774,15776,15780,15781,15784,15786,15787,15788,15792,15793,15794,15795,15798,15799,15800,15801,15804,15805,15806,15807,15810,15811,15812,15813,15816,15818,15819,15820,15823,15824,15825,15826,15831,15832,15836,15837,15841,15842,15846,15847,15851,15852,16213,16214,17129,17135,32768,32770,32859,32887,58666,58667,59296,59298,59327,59329,59875,59876,60098,60099,65536,65558,81757,81758,81762,81764,81781,81782,81817,81818,81827,81828,81830,81831,81885,81886,81890,81891,81967,81968,81974,81975,82000,82001,82039,82040,82146,82147,82208,82209,82340,82344,82817,82818,82842,82843,82897,82898,83295,83296,83302,83303,83319,83320,83435,83436,83438,83440,83504,83505,83575,83576,83643,83644,83646,83647,83649,83659,83718,83719,83721,83723,83784,83785,83787,83788,83848,83849,83851,83852,83915,83916,83918,83919,83986,83987,83989,83990,84057,84058,84127,84128,84196,84197,84268,84269,84271,84272,84337,84338,84340,84341,84405,84406,84408,84409,84473,84474,84476,84477,84544,84545,84547,84548,84615,84616,84618,84619,84683,84684,84686,84687,84751,84752,84754,84755,84819,84820,84823,84824,84888,84889,84891,84892,84957,84958,84960,84961,84963,84964,85027,85028,85030,85031,85034,85036,88848,88849,94052,94053,94109,94110,94143,94144,94208,94209,94359,94360,94439,94440,94464,94465,94535,94536,94603,94604,94635,94636,94728,94729,94801,94802,94826,94827,94913,94914,94953,94954,94956,94957,94989,94990,95211,95212,95328,95329,95400,95401,95457,95458,95599,95600,95601,95602,95712,95713,95778,95779,95809,95810,95858,95859,95929,95930,96012,96013,96267,96269,96325,96326,96616,96620,96628,96630,96638,96641,96643,96647,96661,96662,96823,96829,96965,96969,96977,96978,96979,96980,97036,97038,97044,97046,97084,97109,98148,98306,98395,163842,163931,229378,229467,294914,295003,360465,360470,367139,368359,374198,374285,374286") && 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,0,12288,24576,36864,98304,110592,159744,172032,221184,233472,294912,307200,552960,577536,811008,823296,884736,897024,1130496,1159093") == "656b1c828f2d6347b0ed8a726003756bd5aabaf3" || 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,0,12288,24576,36864,98304,110592,159744,172032,221184,233472,294912,307200,552960,577536,811008,823296,884736,897024,1130496,1159093") && 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") == "23f08348ecded66e210da50b4fdf1c1a7c6b1eda" || 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"), "8,0,12288,24576,86016,98304,110592,159744,185570") == "55234e58e6cd918a3a24dd7a32cd49cd53195be4" || 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"), "8,0,12288,24576,86016,98304,110592,159744,185570") && 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,646") == "ebfb80dcac816e1830ee3324a2e049c75e4888ee" || 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,646") && 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:020324f55595996ade14a759fd4690326fa01647"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:35e6f6ed24b67a7378ec8e0c78c2bdc10ae79914"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:35e6f6ed24b67a7378ec8e0c78c2bdc10ae79914")));

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