getprop("ro.product.device") == "toco" || abort("E3004: This package is for \"toco\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.7.0.QFNMIXM:user/release-keys");
ui_print("Target: Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.8.0.QFNMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.7.0.QFNMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.8.0.QFNMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.7.0.QFNMIXM:user/release-keys or Xiaomi/toco_global/toco:10/QKQ1.190825.002/V11.0.8.0.QFNMIXM: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:134217728:ae3fcc0dfaf6f32cdfb0a1118e8091327424c14a",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:d05fcc754bf07f8838dc0578518c3f2a6d634656") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:ae3fcc0dfaf6f32cdfb0a1118e8091327424c14a\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:d05fcc754bf07f8838dc0578518c3f2a6d634656\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "42,1,186,219,228,230,231,477,481,493,494,513,514,1831,1832,2255,26123,26129,26130,27497,27498,32725,32726,32768,32770,32918,32940,33112,98306,98454,163842,163990,229378,229526,294914,295062,589832,589846,606045,607908,617542,617674,617675") == "b5740e0464a2419a6307be9a6d7daf7205564b20" || 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"), "42,1,186,219,228,230,231,477,481,493,494,513,514,1831,1832,2255,26123,26129,26130,27497,27498,32725,32726,32768,32770,32918,32940,33112,98306,98454,163842,163990,229378,229526,294914,295062,589832,589846,606045,607908,617542,617674,617675") && 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"), "340,1,98,108,112,117,118,199,203,208,209,1915,1919,2397,2398,2659,2663,2667,2668,2670,2681,2703,2704,2740,2744,2794,2795,2807,2811,2815,2816,2819,2825,2826,2827,3150,3151,3156,3160,3173,3174,3182,3186,3190,3191,3689,3739,3758,4063,4140,4141,14661,14662,14777,14828,15422,15423,15427,15429,15432,15434,15437,15439,15442,15444,15447,15449,15452,15454,15458,15460,15461,15462,15464,15466,15467,15468,15470,15472,15473,15474,15482,15484,15485,15486,15488,15490,15491,15492,15496,15497,15501,15503,15506,15508,15511,15513,15516,15518,15521,15523,15524,15525,15534,15535,15536,15537,15558,15559,15560,15561,15566,15567,15571,15572,15576,15577,15581,15582,15587,15588,15592,15593,15594,15595,15598,15599,15600,15601,15604,15605,15606,15607,15959,15960,16980,16983,26676,26677,28373,28374,32768,32770,32836,32866,35749,35750,36137,36138,36512,36513,37518,37520,37537,37539,37988,37989,38064,38065,41620,41623,41640,41641,41678,41679,41688,41689,41691,41692,41740,41747,41787,41788,41794,41795,41820,41821,42802,42803,42960,42961,42963,42965,43026,43027,43029,43030,43094,43095,43163,43164,43166,43167,43230,43231,43300,43301,43303,43304,43367,43368,43437,43438,43504,43505,43507,43508,43569,43570,43572,43573,43633,43634,43636,43637,43698,43699,43701,43702,43762,43763,43765,43766,43827,43828,43830,43831,43836,43838,43842,43843,43915,43916,43918,43919,43982,43983,43985,43986,44050,44051,44053,44054,44117,44118,44187,44188,44254,44255,44257,44258,44319,44320,44322,44323,44383,44384,44386,44387,44448,44449,44451,44452,44512,44513,44515,44516,44577,44578,44580,44581,44585,44586,44649,44650,44718,44719,44721,44722,44785,44786,44788,44789,44853,44854,44856,44857,44923,44924,44990,44991,44993,44994,45055,45056,45058,45059,45119,45120,45122,45123,45184,45185,45187,45188,45248,45249,45251,45252,45313,45314,45316,45317,51950,51951,61853,61854,62198,62199,62200,62201,62242,62244,62249,62251,62396,62425,62785,98306,98372,163842,163908,229378,229444,262160,262166,270136,271065,275362,275430,275431") == "a0765d4403df1a91c26e53845ded63f86721904d" || 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"), "340,1,98,108,112,117,118,199,203,208,209,1915,1919,2397,2398,2659,2663,2667,2668,2670,2681,2703,2704,2740,2744,2794,2795,2807,2811,2815,2816,2819,2825,2826,2827,3150,3151,3156,3160,3173,3174,3182,3186,3190,3191,3689,3739,3758,4063,4140,4141,14661,14662,14777,14828,15422,15423,15427,15429,15432,15434,15437,15439,15442,15444,15447,15449,15452,15454,15458,15460,15461,15462,15464,15466,15467,15468,15470,15472,15473,15474,15482,15484,15485,15486,15488,15490,15491,15492,15496,15497,15501,15503,15506,15508,15511,15513,15516,15518,15521,15523,15524,15525,15534,15535,15536,15537,15558,15559,15560,15561,15566,15567,15571,15572,15576,15577,15581,15582,15587,15588,15592,15593,15594,15595,15598,15599,15600,15601,15604,15605,15606,15607,15959,15960,16980,16983,26676,26677,28373,28374,32768,32770,32836,32866,35749,35750,36137,36138,36512,36513,37518,37520,37537,37539,37988,37989,38064,38065,41620,41623,41640,41641,41678,41679,41688,41689,41691,41692,41740,41747,41787,41788,41794,41795,41820,41821,42802,42803,42960,42961,42963,42965,43026,43027,43029,43030,43094,43095,43163,43164,43166,43167,43230,43231,43300,43301,43303,43304,43367,43368,43437,43438,43504,43505,43507,43508,43569,43570,43572,43573,43633,43634,43636,43637,43698,43699,43701,43702,43762,43763,43765,43766,43827,43828,43830,43831,43836,43838,43842,43843,43915,43916,43918,43919,43982,43983,43985,43986,44050,44051,44053,44054,44117,44118,44187,44188,44254,44255,44257,44258,44319,44320,44322,44323,44383,44384,44386,44387,44448,44449,44451,44452,44512,44513,44515,44516,44577,44578,44580,44581,44585,44586,44649,44650,44718,44719,44721,44722,44785,44786,44788,44789,44853,44854,44856,44857,44923,44924,44990,44991,44993,44994,45055,45056,45058,45059,45119,45120,45122,45123,45184,45185,45187,45188,45248,45249,45251,45252,45313,45314,45316,45317,51950,51951,61853,61854,62198,62199,62200,62201,62242,62244,62249,62251,62396,62425,62785,98306,98372,163842,163908,229378,229444,262160,262166,270136,271065,275362,275430,275431") && 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"), "356,1,90,5380,5381,5396,5400,5404,5405,8049,8050,9626,9627,9673,9677,11797,11800,11804,11805,11844,11845,11852,11858,11859,11860,11866,11872,11873,11874,11934,11938,11943,11944,14699,14700,18172,18173,20580,20581,20944,20948,21455,21456,21468,21474,21475,21476,23316,23320,24757,24758,28770,28774,32761,32762,32768,32770,32839,32850,39733,39734,40139,40140,47305,47306,55308,55309,56772,56773,65536,65547,67853,67854,69980,69981,70335,70336,70850,70851,75354,75355,80197,80198,80204,80205,80211,80217,80218,80219,80347,80353,80354,80355,80367,80373,80374,80375,80378,80379,80385,80391,80392,80393,80416,80422,80423,80424,81268,81269,94715,94716,94735,94736,96416,96418,98304,98306,98375,98386,110294,110295,110709,110710,111308,111309,117692,117693,122445,122446,124697,124698,124885,124886,124897,124903,124904,124905,124915,124916,124921,124925,124930,124931,124937,124943,124944,124945,124957,124963,124964,124965,124975,124981,124982,124983,124985,124992,124998,124999,126756,126757,126763,126764,126898,126899,128107,128114,128168,128175,128180,128187,128212,128219,128239,128246,128264,128271,128287,128288,128330,128332,128508,128509,128510,128511,128512,128513,128514,128515,128552,128553,128554,128555,128560,128561,128832,128836,128840,128844,128845,128847,128852,128856,128857,128861,128862,128866,128867,128871,128872,128876,128877,128881,128882,128886,128887,128889,128896,128900,128901,128905,128906,128910,128911,128915,128916,128918,128919,128923,128924,128928,128929,128931,128932,128936,128937,128941,128942,128946,128947,128951,128952,128956,128957,128961,128962,128964,128968,128972,128973,128977,128978,128982,128983,128985,128986,128990,128991,128993,128994,128998,128999,129001,129002,129006,129007,129011,129012,129016,129017,129060,129063,129158,130026,130027,131072,131083,133579,133580,134434,134435,139128,139129,140316,140319,143211,143213,143223,143267,150389,150391,155370,155372,155380,155382,157364,157366,161513,161514,163431,163432,163840,163842,163911,163924,165128,165130,165155,165156,165178,165180,174594,174595,174598,174599,175201,175203,175629,175631,177548,177550,177720,177721,180553,180554,184065,184067,184112,184114,184239,184241,185495,185497,186574,186576,187036,187037,189309,189310,192942,192943,195575,195576,196608,196648,200479,200481,200499,229378,229447,262151,262155,284340,285204,289727,289797,289798") == "52e490dbc1c1f1516beaaeef6f0fda5c3395637d" || 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
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "356,1,90,5380,5381,5396,5400,5404,5405,8049,8050,9626,9627,9673,9677,11797,11800,11804,11805,11844,11845,11852,11858,11859,11860,11866,11872,11873,11874,11934,11938,11943,11944,14699,14700,18172,18173,20580,20581,20944,20948,21455,21456,21468,21474,21475,21476,23316,23320,24757,24758,28770,28774,32761,32762,32768,32770,32839,32850,39733,39734,40139,40140,47305,47306,55308,55309,56772,56773,65536,65547,67853,67854,69980,69981,70335,70336,70850,70851,75354,75355,80197,80198,80204,80205,80211,80217,80218,80219,80347,80353,80354,80355,80367,80373,80374,80375,80378,80379,80385,80391,80392,80393,80416,80422,80423,80424,81268,81269,94715,94716,94735,94736,96416,96418,98304,98306,98375,98386,110294,110295,110709,110710,111308,111309,117692,117693,122445,122446,124697,124698,124885,124886,124897,124903,124904,124905,124915,124916,124921,124925,124930,124931,124937,124943,124944,124945,124957,124963,124964,124965,124975,124981,124982,124983,124985,124992,124998,124999,126756,126757,126763,126764,126898,126899,128107,128114,128168,128175,128180,128187,128212,128219,128239,128246,128264,128271,128287,128288,128330,128332,128508,128509,128510,128511,128512,128513,128514,128515,128552,128553,128554,128555,128560,128561,128832,128836,128840,128844,128845,128847,128852,128856,128857,128861,128862,128866,128867,128871,128872,128876,128877,128881,128882,128886,128887,128889,128896,128900,128901,128905,128906,128910,128911,128915,128916,128918,128919,128923,128924,128928,128929,128931,128932,128936,128937,128941,128942,128946,128947,128951,128952,128956,128957,128961,128962,128964,128968,128972,128973,128977,128978,128982,128983,128985,128986,128990,128991,128993,128994,128998,128999,129001,129002,129006,129007,129011,129012,129016,129017,129060,129063,129158,130026,130027,131072,131083,133579,133580,134434,134435,139128,139129,140316,140319,143211,143213,143223,143267,150389,150391,155370,155372,155380,155382,157364,157366,161513,161514,163431,163432,163840,163842,163911,163924,165128,165130,165155,165156,165178,165180,174594,174595,174598,174599,175201,175203,175629,175631,177548,177550,177720,177721,180553,180554,184065,184067,184112,184114,184239,184241,185495,185497,186574,186576,187036,187037,189309,189310,192942,192943,195575,195576,196608,196648,200479,200481,200499,229378,229447,262151,262155,284340,285204,289727,289797,289798") && 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"), "8,1,11,12,15,207,213,229,230") == "fb4b5f13632a7cf396cd46d5771a2d176a83e29f" || 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
check_first_block(map_partition("odm"));
ifelse (block_image_recover(map_partition("odm"), "8,1,11,12,15,207,213,229,230") && 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;

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

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

# ---- 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/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/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
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/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
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/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/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");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Patch partition vendor

ui_print("Patching vendor image after verification.");
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.");

# Update dynamic partition metadata

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

# Patch partition product

ui_print("Patching product image after verification.");
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

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

ui_print("Patching odm image after verification.");
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 ---

show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
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");
