getprop("ro.product.device") == "davinciin" || abort("E3004: This package is for \"davinciin\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/davinciin/davinciin:10/QKQ1.190825.002/V12.0.5.0.QFJINXM:user/release-keys");
ui_print("Target: Xiaomi/davinciin/davinciin:10/QKQ1.190825.002/V12.0.7.0.QFJINXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/davinciin/davinciin:10/QKQ1.190825.002/V12.0.5.0.QFJINXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/davinciin/davinciin:10/QKQ1.190825.002/V12.0.7.0.QFJINXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/davinciin/davinciin:10/QKQ1.190825.002/V12.0.5.0.QFJINXM:user/release-keys or Xiaomi/davinciin/davinciin:10/QKQ1.190825.002/V12.0.7.0.QFJINXM: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:756ce7bec3c7dfe99043e01c101c90658e4b48d4",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:42b4e90c9926263a7467a5d0c713ea0dae92bb67") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:756ce7bec3c7dfe99043e01c101c90658e4b48d4\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:42b4e90c9926263a7467a5d0c713ea0dae92bb67\" 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("/dev/block/bootdevice/by-name/system", "502,1,572,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,2857,2967,2987,2998,3664,3695,3697,3698,3702,3703,3711,3712,3713,3714,5033,5237,5547,5817,8565,8595,9071,9072,9074,9480,9482,9483,10480,10482,16421,16422,16555,16556,19325,19327,25656,25658,32768,32770,32990,32991,34824,34825,34827,34829,34888,34889,35022,35024,35077,35078,35084,35085,35295,35296,35308,35932,35938,35939,35944,35945,36064,36067,37681,37682,39893,39894,39925,39926,40071,40072,40171,41587,43400,43401,43414,43415,43420,43421,43423,43424,45888,45889,46259,46260,46314,46317,46404,46405,46596,46597,49282,49283,49286,49287,49596,49597,49845,49846,61034,61035,61483,61484,62390,62391,62395,62396,62418,62419,63644,63645,64049,64050,64086,64087,65536,65537,67900,67902,71688,71689,71876,71877,73179,73180,73318,73319,73351,73352,73802,73803,74486,74487,75840,75841,76017,76018,77200,77201,79686,79687,80172,80173,84476,84477,87206,87207,88386,88387,88459,88460,88479,88482,91788,91789,94412,94413,95203,95204,95351,95352,96011,96012,96024,96025,98304,98306,98526,98527,102350,102351,103999,104000,104051,104052,104055,104058,104063,104064,105921,105922,106006,106007,106009,106010,106031,106032,106969,106972,107372,107375,107541,107542,107582,107583,109568,109569,109619,109620,109970,109971,109992,109993,110065,110066,110682,110683,114835,114836,114841,114842,115238,115239,116724,116725,118269,118270,118718,118719,118723,118724,118732,118733,118737,118738,118749,118750,118773,118774,120728,120729,120867,120868,121147,121150,121153,121154,122072,122073,122643,122644,126892,126895,129274,129275,129624,129625,131072,131073,131579,131580,132761,132762,132774,132775,133110,133111,134691,134700,135016,135017,135450,135451,136314,136425,137189,137190,137999,138038,139697,139702,139708,139709,140028,140029,140342,140343,140355,140356,140365,140368,140369,140370,140371,140372,140374,140375,140376,140377,140423,140424,140430,140431,140518,140521,140523,140524,140526,140527,140550,140551,140618,140619,140622,140627,140628,140629,140630,140631,140632,140633,141563,141564,141571,141572,142125,142127,142680,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142696,142697,142698,142701,143558,143560,143561,143562,143645,143646,143648,143649,143652,143654,143912,143913,143920,143922,144409,144411,144519,144520,144550,144551,144562,144563,144829,144830,144943,144944,144960,144962,144964,144965,153899,153900,161836,161837,163777,163778,163840,163842,164062,164063,164783,164872,166058,166283,167605,181682,181907,181948,181955,184055,186652,186754,186816,186817,188156,188435,190004,196609,197114,207401,207673,207719,207726,210296,213325,213335,214380,214381,224411,229378,229598,229599,230104,232686,232991,233492,233527,233809,233823,233827,233831,233832,233836,233839,233844,233845,233849,233851,233866,233867,233872,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,860372,884736,884738,884958,884959,903007,917316,917503,917504") == "df4710d3b233e3f3941305a905bf57655c156801" || block_image_verify("/dev/block/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/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "502,1,572,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,2857,2967,2987,2998,3664,3695,3697,3698,3702,3703,3711,3712,3713,3714,5033,5237,5547,5817,8565,8595,9071,9072,9074,9480,9482,9483,10480,10482,16421,16422,16555,16556,19325,19327,25656,25658,32768,32770,32990,32991,34824,34825,34827,34829,34888,34889,35022,35024,35077,35078,35084,35085,35295,35296,35308,35932,35938,35939,35944,35945,36064,36067,37681,37682,39893,39894,39925,39926,40071,40072,40171,41587,43400,43401,43414,43415,43420,43421,43423,43424,45888,45889,46259,46260,46314,46317,46404,46405,46596,46597,49282,49283,49286,49287,49596,49597,49845,49846,61034,61035,61483,61484,62390,62391,62395,62396,62418,62419,63644,63645,64049,64050,64086,64087,65536,65537,67900,67902,71688,71689,71876,71877,73179,73180,73318,73319,73351,73352,73802,73803,74486,74487,75840,75841,76017,76018,77200,77201,79686,79687,80172,80173,84476,84477,87206,87207,88386,88387,88459,88460,88479,88482,91788,91789,94412,94413,95203,95204,95351,95352,96011,96012,96024,96025,98304,98306,98526,98527,102350,102351,103999,104000,104051,104052,104055,104058,104063,104064,105921,105922,106006,106007,106009,106010,106031,106032,106969,106972,107372,107375,107541,107542,107582,107583,109568,109569,109619,109620,109970,109971,109992,109993,110065,110066,110682,110683,114835,114836,114841,114842,115238,115239,116724,116725,118269,118270,118718,118719,118723,118724,118732,118733,118737,118738,118749,118750,118773,118774,120728,120729,120867,120868,121147,121150,121153,121154,122072,122073,122643,122644,126892,126895,129274,129275,129624,129625,131072,131073,131579,131580,132761,132762,132774,132775,133110,133111,134691,134700,135016,135017,135450,135451,136314,136425,137189,137190,137999,138038,139697,139702,139708,139709,140028,140029,140342,140343,140355,140356,140365,140368,140369,140370,140371,140372,140374,140375,140376,140377,140423,140424,140430,140431,140518,140521,140523,140524,140526,140527,140550,140551,140618,140619,140622,140627,140628,140629,140630,140631,140632,140633,141563,141564,141571,141572,142125,142127,142680,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142696,142697,142698,142701,143558,143560,143561,143562,143645,143646,143648,143649,143652,143654,143912,143913,143920,143922,144409,144411,144519,144520,144550,144551,144562,144563,144829,144830,144943,144944,144960,144962,144964,144965,153899,153900,161836,161837,163777,163778,163840,163842,164062,164063,164783,164872,166058,166283,167605,181682,181907,181948,181955,184055,186652,186754,186816,186817,188156,188435,190004,196609,197114,207401,207673,207719,207726,210296,213325,213335,214380,214381,224411,229378,229598,229599,230104,232686,232991,233492,233527,233809,233823,233827,233831,233832,233836,233839,233844,233845,233849,233851,233866,233867,233872,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,860372,884736,884738,884958,884959,903007,917316,917503,917504") && block_image_verify("/dev/block/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/bootdevice/by-name/vendor", "162,1,267,602,610,620,621,702,703,2409,2410,2474,2475,2477,2488,2726,2727,2732,2733,2735,2736,3244,3245,3253,3254,3732,3782,3801,4106,4183,4184,14509,14510,14628,14629,14745,14797,15397,15398,16030,16031,17007,17013,19266,19268,22347,22348,27341,27342,32768,32770,32864,32865,37221,37222,38244,38246,38263,38265,38744,38745,38820,38821,58761,58764,58782,58783,58828,58829,58847,58848,58850,58851,58899,58900,58944,58945,58951,58952,58977,58978,59013,59014,59133,59134,59158,59161,59390,59391,59404,59405,65536,65537,68334,68335,68661,68663,74799,74800,74802,74803,75359,75361,81718,81719,81721,81722,84751,84752,84753,84754,84776,84777,85202,85203,85259,85260,85601,85605,85608,85610,85611,85617,85936,85938,85943,85953,85962,85963,85965,85969,86107,86136,86575,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,317736,360448,360449,386991,393125,393215,393216") == "d604dda345739645bff086ef3d71b2006047384f" || block_image_verify("/dev/block/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/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "162,1,267,602,610,620,621,702,703,2409,2410,2474,2475,2477,2488,2726,2727,2732,2733,2735,2736,3244,3245,3253,3254,3732,3782,3801,4106,4183,4184,14509,14510,14628,14629,14745,14797,15397,15398,16030,16031,17007,17013,19266,19268,22347,22348,27341,27342,32768,32770,32864,32865,37221,37222,38244,38246,38263,38265,38744,38745,38820,38821,58761,58764,58782,58783,58828,58829,58847,58848,58850,58851,58899,58900,58944,58945,58951,58952,58977,58978,59013,59014,59133,59134,59158,59161,59390,59391,59404,59405,65536,65537,68334,68335,68661,68663,74799,74800,74802,74803,75359,75361,81718,81719,81721,81722,84751,84752,84753,84754,84776,84777,85202,85203,85259,85260,85601,85605,85608,85610,85611,85617,85936,85938,85943,85953,85962,85963,85965,85969,86107,86136,86575,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,317736,360448,360449,386991,393125,393215,393216") && block_image_verify("/dev/block/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("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:134217728:756ce7bec3c7dfe99043e01c101c90658e4b48d4",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:42b4e90c9926263a7467a5d0c713ea0dae92bb67",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:42b4e90c9926263a7467a5d0c713ea0dae92bb67");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/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/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
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");
