getprop("ro.product.device") == "eros-p1" || abort("E3004: This package is for \"eros-p1\" devices; this is a \"" + getprop("ro.product.device") + "\".");
assert_boot_version(0);
ui_print("Source: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20251129.141905:user/test-keys");
ui_print("Target: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260325.174158:user/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20251129.141905:user/test-keys" ||
    getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260325.174158:user/test-keys" ||
    abort("E3001: Package expects build fingerprint of Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20251129.141905:user/test-keys or Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260325.174158:user/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check("EMMC:/dev/block/by-name/boot:33554432:b7aa6e20d987242dd44f2f6678e8e67e6a4f8ec0",
                      "EMMC:/dev/block/by-name/boot:33554432:291b5ffa86f85cb471473ea855f07accb528a827") ||
    abort("E3005: \"EMMC:/dev/block/by-name/boot:33554432:b7aa6e20d987242dd44f2f6678e8e67e6a4f8ec0\" or \"EMMC:/dev/block/by-name/boot:33554432:291b5ffa86f85cb471473ea855f07accb528a827\" has unexpected contents.");
apply_patch_space(33554432) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "108,107037,107038,110558,110560,110884,110885,262173,262197,282496,282497,294912,294914,294994,295103,301815,301817,302144,302145,302152,302154,302160,302161,302205,302207,302213,302214,302290,302292,302379,302380,302386,302388,302394,302395,302492,302494,302501,302502,302965,302967,302980,302981,302998,303000,303006,303007,304869,304871,304911,304912,305502,305504,305527,305528,308552,308554,308580,308581,310349,310351,311326,311327,311443,311445,311451,311452,321676,321678,321859,321860,321891,321893,321899,321900,327151,327153,327206,327207,327516,327518,327526,327527,327538,327540,327546,327547,327591,327593,327599,327693,327700,328981,329357,329358,329361,329362,329381,329382,329464,329466,329475,329476,329602,329606,330601,335843,335921,335922") == "d976252a12a35458ac101802eed9def2d09f8873" || 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"), "108,107037,107038,110558,110560,110884,110885,262173,262197,282496,282497,294912,294914,294994,295103,301815,301817,302144,302145,302152,302154,302160,302161,302205,302207,302213,302214,302290,302292,302379,302380,302386,302388,302394,302395,302492,302494,302501,302502,302965,302967,302980,302981,302998,303000,303006,303007,304869,304871,304911,304912,305502,305504,305527,305528,308552,308554,308580,308581,310349,310351,311326,311327,311443,311445,311451,311452,321676,321678,321859,321860,321891,321893,321899,321900,327151,327153,327206,327207,327516,327518,327526,327527,327538,327540,327546,327547,327591,327593,327599,327693,327700,328981,329357,329358,329361,329362,329381,329382,329464,329466,329475,329476,329602,329606,330601,335843,335921,335922") && 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"), "36,1,45,645,646,1751,1752,1753,1754,1777,1778,1793,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2413,2744,2903,3228,5300,5343,5507,32770,32779,38928,39049,39672,39695,39696") == "60a11f9450a348f1e536fcd1cda968c2dce04fb0" || 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"), "36,1,45,645,646,1751,1752,1753,1754,1777,1778,1793,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2413,2744,2903,3228,5300,5343,5507,32770,32779,38928,39049,39672,39695,39696") && 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"), "58,1,2,8,26,513,515,531,532,1794,1798,1821,1822,3237,3241,3258,3259,3264,3265,3269,3272,17186,17188,17190,17191,17195,17197,17202,17203,17419,17420,17424,17426,17431,17433,17439,17440,17446,17448,17454,17455,17952,17954,17970,17971,19566,19568,19586,19587,24447,24449,24492,24493,24526,24528,24608,25003,25022,25023") == "5afa122e63d122c8b052bac051b8030b0a388781" || 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"), "58,1,2,8,26,513,515,531,532,1794,1798,1821,1822,3237,3241,3258,3259,3264,3265,3269,3272,17186,17188,17190,17191,17195,17197,17202,17203,17419,17420,17424,17426,17431,17433,17439,17440,17446,17448,17454,17455,17952,17954,17970,17971,19566,19568,19586,19587,24447,24449,24492,24493,24526,24528,24608,25003,25022,25023") && 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 ----


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

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

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/by-name/boot:33554432:b7aa6e20d987242dd44f2f6678e8e67e6a4f8ec0",
                "EMMC:/dev/block/by-name/boot:33554432:291b5ffa86f85cb471473ea855f07accb528a827",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:33554432:291b5ffa86f85cb471473ea855f07accb528a827");
ui_print("Updating boot-resource.fex into bootloader partition...");
package_extract_file("boot-resource.fex","/dev/block/by-name/bootloader");
ui_print("Updating env.fex into env partition...");
package_extract_file("env.fex","/dev/block/by-name/env");
ui_print("Updating vbmeta.img into vbmeta partition...");
package_extract_file("vbmeta.img","/dev/block/by-name/vbmeta");
ui_print("Updating vbmeta_system.img into vbmeta_system partition...");
package_extract_file("vbmeta_system.img","/dev/block/by-name/vbmeta_system");
ui_print("Updating vbmeta_vendor.img into vbmeta_vendor partition...");
package_extract_file("vbmeta_vendor.img","/dev/block/by-name/vbmeta_vendor");
ui_print("Updating boot...");
burnboot();
set_progress(1.000000);
