getprop("ro.product.device") == "violet" || abort("E3004: This package is for \"violet\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/violet/violet:10/QKQ1.190915.002/20.3.26:user/release-keys");
ui_print("Target: xiaomi/violet/violet:10/QKQ1.190915.002/20.4.1:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/violet/violet:10/QKQ1.190915.002/20.3.26:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/violet/violet:10/QKQ1.190915.002/20.4.1:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/violet/violet:10/QKQ1.190915.002/20.3.26:user/release-keys or xiaomi/violet/violet:10/QKQ1.190915.002/20.4.1: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:67108864:34577d976fa71962f1c9f0b8fb5a6a2ee0f69653",
                      "EMMC:/dev/block/bootdevice/by-name/boot:67108864:b3436521a7ddce87daa76b13d627772d4e1f0597") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:34577d976fa71962f1c9f0b8fb5a6a2ee0f69653\" or \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:b3436521a7ddce87daa76b13d627772d4e1f0597\" has unexpected contents.");
apply_patch_space(67108864) || 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", "676,1,645,728,742,770,777,830,831,1091,1096,1098,1099,1205,1206,1691,1692,2380,2381,2383,2385,2386,2387,2402,2403,2584,2585,3753,3754,3756,3757,3761,3762,3770,3771,3772,3773,9130,9131,9133,9134,9538,9539,9541,9542,10539,10541,16480,16481,16614,16615,19384,19386,25667,25669,32768,32770,32990,32991,34855,34856,34858,34860,34919,34920,35053,35055,35397,35399,35414,35415,35570,35572,35582,35583,35591,35593,35600,35601,36673,36675,36685,36686,36695,36697,36703,36704,37748,37752,37786,37787,37793,37795,37801,37802,37807,37809,37815,37816,37860,37864,37872,37873,37884,37886,37892,37893,37896,37897,37914,37916,37922,37923,39678,39680,39704,39705,39713,39715,39721,39722,39724,39725,42547,42549,42579,42580,42582,42584,42590,42591,42667,42671,42678,42679,42937,42939,42947,42948,43076,43078,43086,43087,43490,43492,43509,43510,45511,45513,45543,45544,46202,46204,46228,46229,49920,49921,50082,50083,50154,50156,50163,50164,50688,50690,50708,50709,52884,52886,52918,52919,52955,52957,52963,52964,53047,53049,53057,53058,57701,57703,62306,62307,62579,62581,62595,62596,62606,62608,62614,62615,62628,62630,62654,62655,63277,63279,63297,63298,64829,64831,64870,64871,65242,65243,65536,65537,66143,66145,66160,66161,69719,69720,70645,70647,70674,70675,78646,78648,78773,78774,80639,80641,80649,80650,80689,80691,80698,80699,90479,90481,90586,90587,90662,90664,90670,90671,90709,90713,90720,90721,93496,93498,93518,93519,94914,94915,95055,95056,95409,95411,95427,95428,97215,97216,97635,97638,97655,97657,97663,97664,98304,98306,98526,98527,99396,99398,99422,99423,99472,99474,99481,99482,99485,99489,99496,99497,102057,102058,102116,102118,102126,102127,102172,102174,102180,102181,102734,102738,102757,102758,102786,102788,102794,102795,103031,103035,103047,103048,103244,103246,103253,103254,103257,103259,103266,103267,104061,104065,104090,104091,104128,104130,104136,104137,105303,105305,105331,105332,105449,105451,105459,105460,105939,105941,105957,105958,106024,106026,106033,106034,106747,106749,106769,106770,107036,107038,107049,107050,115218,115220,117847,117848,117917,117919,117927,117928,118327,118329,118341,118342,122578,122580,122656,122657,122665,122667,122673,122674,122880,122882,122892,122893,123593,123595,123613,123614,123625,123627,123633,123634,124433,124437,124455,124456,131072,131073,143972,143974,149181,149182,150075,150077,150106,150107,150111,150113,150119,150120,150142,150144,150150,150151,150155,150157,150167,150168,150183,150185,150191,150192,150594,150596,150603,150604,150628,150630,150636,150637,153434,153436,153484,153485,153751,153753,153765,153766,153919,153923,153934,153935,154210,154212,154226,154227,154277,154279,154288,154289,154315,154319,154326,154327,155814,155816,155828,155829,156705,156708,161165,161167,163366,163367,163786,163788,163802,163805,163840,163842,164062,164063,166297,166299,166316,166317,166693,166695,166705,166706,169333,169336,171757,171758,175749,175752,377792,378249,378321,378595,404409,405879,558089,558102,558107,562436,562810,562843,744135,744137,744148,744149,747259,747262,747321,747324,747334,747337,747367,747370,747394,747397,747420,747423,747444,747445,747454,747455,747617,747618,747619,747620,747621,747622,747656,747657,747658,747659,747892,747894,748114,748115,749219,749220,752824,752825,753664,753665,754315,754316,759052,759053,760445,760448,760897,760898,761269,761270,762755,762756,762846,762848,762850,762851,762853,762854,762856,762857,762859,762860,762862,762863,762865,762866,762870,762871,762873,762874,762876,762877,762879,762880,762884,762885,762904,762905,762910,762911,762930,762931,762946,762947,762951,762952,762968,762969,762974,762975,762993,762994,763007,763008,763012,763013,763030,763031,763036,763037,763056,763057,763071,763072,763074,763075,763077,763078,763080,763081,763083,763084,763086,763087,763089,763090,763092,763093,763095,763096,763098,763099,763101,763103,763141,763143,763149,763150,763887,763889,763907,763908,763912,763914,763920,763921,764345,764346,769209,769211,769231,769232,776078,776079,778698,778700,784428,784429,784894,784896,784912,784913,785580,785582,785600,785601,785628,785630,785636,785637,785640,785642,785648,785649,785926,785930,785940,785943,785970,785973,785995,786433,786938,790224,790600,790601,790606,790607,790626,790627,790686,790688,790697,790698,790823,790824,790927,790928,790929,790932,819200,819202,884736,884738,884958,884959,903007,917316,917503,917504") == "f491dc3680e4f80d87639a1a3baca12a0abbb6aa" || 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", "676,1,645,728,742,770,777,830,831,1091,1096,1098,1099,1205,1206,1691,1692,2380,2381,2383,2385,2386,2387,2402,2403,2584,2585,3753,3754,3756,3757,3761,3762,3770,3771,3772,3773,9130,9131,9133,9134,9538,9539,9541,9542,10539,10541,16480,16481,16614,16615,19384,19386,25667,25669,32768,32770,32990,32991,34855,34856,34858,34860,34919,34920,35053,35055,35397,35399,35414,35415,35570,35572,35582,35583,35591,35593,35600,35601,36673,36675,36685,36686,36695,36697,36703,36704,37748,37752,37786,37787,37793,37795,37801,37802,37807,37809,37815,37816,37860,37864,37872,37873,37884,37886,37892,37893,37896,37897,37914,37916,37922,37923,39678,39680,39704,39705,39713,39715,39721,39722,39724,39725,42547,42549,42579,42580,42582,42584,42590,42591,42667,42671,42678,42679,42937,42939,42947,42948,43076,43078,43086,43087,43490,43492,43509,43510,45511,45513,45543,45544,46202,46204,46228,46229,49920,49921,50082,50083,50154,50156,50163,50164,50688,50690,50708,50709,52884,52886,52918,52919,52955,52957,52963,52964,53047,53049,53057,53058,57701,57703,62306,62307,62579,62581,62595,62596,62606,62608,62614,62615,62628,62630,62654,62655,63277,63279,63297,63298,64829,64831,64870,64871,65242,65243,65536,65537,66143,66145,66160,66161,69719,69720,70645,70647,70674,70675,78646,78648,78773,78774,80639,80641,80649,80650,80689,80691,80698,80699,90479,90481,90586,90587,90662,90664,90670,90671,90709,90713,90720,90721,93496,93498,93518,93519,94914,94915,95055,95056,95409,95411,95427,95428,97215,97216,97635,97638,97655,97657,97663,97664,98304,98306,98526,98527,99396,99398,99422,99423,99472,99474,99481,99482,99485,99489,99496,99497,102057,102058,102116,102118,102126,102127,102172,102174,102180,102181,102734,102738,102757,102758,102786,102788,102794,102795,103031,103035,103047,103048,103244,103246,103253,103254,103257,103259,103266,103267,104061,104065,104090,104091,104128,104130,104136,104137,105303,105305,105331,105332,105449,105451,105459,105460,105939,105941,105957,105958,106024,106026,106033,106034,106747,106749,106769,106770,107036,107038,107049,107050,115218,115220,117847,117848,117917,117919,117927,117928,118327,118329,118341,118342,122578,122580,122656,122657,122665,122667,122673,122674,122880,122882,122892,122893,123593,123595,123613,123614,123625,123627,123633,123634,124433,124437,124455,124456,131072,131073,143972,143974,149181,149182,150075,150077,150106,150107,150111,150113,150119,150120,150142,150144,150150,150151,150155,150157,150167,150168,150183,150185,150191,150192,150594,150596,150603,150604,150628,150630,150636,150637,153434,153436,153484,153485,153751,153753,153765,153766,153919,153923,153934,153935,154210,154212,154226,154227,154277,154279,154288,154289,154315,154319,154326,154327,155814,155816,155828,155829,156705,156708,161165,161167,163366,163367,163786,163788,163802,163805,163840,163842,164062,164063,166297,166299,166316,166317,166693,166695,166705,166706,169333,169336,171757,171758,175749,175752,377792,378249,378321,378595,404409,405879,558089,558102,558107,562436,562810,562843,744135,744137,744148,744149,747259,747262,747321,747324,747334,747337,747367,747370,747394,747397,747420,747423,747444,747445,747454,747455,747617,747618,747619,747620,747621,747622,747656,747657,747658,747659,747892,747894,748114,748115,749219,749220,752824,752825,753664,753665,754315,754316,759052,759053,760445,760448,760897,760898,761269,761270,762755,762756,762846,762848,762850,762851,762853,762854,762856,762857,762859,762860,762862,762863,762865,762866,762870,762871,762873,762874,762876,762877,762879,762880,762884,762885,762904,762905,762910,762911,762930,762931,762946,762947,762951,762952,762968,762969,762974,762975,762993,762994,763007,763008,763012,763013,763030,763031,763036,763037,763056,763057,763071,763072,763074,763075,763077,763078,763080,763081,763083,763084,763086,763087,763089,763090,763092,763093,763095,763096,763098,763099,763101,763103,763141,763143,763149,763150,763887,763889,763907,763908,763912,763914,763920,763921,764345,764346,769209,769211,769231,769232,776078,776079,778698,778700,784428,784429,784894,784896,784912,784913,785580,785582,785600,785601,785628,785630,785636,785637,785640,785642,785648,785649,785926,785930,785940,785943,785970,785973,785995,786433,786938,790224,790600,790601,790606,790607,790626,790627,790686,790688,790697,790698,790823,790824,790927,790928,790929,790932,819200,819202,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", "188,1,302,633,641,651,653,660,661,742,744,751,752,757,758,1019,1021,1028,1029,1031,1037,1080,1086,1093,1094,1106,1108,1114,1115,1118,1120,1126,1127,1135,1137,1144,1145,2055,2056,12411,12412,12640,12641,13343,13344,13976,13977,14960,14965,17218,17220,32768,32770,32895,32896,34447,34448,40983,40984,43481,43484,53212,53214,56049,56051,56477,56478,56849,56850,57237,57238,57609,57618,57676,57677,60306,60309,60327,60328,60373,60374,60392,60393,60395,60396,60445,60446,60492,60493,60496,60497,60522,60523,60557,60558,60728,60729,60971,60972,60984,60985,65536,65537,68310,68311,68601,68603,74736,74737,74739,74740,75284,75286,75418,75419,75433,75434,75435,75436,75456,75457,75882,75883,75940,75941,76855,76857,76862,76872,76884,76885,76887,76891,76907,76908,77060,77061,79288,79289,81339,81340,83118,98306,98431,98432,98937,115491,115537,115538,115740,115833,115917,115918,115969,131073,131578,163842,163967,163968,164473,196609,197114,215638,215684,215685,215887,215980,216064,216065,216116,229378,229503,229504,230009,262145,262650,294914,295039,295040,295545,327681,328186,335027,491520,491521,515995,524173,524287,524288") == "53c0d0f8cb1388864406e46ede5827c50208da50" || 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", "188,1,302,633,641,651,653,660,661,742,744,751,752,757,758,1019,1021,1028,1029,1031,1037,1080,1086,1093,1094,1106,1108,1114,1115,1118,1120,1126,1127,1135,1137,1144,1145,2055,2056,12411,12412,12640,12641,13343,13344,13976,13977,14960,14965,17218,17220,32768,32770,32895,32896,34447,34448,40983,40984,43481,43484,53212,53214,56049,56051,56477,56478,56849,56850,57237,57238,57609,57618,57676,57677,60306,60309,60327,60328,60373,60374,60392,60393,60395,60396,60445,60446,60492,60493,60496,60497,60522,60523,60557,60558,60728,60729,60971,60972,60984,60985,65536,65537,68310,68311,68601,68603,74736,74737,74739,74740,75284,75286,75418,75419,75433,75434,75435,75436,75456,75457,75882,75883,75940,75941,76855,76857,76862,76872,76884,76885,76887,76891,76907,76908,77060,77061,79288,79289,81339,81340,83118,98306,98431,98432,98937,115491,115537,115538,115740,115833,115917,115918,115969,131073,131578,163842,163967,163968,164473,196609,197114,215638,215684,215685,215887,215980,216064,216065,216116,229378,229503,229504,230009,262145,262650,294914,295039,295040,295545,327681,328186,335027,491520,491521,515995,524173,524287,524288") && 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:67108864:34577d976fa71962f1c9f0b8fb5a6a2ee0f69653",
                "EMMC:/dev/block/bootdevice/by-name/boot:67108864:b3436521a7ddce87daa76b13d627772d4e1f0597",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:67108864:b3436521a7ddce87daa76b13d627772d4e1f0597");

# ---- 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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
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/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
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/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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/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/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");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
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");
