getprop("ro.product.device") == "courbet" || abort("E3004: This package is for \"courbet\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/courbet_ru/courbet:11/RKQ1.200826.002/V12.5.3.0.RKQRUXM:user/release-keys");
ui_print("Target: Xiaomi/courbet_ru/courbet:11/RKQ1.200826.002/V12.5.4.0.RKQRUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/courbet_ru/courbet:11/RKQ1.200826.002/V12.5.3.0.RKQRUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/courbet_ru/courbet:11/RKQ1.200826.002/V12.5.4.0.RKQRUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/courbet_ru/courbet:11/RKQ1.200826.002/V12.5.3.0.RKQRUXM:user/release-keys or Xiaomi/courbet_ru/courbet:11/RKQ1.200826.002/V12.5.4.0.RKQRUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:adb6bf8f28b0944ded0f46228f32847a506a160f"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0bb6b405bb60aa745383fd8801b304607d49cd85")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:adb6bf8f28b0944ded0f46228f32847a506a160f"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0bb6b405bb60aa745383fd8801b304607d49cd85"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "176,1,31,42,52,54,58,86,87,21340,21341,21371,21372,27536,27537,28951,56663,56670,56671,57974,57975,59096,59097,60827,60828,61663,61664,62871,62872,63023,63024,63948,63949,65536,65551,68328,68329,69314,69315,70680,70681,71130,71131,73300,73301,73562,73563,73655,73656,73906,73907,74123,74125,74263,74267,74275,74276,74288,74292,74296,74297,75744,75750,75784,75785,75791,75797,75798,75799,75804,75810,75811,75812,79308,79312,79352,79353,80318,80319,80969,80970,82901,82904,82912,82913,82935,82936,82940,82941,83375,83376,83500,83501,83532,83538,83539,83540,83851,83855,83863,83864,83984,83990,83991,85206,86430,86568,86590,86591,89001,89002,89767,89771,89809,89810,89824,89830,89831,89832,89839,89845,89846,89847,93471,93472,95502,95506,95537,95538,95569,95570,96658,96662,96683,96684,96813,96817,96823,96824,96957,96961,96968,96969,98304,98321,102269,102273,102342,102343,102371,102372,102924,102930,102931,102932,104802,104806,104851,104852,104856,104862,104863,104864,104895,104901,104902,104903,106593,106597,106621,753678,753679,764963,767273,779431,779594,779595") == "4432dee75307e90c5258776f5c67bc6c6e03c7cf" || 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"), "176,1,31,42,52,54,58,86,87,21340,21341,21371,21372,27536,27537,28951,56663,56670,56671,57974,57975,59096,59097,60827,60828,61663,61664,62871,62872,63023,63024,63948,63949,65536,65551,68328,68329,69314,69315,70680,70681,71130,71131,73300,73301,73562,73563,73655,73656,73906,73907,74123,74125,74263,74267,74275,74276,74288,74292,74296,74297,75744,75750,75784,75785,75791,75797,75798,75799,75804,75810,75811,75812,79308,79312,79352,79353,80318,80319,80969,80970,82901,82904,82912,82913,82935,82936,82940,82941,83375,83376,83500,83501,83532,83538,83539,83540,83851,83855,83863,83864,83984,83990,83991,85206,86430,86568,86590,86591,89001,89002,89767,89771,89809,89810,89824,89830,89831,89832,89839,89845,89846,89847,93471,93472,95502,95506,95537,95538,95569,95570,96658,96662,96683,96684,96813,96817,96823,96824,96957,96961,96968,96969,98304,98321,102269,102273,102342,102343,102371,102372,102924,102930,102931,102932,104802,104806,104851,104852,104856,104862,104863,104864,104895,104901,104902,104903,106593,106597,106621,753678,753679,764963,767273,779431,779594,779595") && 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"), "454,1,30,40,44,49,50,128,136,142,143,387,391,396,397,399,403,405,406,561,562,565,569,573,574,577,578,587,591,595,596,1428,1429,1595,1601,3924,3925,12610,12611,13601,13603,13604,13605,13607,13610,13611,13612,13614,13616,13617,13618,13620,13622,13623,13624,13626,13628,13629,13630,13632,13634,13635,13636,13638,13640,13645,13647,13650,13652,13655,13657,13665,13667,13670,13672,13673,13674,13676,13678,13679,13680,13683,13685,13686,13687,13689,13691,13692,13693,13695,13697,13698,13699,13701,13703,13704,13705,13707,13709,13710,13711,13720,13721,13740,13741,13742,13743,13747,13748,13749,13750,13753,13754,13755,13756,13759,13760,13761,13762,13765,13766,13767,13768,13772,13773,13774,13775,13778,13779,13780,13781,13785,13786,13790,13791,13795,13796,13800,13801,13805,13806,13807,13808,13817,13818,13819,13820,13823,13824,13825,13826,13829,13830,13831,13832,13835,13836,13837,13838,13840,13842,14134,14135,14250,14251,15149,15156,30611,30612,30634,30635,30736,30737,30738,30739,31237,31239,31244,31246,31252,31254,31259,31261,31320,31322,32768,32799,32803,32805,32835,32837,33339,33340,33555,33556,40518,40519,40523,40524,41138,41139,41299,41300,41302,41304,41368,41369,41439,41440,41507,41508,41510,41511,41513,41523,41582,41583,41585,41587,41647,41648,41650,41651,41715,41716,41784,41785,41787,41788,41851,41852,41854,41855,41921,41922,41924,41925,41992,41993,42061,42062,42128,42129,42131,42132,42192,42193,42195,42196,42260,42261,42263,42264,42327,42328,42330,42331,42392,42393,42395,42396,42456,42457,42459,42460,42521,42522,42524,42525,42589,42590,42592,42593,42657,42659,42661,42662,42726,42727,42729,42730,42796,42797,42799,42800,42864,42865,42867,42868,42872,42873,42875,42876,42880,42881,42958,42959,42963,42964,42968,42969,42973,42974,43100,43101,43103,43104,43164,43165,43167,43168,43229,43231,43233,43234,43298,43299,43301,43302,43366,43367,43369,43370,43434,43435,43437,43438,43504,43505,43507,43508,43572,43573,43575,43576,43636,43637,43639,43640,43703,43704,43706,43707,43773,43774,43843,43844,43854,43858,43860,43861,43862,43863,43864,43865,43867,43868,43870,43871,43941,43942,43944,43945,44008,44009,44011,44012,44079,44080,44082,44083,44149,44150,44218,44219,44226,44227,55085,55086,55218,55219,55307,55308,55611,55612,55673,55674,55823,55824,55903,55904,55936,55937,56023,56024,56092,56093,56189,56190,56282,56283,56355,56356,56401,56402,56522,56523,56549,56550,56552,56553,56585,56586,56747,56748,56819,56820,56872,56873,57197,57198,57200,57201,57295,57296,57420,57421,57495,57496,57529,57530,57557,57558,57621,57622,57693,57694,57766,57767,57768,57769,57847,57849,57854,57856,58215,58223,58638,327694,327701,329070,330074,335306,335386,335387") == "9d2e0f73eb5fd57b625206edf7e171f45dffeb76" || 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"), "454,1,30,40,44,49,50,128,136,142,143,387,391,396,397,399,403,405,406,561,562,565,569,573,574,577,578,587,591,595,596,1428,1429,1595,1601,3924,3925,12610,12611,13601,13603,13604,13605,13607,13610,13611,13612,13614,13616,13617,13618,13620,13622,13623,13624,13626,13628,13629,13630,13632,13634,13635,13636,13638,13640,13645,13647,13650,13652,13655,13657,13665,13667,13670,13672,13673,13674,13676,13678,13679,13680,13683,13685,13686,13687,13689,13691,13692,13693,13695,13697,13698,13699,13701,13703,13704,13705,13707,13709,13710,13711,13720,13721,13740,13741,13742,13743,13747,13748,13749,13750,13753,13754,13755,13756,13759,13760,13761,13762,13765,13766,13767,13768,13772,13773,13774,13775,13778,13779,13780,13781,13785,13786,13790,13791,13795,13796,13800,13801,13805,13806,13807,13808,13817,13818,13819,13820,13823,13824,13825,13826,13829,13830,13831,13832,13835,13836,13837,13838,13840,13842,14134,14135,14250,14251,15149,15156,30611,30612,30634,30635,30736,30737,30738,30739,31237,31239,31244,31246,31252,31254,31259,31261,31320,31322,32768,32799,32803,32805,32835,32837,33339,33340,33555,33556,40518,40519,40523,40524,41138,41139,41299,41300,41302,41304,41368,41369,41439,41440,41507,41508,41510,41511,41513,41523,41582,41583,41585,41587,41647,41648,41650,41651,41715,41716,41784,41785,41787,41788,41851,41852,41854,41855,41921,41922,41924,41925,41992,41993,42061,42062,42128,42129,42131,42132,42192,42193,42195,42196,42260,42261,42263,42264,42327,42328,42330,42331,42392,42393,42395,42396,42456,42457,42459,42460,42521,42522,42524,42525,42589,42590,42592,42593,42657,42659,42661,42662,42726,42727,42729,42730,42796,42797,42799,42800,42864,42865,42867,42868,42872,42873,42875,42876,42880,42881,42958,42959,42963,42964,42968,42969,42973,42974,43100,43101,43103,43104,43164,43165,43167,43168,43229,43231,43233,43234,43298,43299,43301,43302,43366,43367,43369,43370,43434,43435,43437,43438,43504,43505,43507,43508,43572,43573,43575,43576,43636,43637,43639,43640,43703,43704,43706,43707,43773,43774,43843,43844,43854,43858,43860,43861,43862,43863,43864,43865,43867,43868,43870,43871,43941,43942,43944,43945,44008,44009,44011,44012,44079,44080,44082,44083,44149,44150,44218,44219,44226,44227,55085,55086,55218,55219,55307,55308,55611,55612,55673,55674,55823,55824,55903,55904,55936,55937,56023,56024,56092,56093,56189,56190,56282,56283,56355,56356,56401,56402,56522,56523,56549,56550,56552,56553,56585,56586,56747,56748,56819,56820,56872,56873,57197,57198,57200,57201,57295,57296,57420,57421,57495,57496,57529,57530,57557,57558,57621,57622,57693,57694,57766,57767,57768,57769,57847,57849,57854,57856,58215,58223,58638,327694,327701,329070,330074,335306,335386,335387") && 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"), "370,1,15,3862,3863,4441,4442,6213,6217,6313,6314,8949,8952,8960,8961,9000,9001,17183,17184,25171,25173,25303,25308,26586,26587,27262,27266,28232,28233,29569,29570,29971,29972,31271,31272,31634,31638,32157,32158,32170,32174,32178,32179,32768,32776,39990,39991,41215,41216,50391,50392,54303,54307,54338,54340,54633,54636,58436,58437,65536,65542,68284,68285,77829,77836,79312,79313,84702,84703,96200,96201,96426,96427,96825,96826,97327,97328,97333,97334,97462,97468,97469,97470,97482,97488,97489,97490,98280,98281,98304,98312,100655,100656,113941,113942,114018,114019,116197,116198,131072,131078,132554,132555,132814,132815,133011,133012,134923,134924,142376,142377,143359,143363,148436,148437,153495,153496,153503,153504,153510,153511,157848,157849,158074,158076,158086,158088,158134,158136,158146,158148,158157,158158,159976,159977,159980,159983,163749,163750,163840,163848,169598,169599,169619,169620,169683,169684,170345,170346,171890,171891,180943,180944,180950,180951,181422,181423,185973,185974,187672,187673,187677,187678,190583,190584,196608,196614,202011,202015,203766,203767,208156,208157,208717,208718,208722,208723,208746,208748,208749,208750,208782,208783,208794,208795,210714,210715,210718,210719,217022,217023,217186,217187,217188,217189,217191,217192,217209,217210,217213,217215,217216,217218,217236,217237,217249,217250,217289,217293,217297,217301,217302,217306,217307,217323,217738,217739,218110,218111,219596,219597,219686,219688,219690,219691,219693,219694,219696,219697,219699,219700,219702,219703,219705,219706,219716,219717,219721,219722,219727,219728,219733,219734,219738,219739,219744,219745,219774,219775,219795,219796,219802,219803,219823,219824,219840,219841,219845,219846,220553,220555,229376,229411,229412,229413,230429,230431,230788,230789,234381,234382,236333,236334,238253,238255,240277,240278,240287,240289,241659,241661,249824,249826,250876,250878,253118,253119,253293,253295,253343,253344,261654,261655,262144,262153,266481,266485,266552,266553,266581,266582,266718,266722,266730,266731,268119,268123,268158,268159,269559,269563,272329,272330,273860,273861,273864,273865,283841,283842,284425,284427,284972,284973,285636,285640,285656,285657,287194,287198,287223,287224,294912,294919,298060,298061,322055,322056,322077,322078,322285,322286,322591,322592,322712,322713,323005,323006,323741,323742,324286,324287,324500,324501,325444,325446,325951,325952,326593,326594,327680,327681,329494,329495,330288,330291,333625,333626,341080,346486,346568,346569") == "21fb24dc5daeeefa66ca4686ec6d73db502cd694" || 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"), "370,1,15,3862,3863,4441,4442,6213,6217,6313,6314,8949,8952,8960,8961,9000,9001,17183,17184,25171,25173,25303,25308,26586,26587,27262,27266,28232,28233,29569,29570,29971,29972,31271,31272,31634,31638,32157,32158,32170,32174,32178,32179,32768,32776,39990,39991,41215,41216,50391,50392,54303,54307,54338,54340,54633,54636,58436,58437,65536,65542,68284,68285,77829,77836,79312,79313,84702,84703,96200,96201,96426,96427,96825,96826,97327,97328,97333,97334,97462,97468,97469,97470,97482,97488,97489,97490,98280,98281,98304,98312,100655,100656,113941,113942,114018,114019,116197,116198,131072,131078,132554,132555,132814,132815,133011,133012,134923,134924,142376,142377,143359,143363,148436,148437,153495,153496,153503,153504,153510,153511,157848,157849,158074,158076,158086,158088,158134,158136,158146,158148,158157,158158,159976,159977,159980,159983,163749,163750,163840,163848,169598,169599,169619,169620,169683,169684,170345,170346,171890,171891,180943,180944,180950,180951,181422,181423,185973,185974,187672,187673,187677,187678,190583,190584,196608,196614,202011,202015,203766,203767,208156,208157,208717,208718,208722,208723,208746,208748,208749,208750,208782,208783,208794,208795,210714,210715,210718,210719,217022,217023,217186,217187,217188,217189,217191,217192,217209,217210,217213,217215,217216,217218,217236,217237,217249,217250,217289,217293,217297,217301,217302,217306,217307,217323,217738,217739,218110,218111,219596,219597,219686,219688,219690,219691,219693,219694,219696,219697,219699,219700,219702,219703,219705,219706,219716,219717,219721,219722,219727,219728,219733,219734,219738,219739,219744,219745,219774,219775,219795,219796,219802,219803,219823,219824,219840,219841,219845,219846,220553,220555,229376,229411,229412,229413,230429,230431,230788,230789,234381,234382,236333,236334,238253,238255,240277,240278,240287,240289,241659,241661,249824,249826,250876,250878,253118,253119,253293,253295,253343,253344,261654,261655,262144,262153,266481,266485,266552,266553,266581,266582,266718,266722,266730,266731,268119,268123,268158,268159,269559,269563,272329,272330,273860,273861,273864,273865,283841,283842,284425,284427,284972,284973,285636,285640,285656,285657,287194,287198,287223,287224,294912,294919,298060,298061,322055,322056,322077,322078,322285,322286,322591,322592,322712,322713,323005,323006,323741,323742,324286,324287,324500,324501,325444,325446,325951,325952,326593,326594,327680,327681,329494,329495,330288,330291,333625,333626,341080,346486,346568,346569") && 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;
if (range_sha1(map_partition("odm"), "12,1,12,13,16,24,25,247,248,250,256,275,276") == "04e4a029381545a0642c42ea4dfc9aabb8611d4b" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "12,1,12,13,16,24,25,247,248,250,256,275,276") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "212,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,150,554,560,574,575,581,587,588,589,783,787,791,792,795,799,804,805,808,809,815,821,822,823,845,851,852,853,1588,1592,1610,1611,1615,1621,1622,1623,1625,1626,1637,1643,1644,1645,1655,1656,1661,1665,1669,1670,1674,1680,1684,1685,1692,1698,1699,1700,1712,1718,1719,1720,1722,1729,1735,1742,1747,1754,1784,1791,1810,1817,1835,1840,1857,1864,1880,1881,2090,2092,2102,2103,2115,2116,2117,2118,2119,2120,2129,2130,2153,2154,2200,2205,2208,2211,2214,2217,2220,2222,2226,2227,2231,2234,2239,2240,2243,2245,2732,2734,2738,2742,2747,2749,2754,2758,2759,2763,2764,2768,2769,2773,2774,2778,2779,2783,2784,2788,2789,2791,2798,2802,2803,2807,2808,2812,2813,2817,2818,2822,2823,2827,2828,2832,2833,2835,2836,2840,2841,2845,2846,2850,2851,2855,2856,2860,2861,2865,2866,2870,2871,2873,2877,2881,2882,2886,2887,2889,2890,2892,2893,2897,2898,2902,2903,2905,2906,2910,2911,2915,2916,2920,2921,2925,2926,2928,2929,2933,2934,2936,2940,98325,98327,114763,115108,116936,116974,116975") == "8cc4447a2d07dcd95ef83b833bebdb64c008b5ab" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "212,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,150,554,560,574,575,581,587,588,589,783,787,791,792,795,799,804,805,808,809,815,821,822,823,845,851,852,853,1588,1592,1610,1611,1615,1621,1622,1623,1625,1626,1637,1643,1644,1645,1655,1656,1661,1665,1669,1670,1674,1680,1684,1685,1692,1698,1699,1700,1712,1718,1719,1720,1722,1729,1735,1742,1747,1754,1784,1791,1810,1817,1835,1840,1857,1864,1880,1881,2090,2092,2102,2103,2115,2116,2117,2118,2119,2120,2129,2130,2153,2154,2200,2205,2208,2211,2214,2217,2220,2222,2226,2227,2231,2234,2239,2240,2243,2245,2732,2734,2738,2742,2747,2749,2754,2758,2759,2763,2764,2768,2769,2773,2774,2778,2779,2783,2784,2788,2789,2791,2798,2802,2803,2807,2808,2812,2813,2817,2818,2822,2823,2827,2828,2832,2833,2835,2836,2840,2841,2845,2846,2850,2851,2855,2856,2860,2861,2865,2866,2870,2871,2873,2877,2881,2882,2886,2887,2889,2890,2892,2893,2897,2898,2902,2903,2905,2906,2910,2911,2915,2916,2920,2921,2925,2926,2928,2929,2933,2934,2936,2940,98325,98327,114763,115108,116936,116974,116975") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

# ---- start making changes here ----


# ---- 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/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/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/km41.mbn", "/dev/block/bootdevice/by-name/keymaster");
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/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/km41.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition system

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

# 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 product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
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 odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:adb6bf8f28b0944ded0f46228f32847a506a160f"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0bb6b405bb60aa745383fd8801b304607d49cd85"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0bb6b405bb60aa745383fd8801b304607d49cd85")));

# ---- 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");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
set_progress(1.000000);
