getprop("ro.product.device") == "surya" || abort("E3004: This package is for \"surya\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/surya_id/surya:12/RKQ1.211019.001/V13.0.4.0.SJGIDXM:user/release-keys");
ui_print("Target: POCO/surya_id/surya:12/RKQ1.211019.001/V13.0.5.0.SJGIDXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/surya_id/surya:12/RKQ1.211019.001/V13.0.4.0.SJGIDXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/surya_id/surya:12/RKQ1.211019.001/V13.0.5.0.SJGIDXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/surya_id/surya:12/RKQ1.211019.001/V13.0.4.0.SJGIDXM:user/release-keys or POCO/surya_id/surya:12/RKQ1.211019.001/V13.0.5.0.SJGIDXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:335e57b6bb3b273a2679557dd3d63eb16c604837"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:a2e93e81dd4c2a301ffd53a4c950389169c87037")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:335e57b6bb3b273a2679557dd3d63eb16c604837"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:a2e93e81dd4c2a301ffd53a4c950389169c87037"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "138,1,31,44,58,114,115,659,660,9725,9726,11883,22800,32768,32785,40220,40221,40501,40502,40843,40845,40918,40919,40933,44738,44745,44746,44753,44754,44767,44768,44835,44837,44930,44931,45074,45075,45107,45108,45248,45565,45566,46601,46860,46998,49317,49318,50871,50872,50894,50895,52139,52140,52228,52229,52303,52304,52333,52334,52990,52991,52996,52997,53030,53031,55790,55791,57203,57204,57234,57235,57599,57601,57602,57603,58380,58381,59390,59391,65536,65551,70614,70615,71273,71274,73398,73399,73560,73561,74293,74294,76504,76505,81114,81115,81902,81903,87553,87554,88798,88799,89524,89525,94370,94371,95357,95358,96520,96521,97857,97858,98304,98321,104410,104411,104985,104986,112782,112783,113082,113083,123291,123292,125478,125479,127738,127739,128435,128436,130959,688137,688143,720897,720911,739267,741500,753249,753406,753407") == "d87b5565b0a7392048ded3c44d265bee906fb2e8" || 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"), "138,1,31,44,58,114,115,659,660,9725,9726,11883,22800,32768,32785,40220,40221,40501,40502,40843,40845,40918,40919,40933,44738,44745,44746,44753,44754,44767,44768,44835,44837,44930,44931,45074,45075,45107,45108,45248,45565,45566,46601,46860,46998,49317,49318,50871,50872,50894,50895,52139,52140,52228,52229,52303,52304,52333,52334,52990,52991,52996,52997,53030,53031,55790,55791,57203,57204,57234,57235,57599,57601,57602,57603,58380,58381,59390,59391,65536,65551,70614,70615,71273,71274,73398,73399,73560,73561,74293,74294,76504,76505,81114,81115,81902,81903,87553,87554,88798,88799,89524,89525,94370,94371,95357,95358,96520,96521,97857,97858,98304,98321,104410,104411,104985,104986,112782,112783,113082,113083,123291,123292,125478,125479,127738,127739,128435,128436,130959,688137,688143,720897,720911,739267,741500,753249,753406,753407") && 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"), "432,1,38,49,50,130,135,141,142,147,148,211,212,217,218,223,224,229,230,233,234,464,471,1001,1002,3450,3451,12371,12372,12376,12377,13336,13338,13342,13344,13366,13367,13368,13369,13372,13373,13378,13379,13380,13381,13384,13385,13386,13387,13392,13393,13397,13398,13402,13403,13407,13408,13412,13413,13417,13419,13420,13421,13423,13425,13426,13427,13430,13431,13432,13433,13436,13437,13438,13439,13442,13443,13444,13445,13448,13449,13450,13451,13454,13455,13456,13457,13462,13463,13466,13468,13472,13473,13476,13478,13483,13484,13488,13489,13490,13491,13494,13495,13496,13497,13500,13501,13502,13503,13507,13508,13509,13510,13513,13514,13515,13516,13519,13520,13521,13522,13525,13526,13533,13534,13538,13539,13543,13544,13904,13905,14133,14134,14809,14815,16180,16181,21071,21072,22629,22630,22632,22634,22698,22699,22769,22770,22837,22838,22840,22841,22843,22844,22903,22905,22907,22908,22972,22973,23043,23044,23111,23112,23114,23115,23117,23126,23127,23128,23190,23191,23257,23258,23260,23261,23264,23268,23270,23271,23273,23275,23277,23278,23337,23338,23340,23342,23402,23403,23405,23406,23467,23468,23470,23471,23531,23532,23534,23535,23602,23603,23671,23672,23739,23740,23806,23807,23809,23810,23873,23874,23940,23941,23943,23944,24005,24006,24008,24009,24073,24074,24076,24077,24139,24140,24142,24143,24207,24208,24210,24211,24272,24273,24275,24276,24340,24341,24343,24344,24408,24409,24411,24412,24476,24477,24479,24480,24544,24545,24547,24548,24615,24616,24617,24618,24684,24685,24686,24687,24692,24693,24753,24754,24820,24821,24823,24824,24887,24888,24954,24955,24957,24958,25019,25020,25022,25023,25087,25088,25090,25091,25153,25154,25156,25157,25221,25222,25224,25225,25286,25287,25289,25290,25354,25355,25357,25358,25422,25423,25425,25426,25490,25491,25493,25494,25558,25559,25561,25562,25629,25630,25631,25632,25698,25699,25700,25701,25706,25708,25768,25769,25841,25842,25844,25845,25907,25908,25978,25979,25987,25991,25992,25993,26192,26193,26259,26260,26262,26263,26266,26271,26515,26762,26794,26800,26801,26991,28202,28203,28267,28268,28418,28419,28498,28499,28523,28524,28594,28595,28662,28663,28694,28695,28787,28788,28860,28861,28885,28886,28972,28973,29012,29013,29015,29016,29048,29049,29270,29271,29387,29388,29459,29460,29516,29517,29658,29659,29660,29661,29771,29772,29837,29838,29868,29869,29917,29918,29988,29989,30071,30072,30326,30327,30385,30386,30689,30695,30700,30707,30819,30828,30836,30837,30838,30839,30870,30872,30878,30880,30932,30933,30985,30986,31360,31361,31646,229402,229407,257593,258376,262473,262539,262540") == "edc213c8b772a80256bc71b65084a38620b6015b" || 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"), "432,1,38,49,50,130,135,141,142,147,148,211,212,217,218,223,224,229,230,233,234,464,471,1001,1002,3450,3451,12371,12372,12376,12377,13336,13338,13342,13344,13366,13367,13368,13369,13372,13373,13378,13379,13380,13381,13384,13385,13386,13387,13392,13393,13397,13398,13402,13403,13407,13408,13412,13413,13417,13419,13420,13421,13423,13425,13426,13427,13430,13431,13432,13433,13436,13437,13438,13439,13442,13443,13444,13445,13448,13449,13450,13451,13454,13455,13456,13457,13462,13463,13466,13468,13472,13473,13476,13478,13483,13484,13488,13489,13490,13491,13494,13495,13496,13497,13500,13501,13502,13503,13507,13508,13509,13510,13513,13514,13515,13516,13519,13520,13521,13522,13525,13526,13533,13534,13538,13539,13543,13544,13904,13905,14133,14134,14809,14815,16180,16181,21071,21072,22629,22630,22632,22634,22698,22699,22769,22770,22837,22838,22840,22841,22843,22844,22903,22905,22907,22908,22972,22973,23043,23044,23111,23112,23114,23115,23117,23126,23127,23128,23190,23191,23257,23258,23260,23261,23264,23268,23270,23271,23273,23275,23277,23278,23337,23338,23340,23342,23402,23403,23405,23406,23467,23468,23470,23471,23531,23532,23534,23535,23602,23603,23671,23672,23739,23740,23806,23807,23809,23810,23873,23874,23940,23941,23943,23944,24005,24006,24008,24009,24073,24074,24076,24077,24139,24140,24142,24143,24207,24208,24210,24211,24272,24273,24275,24276,24340,24341,24343,24344,24408,24409,24411,24412,24476,24477,24479,24480,24544,24545,24547,24548,24615,24616,24617,24618,24684,24685,24686,24687,24692,24693,24753,24754,24820,24821,24823,24824,24887,24888,24954,24955,24957,24958,25019,25020,25022,25023,25087,25088,25090,25091,25153,25154,25156,25157,25221,25222,25224,25225,25286,25287,25289,25290,25354,25355,25357,25358,25422,25423,25425,25426,25490,25491,25493,25494,25558,25559,25561,25562,25629,25630,25631,25632,25698,25699,25700,25701,25706,25708,25768,25769,25841,25842,25844,25845,25907,25908,25978,25979,25987,25991,25992,25993,26192,26193,26259,26260,26262,26263,26266,26271,26515,26762,26794,26800,26801,26991,28202,28203,28267,28268,28418,28419,28498,28499,28523,28524,28594,28595,28662,28663,28694,28695,28787,28788,28860,28861,28885,28886,28972,28973,29012,29013,29015,29016,29048,29049,29270,29271,29387,29388,29459,29460,29516,29517,29658,29659,29660,29661,29771,29772,29837,29838,29868,29869,29917,29918,29988,29989,30071,30072,30326,30327,30385,30386,30689,30695,30700,30707,30819,30828,30836,30837,30838,30839,30870,30872,30878,30880,30932,30933,30985,30986,31360,31361,31646,229402,229407,257593,258376,262473,262539,262540") && 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"), "292,1,15,32,33,7397,7398,7543,7545,8114,8116,8386,8387,8396,8397,9051,9052,9068,9069,18696,18697,27198,27203,27376,27380,29687,29688,30293,30294,30677,30678,30691,30692,32532,32533,32768,32776,44206,44207,51137,51140,51197,51200,51214,51215,51227,51229,51301,51303,51331,51333,51376,51379,51390,51394,51607,51611,51622,51624,52412,52413,61982,61983,65536,65542,69728,69729,70266,70273,70541,70547,71944,71950,73065,73066,73073,73074,73077,73078,73208,73209,73222,73223,74039,74040,83129,83130,89782,89783,90694,90695,94266,94268,98304,98312,108519,108520,108599,108600,111763,111765,131072,131078,134010,134011,134398,134399,135444,135445,143227,143228,144703,144704,150126,150127,154465,154467,154476,154478,154486,154488,154497,154499,155293,155294,155301,155302,155308,155309,155312,155313,155320,155321,160885,160886,161012,161013,161078,161080,161082,161083,161112,161113,161606,161607,161742,161743,161867,161868,161869,161870,161871,161873,161883,161884,162445,162446,162453,162454,162493,162494,162519,162520,162544,162545,162564,162565,162579,162581,163790,163791,163840,163848,163977,163979,163980,163981,163991,163992,163996,163997,164022,164023,164027,164029,164031,164033,164054,164055,164066,164067,164194,164197,164612,164613,164984,164985,166470,166471,169137,169138,169157,169158,169198,169199,169211,169212,169248,169249,169265,169266,169282,169283,169317,169318,169456,169457,169470,169471,169475,169476,169483,169484,169496,169497,185243,185245,188977,188978,193034,193035,196608,196621,196681,196683,196769,196772,197630,197631,202801,202802,209339,209340,212215,212216,221480,221481,226445,226448,229376,229406,229947,229948,255552,255553,262144,262150,264953,264954,285511,285512,285716,285717,285750,285751,286273,286274,287028,287029,287296,287297,288683,288685,288844,288845,289757,289758,289855,289856,290526,290527,293521,293522,294551,294554,294912,294917,299263,299264,307166,312035,312111,312112") == "8174089a8989dc75024e4d23b443f44a2ed92003" || 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"), "292,1,15,32,33,7397,7398,7543,7545,8114,8116,8386,8387,8396,8397,9051,9052,9068,9069,18696,18697,27198,27203,27376,27380,29687,29688,30293,30294,30677,30678,30691,30692,32532,32533,32768,32776,44206,44207,51137,51140,51197,51200,51214,51215,51227,51229,51301,51303,51331,51333,51376,51379,51390,51394,51607,51611,51622,51624,52412,52413,61982,61983,65536,65542,69728,69729,70266,70273,70541,70547,71944,71950,73065,73066,73073,73074,73077,73078,73208,73209,73222,73223,74039,74040,83129,83130,89782,89783,90694,90695,94266,94268,98304,98312,108519,108520,108599,108600,111763,111765,131072,131078,134010,134011,134398,134399,135444,135445,143227,143228,144703,144704,150126,150127,154465,154467,154476,154478,154486,154488,154497,154499,155293,155294,155301,155302,155308,155309,155312,155313,155320,155321,160885,160886,161012,161013,161078,161080,161082,161083,161112,161113,161606,161607,161742,161743,161867,161868,161869,161870,161871,161873,161883,161884,162445,162446,162453,162454,162493,162494,162519,162520,162544,162545,162564,162565,162579,162581,163790,163791,163840,163848,163977,163979,163980,163981,163991,163992,163996,163997,164022,164023,164027,164029,164031,164033,164054,164055,164066,164067,164194,164197,164612,164613,164984,164985,166470,166471,169137,169138,169157,169158,169198,169199,169211,169212,169248,169249,169265,169266,169282,169283,169317,169318,169456,169457,169470,169471,169475,169476,169483,169484,169496,169497,185243,185245,188977,188978,193034,193035,196608,196621,196681,196683,196769,196772,197630,197631,202801,202802,209339,209340,212215,212216,221480,221481,226445,226448,229376,229406,229947,229948,255552,255553,262144,262150,264953,264954,285511,285512,285716,285717,285750,285751,286273,286274,287028,287029,287296,287297,288683,288685,288844,288845,289757,289758,289855,289856,290526,290527,293521,293522,294551,294554,294912,294917,299263,299264,307166,312035,312111,312112") && 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"), "128,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28507,28508,29696,29699,29706,29707,29945,29946,30012,30013,30209,30210,30214,30215,30220,30221,30660,30661,30673,30674,30680,30681,30693,30694,30705,30706,30711,30712,30718,30719,30732,30733,30745,30746,30774,30775,30793,30794,30924,30925,31012,31013,31032,31033,31035,31036,31037,31038,31039,31041,31042,31043,31044,31045,31075,31087,31089,31090,31091,31092,31825,32069,32768,32795,33548,33549,34663,34664,34693,34694,35070,35945,36061,36062,36211,36212,37475,37746,38216,38225,38542,38563,39001,39002,39054,39055,39364,39365,39714,39715,44691,44692,49155,57723,58398,58410,58820,58851,59584,59585,59646,59647,59966,59967,65536,65552,72074,74435,76410,131084,131088,133084,133484,135602,135645,135646") == "a8e03c00e2d22acff7bf1c24a340ee585f564a00" || 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"), "128,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28507,28508,29696,29699,29706,29707,29945,29946,30012,30013,30209,30210,30214,30215,30220,30221,30660,30661,30673,30674,30680,30681,30693,30694,30705,30706,30711,30712,30718,30719,30732,30733,30745,30746,30774,30775,30793,30794,30924,30925,31012,31013,31032,31033,31035,31036,31037,31038,31039,31041,31042,31043,31044,31045,31075,31087,31089,31090,31091,31092,31825,32069,32768,32795,33548,33549,34663,34664,34693,34694,35070,35945,36061,36062,36211,36212,37475,37746,38216,38225,38542,38563,39001,39002,39054,39055,39364,39365,39714,39715,44691,44692,49155,57723,58398,58410,58820,58851,59584,59585,59646,59647,59966,59967,65536,65552,72074,74435,76410,131084,131088,133084,133484,135602,135645,135646") && 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/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/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/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 ---


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

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

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