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:10/QKQ1.200830.002/V12.0.5.0.QJQTWXM:user/release-keys");
ui_print("Target: Redmi/lime/lime:10/QKQ1.200830.002/V12.0.6.0.QJQTWXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/lime/lime:10/QKQ1.200830.002/V12.0.5.0.QJQTWXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/lime/lime:10/QKQ1.200830.002/V12.0.6.0.QJQTWXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/lime/lime:10/QKQ1.200830.002/V12.0.5.0.QJQTWXM:user/release-keys or Redmi/lime/lime:10/QKQ1.200830.002/V12.0.6.0.QJQTWXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:100663296:8a8a9c00e7c844bb9402196bac6c516e1140872e",
                      "EMMC:/dev/block/bootdevice/by-name/boot:100663296:cc598024833a687ac758ced75869fec5efa5e3ac") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:8a8a9c00e7c844bb9402196bac6c516e1140872e\" or \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:cc598024833a687ac758ced75869fec5efa5e3ac\" has unexpected contents.");
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "22,1,32770,32938,98306,98474,156872,156882,156884,156892,163842,164010,229378,229546,294914,295082,688133,688147,689961,692099,703068,703214,703215") == "3d9c223b52bfc0cb22575c4376f782a5b2df9b2c" || 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"), "22,1,32770,32938,98306,98474,156872,156882,156884,156892,163842,164010,229378,229546,294914,295082,688133,688147,689961,692099,703068,703214,703215") && 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"), "624,1,109,119,123,128,129,211,215,220,221,1895,1899,2376,2377,2640,2644,2648,2649,2651,2655,2657,2668,2691,2692,2728,2732,2782,2783,2944,2945,2957,2961,2965,2966,2969,2975,2976,2977,2989,2993,2997,3004,3013,3014,5370,5371,8875,8876,9647,9648,9652,9653,9657,9658,9662,9663,9668,9669,9673,9674,9675,9676,9679,9680,9681,9682,9685,9686,9687,9688,9690,9692,9693,9694,9697,9698,9699,9700,9703,9704,9705,9706,9709,9710,9716,9717,9721,9722,9725,9727,9730,9732,9736,9737,9741,9742,9743,9744,9747,9748,9749,9750,9753,9754,9755,9756,9759,9760,9761,9762,9765,9766,9767,9768,9771,9772,9777,9778,9779,9780,9784,9785,10197,10198,11287,11295,25990,25991,26092,26093,26094,26095,26593,26595,26600,26602,26608,26610,26615,26617,26676,26678,27958,27959,32578,32579,32768,32770,32848,32879,33324,33326,33967,33969,34494,34495,35071,35072,35978,35979,35987,35988,36084,36085,38009,38011,48988,48989,49404,49405,50853,50854,54923,54924,54926,54928,54992,54993,55063,55064,55131,55132,55134,55135,55137,55138,55197,55199,55201,55202,55266,55267,55337,55338,55405,55406,55408,55409,55411,55414,55415,55417,55419,55420,55426,55427,55429,55430,55433,55434,55444,55447,55449,55450,55452,55454,55457,55458,55467,55468,55470,55471,55474,55476,55478,55479,55485,55486,55488,55489,55492,55493,55504,55506,55508,55509,55515,55516,55518,55519,55522,55523,55534,55536,55538,55539,55545,55546,55548,55549,55551,55552,55554,55555,55557,55568,55628,55629,55631,55632,55642,55643,55709,55710,55787,55788,55798,55799,55865,55866,55942,55943,56022,56023,56099,56100,56176,56177,56253,56254,56264,56265,56268,56269,56332,56333,56408,56409,56419,56420,56486,56487,56563,56564,56636,56637,56639,56640,56652,56656,56658,56659,56661,56663,56666,56667,56671,56672,56674,56675,56678,56679,58010,58012,58017,58019,58145,58146,58195,58198,58378,58379,58406,58407,58422,58423,58617,58618,58818,58819,58825,58826,58846,58847,58854,58855,59759,59760,62751,62752,63353,63354,64345,64346,64355,64356,65536,65574,65831,65832,67164,67165,67984,67985,69203,69207,69313,69316,69358,69359,69750,69752,74419,74420,75024,77762,81324,81325,81919,81934,82236,82237,88825,88826,90223,90285,94061,94062,94506,94507,98304,98306,98384,98422,101368,101369,102110,102111,104080,104081,104084,104085,108238,108239,114689,114690,114696,114698,114705,114706,114847,114848,121128,121130,121209,121210,127735,127736,131072,131095,131597,131598,131690,131691,132152,132153,136204,136205,140131,140132,140519,140520,142545,142574,144528,144529,151723,151724,156168,156169,156182,157784,157787,160200,161471,161472,161860,161861,163840,163842,163920,163947,164905,164907,167823,167824,167947,167948,167952,167953,168184,168198,170042,170043,196608,196633,197271,197272,197736,197737,198587,200953,204338,204343,204346,204352,204481,204482,205368,205369,212690,212691,214315,214316,215711,215773,219732,219733,219922,219923,220890,220891,226458,226459,226830,226831,229215,229216,229376,229378,229456,229479,230060,230061,233805,233806,233809,233810,239180,239181,244677,244680,244713,244714,245585,245586,247714,247715,247721,247723,247730,247731,254775,254776,254780,254781,254788,254789,260429,260430,260446,260447,260448,260450,260451,260453,260454,260456,260457,260459,260460,260461,260517,260519,260520,260521,260523,260524,260526,260527,260713,260714,261282,261283,262144,262165,266967,266968,270623,270624,278480,278482,278816,278818,280170,280171,281462,281463,284329,284330,286759,286760,290197,290198,292339,292340,294912,294914,294992,295007,295584,295585,295615,295616,297314,297315,301959,301960,301964,301965,301972,301973,303118,303119,303143,303144,304008,304009,304254,304255,305818,305824,305825,305826,308222,308223,309885,309886,311160,311162,315858,315866,315870,315871,315874,315875,315899,315900,315920,315926,318835,318837,318845,318847,318863,318864,318897,318928,318934,318945,319961,325033,325111,325112") == "6c8ba38ae5b1946f567ea0c9dadea4458d8fe9a3" || 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"), "624,1,109,119,123,128,129,211,215,220,221,1895,1899,2376,2377,2640,2644,2648,2649,2651,2655,2657,2668,2691,2692,2728,2732,2782,2783,2944,2945,2957,2961,2965,2966,2969,2975,2976,2977,2989,2993,2997,3004,3013,3014,5370,5371,8875,8876,9647,9648,9652,9653,9657,9658,9662,9663,9668,9669,9673,9674,9675,9676,9679,9680,9681,9682,9685,9686,9687,9688,9690,9692,9693,9694,9697,9698,9699,9700,9703,9704,9705,9706,9709,9710,9716,9717,9721,9722,9725,9727,9730,9732,9736,9737,9741,9742,9743,9744,9747,9748,9749,9750,9753,9754,9755,9756,9759,9760,9761,9762,9765,9766,9767,9768,9771,9772,9777,9778,9779,9780,9784,9785,10197,10198,11287,11295,25990,25991,26092,26093,26094,26095,26593,26595,26600,26602,26608,26610,26615,26617,26676,26678,27958,27959,32578,32579,32768,32770,32848,32879,33324,33326,33967,33969,34494,34495,35071,35072,35978,35979,35987,35988,36084,36085,38009,38011,48988,48989,49404,49405,50853,50854,54923,54924,54926,54928,54992,54993,55063,55064,55131,55132,55134,55135,55137,55138,55197,55199,55201,55202,55266,55267,55337,55338,55405,55406,55408,55409,55411,55414,55415,55417,55419,55420,55426,55427,55429,55430,55433,55434,55444,55447,55449,55450,55452,55454,55457,55458,55467,55468,55470,55471,55474,55476,55478,55479,55485,55486,55488,55489,55492,55493,55504,55506,55508,55509,55515,55516,55518,55519,55522,55523,55534,55536,55538,55539,55545,55546,55548,55549,55551,55552,55554,55555,55557,55568,55628,55629,55631,55632,55642,55643,55709,55710,55787,55788,55798,55799,55865,55866,55942,55943,56022,56023,56099,56100,56176,56177,56253,56254,56264,56265,56268,56269,56332,56333,56408,56409,56419,56420,56486,56487,56563,56564,56636,56637,56639,56640,56652,56656,56658,56659,56661,56663,56666,56667,56671,56672,56674,56675,56678,56679,58010,58012,58017,58019,58145,58146,58195,58198,58378,58379,58406,58407,58422,58423,58617,58618,58818,58819,58825,58826,58846,58847,58854,58855,59759,59760,62751,62752,63353,63354,64345,64346,64355,64356,65536,65574,65831,65832,67164,67165,67984,67985,69203,69207,69313,69316,69358,69359,69750,69752,74419,74420,75024,77762,81324,81325,81919,81934,82236,82237,88825,88826,90223,90285,94061,94062,94506,94507,98304,98306,98384,98422,101368,101369,102110,102111,104080,104081,104084,104085,108238,108239,114689,114690,114696,114698,114705,114706,114847,114848,121128,121130,121209,121210,127735,127736,131072,131095,131597,131598,131690,131691,132152,132153,136204,136205,140131,140132,140519,140520,142545,142574,144528,144529,151723,151724,156168,156169,156182,157784,157787,160200,161471,161472,161860,161861,163840,163842,163920,163947,164905,164907,167823,167824,167947,167948,167952,167953,168184,168198,170042,170043,196608,196633,197271,197272,197736,197737,198587,200953,204338,204343,204346,204352,204481,204482,205368,205369,212690,212691,214315,214316,215711,215773,219732,219733,219922,219923,220890,220891,226458,226459,226830,226831,229215,229216,229376,229378,229456,229479,230060,230061,233805,233806,233809,233810,239180,239181,244677,244680,244713,244714,245585,245586,247714,247715,247721,247723,247730,247731,254775,254776,254780,254781,254788,254789,260429,260430,260446,260447,260448,260450,260451,260453,260454,260456,260457,260459,260460,260461,260517,260519,260520,260521,260523,260524,260526,260527,260713,260714,261282,261283,262144,262165,266967,266968,270623,270624,278480,278482,278816,278818,280170,280171,281462,281463,284329,284330,286759,286760,290197,290198,292339,292340,294912,294914,294992,295007,295584,295585,295615,295616,297314,297315,301959,301960,301964,301965,301972,301973,303118,303119,303143,303144,304008,304009,304254,304255,305818,305824,305825,305826,308222,308223,309885,309886,311160,311162,315858,315866,315870,315871,315874,315875,315899,315900,315920,315926,318835,318837,318845,318847,318863,318864,318897,318928,318934,318945,319961,325033,325111,325112") && 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"), "386,1,96,3114,3115,3281,3282,5982,5983,5999,6003,6007,6008,9718,9719,11743,11747,14686,14689,14693,14694,14737,14738,14745,14751,14752,14753,15470,15474,15481,15482,15488,15494,15495,15496,22494,22495,28433,28434,28474,28475,30697,30698,31062,31066,31573,31574,31586,31592,31593,31594,32768,32770,32845,32856,33522,33526,34963,34964,43270,43271,44348,44349,53268,53269,57873,57875,61611,61612,65536,65547,71474,71475,79782,79789,79853,79859,80928,80935,82507,82508,82514,82515,82521,82527,82528,82529,82657,82663,82664,82665,82677,82683,82684,82685,82688,82689,82695,82701,82702,82703,82726,82732,82733,82734,85674,85675,97951,97952,98007,98008,98304,98306,98381,98392,100009,100010,117102,117103,121809,121810,121812,121813,121818,121819,124789,124790,130148,130149,131072,131083,134108,134110,134118,134120,134128,134130,134910,134911,134922,134928,134929,134930,134940,134941,134946,134950,134955,134956,134960,134966,134970,134971,134977,134983,134984,134985,134997,135003,135004,135005,135015,135021,135022,135023,135025,135032,135038,135039,139376,139377,139602,139604,139614,139616,139662,139664,139674,139676,139685,139686,141504,141511,141580,141587,141592,141599,141629,141636,141655,141662,141680,141687,141703,141704,141715,141717,141886,141887,141888,141889,141890,141891,141892,141893,141932,141934,141942,141943,141948,141949,142309,142313,142317,142319,142324,142328,142329,142333,142334,142338,142339,142343,142344,142348,142349,142353,142354,142358,142359,142363,142364,142366,142367,142368,142371,142377,142378,142382,142383,142387,142388,142392,142393,142397,142398,142402,142403,142407,142408,142410,142411,142415,142416,142420,142421,142425,142426,142430,142431,142435,142436,142440,142441,142445,142446,142450,142451,142453,142457,142461,142462,142466,142467,142471,142472,142476,142477,142479,142480,142484,142485,142487,142488,142492,142493,142497,142498,142500,142501,142505,142506,142510,142511,142513,142514,142518,142519,142525,142528,142680,142717,142975,143698,143699,147507,147508,148712,148713,153776,153777,158302,158304,158314,158363,161178,161180,163840,163842,163917,163932,165070,165071,166579,166582,172583,172584,176393,176394,176412,176413,177492,177493,178463,178466,187429,187430,187433,187434,188036,188038,188464,188466,188645,188647,188692,188694,188834,188836,190232,190234,191319,191321,191452,191456,191566,191568,191842,191843,194369,194372,196322,196324,196608,196625,197993,197996,198988,198990,201300,201301,206064,206065,206090,206092,206110,229378,229453,294914,294989,294990,295000,306374,307306,312178,312254,312255") == "7d1c027b45a971dadbfd6cd6663c139475ac001a" || 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"), "386,1,96,3114,3115,3281,3282,5982,5983,5999,6003,6007,6008,9718,9719,11743,11747,14686,14689,14693,14694,14737,14738,14745,14751,14752,14753,15470,15474,15481,15482,15488,15494,15495,15496,22494,22495,28433,28434,28474,28475,30697,30698,31062,31066,31573,31574,31586,31592,31593,31594,32768,32770,32845,32856,33522,33526,34963,34964,43270,43271,44348,44349,53268,53269,57873,57875,61611,61612,65536,65547,71474,71475,79782,79789,79853,79859,80928,80935,82507,82508,82514,82515,82521,82527,82528,82529,82657,82663,82664,82665,82677,82683,82684,82685,82688,82689,82695,82701,82702,82703,82726,82732,82733,82734,85674,85675,97951,97952,98007,98008,98304,98306,98381,98392,100009,100010,117102,117103,121809,121810,121812,121813,121818,121819,124789,124790,130148,130149,131072,131083,134108,134110,134118,134120,134128,134130,134910,134911,134922,134928,134929,134930,134940,134941,134946,134950,134955,134956,134960,134966,134970,134971,134977,134983,134984,134985,134997,135003,135004,135005,135015,135021,135022,135023,135025,135032,135038,135039,139376,139377,139602,139604,139614,139616,139662,139664,139674,139676,139685,139686,141504,141511,141580,141587,141592,141599,141629,141636,141655,141662,141680,141687,141703,141704,141715,141717,141886,141887,141888,141889,141890,141891,141892,141893,141932,141934,141942,141943,141948,141949,142309,142313,142317,142319,142324,142328,142329,142333,142334,142338,142339,142343,142344,142348,142349,142353,142354,142358,142359,142363,142364,142366,142367,142368,142371,142377,142378,142382,142383,142387,142388,142392,142393,142397,142398,142402,142403,142407,142408,142410,142411,142415,142416,142420,142421,142425,142426,142430,142431,142435,142436,142440,142441,142445,142446,142450,142451,142453,142457,142461,142462,142466,142467,142471,142472,142476,142477,142479,142480,142484,142485,142487,142488,142492,142493,142497,142498,142500,142501,142505,142506,142510,142511,142513,142514,142518,142519,142525,142528,142680,142717,142975,143698,143699,147507,147508,148712,148713,153776,153777,158302,158304,158314,158363,161178,161180,163840,163842,163917,163932,165070,165071,166579,166582,172583,172584,176393,176394,176412,176413,177492,177493,178463,178466,187429,187430,187433,187434,188036,188038,188464,188466,188645,188647,188692,188694,188834,188836,190232,190234,191319,191321,191452,191456,191566,191568,191842,191843,194369,194372,196322,196324,196608,196625,197993,197996,198988,198990,201300,201301,206064,206065,206090,206092,206110,229378,229453,294914,294989,294990,295000,306374,307306,312178,312254,312255") && 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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:100663296:8a8a9c00e7c844bb9402196bac6c516e1140872e",
                "EMMC:/dev/block/bootdevice/by-name/boot:100663296:cc598024833a687ac758ced75869fec5efa5e3ac",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:100663296:cc598024833a687ac758ced75869fec5efa5e3ac");

# ---- 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/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Patch partition product

ui_print("Patching product image after verification.");
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.");

# Update dynamic partition metadata

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

# Patch partition vendor

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

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

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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