getprop("ro.product.device") == "joyeuse" || abort("E3004: This package is for \"joyeuse\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/joyeuse_eea/joyeuse:12/RKQ1.211019.001/V13.0.4.0.SJZEUXM:user/release-keys");
ui_print("Target: Redmi/joyeuse_eea/joyeuse:12/RKQ1.211019.001/V13.0.5.0.SJZEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/joyeuse_eea/joyeuse:12/RKQ1.211019.001/V13.0.4.0.SJZEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/joyeuse_eea/joyeuse:12/RKQ1.211019.001/V13.0.5.0.SJZEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/joyeuse_eea/joyeuse:12/RKQ1.211019.001/V13.0.4.0.SJZEUXM:user/release-keys or Redmi/joyeuse_eea/joyeuse:12/RKQ1.211019.001/V13.0.5.0.SJZEUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:d809d415353a8f85e8fc0df93c251de5b9c722d0"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c038330b1b7244a69a274e86cabaf593ee7a8956")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:d809d415353a8f85e8fc0df93c251de5b9c722d0"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c038330b1b7244a69a274e86cabaf593ee7a8956"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "144,1,31,44,58,114,115,659,660,9725,9726,11883,22800,32768,32785,40220,40221,40501,40502,40843,40845,40918,40919,41983,41984,41998,41999,45800,45803,45810,45811,45818,45819,45832,45833,46557,46558,47368,47369,48305,48306,51307,51308,51451,51452,51484,51485,51625,51626,53124,53126,54031,54032,54291,54429,58302,58303,58325,58326,59570,59571,59659,59660,59734,59735,59764,59765,60421,60422,60427,60428,60461,60462,63221,63222,64634,64635,64665,64666,65030,65032,65033,65034,65536,65551,65826,65827,66836,66837,78045,78046,80170,80171,80332,80333,81065,81066,83276,83277,87886,87887,88674,88675,94325,94326,95570,95571,96296,96297,98304,98321,101159,101160,102146,102147,103309,103310,104646,104647,111183,111184,111757,111758,119554,119555,119854,119855,130063,130064,131072,131087,132265,132266,134525,134526,135222,135223,137746,688135,688143,693070,695165,706181,706330,706331") == "f10125aca42b7eff8a44edcb4fc5d64500caf2a8" || 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"), "144,1,31,44,58,114,115,659,660,9725,9726,11883,22800,32768,32785,40220,40221,40501,40502,40843,40845,40918,40919,41983,41984,41998,41999,45800,45803,45810,45811,45818,45819,45832,45833,46557,46558,47368,47369,48305,48306,51307,51308,51451,51452,51484,51485,51625,51626,53124,53126,54031,54032,54291,54429,58302,58303,58325,58326,59570,59571,59659,59660,59734,59735,59764,59765,60421,60422,60427,60428,60461,60462,63221,63222,64634,64635,64665,64666,65030,65032,65033,65034,65536,65551,65826,65827,66836,66837,78045,78046,80170,80171,80332,80333,81065,81066,83276,83277,87886,87887,88674,88675,94325,94326,95570,95571,96296,96297,98304,98321,101159,101160,102146,102147,103309,103310,104646,104647,111183,111184,111757,111758,119554,119555,119854,119855,130063,130064,131072,131087,132265,132266,134525,134526,135222,135223,137746,688135,688143,693070,695165,706181,706330,706331") && 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"), "330,1,38,49,50,130,135,1781,1782,1788,1789,1794,1795,1858,1859,1864,1865,1870,1871,1876,1877,1890,1891,2645,2646,5048,5049,14163,14164,14168,14169,15142,15144,15148,15150,15172,15173,15174,15175,15178,15179,15184,15185,15186,15187,15190,15191,15192,15193,15198,15199,15203,15204,15208,15209,15213,15214,15218,15219,15223,15225,15226,15227,15229,15231,15232,15233,15236,15237,15238,15239,15242,15243,15244,15245,15248,15249,15250,15251,15254,15255,15256,15257,15260,15261,15262,15263,15267,15268,15271,15273,15277,15278,15281,15283,15288,15289,15293,15294,15295,15296,15299,15300,15301,15302,15305,15306,15307,15308,15312,15313,15314,15315,15318,15319,15320,15321,15324,15325,15326,15327,15330,15331,15337,15338,15342,15343,15347,15348,15711,15712,15939,15940,16598,16602,30694,30695,32217,32218,32220,32222,32286,32287,32357,32358,32425,32426,32428,32429,32431,32432,32491,32493,32495,32496,32560,32561,32631,32632,32699,32700,32702,32703,32705,32714,32768,32826,32831,32832,32833,32834,32835,32836,32896,32897,32899,32900,32964,32965,32967,32968,33029,33030,33039,33040,33102,33103,33169,33170,33172,33173,33176,33181,33183,33184,33186,33188,33190,33192,33251,33252,33254,33255,33317,33318,33320,33321,33382,33383,33391,33393,33453,33454,33526,33527,33529,33530,33592,33593,33663,33664,33672,33676,33677,33678,33877,33878,33944,33945,33947,33948,33951,33956,34200,34447,34478,34484,34485,34678,35936,35937,36001,36002,36152,36153,36232,36233,36257,36258,36328,36329,36396,36397,36428,36429,36521,36522,36594,36595,36619,36620,36706,36707,36746,36747,36749,36750,36782,36783,37004,37005,37121,37122,37193,37194,37250,37251,37392,37393,37394,37395,37505,37506,37571,37572,37602,37603,37651,37652,37722,37723,37805,37806,38060,38061,38119,38120,38418,38422,38424,38426,38427,38434,38546,38555,38557,38559,38560,38562,38615,38616,38633,38635,38641,38643,38693,38694,39826,39827,39901,39902,40033,40034,40042,229399,229407,258527,259313,263425,263491,263492") == "48a133939793de17f696560a75c095b46246be87" || 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"), "330,1,38,49,50,130,135,1781,1782,1788,1789,1794,1795,1858,1859,1864,1865,1870,1871,1876,1877,1890,1891,2645,2646,5048,5049,14163,14164,14168,14169,15142,15144,15148,15150,15172,15173,15174,15175,15178,15179,15184,15185,15186,15187,15190,15191,15192,15193,15198,15199,15203,15204,15208,15209,15213,15214,15218,15219,15223,15225,15226,15227,15229,15231,15232,15233,15236,15237,15238,15239,15242,15243,15244,15245,15248,15249,15250,15251,15254,15255,15256,15257,15260,15261,15262,15263,15267,15268,15271,15273,15277,15278,15281,15283,15288,15289,15293,15294,15295,15296,15299,15300,15301,15302,15305,15306,15307,15308,15312,15313,15314,15315,15318,15319,15320,15321,15324,15325,15326,15327,15330,15331,15337,15338,15342,15343,15347,15348,15711,15712,15939,15940,16598,16602,30694,30695,32217,32218,32220,32222,32286,32287,32357,32358,32425,32426,32428,32429,32431,32432,32491,32493,32495,32496,32560,32561,32631,32632,32699,32700,32702,32703,32705,32714,32768,32826,32831,32832,32833,32834,32835,32836,32896,32897,32899,32900,32964,32965,32967,32968,33029,33030,33039,33040,33102,33103,33169,33170,33172,33173,33176,33181,33183,33184,33186,33188,33190,33192,33251,33252,33254,33255,33317,33318,33320,33321,33382,33383,33391,33393,33453,33454,33526,33527,33529,33530,33592,33593,33663,33664,33672,33676,33677,33678,33877,33878,33944,33945,33947,33948,33951,33956,34200,34447,34478,34484,34485,34678,35936,35937,36001,36002,36152,36153,36232,36233,36257,36258,36328,36329,36396,36397,36428,36429,36521,36522,36594,36595,36619,36620,36706,36707,36746,36747,36749,36750,36782,36783,37004,37005,37121,37122,37193,37194,37250,37251,37392,37393,37394,37395,37505,37506,37571,37572,37602,37603,37651,37652,37722,37723,37805,37806,38060,38061,38119,38120,38418,38422,38424,38426,38427,38434,38546,38555,38557,38559,38560,38562,38615,38616,38633,38635,38641,38643,38693,38694,39826,39827,39901,39902,40033,40034,40042,229399,229407,258527,259313,263425,263491,263492") && 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"), "392,1,15,3291,3292,6596,6597,6614,6615,13975,13976,14124,14126,14695,14697,14967,14968,14977,14978,15632,15633,15649,15650,25277,25278,32768,32776,33786,33791,33964,33968,36275,36276,37723,37724,39698,39699,40082,40083,40096,40097,41937,41938,43623,43624,43631,43632,43677,43678,43968,43969,43975,43976,44062,44063,44064,44065,45997,45998,57672,57673,64594,64597,64654,64657,64671,64672,64684,64686,64758,64760,64788,64790,64833,64836,64847,64851,65064,65068,65079,65081,65536,65542,65875,65876,75445,75446,83185,83186,83723,83730,83998,84004,85401,85407,86522,86523,97783,97784,97863,97864,98304,98312,102981,102982,112422,112423,112430,112431,112434,112435,112565,112566,112579,112580,113396,113397,122486,122487,129135,129136,130047,130048,131072,131078,133625,133627,147870,147871,147950,147951,151114,151116,163840,163848,173363,173364,173751,173752,174797,174798,182580,182581,184055,184056,189478,189479,193817,193819,193828,193830,193838,193840,193849,193851,194645,194646,194653,194654,194660,194661,194664,194665,194672,194673,196608,196614,200217,200218,200435,200437,200439,200440,200469,200470,200963,200964,201098,201099,201209,201210,201224,201225,201227,201229,201239,201240,201801,201802,201809,201810,201849,201850,201875,201876,201900,201901,201920,201921,201935,201937,203146,203147,203331,203333,203334,203335,203341,203342,203346,203347,203373,203374,203378,203380,203382,203384,203405,203406,203419,203420,203548,203551,203966,203967,204338,204339,205824,205825,205914,205915,205922,205930,205952,205953,205960,205961,205968,205969,205976,205977,205984,205985,205995,205996,208502,208503,208522,208523,208563,208564,208576,208577,208613,208614,208630,208631,208647,208648,208682,208683,208821,208822,208835,208836,208840,208841,208848,208849,208861,208862,219110,219111,226670,226672,229376,229397,230425,230426,234482,234483,238116,238118,238204,238207,239065,239066,244236,244237,247456,247458,250776,250777,251284,251285,251562,251563,253861,253864,260623,260624,262144,262150,264465,264467,264474,264475,264482,264483,264518,264519,264527,264528,264535,264536,264544,264545,264552,264554,264561,264562,266210,266211,266257,266258,266435,266436,268304,268305,268750,268751,268893,268894,268898,268899,269017,269018,270034,270035,277836,277837,282802,282805,284105,284106,284792,284793,285335,285336,286963,286964,294912,294918,312553,312554,321969,321970,327680,327681,342530,342531,342732,342733,342771,342772,343293,343294,344003,344004,344316,344317,345698,345700,345863,345864,346774,346775,346874,346875,347545,347546,350540,350541,351570,351573,356274,356275,360448,360449,364354,370130,370216,370217") == "3f816385392b86a6b25798829a81bb0931836ec3" || 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"), "392,1,15,3291,3292,6596,6597,6614,6615,13975,13976,14124,14126,14695,14697,14967,14968,14977,14978,15632,15633,15649,15650,25277,25278,32768,32776,33786,33791,33964,33968,36275,36276,37723,37724,39698,39699,40082,40083,40096,40097,41937,41938,43623,43624,43631,43632,43677,43678,43968,43969,43975,43976,44062,44063,44064,44065,45997,45998,57672,57673,64594,64597,64654,64657,64671,64672,64684,64686,64758,64760,64788,64790,64833,64836,64847,64851,65064,65068,65079,65081,65536,65542,65875,65876,75445,75446,83185,83186,83723,83730,83998,84004,85401,85407,86522,86523,97783,97784,97863,97864,98304,98312,102981,102982,112422,112423,112430,112431,112434,112435,112565,112566,112579,112580,113396,113397,122486,122487,129135,129136,130047,130048,131072,131078,133625,133627,147870,147871,147950,147951,151114,151116,163840,163848,173363,173364,173751,173752,174797,174798,182580,182581,184055,184056,189478,189479,193817,193819,193828,193830,193838,193840,193849,193851,194645,194646,194653,194654,194660,194661,194664,194665,194672,194673,196608,196614,200217,200218,200435,200437,200439,200440,200469,200470,200963,200964,201098,201099,201209,201210,201224,201225,201227,201229,201239,201240,201801,201802,201809,201810,201849,201850,201875,201876,201900,201901,201920,201921,201935,201937,203146,203147,203331,203333,203334,203335,203341,203342,203346,203347,203373,203374,203378,203380,203382,203384,203405,203406,203419,203420,203548,203551,203966,203967,204338,204339,205824,205825,205914,205915,205922,205930,205952,205953,205960,205961,205968,205969,205976,205977,205984,205985,205995,205996,208502,208503,208522,208523,208563,208564,208576,208577,208613,208614,208630,208631,208647,208648,208682,208683,208821,208822,208835,208836,208840,208841,208848,208849,208861,208862,219110,219111,226670,226672,229376,229397,230425,230426,234482,234483,238116,238118,238204,238207,239065,239066,244236,244237,247456,247458,250776,250777,251284,251285,251562,251563,253861,253864,260623,260624,262144,262150,264465,264467,264474,264475,264482,264483,264518,264519,264527,264528,264535,264536,264544,264545,264552,264554,264561,264562,266210,266211,266257,266258,266435,266436,268304,268305,268750,268751,268893,268894,268898,268899,269017,269018,270034,270035,277836,277837,282802,282805,284105,284106,284792,284793,285335,285336,286963,286964,294912,294918,312553,312554,321969,321970,327680,327681,342530,342531,342732,342733,342771,342772,343293,343294,344003,344004,344316,344317,345698,345700,345863,345864,346774,346775,346874,346875,347545,347546,350540,350541,351570,351573,356274,356275,360448,360449,364354,370130,370216,370217") && 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("system_ext"), "110,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28744,28745,28766,29958,29965,29966,30204,30205,30271,30272,30468,30469,30473,30474,30479,30480,30919,30920,30932,30933,30939,30940,30952,30953,30964,30965,30970,30971,30977,30978,30991,30992,31004,31005,31033,31034,31052,31053,31183,31184,31271,31272,31291,31292,31294,31295,31296,31297,31298,31300,31301,31302,31303,31304,31334,31346,31348,31349,31350,31351,32088,32332,32768,32795,33811,33812,34926,34927,34956,34957,35333,36208,36324,36325,36474,36475,38479,38488,38805,38826,39264,39265,39317,39318,39627,39628,39977,39978,44954,44955,49418,131084,131088,133338,133739,135861,135904,135905") == "7d923bb6d45a560fe839e998c2241d60997b5fa8" || 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"), "110,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28744,28745,28766,29958,29965,29966,30204,30205,30271,30272,30468,30469,30473,30474,30479,30480,30919,30920,30932,30933,30939,30940,30952,30953,30964,30965,30970,30971,30977,30978,30991,30992,31004,31005,31033,31034,31052,31053,31183,31184,31271,31272,31291,31292,31294,31295,31296,31297,31298,31300,31301,31302,31303,31304,31334,31346,31348,31349,31350,31351,32088,32332,32768,32795,33811,33812,34926,34927,34956,34957,35333,36208,36324,36325,36474,36475,38479,38488,38805,38826,39264,39265,39317,39318,39627,39628,39977,39978,44954,44955,49418,131084,131088,133338,133739,135861,135904,135905") && 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/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/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");

# --- Start patching dynamic partitions ---


# 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.600000, 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 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.");

# --- 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:d809d415353a8f85e8fc0df93c251de5b9c722d0"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c038330b1b7244a69a274e86cabaf593ee7a8956"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c038330b1b7244a69a274e86cabaf593ee7a8956")));

# ---- 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);
