getprop("ro.product.device") == "citrus" || abort("E3004: This package is for \"citrus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/citrus_id/citrus:11/RKQ1.201004.002/V12.5.5.0.RJFIDXM:user/release-keys");
ui_print("Target: POCO/citrus_id/citrus:11/RKQ1.201004.002/V12.5.6.0.RJFIDXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/citrus_id/citrus:11/RKQ1.201004.002/V12.5.5.0.RJFIDXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/citrus_id/citrus:11/RKQ1.201004.002/V12.5.6.0.RJFIDXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/citrus_id/citrus:11/RKQ1.201004.002/V12.5.5.0.RJFIDXM:user/release-keys or POCO/citrus_id/citrus:11/RKQ1.201004.002/V12.5.6.0.RJFIDXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:e2920baac77974611f8ea966a5141450b74e29e4"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:c3a3a00b65c7533ac14b3ee88f7584a892fd92a8")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:e2920baac77974611f8ea966a5141450b74e29e4"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:c3a3a00b65c7533ac14b3ee88f7584a892fd92a8"),"\" has unexpected contents."));
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "1376,1,32,44,54,74,78,106,107,21362,21363,21393,21394,27558,27559,28973,43324,50490,56685,56692,56693,58035,58036,60193,60194,62746,62747,63489,63490,65020,65021,65211,65212,65536,65552,66454,66455,70808,70809,71923,71924,73921,73922,74402,74403,77553,77554,78132,78133,78320,78321,79025,79026,79242,79244,79405,79409,79417,79418,84296,84297,84309,84313,84317,84318,85738,85744,85777,85778,85784,85790,85791,85792,85797,85803,85804,85805,89301,89305,89345,89346,90327,90328,90978,90979,92910,92913,92921,92922,92944,92945,92949,92950,93385,93386,93560,93561,93592,93598,93599,93600,93720,93726,93727,93728,95062,95063,98030,98031,98304,98322,99059,99063,99101,99102,99116,99122,99123,99124,104852,104856,104922,104923,106011,106015,106036,106037,106685,106686,106790,106805,106810,106813,106814,106850,107136,107137,107153,107154,107285,107286,107288,107289,107291,107292,114583,114587,114613,114614,114743,114747,114753,114754,114887,114891,114898,114899,120182,120186,120255,120256,120284,120285,120323,120329,120330,120331,120579,120580,120613,120619,120620,120621,121096,121100,121116,121117,121669,121675,121676,121677,123547,123551,123596,123597,123601,123607,123608,123609,123640,123646,123647,123648,125338,125342,125366,125367,125391,125392,125394,125395,125396,125397,125398,125399,125429,125430,129370,129374,129411,129412,131072,131088,131193,131197,131215,131216,131245,131246,131251,131257,131258,131259,131460,131464,131604,131605,133410,133414,133456,133457,135990,135991,137106,137108,137109,137110,137144,137148,137165,137166,137171,137172,137622,137626,138028,138029,138719,138723,138739,138740,140855,140859,140887,140888,140899,140900,141183,141187,141197,141198,141235,141236,143934,143935,150053,150057,150144,150145,151359,151360,151504,151505,151670,151674,151701,151702,152343,152347,152367,152368,155641,155642,158913,158917,158942,158943,158962,158963,161370,161371,162021,162025,162081,162082,163840,163858,163893,163897,163935,163936,163977,163983,163989,163990,167643,167644,168294,168300,168341,168342,168363,168364,171688,171689,173788,173792,173823,173824,174955,174961,174984,174985,175162,175163,176481,176487,176509,176510,178459,178463,178493,178494,179188,179189,179850,179854,179876,179877,182078,182082,182114,182115,196608,196624,204883,204884,206751,206752,206927,206928,208677,208681,208849,208850,208942,208943,216289,216291,220499,220500,225685,225689,225760,225761,225813,225814,227512,227513,228426,228430,228455,228456,228469,228470,228473,228479,228484,228485,229376,229394,231872,231873,233521,233525,233572,233573,233604,233605,233607,233611,233612,233613,233657,233665,233666,233667,236487,236493,236538,236539,236570,236576,236577,236578,236620,236626,236627,236628,238950,238951,239964,239968,240007,240008,240090,240094,240099,240100,240111,240117,240118,240119,240686,240690,240705,240706,241929,241933,241959,241960,251331,251408,253323,253324,253350,253351,256286,256290,256456,256457,256536,256537,256545,256551,256552,256553,257842,257846,257868,257869,259542,259546,259563,259564,260620,260621,262144,262160,262272,262276,262304,262305,262312,262318,262319,262320,262325,262329,262334,262335,262339,262340,262355,262361,262362,262363,263346,263350,265098,265099,265123,265129,265130,265131,267547,267548,269871,269875,269946,269947,270295,270299,270312,270313,271657,271663,271682,271683,271692,271698,271699,271700,273147,273151,274588,274589,274613,274614,279445,279446,280481,280482,281606,281607,283258,283262,283345,283346,283382,283386,285900,285904,285918,285919,286416,286420,286428,286429,288075,288076,289417,289418,289424,289431,289444,289445,290055,290056,291056,291072,291595,291596,294868,294869,294912,294930,297695,297700,297701,297702,297703,297704,297705,297706,297707,297708,297709,297710,297711,297712,297713,297714,297715,297716,297717,297718,297719,297720,297721,297722,297723,297724,297725,297726,297727,297728,297729,297730,297731,297732,297733,297734,297735,297736,297737,297738,297739,297740,297741,297742,297743,297744,297745,297746,297747,297748,297749,297750,297751,297752,297753,297754,297755,297756,297757,297758,297759,297760,297761,297762,297763,297764,297765,297766,297767,297768,297769,297770,297771,297772,297773,297774,297775,297776,297777,297778,297779,297780,297781,297782,297783,297784,297785,297786,297787,297788,297789,297790,297791,297792,297793,297794,297795,297796,297797,297798,297799,297800,297801,297802,297803,297804,297805,297806,297807,297808,297809,297810,297811,297812,297813,297814,297815,297816,297817,297818,297819,297820,297821,297822,297823,297824,297825,297826,297827,297828,297829,297830,297831,297832,297833,297834,297835,297836,297837,297838,297839,297840,297841,297842,297843,297844,297845,297846,297847,297848,297849,297850,297851,297852,297853,297854,297855,297856,297857,297858,297859,297860,297861,297862,297863,297864,297865,297866,297867,297868,297869,297870,297871,297872,297873,297874,297875,297876,297877,297878,297879,297880,297881,297882,297883,297884,297885,297886,297887,297888,297889,297890,297891,297892,297893,297894,297895,297896,297897,297898,297899,297900,297901,297902,297903,297904,297905,297906,297907,297908,297909,297910,297911,297912,297913,297914,297915,297916,297917,297918,297919,297920,297921,297922,297923,297924,297925,297926,297927,297928,297929,297930,297931,297932,297933,297934,297935,297936,297937,297938,297939,297940,297941,297942,297943,297944,297945,297946,297947,297948,297949,297950,297951,297952,297953,297954,297955,297956,297957,297958,297959,297960,297961,297962,297963,297964,297965,297966,297967,297968,297969,297970,297971,297972,297973,297974,297975,297976,297977,297978,297979,297980,297981,297982,297983,297984,297985,297986,297987,297988,297989,297990,297991,297992,297993,297994,297995,297996,297997,297998,297999,298000,298001,298002,298003,298004,298005,298006,298007,298008,298009,298010,298011,298012,298013,298014,298015,298016,298017,298018,298019,298020,298021,298022,298023,298024,298025,298026,298027,298028,298029,298030,298031,298032,298033,298034,298035,298036,298037,298038,298039,298040,298041,298042,298043,298044,298045,298046,298047,298048,298049,298050,298051,298052,298053,298054,298055,298056,298057,298058,298059,298060,298061,298062,298063,298064,298065,298066,298067,298068,298069,298070,298071,298072,298073,298074,298075,298076,298077,298078,298079,298080,298081,298082,298083,298084,298085,298086,298087,298088,298089,298090,298091,298092,298093,298094,298095,298096,298097,298098,298099,298100,298101,298102,298103,298104,298105,298106,298107,298108,298109,298110,298111,298112,298113,298114,298115,298116,298117,298118,298119,298120,298121,298122,298123,298124,298125,298126,298127,298128,298129,298130,298131,298132,298133,298134,298135,298136,298137,298138,298139,298140,298141,298142,298143,298145,298150,298151,304051,304052,305391,305392,305396,305397,309729,309730,309876,309877,312662,312663,312988,312989,312991,313013,313025,313026,313033,313034,313068,313069,313074,313075,313100,313101,313184,313185,313193,313194,313256,313257,313260,313265,313266,313267,313268,313269,313270,313271,314194,314195,314202,314203,314756,314757,314758,314762,314763,314764,314765,314766,314767,314768,314769,314770,314771,314772,314773,314774,314775,314776,314778,314779,314780,314783,316027,316029,316169,316170,316174,316176,316434,316435,316437,316439,316982,316983,316998,316999,317016,317017,317163,317164,317172,317174,317176,317177,326200,326201,327680,327696,334151,334152,336136,336137,336767,336770,336776,336777,336782,336783,336788,336839,336844,340179,340184,340191,340205,340211,340221,340222,340227,340228,340233,340346,340358,340359,340363,340407,340416,340418,340424,340425,340430,340431,340436,340491,340496,344280,344285,344292,344304,344309,344317,344318,344323,344324,344329,344446,344451,344452,344456,344502,344523,344534,345636,345637,350306,350307,350433,350434,350560,350561,350595,350596,350919,350920,351268,351269,351285,351286,351292,351293,351299,351300,351604,351605,351769,351770,351775,351776,351777,351778,351779,351780,351781,351782,351783,351784,351786,351787,351788,351789,351790,351791,351792,351793,351794,351795,351796,351797,351798,351799,351800,351801,351802,351803,351804,351805,351806,351807,351808,351809,351810,351811,351812,351813,351814,351815,351816,351817,351818,351819,351822,351823,351824,351825,351826,351827,351828,351829,351830,351831,351832,351833,351835,351836,351837,351838,351969,351970,351997,351998,352019,352020,352027,352028,352047,352048,352090,352091,352143,352144,352212,352213,352267,352268,352269,352270,352271,352272,352273,352274,352276,352277,352278,352279,352280,352281,352282,352283,352284,352285,352286,352287,352288,352289,352290,352291,352292,352293,352294,352295,352296,352297,352298,352299,352300,352301,352302,352303,352304,352305,352306,352307,352403,352404,352405,352406,352407,352408,352409,352410,352411,352412,352413,352414,352415,352416,352418,352419,352420,352421,352422,352423,352424,352425,352426,352427,352428,352429,352430,352431,352432,352433,352434,352435,352436,352437,352438,352439,352440,352441,352442,352443,352444,352445,352446,352447,352448,352449,352450,352451,352452,352453,352454,352455,352456,352457,352458,352459,352460,352461,352462,352463,352464,352465,352487,352488,352658,352659,352736,352737,352772,352773,352784,352785,352828,352830,352941,352942,352985,352986,353002,353003,353014,353015,353375,353376,353646,353647,353896,353897,354828,720904,720912,735281,737503,749189,749346,749347") == "d2ce465d80dde22ecd0e24c7a437972bc5db8177" || 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"), "1376,1,32,44,54,74,78,106,107,21362,21363,21393,21394,27558,27559,28973,43324,50490,56685,56692,56693,58035,58036,60193,60194,62746,62747,63489,63490,65020,65021,65211,65212,65536,65552,66454,66455,70808,70809,71923,71924,73921,73922,74402,74403,77553,77554,78132,78133,78320,78321,79025,79026,79242,79244,79405,79409,79417,79418,84296,84297,84309,84313,84317,84318,85738,85744,85777,85778,85784,85790,85791,85792,85797,85803,85804,85805,89301,89305,89345,89346,90327,90328,90978,90979,92910,92913,92921,92922,92944,92945,92949,92950,93385,93386,93560,93561,93592,93598,93599,93600,93720,93726,93727,93728,95062,95063,98030,98031,98304,98322,99059,99063,99101,99102,99116,99122,99123,99124,104852,104856,104922,104923,106011,106015,106036,106037,106685,106686,106790,106805,106810,106813,106814,106850,107136,107137,107153,107154,107285,107286,107288,107289,107291,107292,114583,114587,114613,114614,114743,114747,114753,114754,114887,114891,114898,114899,120182,120186,120255,120256,120284,120285,120323,120329,120330,120331,120579,120580,120613,120619,120620,120621,121096,121100,121116,121117,121669,121675,121676,121677,123547,123551,123596,123597,123601,123607,123608,123609,123640,123646,123647,123648,125338,125342,125366,125367,125391,125392,125394,125395,125396,125397,125398,125399,125429,125430,129370,129374,129411,129412,131072,131088,131193,131197,131215,131216,131245,131246,131251,131257,131258,131259,131460,131464,131604,131605,133410,133414,133456,133457,135990,135991,137106,137108,137109,137110,137144,137148,137165,137166,137171,137172,137622,137626,138028,138029,138719,138723,138739,138740,140855,140859,140887,140888,140899,140900,141183,141187,141197,141198,141235,141236,143934,143935,150053,150057,150144,150145,151359,151360,151504,151505,151670,151674,151701,151702,152343,152347,152367,152368,155641,155642,158913,158917,158942,158943,158962,158963,161370,161371,162021,162025,162081,162082,163840,163858,163893,163897,163935,163936,163977,163983,163989,163990,167643,167644,168294,168300,168341,168342,168363,168364,171688,171689,173788,173792,173823,173824,174955,174961,174984,174985,175162,175163,176481,176487,176509,176510,178459,178463,178493,178494,179188,179189,179850,179854,179876,179877,182078,182082,182114,182115,196608,196624,204883,204884,206751,206752,206927,206928,208677,208681,208849,208850,208942,208943,216289,216291,220499,220500,225685,225689,225760,225761,225813,225814,227512,227513,228426,228430,228455,228456,228469,228470,228473,228479,228484,228485,229376,229394,231872,231873,233521,233525,233572,233573,233604,233605,233607,233611,233612,233613,233657,233665,233666,233667,236487,236493,236538,236539,236570,236576,236577,236578,236620,236626,236627,236628,238950,238951,239964,239968,240007,240008,240090,240094,240099,240100,240111,240117,240118,240119,240686,240690,240705,240706,241929,241933,241959,241960,251331,251408,253323,253324,253350,253351,256286,256290,256456,256457,256536,256537,256545,256551,256552,256553,257842,257846,257868,257869,259542,259546,259563,259564,260620,260621,262144,262160,262272,262276,262304,262305,262312,262318,262319,262320,262325,262329,262334,262335,262339,262340,262355,262361,262362,262363,263346,263350,265098,265099,265123,265129,265130,265131,267547,267548,269871,269875,269946,269947,270295,270299,270312,270313,271657,271663,271682,271683,271692,271698,271699,271700,273147,273151,274588,274589,274613,274614,279445,279446,280481,280482,281606,281607,283258,283262,283345,283346,283382,283386,285900,285904,285918,285919,286416,286420,286428,286429,288075,288076,289417,289418,289424,289431,289444,289445,290055,290056,291056,291072,291595,291596,294868,294869,294912,294930,297695,297700,297701,297702,297703,297704,297705,297706,297707,297708,297709,297710,297711,297712,297713,297714,297715,297716,297717,297718,297719,297720,297721,297722,297723,297724,297725,297726,297727,297728,297729,297730,297731,297732,297733,297734,297735,297736,297737,297738,297739,297740,297741,297742,297743,297744,297745,297746,297747,297748,297749,297750,297751,297752,297753,297754,297755,297756,297757,297758,297759,297760,297761,297762,297763,297764,297765,297766,297767,297768,297769,297770,297771,297772,297773,297774,297775,297776,297777,297778,297779,297780,297781,297782,297783,297784,297785,297786,297787,297788,297789,297790,297791,297792,297793,297794,297795,297796,297797,297798,297799,297800,297801,297802,297803,297804,297805,297806,297807,297808,297809,297810,297811,297812,297813,297814,297815,297816,297817,297818,297819,297820,297821,297822,297823,297824,297825,297826,297827,297828,297829,297830,297831,297832,297833,297834,297835,297836,297837,297838,297839,297840,297841,297842,297843,297844,297845,297846,297847,297848,297849,297850,297851,297852,297853,297854,297855,297856,297857,297858,297859,297860,297861,297862,297863,297864,297865,297866,297867,297868,297869,297870,297871,297872,297873,297874,297875,297876,297877,297878,297879,297880,297881,297882,297883,297884,297885,297886,297887,297888,297889,297890,297891,297892,297893,297894,297895,297896,297897,297898,297899,297900,297901,297902,297903,297904,297905,297906,297907,297908,297909,297910,297911,297912,297913,297914,297915,297916,297917,297918,297919,297920,297921,297922,297923,297924,297925,297926,297927,297928,297929,297930,297931,297932,297933,297934,297935,297936,297937,297938,297939,297940,297941,297942,297943,297944,297945,297946,297947,297948,297949,297950,297951,297952,297953,297954,297955,297956,297957,297958,297959,297960,297961,297962,297963,297964,297965,297966,297967,297968,297969,297970,297971,297972,297973,297974,297975,297976,297977,297978,297979,297980,297981,297982,297983,297984,297985,297986,297987,297988,297989,297990,297991,297992,297993,297994,297995,297996,297997,297998,297999,298000,298001,298002,298003,298004,298005,298006,298007,298008,298009,298010,298011,298012,298013,298014,298015,298016,298017,298018,298019,298020,298021,298022,298023,298024,298025,298026,298027,298028,298029,298030,298031,298032,298033,298034,298035,298036,298037,298038,298039,298040,298041,298042,298043,298044,298045,298046,298047,298048,298049,298050,298051,298052,298053,298054,298055,298056,298057,298058,298059,298060,298061,298062,298063,298064,298065,298066,298067,298068,298069,298070,298071,298072,298073,298074,298075,298076,298077,298078,298079,298080,298081,298082,298083,298084,298085,298086,298087,298088,298089,298090,298091,298092,298093,298094,298095,298096,298097,298098,298099,298100,298101,298102,298103,298104,298105,298106,298107,298108,298109,298110,298111,298112,298113,298114,298115,298116,298117,298118,298119,298120,298121,298122,298123,298124,298125,298126,298127,298128,298129,298130,298131,298132,298133,298134,298135,298136,298137,298138,298139,298140,298141,298142,298143,298145,298150,298151,304051,304052,305391,305392,305396,305397,309729,309730,309876,309877,312662,312663,312988,312989,312991,313013,313025,313026,313033,313034,313068,313069,313074,313075,313100,313101,313184,313185,313193,313194,313256,313257,313260,313265,313266,313267,313268,313269,313270,313271,314194,314195,314202,314203,314756,314757,314758,314762,314763,314764,314765,314766,314767,314768,314769,314770,314771,314772,314773,314774,314775,314776,314778,314779,314780,314783,316027,316029,316169,316170,316174,316176,316434,316435,316437,316439,316982,316983,316998,316999,317016,317017,317163,317164,317172,317174,317176,317177,326200,326201,327680,327696,334151,334152,336136,336137,336767,336770,336776,336777,336782,336783,336788,336839,336844,340179,340184,340191,340205,340211,340221,340222,340227,340228,340233,340346,340358,340359,340363,340407,340416,340418,340424,340425,340430,340431,340436,340491,340496,344280,344285,344292,344304,344309,344317,344318,344323,344324,344329,344446,344451,344452,344456,344502,344523,344534,345636,345637,350306,350307,350433,350434,350560,350561,350595,350596,350919,350920,351268,351269,351285,351286,351292,351293,351299,351300,351604,351605,351769,351770,351775,351776,351777,351778,351779,351780,351781,351782,351783,351784,351786,351787,351788,351789,351790,351791,351792,351793,351794,351795,351796,351797,351798,351799,351800,351801,351802,351803,351804,351805,351806,351807,351808,351809,351810,351811,351812,351813,351814,351815,351816,351817,351818,351819,351822,351823,351824,351825,351826,351827,351828,351829,351830,351831,351832,351833,351835,351836,351837,351838,351969,351970,351997,351998,352019,352020,352027,352028,352047,352048,352090,352091,352143,352144,352212,352213,352267,352268,352269,352270,352271,352272,352273,352274,352276,352277,352278,352279,352280,352281,352282,352283,352284,352285,352286,352287,352288,352289,352290,352291,352292,352293,352294,352295,352296,352297,352298,352299,352300,352301,352302,352303,352304,352305,352306,352307,352403,352404,352405,352406,352407,352408,352409,352410,352411,352412,352413,352414,352415,352416,352418,352419,352420,352421,352422,352423,352424,352425,352426,352427,352428,352429,352430,352431,352432,352433,352434,352435,352436,352437,352438,352439,352440,352441,352442,352443,352444,352445,352446,352447,352448,352449,352450,352451,352452,352453,352454,352455,352456,352457,352458,352459,352460,352461,352462,352463,352464,352465,352487,352488,352658,352659,352736,352737,352772,352773,352784,352785,352828,352830,352941,352942,352985,352986,353002,353003,353014,353015,353375,353376,353646,353647,353896,353897,354828,720904,720912,735281,737503,749189,749346,749347") && 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"), "612,1,31,41,45,50,51,129,137,143,144,1821,1825,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2590,2594,2598,2599,2622,2623,2659,2663,2713,2714,2873,2874,2877,2883,2884,2891,2904,2905,5244,5245,7781,7782,9149,9150,9850,9852,9853,9854,9856,9859,9860,9861,9863,9865,9866,9867,9869,9871,9872,9873,9875,9877,9878,9879,9882,9884,9885,9886,9889,9891,9894,9896,9904,9906,9909,9911,9914,9916,9917,9918,9923,9924,9926,9928,9929,9930,9932,9934,9935,9936,9938,9940,9941,9942,9944,9946,9947,9948,9973,9974,9978,9979,9985,9986,9989,9990,9991,9992,9995,9996,9997,9998,10001,10002,10003,10004,10009,10010,10013,10014,10015,10016,10019,10020,10021,10022,10026,10027,10031,10032,10035,10037,10040,10042,10046,10047,10052,10053,10054,10055,10058,10059,10060,10061,10064,10065,10066,10067,10070,10071,10072,10073,10076,10077,10078,10079,10082,10083,10084,10085,10089,10090,10380,10381,11408,11413,14505,14506,14660,14661,27219,27220,27509,27511,27584,27585,29399,29400,32768,32800,34051,34052,34686,34688,35329,35330,35862,35863,36395,36396,36399,36400,36842,36843,37749,37750,37758,37759,37854,37855,39781,39783,50760,50761,51026,51027,51031,51033,51050,51051,51086,51087,51096,51097,51098,51099,51149,51150,51156,51157,52573,52574,56649,56650,56652,56654,56718,56719,56789,56790,56857,56858,56860,56861,56863,56864,56923,56925,56927,56928,56992,56993,57063,57064,57131,57132,57134,57135,57137,57140,57141,57143,57145,57146,57152,57153,57155,57156,57159,57160,57171,57173,57175,57176,57182,57183,57185,57186,57189,57190,57192,57193,57196,57199,57201,57202,57204,57206,57209,57211,57213,57214,57222,57223,57225,57226,57236,57237,57239,57240,57242,57243,57246,57247,57258,57260,57262,57263,57269,57270,57272,57273,57275,57276,57278,57279,57281,57292,57352,57353,57355,57356,57366,57367,57433,57434,57511,57512,57522,57523,57589,57590,57666,57667,57746,57747,57823,57824,57900,57901,57977,57978,57988,57989,57992,57993,58056,58057,58132,58133,58143,58144,58210,58211,58287,58288,58360,58361,58363,58364,58376,58381,58382,58383,58387,58388,58390,58391,58394,58395,59934,59935,59970,59972,59977,59979,60105,60106,60155,60158,60434,60435,60436,60437,61724,61725,62062,62063,62891,62892,63597,63600,63908,63911,64034,64037,64223,64226,64230,64231,65094,65095,65213,65214,65536,65574,66016,66017,70237,72258,74952,74953,75476,75491,75792,75793,82669,82670,84074,84136,87912,87913,88394,88395,94557,94559,97397,97398,98304,98344,101383,101384,101386,101387,107631,107632,107638,107640,107647,107648,107789,107790,114070,114072,114151,114152,120237,120238,124704,124705,128796,128797,129959,129960,130881,130966,131072,131096,131363,131364,140181,140182,144610,145798,145803,148265,149491,149492,152452,152454,155171,155172,156015,156023,156387,156388,163840,163869,189501,191947,195313,195315,196154,196155,196608,196637,204118,204119,205749,205750,207145,207207,211166,211167,211311,211312,212476,212477,218097,218098,220700,220702,226019,226020,229376,229400,230972,230973,239520,239521,239527,239529,239536,239537,239984,239985,246570,246571,246575,246576,246583,246584,252224,252225,252241,252242,252243,252245,252246,252248,252249,252251,252252,252254,252255,252256,252312,252314,252315,252316,252318,252319,252321,252322,252508,252509,258017,258018,259073,259074,262144,262166,262763,262764,267997,267999,268333,268335,269692,269693,272353,272354,272836,272837,275284,275285,278729,278730,280871,280872,284044,284045,290196,290197,290201,290202,290209,290210,291739,291740,291762,291763,292486,292488,292620,292621,294121,294127,294128,294129,294912,294928,296748,296749,297093,297094,299070,299071,299160,299162,304561,304562,305218,305220,305221,305223,307725,307727,307735,307737,307753,307754,307788,312016,312023,312034,312971,317933,318008,318009") == "8197e86b0a1e1f83ed947af689c20aea749f523c" || 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"), "612,1,31,41,45,50,51,129,137,143,144,1821,1825,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2590,2594,2598,2599,2622,2623,2659,2663,2713,2714,2873,2874,2877,2883,2884,2891,2904,2905,5244,5245,7781,7782,9149,9150,9850,9852,9853,9854,9856,9859,9860,9861,9863,9865,9866,9867,9869,9871,9872,9873,9875,9877,9878,9879,9882,9884,9885,9886,9889,9891,9894,9896,9904,9906,9909,9911,9914,9916,9917,9918,9923,9924,9926,9928,9929,9930,9932,9934,9935,9936,9938,9940,9941,9942,9944,9946,9947,9948,9973,9974,9978,9979,9985,9986,9989,9990,9991,9992,9995,9996,9997,9998,10001,10002,10003,10004,10009,10010,10013,10014,10015,10016,10019,10020,10021,10022,10026,10027,10031,10032,10035,10037,10040,10042,10046,10047,10052,10053,10054,10055,10058,10059,10060,10061,10064,10065,10066,10067,10070,10071,10072,10073,10076,10077,10078,10079,10082,10083,10084,10085,10089,10090,10380,10381,11408,11413,14505,14506,14660,14661,27219,27220,27509,27511,27584,27585,29399,29400,32768,32800,34051,34052,34686,34688,35329,35330,35862,35863,36395,36396,36399,36400,36842,36843,37749,37750,37758,37759,37854,37855,39781,39783,50760,50761,51026,51027,51031,51033,51050,51051,51086,51087,51096,51097,51098,51099,51149,51150,51156,51157,52573,52574,56649,56650,56652,56654,56718,56719,56789,56790,56857,56858,56860,56861,56863,56864,56923,56925,56927,56928,56992,56993,57063,57064,57131,57132,57134,57135,57137,57140,57141,57143,57145,57146,57152,57153,57155,57156,57159,57160,57171,57173,57175,57176,57182,57183,57185,57186,57189,57190,57192,57193,57196,57199,57201,57202,57204,57206,57209,57211,57213,57214,57222,57223,57225,57226,57236,57237,57239,57240,57242,57243,57246,57247,57258,57260,57262,57263,57269,57270,57272,57273,57275,57276,57278,57279,57281,57292,57352,57353,57355,57356,57366,57367,57433,57434,57511,57512,57522,57523,57589,57590,57666,57667,57746,57747,57823,57824,57900,57901,57977,57978,57988,57989,57992,57993,58056,58057,58132,58133,58143,58144,58210,58211,58287,58288,58360,58361,58363,58364,58376,58381,58382,58383,58387,58388,58390,58391,58394,58395,59934,59935,59970,59972,59977,59979,60105,60106,60155,60158,60434,60435,60436,60437,61724,61725,62062,62063,62891,62892,63597,63600,63908,63911,64034,64037,64223,64226,64230,64231,65094,65095,65213,65214,65536,65574,66016,66017,70237,72258,74952,74953,75476,75491,75792,75793,82669,82670,84074,84136,87912,87913,88394,88395,94557,94559,97397,97398,98304,98344,101383,101384,101386,101387,107631,107632,107638,107640,107647,107648,107789,107790,114070,114072,114151,114152,120237,120238,124704,124705,128796,128797,129959,129960,130881,130966,131072,131096,131363,131364,140181,140182,144610,145798,145803,148265,149491,149492,152452,152454,155171,155172,156015,156023,156387,156388,163840,163869,189501,191947,195313,195315,196154,196155,196608,196637,204118,204119,205749,205750,207145,207207,211166,211167,211311,211312,212476,212477,218097,218098,220700,220702,226019,226020,229376,229400,230972,230973,239520,239521,239527,239529,239536,239537,239984,239985,246570,246571,246575,246576,246583,246584,252224,252225,252241,252242,252243,252245,252246,252248,252249,252251,252252,252254,252255,252256,252312,252314,252315,252316,252318,252319,252321,252322,252508,252509,258017,258018,259073,259074,262144,262166,262763,262764,267997,267999,268333,268335,269692,269693,272353,272354,272836,272837,275284,275285,278729,278730,280871,280872,284044,284045,290196,290197,290201,290202,290209,290210,291739,291740,291762,291763,292486,292488,292620,292621,294121,294127,294128,294129,294912,294928,296748,296749,297093,297094,299070,299071,299160,299162,304561,304562,305218,305220,305221,305223,307725,307727,307735,307737,307753,307754,307788,312016,312023,312034,312971,317933,318008,318009") && 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"), "260,1,16,32,36,40,41,4813,4814,5237,5239,7276,7280,7373,7374,8376,8377,10074,10077,10083,10084,10125,10126,18539,18540,28347,28348,29023,29027,29993,29994,30356,30360,30879,30880,30892,30898,30899,30900,32740,32744,32768,32777,32794,32795,34186,34187,43938,43939,47810,47811,48061,48066,48078,48079,48143,48146,48339,48344,48601,48603,52085,52086,61928,61929,65536,65543,71479,71486,72962,72963,72968,72969,73097,73103,73104,73105,73117,73123,73124,73125,80583,80584,81839,81843,82905,82906,86754,86756,98304,98313,100248,100249,100318,100319,102540,102542,123040,123041,125049,125050,131072,131079,131080,131081,138730,138731,142717,142718,143019,143020,143072,143074,143083,143084,143178,143180,143969,143970,143977,143978,143984,143985,148322,148323,148548,148550,148560,148562,148608,148610,148620,148622,148631,148632,150450,150451,150452,150455,153840,153841,154004,154005,154006,154007,154009,154010,154026,154027,154030,154032,154033,154035,154051,154052,154064,154065,154103,154107,154111,154115,154116,154128,154543,154544,154915,154916,156401,156402,156491,156493,156495,156496,157336,157338,163840,163883,163884,163885,175115,175117,176258,176259,185509,185511,187751,187752,187926,187928,187976,187977,188232,188234,188622,188624,190020,190022,190197,190201,190206,190207,190323,190325,191726,191728,195226,195227,196608,196647,201704,201705,205926,205927,207455,207456,208119,208123,208139,208140,209713,209717,209742,209743,220575,220576,229376,229385,245727,245728,245762,245763,245957,245958,246487,246488,246676,246677,247417,247418,248000,248001,248177,248178,249155,249157,249629,249630,250271,250272,253195,253196,254132,254135,257469,257470,262144,262145,264702,268899,268967,268968") == "85194710db7fe8dcead6bfddff4a0194ad404a66" || 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"), "260,1,16,32,36,40,41,4813,4814,5237,5239,7276,7280,7373,7374,8376,8377,10074,10077,10083,10084,10125,10126,18539,18540,28347,28348,29023,29027,29993,29994,30356,30360,30879,30880,30892,30898,30899,30900,32740,32744,32768,32777,32794,32795,34186,34187,43938,43939,47810,47811,48061,48066,48078,48079,48143,48146,48339,48344,48601,48603,52085,52086,61928,61929,65536,65543,71479,71486,72962,72963,72968,72969,73097,73103,73104,73105,73117,73123,73124,73125,80583,80584,81839,81843,82905,82906,86754,86756,98304,98313,100248,100249,100318,100319,102540,102542,123040,123041,125049,125050,131072,131079,131080,131081,138730,138731,142717,142718,143019,143020,143072,143074,143083,143084,143178,143180,143969,143970,143977,143978,143984,143985,148322,148323,148548,148550,148560,148562,148608,148610,148620,148622,148631,148632,150450,150451,150452,150455,153840,153841,154004,154005,154006,154007,154009,154010,154026,154027,154030,154032,154033,154035,154051,154052,154064,154065,154103,154107,154111,154115,154116,154128,154543,154544,154915,154916,156401,156402,156491,156493,156495,156496,157336,157338,163840,163883,163884,163885,175115,175117,176258,176259,185509,185511,187751,187752,187926,187928,187976,187977,188232,188234,188622,188624,190020,190022,190197,190201,190206,190207,190323,190325,191726,191728,195226,195227,196608,196647,201704,201705,205926,205927,207455,207456,208119,208123,208139,208140,209713,209717,209742,209743,220575,220576,229376,229385,245727,245728,245762,245763,245957,245958,246487,246488,246676,246677,247417,247418,248000,248001,248177,248178,249155,249157,249629,249630,250271,250272,253195,253196,254132,254135,257469,257470,262144,262145,264702,268899,268967,268968") && 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"), "348,1,31,38,42,46,47,53,59,60,61,75,81,82,83,141,145,150,151,705,707,764,768,783,784,811,817,818,819,1707,1713,1736,1737,1743,1749,1750,1751,1977,1981,1990,1991,2021,2027,2028,2029,2223,2227,2231,2232,2235,2239,2244,2245,2248,2249,2271,2277,2278,2279,2283,2289,2290,2291,2293,2294,2305,2311,2312,2313,2323,2324,2329,2333,2337,2338,2342,2348,2352,2353,2360,2366,2367,2368,2380,2386,2387,2388,2398,2404,2405,2406,2408,2415,2421,2428,2495,2502,2507,2514,2549,2554,2573,2580,2598,2605,2621,2622,2832,2834,2843,2844,2856,2857,2858,2859,2860,2861,2870,2871,2894,2895,2943,2948,2951,2954,2957,2960,2963,2965,2969,2970,2974,2977,2981,2982,3505,3507,3511,3515,3516,3520,3525,3527,3532,3536,3537,3541,3542,3546,3547,3551,3552,3556,3557,3561,3562,3566,3567,3571,3572,3574,3581,3585,3586,3590,3591,3595,3596,3600,3601,3605,3606,3610,3611,3615,3616,3618,3619,3623,3624,3628,3629,3631,3632,3636,3637,3641,3642,3646,3647,3651,3652,3656,3657,3659,3663,3667,3668,3672,3673,3675,3676,3678,3679,3683,3684,3688,3689,3691,3692,3696,3697,3701,3702,3706,3707,3711,3712,3714,3715,3719,3720,3722,3726,3743,3748,3782,3785,3898,6310,6311,7546,7547,8736,8737,9883,9884,11065,11066,11116,11117,11426,11427,16752,16753,16783,16784,16973,16974,17034,17035,17214,17215,17335,17336,17544,17545,22437,22438,22440,22441,22470,22471,22664,22665,22838,22839,22864,22865,22882,22883,22959,22960,22983,22984,23040,23041,23146,23147,28120,28121,28140,28141,28419,28420,28506,28507,28545,28546,28623,28624,28879,28880,32768,32807,37063,37064,44253,44254,45888,45889,45940,45941,46259,46260,48387,48388,54532,54536,56220,56222,56405,56407,56455,56457,58041,58043,65536,65565,66590,66591,66593,66594,66601,66602,66606,66607,66618,66619,66920,66921,66937,66938,66947,66948,68640,68642,73861,73865,74796,74798,74822,98326,98328,118941,119302,121197,121236,121237") == "45a9c8e0a6c50bd7328c78b5381fb509b7f192d9" || 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"), "348,1,31,38,42,46,47,53,59,60,61,75,81,82,83,141,145,150,151,705,707,764,768,783,784,811,817,818,819,1707,1713,1736,1737,1743,1749,1750,1751,1977,1981,1990,1991,2021,2027,2028,2029,2223,2227,2231,2232,2235,2239,2244,2245,2248,2249,2271,2277,2278,2279,2283,2289,2290,2291,2293,2294,2305,2311,2312,2313,2323,2324,2329,2333,2337,2338,2342,2348,2352,2353,2360,2366,2367,2368,2380,2386,2387,2388,2398,2404,2405,2406,2408,2415,2421,2428,2495,2502,2507,2514,2549,2554,2573,2580,2598,2605,2621,2622,2832,2834,2843,2844,2856,2857,2858,2859,2860,2861,2870,2871,2894,2895,2943,2948,2951,2954,2957,2960,2963,2965,2969,2970,2974,2977,2981,2982,3505,3507,3511,3515,3516,3520,3525,3527,3532,3536,3537,3541,3542,3546,3547,3551,3552,3556,3557,3561,3562,3566,3567,3571,3572,3574,3581,3585,3586,3590,3591,3595,3596,3600,3601,3605,3606,3610,3611,3615,3616,3618,3619,3623,3624,3628,3629,3631,3632,3636,3637,3641,3642,3646,3647,3651,3652,3656,3657,3659,3663,3667,3668,3672,3673,3675,3676,3678,3679,3683,3684,3688,3689,3691,3692,3696,3697,3701,3702,3706,3707,3711,3712,3714,3715,3719,3720,3722,3726,3743,3748,3782,3785,3898,6310,6311,7546,7547,8736,8737,9883,9884,11065,11066,11116,11117,11426,11427,16752,16753,16783,16784,16973,16974,17034,17035,17214,17215,17335,17336,17544,17545,22437,22438,22440,22441,22470,22471,22664,22665,22838,22839,22864,22865,22882,22883,22959,22960,22983,22984,23040,23041,23146,23147,28120,28121,28140,28141,28419,28420,28506,28507,28545,28546,28623,28624,28879,28880,32768,32807,37063,37064,44253,44254,45888,45889,45940,45941,46259,46260,48387,48388,54532,54536,56220,56222,56405,56407,56455,56457,58041,58043,65536,65565,66590,66591,66593,66594,66601,66602,66606,66607,66618,66619,66920,66921,66937,66938,66947,66948,68640,68642,73861,73865,74796,74798,74822,98326,98328,118941,119302,121197,121236,121237") && 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/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");

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

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