getprop("ro.product.device") == "dipper" || abort("E3004: This package is for \"dipper\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/dipper/dipper:10/QKQ1.190828.002/V11.0.4.0.QEAMIXM:user/release-keys");
ui_print("Target: Xiaomi/dipper/dipper:10/QKQ1.190828.002/V11.0.5.0.QEAMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/dipper/dipper:10/QKQ1.190828.002/V11.0.4.0.QEAMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/dipper/dipper:10/QKQ1.190828.002/V11.0.5.0.QEAMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/dipper/dipper:10/QKQ1.190828.002/V11.0.4.0.QEAMIXM:user/release-keys or Xiaomi/dipper/dipper:10/QKQ1.190828.002/V11.0.5.0.QEAMIXM: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:45520202:06c817e7cb5c172d4f8e8510006ff0ae3db34e4e",
                      "EMMC:/dev/block/bootdevice/by-name/boot:45516106:935a9b94b9ed5a171cf954e64b5de4697b3349be") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:45520202:06c817e7cb5c172d4f8e8510006ff0ae3db34e4e\" or \"EMMC:/dev/block/bootdevice/by-name/boot:45516106:935a9b94b9ed5a171cf954e64b5de4697b3349be\" has unexpected contents.");
apply_patch_space(45520202) || 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", "456,1,540,698,712,744,751,753,754,1000,1005,1007,1008,1114,1115,1599,1600,2288,2289,2291,2293,2294,2295,2310,2311,2492,2493,3664,3665,3667,3668,3672,3673,3681,3682,3683,3684,9041,9042,9044,9045,9449,9450,9452,9453,10449,10451,16390,16391,16524,16525,19294,19296,25606,25608,32768,32770,32959,32960,34743,34744,34746,34748,34807,34808,34941,34943,34996,34997,35011,35012,35024,35025,35638,35641,35647,35648,35653,35654,35771,35774,36831,36832,36862,36863,37008,37009,37106,38519,39731,39732,39745,39746,39748,39749,41925,41926,42296,42297,42384,42385,42576,42577,45159,45160,45163,45164,45169,45170,45474,45475,49166,49167,49328,49329,49733,49734,50418,50419,50423,50424,50446,50447,52038,52039,52097,52098,52134,52135,56778,56780,61383,61384,61571,61572,62874,62875,63012,63013,63045,63046,63496,63497,64179,64180,65409,65410,65536,65537,66092,66093,68890,68891,71024,71025,71510,71511,73463,73464,73490,73491,73562,73563,78211,78214,80668,80669,82064,82065,82438,82439,82585,82586,82937,82938,96412,96413,96638,96641,98304,98306,98495,98496,99626,99627,99843,99844,99895,99896,99899,99902,101759,101760,101843,101844,101846,101847,101868,101869,102300,102303,102668,102671,102837,102838,103140,103143,103183,103184,104625,104626,104646,104647,104697,104698,105048,105049,105070,105071,105142,105143,105757,105758,109334,109335,109340,109341,109443,109444,110910,110911,111897,111900,112348,112349,112353,112354,112366,112367,112371,112372,112383,112384,112407,112408,114004,114005,114139,114140,114412,114415,114418,114419,115337,115338,115604,115607,117428,117429,117753,117754,120167,120168,120180,120181,120517,120518,121678,121690,122261,122262,122696,122697,123560,123671,124454,124455,124810,124819,125086,125150,127204,127209,127215,127216,127527,127528,127540,127541,127551,127554,127555,127556,127557,127558,127560,127561,127562,127563,127602,127603,127609,127610,127694,127695,127700,127701,128808,128809,129049,129050,129056,129057,129080,129081,129146,129147,129150,129155,129156,129157,129158,129159,129160,129161,129940,129941,129947,129948,130411,130413,130876,130878,130879,130880,130881,130882,130883,130884,130885,130886,130887,130888,130889,130890,130892,130893,130894,130897,131072,131073,132071,132073,132074,132075,132158,132159,132161,134081,134084,134086,134344,134345,134352,134354,134842,134844,134966,134967,134978,134979,135245,135246,135359,135360,135376,135378,135380,135381,144303,144304,152267,152268,154171,154172,154449,154538,155724,156010,157331,163842,164031,164032,164538,171866,172098,174199,176795,176897,176959,176960,178299,178650,180219,196609,197115,197336,197615,200185,203213,203223,204251,204252,213982,229378,229567,229568,230074,262145,262651,294914,295103,295104,295610,327681,328187,360449,360955,393217,393723,425985,426491,458753,459259,491521,492027,524289,524795,557057,557563,589825,590331,622593,623099,655361,655867,688129,688635,720897,721403,753665,754171,755854,774155,780254,780261,780665") == "2d68ae35be280408bbd7039dc1d2797da97267e7" || 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", "456,1,540,698,712,744,751,753,754,1000,1005,1007,1008,1114,1115,1599,1600,2288,2289,2291,2293,2294,2295,2310,2311,2492,2493,3664,3665,3667,3668,3672,3673,3681,3682,3683,3684,9041,9042,9044,9045,9449,9450,9452,9453,10449,10451,16390,16391,16524,16525,19294,19296,25606,25608,32768,32770,32959,32960,34743,34744,34746,34748,34807,34808,34941,34943,34996,34997,35011,35012,35024,35025,35638,35641,35647,35648,35653,35654,35771,35774,36831,36832,36862,36863,37008,37009,37106,38519,39731,39732,39745,39746,39748,39749,41925,41926,42296,42297,42384,42385,42576,42577,45159,45160,45163,45164,45169,45170,45474,45475,49166,49167,49328,49329,49733,49734,50418,50419,50423,50424,50446,50447,52038,52039,52097,52098,52134,52135,56778,56780,61383,61384,61571,61572,62874,62875,63012,63013,63045,63046,63496,63497,64179,64180,65409,65410,65536,65537,66092,66093,68890,68891,71024,71025,71510,71511,73463,73464,73490,73491,73562,73563,78211,78214,80668,80669,82064,82065,82438,82439,82585,82586,82937,82938,96412,96413,96638,96641,98304,98306,98495,98496,99626,99627,99843,99844,99895,99896,99899,99902,101759,101760,101843,101844,101846,101847,101868,101869,102300,102303,102668,102671,102837,102838,103140,103143,103183,103184,104625,104626,104646,104647,104697,104698,105048,105049,105070,105071,105142,105143,105757,105758,109334,109335,109340,109341,109443,109444,110910,110911,111897,111900,112348,112349,112353,112354,112366,112367,112371,112372,112383,112384,112407,112408,114004,114005,114139,114140,114412,114415,114418,114419,115337,115338,115604,115607,117428,117429,117753,117754,120167,120168,120180,120181,120517,120518,121678,121690,122261,122262,122696,122697,123560,123671,124454,124455,124810,124819,125086,125150,127204,127209,127215,127216,127527,127528,127540,127541,127551,127554,127555,127556,127557,127558,127560,127561,127562,127563,127602,127603,127609,127610,127694,127695,127700,127701,128808,128809,129049,129050,129056,129057,129080,129081,129146,129147,129150,129155,129156,129157,129158,129159,129160,129161,129940,129941,129947,129948,130411,130413,130876,130878,130879,130880,130881,130882,130883,130884,130885,130886,130887,130888,130889,130890,130892,130893,130894,130897,131072,131073,132071,132073,132074,132075,132158,132159,132161,134081,134084,134086,134344,134345,134352,134354,134842,134844,134966,134967,134978,134979,135245,135246,135359,135360,135376,135378,135380,135381,144303,144304,152267,152268,154171,154172,154449,154538,155724,156010,157331,163842,164031,164032,164538,171866,172098,174199,176795,176897,176959,176960,178299,178650,180219,196609,197115,197336,197615,200185,203213,203223,204251,204252,213982,229378,229567,229568,230074,262145,262651,294914,295103,295104,295610,327681,328187,360449,360955,393217,393723,425985,426491,458753,459259,491521,492027,524289,524795,557057,557563,589825,590331,622593,623099,655361,655867,688129,688635,720897,721403,753665,754171,755854,774155,780254,780261,780665") && 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", "246,1,221,570,578,588,589,670,671,693,694,798,799,863,864,866,877,882,883,885,886,894,895,1135,1161,3047,3048,3102,3152,3543,3544,4574,4580,6657,6658,6776,6777,7661,7662,8345,8346,8955,8961,11214,11216,18824,18825,23497,23498,32768,32770,32832,32833,43486,43487,46339,46340,50314,50315,62984,62985,65536,65537,68247,68248,69253,69255,69398,69399,69761,69763,70172,70173,70225,70226,72160,72163,72181,72182,72227,72228,72246,72247,72249,72250,72298,72299,72326,72327,72923,72924,72949,72950,72984,72985,73321,73322,73339,73340,86428,86430,92566,92567,92569,92570,93145,93147,98304,98306,98368,98369,100024,100025,100034,100035,100073,100074,100075,100076,100095,100096,100521,100522,100575,100576,100917,100919,100920,100926,100934,100936,100942,100953,101003,101004,101006,101010,101148,101149,108756,108757,110674,110675,117671,117673,118650,118651,119432,120232,127949,127950,131072,131073,148834,148835,150736,150814,150905,151054,163840,163842,163904,163905,171828,172038,172725,172726,172899,172905,185633,185634,186329,186330,186353,186354,187149,187652,187654,190374,190391,190393,190624,190625,192183,192184,195129,195131,196199,196200,196292,196293,196556,196558,196608,196609,198515,198516,199544,199545,199858,199859,206190,206284,206382,206585,214227,214228,221807,221808,223113,223412,224337,224345,229376,229378,229440,229441,232459,232460,232939,232940,238337,238338,238362,238363,239529,239530,244177,244178,248055,248057,248134,248138,248168,248169,253630,253632,253656,253657,253682,253713,253719,253727,258044,260078,260085,260208") == "d4081e99233cd93abeb3bf4af4eceb2d6640b149" || 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", "246,1,221,570,578,588,589,670,671,693,694,798,799,863,864,866,877,882,883,885,886,894,895,1135,1161,3047,3048,3102,3152,3543,3544,4574,4580,6657,6658,6776,6777,7661,7662,8345,8346,8955,8961,11214,11216,18824,18825,23497,23498,32768,32770,32832,32833,43486,43487,46339,46340,50314,50315,62984,62985,65536,65537,68247,68248,69253,69255,69398,69399,69761,69763,70172,70173,70225,70226,72160,72163,72181,72182,72227,72228,72246,72247,72249,72250,72298,72299,72326,72327,72923,72924,72949,72950,72984,72985,73321,73322,73339,73340,86428,86430,92566,92567,92569,92570,93145,93147,98304,98306,98368,98369,100024,100025,100034,100035,100073,100074,100075,100076,100095,100096,100521,100522,100575,100576,100917,100919,100920,100926,100934,100936,100942,100953,101003,101004,101006,101010,101148,101149,108756,108757,110674,110675,117671,117673,118650,118651,119432,120232,127949,127950,131072,131073,148834,148835,150736,150814,150905,151054,163840,163842,163904,163905,171828,172038,172725,172726,172899,172905,185633,185634,186329,186330,186353,186354,187149,187652,187654,190374,190391,190393,190624,190625,192183,192184,195129,195131,196199,196200,196292,196293,196556,196558,196608,196609,198515,198516,199544,199545,199858,199859,206190,206284,206382,206585,214227,214228,221807,221808,223113,223412,224337,224345,229376,229378,229440,229441,232459,232460,232939,232940,238337,238338,238362,238363,239529,239530,244177,244178,248055,248057,248134,248138,248168,248169,253630,253632,253656,253657,253682,253713,253719,253727,258044,260078,260085,260208") && 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);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:45520202:06c817e7cb5c172d4f8e8510006ff0ae3db34e4e",
                "EMMC:/dev/block/bootdevice/by-name/boot:45516106:935a9b94b9ed5a171cf954e64b5de4697b3349be",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:45516106:935a9b94b9ed5a171cf954e64b5de4697b3349be");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_a");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_b");
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.");
show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_a");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_a");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_a");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_a");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_a");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_a");
package_extract_file("firmware-update/bluetooth.img", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_a");
package_extract_file("firmware-update/modem.img", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_a");
package_extract_file("firmware-update/dsp.img", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_a");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_a");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_a");
