getprop("ro.product.device") == "cereus" || abort("E3004: This package is for \"cereus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.1.0.PCGMIXM:user/release-keys");
ui_print("Target: xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.2.0.PCGMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.1.0.PCGMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.2.0.PCGMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.1.0.PCGMIXM:user/release-keys or xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.2.0.PCGMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_space(213237760) || abort("E3006: Not enough free space on /cache to apply patches.");
apply_patch_check("EMMC:/dev/block/platform/bootdevice/by-name/md1img:56768704:1ab04e392e62a748468f59240108b19881eb8f77:56768704:431847bc16e8db397a05a42625776f36e1cc810b", "1ab04e392e62a748468f59240108b19881eb8f77", "431847bc16e8db397a05a42625776f36e1cc810b") || abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:56768704:1ab04e392e62a748468f59240108b19881eb8f77:56768704:431847bc16e8db397a05a42625776f36e1cc810b\" has unexpected contents.");
apply_patch_space(56768704) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/platform/bootdevice/by-name/system", "626,672,681,682,689,692,693,696,1071,1072,1075,1078,2552,2553,4241,4242,5613,5614,6776,6778,6784,6787,14355,15529,15532,15591,15594,15640,15641,15669,15679,16570,16573,16579,16580,16581,16583,16586,16587,16602,16603,16608,16611,16616,16618,16620,16629,16630,16762,16763,22642,22643,22662,22663,22664,22667,22668,22676,22677,22684,22685,22686,22687,22908,22909,23009,23010,23031,23033,23038,23039,23040,23371,23372,25016,25020,25050,25051,32768,33433,33621,33624,33681,33684,36344,36345,36751,36752,36925,36927,37240,37245,37295,37300,37361,37364,37827,37830,37838,37841,37931,37934,37986,37987,37989,37991,38040,38043,38075,38076,51019,51020,53817,53820,61556,64193,64209,64611,65537,66042,98306,98463,98464,98969,131073,131578,140822,141551,142266,146240,163842,163999,164000,164505,195377,196608,196609,198502,198505,198519,198522,198679,203586,203917,203960,204337,204419,204716,229378,229535,229536,230041,262145,262650,294914,295071,295072,295577,296448,296526,327681,328186,335812,336121,336122,336193,360449,360954,385308,386622,388371,389950,389985,391108,393217,393722,399664,399665,400306,400309,400830,402115,402132,402135,402700,402703,402723,403555,403561,403562,408158,408159,413233,413235,413280,413281,415961,415963,415996,415999,417056,417059,417095,417098,417162,417165,417319,417322,417367,417370,417418,417421,417524,417527,417857,417858,419139,419141,419166,419167,423526,423528,423587,423588,425984,426490,427050,427052,427099,427102,427122,427123,435315,443507,455115,455118,457797,457800,458752,459258,460457,460460,460589,460590,468825,468828,468997,469000,469067,469068,469856,469858,469876,469879,470362,470365,470386,470389,470401,470402,479683,479684,491520,492026,493143,493144,493262,493263,493679,493680,494082,494084,508137,508138,524288,524794,527231,527232,534053,534054,536595,536596,538599,538601,539293,539294,540187,540189,540243,540247,540394,540397,540478,540485,540527,540535,543357,543358,543598,543599,546421,546422,546662,546664,546665,546667,546668,546669,546670,546671,546672,546673,546674,546675,546677,546678,546679,546680,546681,546682,546683,546684,546685,546686,546688,546689,546691,546692,546693,546694,546695,546696,546697,546698,546699,546700,546702,546703,546705,546706,546710,546711,546712,546713,546714,546715,546716,546717,546718,546721,546739,546741,546749,546750,546756,546758,546798,546800,546802,546804,546814,546815,546920,546921,549102,549104,549110,549111,549115,549116,549122,549124,549145,549146,549169,549170,549215,549216,549235,549236,549246,549247,549260,549261,549265,549266,549336,549337,549351,549352,549360,549361,549451,549453,549550,549551,550787,550788,553619,553620,554281,554282,554286,554287,554372,554373,554381,554382,554512,554513,554522,554523,554724,554725,554730,554735,554736,554738,554739,554740,554741,554742,554743,554744,554746,554747,554748,554749,554750,554751,554752,554753,554754,554757,555424,555426,555889,555890,555891,555892,555893,555895,555896,555897,555903,555904,556367,556368,557056,557562,557653,557655,557661,557662,557952,557953,557958,557959,557963,557964,557968,557969,557970,557971,557973,557974,557988,557989,558040,558042,558045,558046,558058,558059,558431,558432,558590,558591,559664,559665,559667,559668,559730,559731,559736,559737,565598,565703,568909,569705,569725,569797,569915,570016,570026,570217,570221,570421,570440,570704,570718,570759,570803,570866,571100,571259,573775,573776,573918,573919,574216,574217,574234,574235,579920,579921,581995,582019,582121,582126,582160,582289,582315,582541,582583,583078,583126,583181,583264,583833,583911,584098,584287,584675,584707,585476,585485,585955,585960,586546,586550,587452,587465,588034,588040,588067,588492,588988,588993,589007,589073,589298,589824,590330,595530,595747,595787,595842,595948,596391,596396,596458,596791,596792,601587,601588,603882,603911,603942,603974,604083,604085,604440,604468,604492,604662,604686,604891,604941,604962,605158,605183,605245,605273,605775,605795,605891,605958,606427,606436,606463,606479,606486,607998,608002,608075,608123,608153,608162,608306,608327,608378,608637,608920,608938,608959,608965,609072,609201,609385,609396,609492,611295,611296,613111,613112,613115,613116,613537,613539,613542,613543,613545,645261,655221,655359,655360") == "7840f8f6166af3c450b444263e80a7b713ae6f5b" || block_image_verify("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/platform/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/system", "626,672,681,682,689,692,693,696,1071,1072,1075,1078,2552,2553,4241,4242,5613,5614,6776,6778,6784,6787,14355,15529,15532,15591,15594,15640,15641,15669,15679,16570,16573,16579,16580,16581,16583,16586,16587,16602,16603,16608,16611,16616,16618,16620,16629,16630,16762,16763,22642,22643,22662,22663,22664,22667,22668,22676,22677,22684,22685,22686,22687,22908,22909,23009,23010,23031,23033,23038,23039,23040,23371,23372,25016,25020,25050,25051,32768,33433,33621,33624,33681,33684,36344,36345,36751,36752,36925,36927,37240,37245,37295,37300,37361,37364,37827,37830,37838,37841,37931,37934,37986,37987,37989,37991,38040,38043,38075,38076,51019,51020,53817,53820,61556,64193,64209,64611,65537,66042,98306,98463,98464,98969,131073,131578,140822,141551,142266,146240,163842,163999,164000,164505,195377,196608,196609,198502,198505,198519,198522,198679,203586,203917,203960,204337,204419,204716,229378,229535,229536,230041,262145,262650,294914,295071,295072,295577,296448,296526,327681,328186,335812,336121,336122,336193,360449,360954,385308,386622,388371,389950,389985,391108,393217,393722,399664,399665,400306,400309,400830,402115,402132,402135,402700,402703,402723,403555,403561,403562,408158,408159,413233,413235,413280,413281,415961,415963,415996,415999,417056,417059,417095,417098,417162,417165,417319,417322,417367,417370,417418,417421,417524,417527,417857,417858,419139,419141,419166,419167,423526,423528,423587,423588,425984,426490,427050,427052,427099,427102,427122,427123,435315,443507,455115,455118,457797,457800,458752,459258,460457,460460,460589,460590,468825,468828,468997,469000,469067,469068,469856,469858,469876,469879,470362,470365,470386,470389,470401,470402,479683,479684,491520,492026,493143,493144,493262,493263,493679,493680,494082,494084,508137,508138,524288,524794,527231,527232,534053,534054,536595,536596,538599,538601,539293,539294,540187,540189,540243,540247,540394,540397,540478,540485,540527,540535,543357,543358,543598,543599,546421,546422,546662,546664,546665,546667,546668,546669,546670,546671,546672,546673,546674,546675,546677,546678,546679,546680,546681,546682,546683,546684,546685,546686,546688,546689,546691,546692,546693,546694,546695,546696,546697,546698,546699,546700,546702,546703,546705,546706,546710,546711,546712,546713,546714,546715,546716,546717,546718,546721,546739,546741,546749,546750,546756,546758,546798,546800,546802,546804,546814,546815,546920,546921,549102,549104,549110,549111,549115,549116,549122,549124,549145,549146,549169,549170,549215,549216,549235,549236,549246,549247,549260,549261,549265,549266,549336,549337,549351,549352,549360,549361,549451,549453,549550,549551,550787,550788,553619,553620,554281,554282,554286,554287,554372,554373,554381,554382,554512,554513,554522,554523,554724,554725,554730,554735,554736,554738,554739,554740,554741,554742,554743,554744,554746,554747,554748,554749,554750,554751,554752,554753,554754,554757,555424,555426,555889,555890,555891,555892,555893,555895,555896,555897,555903,555904,556367,556368,557056,557562,557653,557655,557661,557662,557952,557953,557958,557959,557963,557964,557968,557969,557970,557971,557973,557974,557988,557989,558040,558042,558045,558046,558058,558059,558431,558432,558590,558591,559664,559665,559667,559668,559730,559731,559736,559737,565598,565703,568909,569705,569725,569797,569915,570016,570026,570217,570221,570421,570440,570704,570718,570759,570803,570866,571100,571259,573775,573776,573918,573919,574216,574217,574234,574235,579920,579921,581995,582019,582121,582126,582160,582289,582315,582541,582583,583078,583126,583181,583264,583833,583911,584098,584287,584675,584707,585476,585485,585955,585960,586546,586550,587452,587465,588034,588040,588067,588492,588988,588993,589007,589073,589298,589824,590330,595530,595747,595787,595842,595948,596391,596396,596458,596791,596792,601587,601588,603882,603911,603942,603974,604083,604085,604440,604468,604492,604662,604686,604891,604941,604962,605158,605183,605245,605273,605775,605795,605891,605958,606427,606436,606463,606479,606486,607998,608002,608075,608123,608153,608162,608306,608327,608378,608637,608920,608938,608959,608965,609072,609201,609385,609396,609492,611295,611296,613111,613112,613115,613116,613537,613539,613542,613543,613545,645261,655221,655359,655360") && block_image_verify("/dev/block/platform/bootdevice/by-name/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("/dev/block/platform/bootdevice/by-name/vendor", "20,1,140,555,32770,32817,32818,33323,65537,66042,79588,98304,98306,163840,163842,163889,163890,193485,196553,196607,196608") == "1bf2956b7068887f8c4197b94096d9f1c3fdcbe4" || block_image_verify("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/platform/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/vendor", "20,1,140,555,32770,32817,32818,33323,65537,66042,79588,98304,98306,163840,163842,163889,163890,193485,196553,196607,196608") && block_image_verify("/dev/block/platform/bootdevice/by-name/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;

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

ui_print("Installing boot image...");
package_extract_file("boot.img", "/dev/block/platform/bootdevice/by-name/boot");
show_progress(0.600000, 400);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_mtupdate_stage("/cache/recovery/last_mtupdate_stage");
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "1") ,
(
ui_print("start to update general image");
package_extract_file("logo.bin", "/dev/block/platform/bootdevice/by-name/logo");
package_extract_file("odmdtbo.img", "/dev/block/platform/bootdevice/by-name/odmdtbo");
ui_print("Patching md1img image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/platform/bootdevice/by-name/md1img:56768704:1ab04e392e62a748468f59240108b19881eb8f77:56768704:431847bc16e8db397a05a42625776f36e1cc810b",
            "-", 431847bc16e8db397a05a42625776f36e1cc810b, 56768704,
            1ab04e392e62a748468f59240108b19881eb8f77, package_extract_file("patch/md1img.img.p")) || abort("Failed to apply patch \"patch/md1img.img.p \".");
package_extract_file("spmfw.img", "/dev/block/platform/bootdevice/by-name/spmfw");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "1");
),
ui_print("general images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "3") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "2") then

ui_print("start to update alt loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_2");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee2");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk2");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp2");
assert(set_emmc_writable("/sys/block/mmcblk0boot1/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot1"));

set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "2");
endif;

switch_active("sspm_1", "sspm_2");
switch_active("tee1", "tee2");
switch_active("lk", "lk2");
switch_active("scp1", "scp2");
switch_active("preloader", "preloader2");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "3");
),
ui_print("alt loder images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "5") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "4") then

ui_print("start to update main loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_1");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee1");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp1");
assert(set_emmc_writable("/sys/block/mmcblk0boot0/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot0"));

set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "4");
endif;

switch_active("sspm_2", "sspm_1");
switch_active("tee2", "tee1");
switch_active("lk2", "lk");
switch_active("scp2", "scp1");
switch_active("preloader2", "preloader");
),
ui_print("main loader images are already updated");
);
delete("/cache/recovery/last_mtupdate_stage");
package_extract_file("vbmeta.img", "/dev/block/platform/bootdevice/by-name/vbmeta");
set_ota_result_for_dm_verity();
show_progress(0.100000, 2);
