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:9/PKQ1.181203.001/9.7.18:user/release-keys");
ui_print("Target: xiaomi/violet/violet:9/PKQ1.181203.001/9.7.25:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/violet/violet:9/PKQ1.181203.001/9.7.18:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/violet/violet:9/PKQ1.181203.001/9.7.25:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/violet/violet:9/PKQ1.181203.001/9.7.18:user/release-keys or xiaomi/violet/violet:9/PKQ1.181203.001/9.7.25:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:67108864:717036ffc4447f5901d073e3f2381033f7553505:67108864:b4c815104877e17b144c69324390858805b52886") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:717036ffc4447f5901d073e3f2381033f7553505:67108864:b4c815104877e17b144c69324390858805b52886\" has unexpected contents.");
apply_patch_space(210116608) || 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", "1016,1,239,254,528,8325,8333,8336,8389,8392,8394,8395,9024,9025,9028,9029,9032,9034,9577,9578,9579,9581,11926,11927,23650,23651,28059,28060,29534,29535,32768,32990,39847,39848,42330,42331,43812,43813,46603,46604,47773,47774,56599,56600,58421,58422,63314,63315,69532,69533,72685,72690,72859,73005,73854,74141,74216,74302,74457,74518,75094,75104,75124,75192,75609,76786,77005,77048,77475,77570,79475,80189,80332,80934,82890,83249,96014,96016,98304,98526,104190,104191,108403,108404,112497,112498,114020,114021,116021,116022,116050,116051,116619,116623,116674,116684,116698,116704,116721,116757,116793,116917,117192,117213,117293,117297,117403,117435,117532,117548,117646,117648,117653,118127,118128,118129,118141,118214,118232,118353,118364,118368,118394,118819,118828,119092,119205,119212,119219,119228,119253,119280,119364,119413,119615,119742,119756,119757,119960,120001,120052,120565,120622,120630,120704,120857,122151,122153,125844,125845,126004,126007,126020,126023,126971,126974,127099,127102,127638,127639,127641,127642,132056,132058,133380,135802,136875,136878,137517,137518,140412,140415,140423,140426,142960,142961,143167,143168,144834,144837,144847,144850,144923,144926,144937,144940,145349,145350,145357,145359,145370,145373,145462,145463,145922,145925,146860,146863,146906,146908,147251,147254,147268,147269,148140,148143,148421,148424,148438,148441,148471,148474,149306,149309,149327,149328,149433,149436,149636,149639,149661,149664,149788,149789,149792,149795,149811,149814,149975,149980,150639,150642,151179,151180,163840,164062,169903,169904,181404,181407,181562,181563,181567,181569,181618,181621,181658,181660,181923,181926,181972,184494,192186,192187,193708,193711,193737,193740,193908,193911,193935,193938,194018,194020,194039,194042,194111,194112,194124,194126,194150,194153,194177,194861,194879,195047,195087,195090,195130,195131,205896,205898,210816,210819,211679,212542,212544,212557,214953,214956,214971,214972,214974,216285,216293,217168,217609,217614,217635,217638,218901,218906,219369,220481,221694,221697,221707,221712,221726,221729,221774,221775,223268,223269,225615,225618,225657,225660,225752,225755,226366,226369,226386,226389,226409,226412,226450,226453,226481,226484,226848,226849,226912,226914,227319,227324,229232,229237,229376,229598,230466,230469,230485,230488,230510,230513,230698,230701,233738,233741,233761,233764,235944,235945,235951,235953,235994,235999,236451,236454,236488,238260,238268,238498,238508,238840,238852,238855,239033,239036,239043,239788,239894,239895,239899,239902,246748,246751,246763,246766,246861,246864,247000,247003,247014,247017,247927,247930,247959,247962,248457,248460,248481,248484,250020,250023,250039,250042,250054,250055,252697,252699,255257,255258,255670,255675,260451,260454,260504,260507,262002,262005,262044,262047,262062,262065,262218,262221,262237,262240,262643,262646,262658,262659,262662,262663,262665,262668,262692,262695,262707,262710,267748,267750,268835,268939,269094,269416,269430,270153,274713,275268,275270,275367,275372,275401,275407,275427,275431,281506,281672,281673,288008,288009,290231,290233,290234,290235,290413,290414,291583,291584,291590,291591,291727,291729,293045,293046,293048,293138,293181,293182,293184,293185,293208,293210,293301,293587,293593,293594,293595,293596,293602,293603,293864,293865,293869,293870,294120,294121,294132,294133,294145,294146,294150,294152,294254,294255,294264,294269,294270,294272,294442,295875,295880,295881,296188,296189,296190,296191,296192,296193,296194,296196,296197,296199,296200,296201,296202,296203,296204,296205,296206,296207,296208,296209,296210,296211,296212,296213,296214,296215,296216,296219,296919,296920,296968,296969,296977,296978,296983,296984,297204,297205,298183,298186,298195,298196,298328,298329,298705,298706,298749,298750,304629,304630,304635,304636,304655,304656,304672,304674,307811,307812,308413,308414,320664,321152,321322,321328,321337,321365,321412,321653,321654,321883,321926,321946,321974,321985,321987,321993,322038,322039,322980,323006,323056,323061,323122,323164,323274,323321,323388,323390,323424,323439,323444,323464,323641,324411,324413,326354,326376,326377,328002,328003,329400,329401,330043,330044,331371,331372,333963,333964,338237,338238,338660,338661,350568,350569,352661,352662,354281,354282,354485,354486,355204,355205,356143,356144,356168,356853,356915,356916,359904,359905,363203,363303,363317,364872,364874,364875,365335,365336,380052,380053,380704,380705,387047,392105,397578,402782,404692,404695,409329,409332,409985,409988,410002,410005,412235,412238,412559,412562,412597,412600,412704,412707,412708,412709,416566,416568,416844,416847,417016,417019,419379,419380,424463,424466,424474,424475,424543,424546,428311,428314,428338,428341,428378,428381,428392,428395,428817,428820,428835,428838,429810,429813,429825,429828,429844,429847,430751,430754,430766,430769,430934,430937,430971,430972,432981,432984,433005,433006,433236,433238,433249,433252,438305,438306,440358,441707,441884,442411,442555,442558,445160,445163,446024,446027,457253,457254,459321,459324,468107,468110,468445,468448,468828,468831,468842,468845,476426,476429,476438,476441,476471,477642,477771,477774,479168,487361,498819,498822,498832,498835,500342,500345,504455,504458,504501,506605,507150,507152,507170,507171,508571,508576,509275,509278,509608,509611,509967,509968,509973,509975,509985,509988,510157,510160,510186,510189,510340,510343,511728,511731,511797,511800,512058,512061,512119,512121,512127,512130,516015,516018,516546,516549,516563,516566,517760,517763,517790,517793,517855,517858,517877,517878,517884,517887,518460,518463,524288,530360,538025,538028,547111,548521,549353,550174,552608,552609,552698,552699,553410,553411,556674,556675,556676,556677,556865,556866,557240,557241,558099,558101,558102,558104,558114,558115,558138,558139,558152,558153,558256,558257,558304,558305,558308,558309,558313,558314,558335,558336,558355,558356,558401,558403,558404,558405,558406,558407,558409,558410,558411,558412,558413,558414,558417,558418,558420,558421,558422,558423,558424,558425,558426,558427,558429,558430,558432,558433,558435,558436,558437,558438,558439,558440,558441,558442,558443,558444,558445,558446,558447,558448,558449,558450,558452,558453,558454,558455,558456,558457,558458,558461,558469,558470,558476,558478,558488,558490,558494,558495,558501,558502,558508,558509,558614,558616,558634,558636,558638,558639,560968,560970,561113,578869,587847,587848,590834,590835,591961,591962,593754,593755,597619,597620,598441,598442,598794,598795,603685,609552,610058,610059,617256,617257,624923,624924,635024,635025,639043,639044,643584,643585,653323,653324,654575,654576,655945,655946,659250,659251,665004,665005,668611,668612,669407,671970,677067,677068,677072,677073,678264,678613,685022,685024,685448,685449,687798,687799,688935,688968,689087,689088,690209,691586,692657,692658,694746,694747,696066,696067,700674,700675,704528,704529,709610,709611,715390,715391,724363,724364,724782,724784,728931,728932,729029,729030,729034,729035,729038,903052,917316,917503,917504") == "62437604fa9d266c863243971651dc470ec7764e" || 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", "1016,1,239,254,528,8325,8333,8336,8389,8392,8394,8395,9024,9025,9028,9029,9032,9034,9577,9578,9579,9581,11926,11927,23650,23651,28059,28060,29534,29535,32768,32990,39847,39848,42330,42331,43812,43813,46603,46604,47773,47774,56599,56600,58421,58422,63314,63315,69532,69533,72685,72690,72859,73005,73854,74141,74216,74302,74457,74518,75094,75104,75124,75192,75609,76786,77005,77048,77475,77570,79475,80189,80332,80934,82890,83249,96014,96016,98304,98526,104190,104191,108403,108404,112497,112498,114020,114021,116021,116022,116050,116051,116619,116623,116674,116684,116698,116704,116721,116757,116793,116917,117192,117213,117293,117297,117403,117435,117532,117548,117646,117648,117653,118127,118128,118129,118141,118214,118232,118353,118364,118368,118394,118819,118828,119092,119205,119212,119219,119228,119253,119280,119364,119413,119615,119742,119756,119757,119960,120001,120052,120565,120622,120630,120704,120857,122151,122153,125844,125845,126004,126007,126020,126023,126971,126974,127099,127102,127638,127639,127641,127642,132056,132058,133380,135802,136875,136878,137517,137518,140412,140415,140423,140426,142960,142961,143167,143168,144834,144837,144847,144850,144923,144926,144937,144940,145349,145350,145357,145359,145370,145373,145462,145463,145922,145925,146860,146863,146906,146908,147251,147254,147268,147269,148140,148143,148421,148424,148438,148441,148471,148474,149306,149309,149327,149328,149433,149436,149636,149639,149661,149664,149788,149789,149792,149795,149811,149814,149975,149980,150639,150642,151179,151180,163840,164062,169903,169904,181404,181407,181562,181563,181567,181569,181618,181621,181658,181660,181923,181926,181972,184494,192186,192187,193708,193711,193737,193740,193908,193911,193935,193938,194018,194020,194039,194042,194111,194112,194124,194126,194150,194153,194177,194861,194879,195047,195087,195090,195130,195131,205896,205898,210816,210819,211679,212542,212544,212557,214953,214956,214971,214972,214974,216285,216293,217168,217609,217614,217635,217638,218901,218906,219369,220481,221694,221697,221707,221712,221726,221729,221774,221775,223268,223269,225615,225618,225657,225660,225752,225755,226366,226369,226386,226389,226409,226412,226450,226453,226481,226484,226848,226849,226912,226914,227319,227324,229232,229237,229376,229598,230466,230469,230485,230488,230510,230513,230698,230701,233738,233741,233761,233764,235944,235945,235951,235953,235994,235999,236451,236454,236488,238260,238268,238498,238508,238840,238852,238855,239033,239036,239043,239788,239894,239895,239899,239902,246748,246751,246763,246766,246861,246864,247000,247003,247014,247017,247927,247930,247959,247962,248457,248460,248481,248484,250020,250023,250039,250042,250054,250055,252697,252699,255257,255258,255670,255675,260451,260454,260504,260507,262002,262005,262044,262047,262062,262065,262218,262221,262237,262240,262643,262646,262658,262659,262662,262663,262665,262668,262692,262695,262707,262710,267748,267750,268835,268939,269094,269416,269430,270153,274713,275268,275270,275367,275372,275401,275407,275427,275431,281506,281672,281673,288008,288009,290231,290233,290234,290235,290413,290414,291583,291584,291590,291591,291727,291729,293045,293046,293048,293138,293181,293182,293184,293185,293208,293210,293301,293587,293593,293594,293595,293596,293602,293603,293864,293865,293869,293870,294120,294121,294132,294133,294145,294146,294150,294152,294254,294255,294264,294269,294270,294272,294442,295875,295880,295881,296188,296189,296190,296191,296192,296193,296194,296196,296197,296199,296200,296201,296202,296203,296204,296205,296206,296207,296208,296209,296210,296211,296212,296213,296214,296215,296216,296219,296919,296920,296968,296969,296977,296978,296983,296984,297204,297205,298183,298186,298195,298196,298328,298329,298705,298706,298749,298750,304629,304630,304635,304636,304655,304656,304672,304674,307811,307812,308413,308414,320664,321152,321322,321328,321337,321365,321412,321653,321654,321883,321926,321946,321974,321985,321987,321993,322038,322039,322980,323006,323056,323061,323122,323164,323274,323321,323388,323390,323424,323439,323444,323464,323641,324411,324413,326354,326376,326377,328002,328003,329400,329401,330043,330044,331371,331372,333963,333964,338237,338238,338660,338661,350568,350569,352661,352662,354281,354282,354485,354486,355204,355205,356143,356144,356168,356853,356915,356916,359904,359905,363203,363303,363317,364872,364874,364875,365335,365336,380052,380053,380704,380705,387047,392105,397578,402782,404692,404695,409329,409332,409985,409988,410002,410005,412235,412238,412559,412562,412597,412600,412704,412707,412708,412709,416566,416568,416844,416847,417016,417019,419379,419380,424463,424466,424474,424475,424543,424546,428311,428314,428338,428341,428378,428381,428392,428395,428817,428820,428835,428838,429810,429813,429825,429828,429844,429847,430751,430754,430766,430769,430934,430937,430971,430972,432981,432984,433005,433006,433236,433238,433249,433252,438305,438306,440358,441707,441884,442411,442555,442558,445160,445163,446024,446027,457253,457254,459321,459324,468107,468110,468445,468448,468828,468831,468842,468845,476426,476429,476438,476441,476471,477642,477771,477774,479168,487361,498819,498822,498832,498835,500342,500345,504455,504458,504501,506605,507150,507152,507170,507171,508571,508576,509275,509278,509608,509611,509967,509968,509973,509975,509985,509988,510157,510160,510186,510189,510340,510343,511728,511731,511797,511800,512058,512061,512119,512121,512127,512130,516015,516018,516546,516549,516563,516566,517760,517763,517790,517793,517855,517858,517877,517878,517884,517887,518460,518463,524288,530360,538025,538028,547111,548521,549353,550174,552608,552609,552698,552699,553410,553411,556674,556675,556676,556677,556865,556866,557240,557241,558099,558101,558102,558104,558114,558115,558138,558139,558152,558153,558256,558257,558304,558305,558308,558309,558313,558314,558335,558336,558355,558356,558401,558403,558404,558405,558406,558407,558409,558410,558411,558412,558413,558414,558417,558418,558420,558421,558422,558423,558424,558425,558426,558427,558429,558430,558432,558433,558435,558436,558437,558438,558439,558440,558441,558442,558443,558444,558445,558446,558447,558448,558449,558450,558452,558453,558454,558455,558456,558457,558458,558461,558469,558470,558476,558478,558488,558490,558494,558495,558501,558502,558508,558509,558614,558616,558634,558636,558638,558639,560968,560970,561113,578869,587847,587848,590834,590835,591961,591962,593754,593755,597619,597620,598441,598442,598794,598795,603685,609552,610058,610059,617256,617257,624923,624924,635024,635025,639043,639044,643584,643585,653323,653324,654575,654576,655945,655946,659250,659251,665004,665005,668611,668612,669407,671970,677067,677068,677072,677073,678264,678613,685022,685024,685448,685449,687798,687799,688935,688968,689087,689088,690209,691586,692657,692658,694746,694747,696066,696067,700674,700675,704528,704529,709610,709611,715390,715391,724363,724364,724782,724784,728931,728932,729029,729030,729034,729035,729038,903052,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", "22,1,136,142,144,159,305,8223,32770,32895,98306,98431,163842,163967,229378,229503,271561,294912,294914,515995,524173,524287,524288") == "cf407cf016ff50b0ee1ee482e953793c5cd7cd20" || 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", "22,1,136,142,144,159,305,8223,32770,32895,98306,98431,163842,163967,229378,229503,271561,294912,294914,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);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:67108864:717036ffc4447f5901d073e3f2381033f7553505:67108864:b4c815104877e17b144c69324390858805b52886",
            "-", b4c815104877e17b144c69324390858805b52886, 67108864,
            717036ffc4447f5901d073e3f2381033f7553505, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");
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.");

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

ui_print("Patching firmware images...");
ifelse(msm.boot_update("main"), (
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/splash.img", "/dev/block/bootdevice/by-name/splash");
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/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/multi_image.mbn", "/dev/block/bootdevice/by-name/multiimgoem");
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/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/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
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");
), "");
ifelse(msm.boot_update("backup"), (
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/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
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");
), "");
msm.boot_update("finalize");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
show_progress(0.100000, 2);
