getprop("ro.product.device") == "titan-p1" || abort("E3004: This package is for \"titan-p1\" devices; this is a \"" + getprop("ro.product.device") + "\".");
assert_boot_version(0);
ui_print("Source: google/walley/titan-p1:10/QP1A.191105.004/eng.zhshs.20250624.094128:user/test-keys");
ui_print("Target: google/walley/titan-p1:10/QP1A.191105.004/eng.zhshs.20250724.142741:user/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "google/walley/titan-p1:10/QP1A.191105.004/eng.zhshs.20250624.094128:user/test-keys" ||
    getprop("ro.build.fingerprint") == "google/walley/titan-p1:10/QP1A.191105.004/eng.zhshs.20250724.142741:user/test-keys" ||
    abort("E3001: Package expects build fingerprint of google/walley/titan-p1:10/QP1A.191105.004/eng.zhshs.20250624.094128:user/test-keys or google/walley/titan-p1:10/QP1A.191105.004/eng.zhshs.20250724.142741:user/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check("EMMC:/dev/block/by-name/boot:33554432:0fff8c206123603da48b32663dd4b7ef437fd023",
                      "EMMC:/dev/block/by-name/boot:33554432:192ca96e06b77ab596b6c9aaf61b57d2503f4636") ||
    abort("E3005: \"EMMC:/dev/block/by-name/boot:33554432:0fff8c206123603da48b32663dd4b7ef437fd023\" or \"EMMC:/dev/block/by-name/boot:33554432:192ca96e06b77ab596b6c9aaf61b57d2503f4636\" has unexpected contents.");
apply_patch_space(105873408) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "290,1,119,382,394,396,397,495,496,974,975,977,979,980,981,996,997,1134,1168,1300,1461,1950,1951,1953,1954,1957,1958,1965,1966,1967,1968,5620,5654,6225,6226,6228,6229,6510,6511,6513,6514,7068,7070,13009,13010,13143,13144,15623,15625,21525,21526,21528,21530,22374,22376,22726,22728,23694,23696,23723,23725,23737,23739,23852,23854,23970,23972,23993,23995,25445,25447,29546,29548,29990,29992,30005,30007,31474,31476,31940,31942,32768,32770,32853,32926,37694,37698,38311,38312,38320,38324,38328,38329,38365,38369,38389,38390,39227,39231,39245,39246,39451,39455,39460,39461,40061,40067,40084,40085,40139,40143,40148,40149,40154,40160,40164,40165,40258,40262,40268,40269,44992,44996,46999,47000,47034,47038,47042,47043,47305,47311,47319,47320,47356,47360,47364,47365,47439,47443,47448,47449,49135,49139,49155,49156,49275,49279,49285,49286,50590,50594,50621,50622,50628,50632,50639,50640,52930,52934,52978,52979,52985,52989,52993,52994,65536,65556,67354,67358,67382,67383,75982,75986,77143,77144,77160,77164,77170,77171,78070,78074,78093,78094,92057,92058,95955,95959,98304,98306,98389,98409,99375,99376,100017,100021,100506,100511,102636,102641,106378,106379,106641,106642,107520,107521,107827,107828,109673,109674,109785,109786,111348,111350,111351,111352,111410,111411,111413,137115,137211,138292,139061,139070,149498,155513,155602,155604,155608,155610,155614,155616,155620,155622,155626,155628,155632,155634,155638,155640,155644,155646,155650,155652,155656,155658,155662,155664,155668,155670,155674,155676,155680,155682,155686,155688,155692,155694,155698,155700,155704,155706,155710,155712,155716,155718,155722,155724,155728,155730,155734,155736,155740,155742,155821,155823,155828,155830,155834,163842,163925,229378,229461,294914,294997,327694,327700,339494,340524,345922,346004,346005") == "0903eb94f4d08a4d4a2acdd46a72897a73cac995" || 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"), "290,1,119,382,394,396,397,495,496,974,975,977,979,980,981,996,997,1134,1168,1300,1461,1950,1951,1953,1954,1957,1958,1965,1966,1967,1968,5620,5654,6225,6226,6228,6229,6510,6511,6513,6514,7068,7070,13009,13010,13143,13144,15623,15625,21525,21526,21528,21530,22374,22376,22726,22728,23694,23696,23723,23725,23737,23739,23852,23854,23970,23972,23993,23995,25445,25447,29546,29548,29990,29992,30005,30007,31474,31476,31940,31942,32768,32770,32853,32926,37694,37698,38311,38312,38320,38324,38328,38329,38365,38369,38389,38390,39227,39231,39245,39246,39451,39455,39460,39461,40061,40067,40084,40085,40139,40143,40148,40149,40154,40160,40164,40165,40258,40262,40268,40269,44992,44996,46999,47000,47034,47038,47042,47043,47305,47311,47319,47320,47356,47360,47364,47365,47439,47443,47448,47449,49135,49139,49155,49156,49275,49279,49285,49286,50590,50594,50621,50622,50628,50632,50639,50640,52930,52934,52978,52979,52985,52989,52993,52994,65536,65556,67354,67358,67382,67383,75982,75986,77143,77144,77160,77164,77170,77171,78070,78074,78093,78094,92057,92058,95955,95959,98304,98306,98389,98409,99375,99376,100017,100021,100506,100511,102636,102641,106378,106379,106641,106642,107520,107521,107827,107828,109673,109674,109785,109786,111348,111350,111351,111352,111410,111411,111413,137115,137211,138292,139061,139070,149498,155513,155602,155604,155608,155610,155614,155616,155620,155622,155626,155628,155632,155634,155638,155640,155644,155646,155650,155652,155656,155658,155662,155664,155668,155670,155674,155676,155680,155682,155686,155688,155692,155694,155698,155700,155704,155706,155710,155712,155716,155718,155722,155724,155728,155730,155734,155736,155740,155742,155821,155823,155828,155830,155834,163842,163925,229378,229461,294914,294997,327694,327700,339494,340524,345922,346004,346005") && 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"), "18,1,46,645,646,2502,2503,2504,2505,2528,2529,2536,32770,32781,45104,45244,45965,45989,45990") == "a4b669d2695cb80f818e792c49192438c037f140" || 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"), "18,1,46,645,646,2502,2503,2504,2505,2528,2529,2536,32770,32781,45104,45244,45965,45989,45990") && 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,9,27,514,518,532,533,1795,1801,1822,1823,3238,3244,3259,3260,3265,3266,3270,3275,22974,22976,22978,22979,22983,22985,22990,22991,23207,23208,23212,23214,23219,23223,23227,23228,23234,23238,23242,23243,23740,23744,23758,23759,25354,25358,25374,25375,30235,30239,30280,30281,30314,30318,30427,30913,30935,30936") == "572a524df9d551de3fb74d3cb73e53a3a6e920b2" || 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,9,27,514,518,532,533,1795,1801,1822,1823,3238,3244,3259,3260,3265,3266,3270,3275,22974,22976,22978,22979,22983,22985,22990,22991,23207,23208,23212,23214,23219,23223,23227,23228,23234,23238,23242,23243,23740,23744,23758,23759,25354,25358,25374,25375,30235,30239,30280,30281,30314,30318,30427,30913,30935,30936") && 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:0fff8c206123603da48b32663dd4b7ef437fd023",
                "EMMC:/dev/block/by-name/boot:33554432:192ca96e06b77ab596b6c9aaf61b57d2503f4636",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:33554432:192ca96e06b77ab596b6c9aaf61b57d2503f4636");
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);
