getprop("ro.product.device") == "apollo" || abort("E3004: This package is for \"apollo\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/apollo_eea/apollo:10/QKQ1.200419.002/V12.0.5.0.QJDEUXM:user/release-keys");
ui_print("Target: Xiaomi/apollo_eea/apollo:10/QKQ1.200419.002/V12.0.6.0.QJDEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/apollo_eea/apollo:10/QKQ1.200419.002/V12.0.5.0.QJDEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/apollo_eea/apollo:10/QKQ1.200419.002/V12.0.6.0.QJDEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/apollo_eea/apollo:10/QKQ1.200419.002/V12.0.5.0.QJDEUXM:user/release-keys or Xiaomi/apollo_eea/apollo:10/QKQ1.200419.002/V12.0.6.0.QJDEUXM: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:134217728:3fe1882cb2067ed1c4ad5d021b27c2cf672f1386",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:287d6ebf944aa8188bc75fd25fb89bdab707bf7e") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:3fe1882cb2067ed1c4ad5d021b27c2cf672f1386\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:287d6ebf944aa8188bc75fd25fb89bdab707bf7e\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "404,1,211,239,248,250,251,512,516,532,533,32768,32770,32944,32965,34672,34673,35635,35637,35797,35799,35809,35810,35818,35820,35827,35828,36319,36321,36339,36340,36352,36354,36360,36361,37584,37588,37622,37623,37629,37631,37637,37638,37643,37645,37651,37652,37771,37775,37783,37784,39934,39936,39967,39968,44340,44341,44792,44793,44824,44826,44832,44833,45141,45143,45153,45154,45253,45255,45261,46692,48972,48974,49003,49004,49017,49019,49025,49026,49032,49034,49040,49041,49043,49044,52330,52332,52375,52376,52746,52748,52758,52759,52887,52889,52897,52898,53160,53161,53354,53356,53373,53374,57991,57993,58089,58090,58095,58097,58103,58104,58791,58793,58817,58818,59066,59067,59138,59140,59147,59148,59374,59376,59386,59387,59837,59839,59845,59846,61608,61610,61655,61656,61660,61662,61668,61669,61691,61693,61719,61720,63424,63426,63452,63453,64298,64300,64325,64326,64409,64411,64419,64420,65536,65557,67748,67750,71536,71537,73123,73125,75289,75290,75622,75624,75677,75678,75710,75712,75736,75737,76187,76189,76594,76595,77278,77280,77298,77299,79688,79690,79739,79740,80085,80087,80096,80097,80491,80493,80508,80509,82309,82310,85950,85952,86021,86022,86949,86951,86978,86979,98304,98306,98480,98501,99742,99744,99770,99771,102164,102166,102218,102219,103971,103973,104009,104010,104048,104052,104059,104060,107927,107929,107969,107970,110594,110595,111796,111798,111824,111825,112191,112195,112211,112212,113323,113325,113353,113354,113367,113369,113375,113376,131072,131093,133745,133746,134980,134982,135198,135199,135447,135449,135459,135460,135862,135866,135882,135883,135893,135895,135904,135905,143500,143502,143587,143588,146146,146148,146190,146191,146235,146237,146244,146245,146296,146298,146305,146306,146309,146313,146320,146321,150194,150196,150265,150266,150350,150352,150360,150361,150363,150365,150371,150372,150416,150418,150424,150425,152233,152237,152281,152282,152682,152686,152698,152699,152895,152897,152904,152905,152944,152946,152952,152953,156024,156026,156067,156068,156138,156140,156147,156148,156885,156887,156907,156908,157011,157013,157021,157022,158010,158012,158039,158040,163840,163842,164016,164037,165028,165030,165153,165154,165162,165164,165170,165171,165795,165797,165815,165816,167300,167302,167320,167321,169332,169334,169362,169363,170256,170258,170287,170288,170292,170294,170300,170301,170323,170325,170331,170332,170336,170338,170348,170349,170373,170375,170381,170382,173437,173439,173489,173490,173493,173497,173504,173505,173778,173780,173792,173793,174150,174154,174165,229378,229552,294914,295088,688139,688149,711699,713857,725169,725321,725322") == "7761cda2b2fadad1ad12669569739a0a3311a4db" || 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"), "404,1,211,239,248,250,251,512,516,532,533,32768,32770,32944,32965,34672,34673,35635,35637,35797,35799,35809,35810,35818,35820,35827,35828,36319,36321,36339,36340,36352,36354,36360,36361,37584,37588,37622,37623,37629,37631,37637,37638,37643,37645,37651,37652,37771,37775,37783,37784,39934,39936,39967,39968,44340,44341,44792,44793,44824,44826,44832,44833,45141,45143,45153,45154,45253,45255,45261,46692,48972,48974,49003,49004,49017,49019,49025,49026,49032,49034,49040,49041,49043,49044,52330,52332,52375,52376,52746,52748,52758,52759,52887,52889,52897,52898,53160,53161,53354,53356,53373,53374,57991,57993,58089,58090,58095,58097,58103,58104,58791,58793,58817,58818,59066,59067,59138,59140,59147,59148,59374,59376,59386,59387,59837,59839,59845,59846,61608,61610,61655,61656,61660,61662,61668,61669,61691,61693,61719,61720,63424,63426,63452,63453,64298,64300,64325,64326,64409,64411,64419,64420,65536,65557,67748,67750,71536,71537,73123,73125,75289,75290,75622,75624,75677,75678,75710,75712,75736,75737,76187,76189,76594,76595,77278,77280,77298,77299,79688,79690,79739,79740,80085,80087,80096,80097,80491,80493,80508,80509,82309,82310,85950,85952,86021,86022,86949,86951,86978,86979,98304,98306,98480,98501,99742,99744,99770,99771,102164,102166,102218,102219,103971,103973,104009,104010,104048,104052,104059,104060,107927,107929,107969,107970,110594,110595,111796,111798,111824,111825,112191,112195,112211,112212,113323,113325,113353,113354,113367,113369,113375,113376,131072,131093,133745,133746,134980,134982,135198,135199,135447,135449,135459,135460,135862,135866,135882,135883,135893,135895,135904,135905,143500,143502,143587,143588,146146,146148,146190,146191,146235,146237,146244,146245,146296,146298,146305,146306,146309,146313,146320,146321,150194,150196,150265,150266,150350,150352,150360,150361,150363,150365,150371,150372,150416,150418,150424,150425,152233,152237,152281,152282,152682,152686,152698,152699,152895,152897,152904,152905,152944,152946,152952,152953,156024,156026,156067,156068,156138,156140,156147,156148,156885,156887,156907,156908,157011,157013,157021,157022,158010,158012,158039,158040,163840,163842,164016,164037,165028,165030,165153,165154,165162,165164,165170,165171,165795,165797,165815,165816,167300,167302,167320,167321,169332,169334,169362,169363,170256,170258,170287,170288,170292,170294,170300,170301,170323,170325,170331,170332,170336,170338,170348,170349,170373,170375,170381,170382,173437,173439,173489,173490,173493,173497,173504,173505,173778,173780,173792,173793,174150,174154,174165,229378,229552,294914,295088,688139,688149,711699,713857,725169,725321,725322") && 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"), "214,1,139,149,151,158,159,240,242,249,250,254,256,262,263,269,271,277,278,283,284,547,549,556,557,559,563,565,576,1104,1106,1113,1114,1274,1275,1287,1289,1295,1296,1299,1301,1307,1308,1311,1312,1506,1513,3105,3106,15073,15074,16177,16178,16785,16786,17837,17845,32768,32770,32883,32900,65536,65559,65674,65675,73713,73714,74736,74738,74775,74776,79485,79487,80144,80145,80231,80232,98304,98306,98419,98435,101739,101740,101754,101755,101759,101761,101779,101780,101825,101826,101844,101845,101988,101991,102650,102651,103415,103416,103425,103426,105763,105764,105789,105790,105828,105829,105950,105951,106119,106120,106606,106607,117500,117501,127622,127623,127725,127726,127839,127840,128245,128246,128307,128308,128447,128448,128569,128570,128638,128639,128807,128808,128923,128924,128969,128970,129186,129187,129228,129229,129266,129267,129444,129445,129578,129579,129967,129968,130079,130080,130134,130135,130185,130186,130284,130285,130347,130349,130350,130356,130452,130454,130461,130473,130474,130476,130483,130495,131072,131098,131519,131520,139419,139420,140904,140905,142473,142474,151930,151931,163678,163679,163840,163842,163955,163982,168269,170750,174622,174623,175575,175576,177597,177598,196487,196488,196608,196627,202343,202373,202448,202449,206953,229378,229491,294914,295027,458764,458768,462712,464127,471482,471587,471588") == "325d35e348697d189fea88bc19d55c77c285fe10" || 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"), "214,1,139,149,151,158,159,240,242,249,250,254,256,262,263,269,271,277,278,283,284,547,549,556,557,559,563,565,576,1104,1106,1113,1114,1274,1275,1287,1289,1295,1296,1299,1301,1307,1308,1311,1312,1506,1513,3105,3106,15073,15074,16177,16178,16785,16786,17837,17845,32768,32770,32883,32900,65536,65559,65674,65675,73713,73714,74736,74738,74775,74776,79485,79487,80144,80145,80231,80232,98304,98306,98419,98435,101739,101740,101754,101755,101759,101761,101779,101780,101825,101826,101844,101845,101988,101991,102650,102651,103415,103416,103425,103426,105763,105764,105789,105790,105828,105829,105950,105951,106119,106120,106606,106607,117500,117501,127622,127623,127725,127726,127839,127840,128245,128246,128307,128308,128447,128448,128569,128570,128638,128639,128807,128808,128923,128924,128969,128970,129186,129187,129228,129229,129266,129267,129444,129445,129578,129579,129967,129968,130079,130080,130134,130135,130185,130186,130284,130285,130347,130349,130350,130356,130452,130454,130461,130473,130474,130476,130483,130495,131072,131098,131519,131520,139419,139420,140904,140905,142473,142474,151930,151931,163678,163679,163840,163842,163955,163982,168269,170750,174622,174623,175575,175576,177597,177598,196487,196488,196608,196627,202343,202373,202448,202449,206953,229378,229491,294914,295027,458764,458768,462712,464127,471482,471587,471588") && 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"), "234,1,93,5383,5384,5400,5402,5408,5409,9745,9747,11890,11891,14045,14046,14053,14055,14061,14062,14068,14070,14076,14077,14092,14094,14100,14101,14161,14163,14170,14171,20410,20411,22818,22819,23183,23185,23694,23695,23707,23709,23715,23716,25556,25558,26997,26998,32768,32770,32841,32853,33972,33973,34378,34379,41544,41545,49595,49596,61483,61484,62140,62141,65536,65548,66365,66366,75098,75099,75105,75106,75108,75109,75115,75117,75123,75124,75252,75254,75260,75261,75273,75275,75281,75282,75285,75286,75292,75294,75300,75301,75324,75326,75332,75333,89898,89899,98304,98306,98377,98389,105663,105664,107077,107078,113461,113462,120703,120704,120715,120717,120723,120724,120734,120735,120740,120742,120749,120750,120754,120758,120765,120766,120772,120774,120780,120781,120793,120795,120801,120802,120804,120807,120818,120819,123929,123932,123991,123994,124004,124007,124037,124040,124064,124067,124090,124093,124114,124115,124126,124128,124299,124300,124301,124302,124303,124304,124305,124306,124344,124346,124354,124355,124361,124362,124700,124702,124947,124948,126226,126227,129793,129794,131072,131084,131142,131143,135718,135719,137890,137893,163358,163359,163840,163842,163913,163927,177848,177849,196608,196673,205254,205255,229376,229378,229449,229501,229946,229948,229966,229967,231848,231849,232274,232276,232302,232303,262144,262148,263240,263241,278552,278553,278583,278585,278591,278592,281154,281155,281163,281165,281171,281172,281451,281455,281466,281469,281496,281499,281520,281523,292261,296895,296967,296968") == "5bfadb87dbc61ebe71badeca12d3199ca278340b" || 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
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "234,1,93,5383,5384,5400,5402,5408,5409,9745,9747,11890,11891,14045,14046,14053,14055,14061,14062,14068,14070,14076,14077,14092,14094,14100,14101,14161,14163,14170,14171,20410,20411,22818,22819,23183,23185,23694,23695,23707,23709,23715,23716,25556,25558,26997,26998,32768,32770,32841,32853,33972,33973,34378,34379,41544,41545,49595,49596,61483,61484,62140,62141,65536,65548,66365,66366,75098,75099,75105,75106,75108,75109,75115,75117,75123,75124,75252,75254,75260,75261,75273,75275,75281,75282,75285,75286,75292,75294,75300,75301,75324,75326,75332,75333,89898,89899,98304,98306,98377,98389,105663,105664,107077,107078,113461,113462,120703,120704,120715,120717,120723,120724,120734,120735,120740,120742,120749,120750,120754,120758,120765,120766,120772,120774,120780,120781,120793,120795,120801,120802,120804,120807,120818,120819,123929,123932,123991,123994,124004,124007,124037,124040,124064,124067,124090,124093,124114,124115,124126,124128,124299,124300,124301,124302,124303,124304,124305,124306,124344,124346,124354,124355,124361,124362,124700,124702,124947,124948,126226,126227,129793,129794,131072,131084,131142,131143,135718,135719,137890,137893,163358,163359,163840,163842,163913,163927,177848,177849,196608,196673,205254,205255,229376,229378,229449,229501,229946,229948,229966,229967,231848,231849,232274,232276,232302,232303,262144,262148,263240,263241,278552,278553,278583,278585,278591,278592,281154,281155,281163,281165,281171,281172,281451,281455,281466,281469,281496,281499,281520,281523,292261,296895,296967,296968") && 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"), "10,1,2,9,13,2026,2037,32231,32745,32767,32768") == "0045d2e780d641016cae0b796f7e6452af250878" || 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
check_first_block(map_partition("odm"));
ifelse (block_image_recover(map_partition("odm"), "10,1,2,9,13,2026,2037,32231,32745,32767,32768") && 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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:134217728:3fe1882cb2067ed1c4ad5d021b27c2cf672f1386",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:287d6ebf944aa8188bc75fd25fb89bdab707bf7e",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:287d6ebf944aa8188bc75fd25fb89bdab707bf7e");

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


# Update dynamic partition metadata

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

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

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

# Patch partition odm

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

# --- 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/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
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");

# ---- update tasks: exaid part 2----


package_extract_file("exaid.img", "/dev/block/bootdevice/by-name/exaid");
    
