mount("ubifs", "UBI", "system", "/system", "");
ui_print("Source: None");
ui_print("Target: None");
ui_print("Verifying current system...");
show_progress(0.100000, 0);
apply_patch_check("/system/boot/abl.elf", "c29faec0656d90e0d4e5fee6a623cc3ebcc1d35f", "f150d16aa9dd6ace8da72951f69a978631b8d06a") || abort("E3005: \"/system/boot/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/sign/default/abl/abl.elf", "c29faec0656d90e0d4e5fee6a623cc3ebcc1d35f", "f150d16aa9dd6ace8da72951f69a978631b8d06a") || abort("E3005: \"/system/boot/sign/default/abl/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/sign_and_encrypt/default/abl/abl.elf", "51c2a36e85390a6e675b1af351751b5d4dbd532b", "ea0a5846577f9e716eb60d6847981e7b04e45576") || abort("E3005: \"/system/boot/sign_and_encrypt/default/abl/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/signed/abl.elf", "c29faec0656d90e0d4e5fee6a623cc3ebcc1d35f", "f150d16aa9dd6ace8da72951f69a978631b8d06a") || abort("E3005: \"/system/boot/signed/abl.elf\" has unexpected contents.");
apply_patch_check("/system/boot/signed_encrypted/abl.elf", "51c2a36e85390a6e675b1af351751b5d4dbd532b", "ea0a5846577f9e716eb60d6847981e7b04e45576") || abort("E3005: \"/system/boot/signed_encrypted/abl.elf\" has unexpected contents.");
apply_patch_check("/system/sbin/powerapp", "4f51e42bfccb7f07460dd9d109503027e79ab6da", "9457311f62d9f689ab9508970e4ed89dd52e9d7a") || abort("E3005: \"/system/sbin/powerapp\" has unexpected contents.");
apply_patch_check("/system/sbin/sys_reboot", "4f51e42bfccb7f07460dd9d109503027e79ab6da", "9457311f62d9f689ab9508970e4ed89dd52e9d7a") || abort("E3005: \"/system/sbin/sys_reboot\" has unexpected contents.");
apply_patch_check("/system/sbin/sys_shutdown", "4f51e42bfccb7f07460dd9d109503027e79ab6da", "9457311f62d9f689ab9508970e4ed89dd52e9d7a") || abort("E3005: \"/system/sbin/sys_shutdown\" has unexpected contents.");
apply_patch_check("/system/usr/bin/atfwd_daemon", "35578e0abcd327e4f1b5cddfd312b6781ef78683", "0bf5aff20fbaa8638eff23e1e04a97e2401f36d4") || abort("E3005: \"/system/usr/bin/atfwd_daemon\" has unexpected contents.");
apply_patch_check("/system/usr/bin/qmuxbridge", "794cb991bafa74e750afa83afcc8e5d646cb10ee", "e091464864a2f3cac9bdcda9e167317e92e66ebf") || abort("E3005: \"/system/usr/bin/qmuxbridge\" has unexpected contents.");
apply_patch_check("/system/var/lib/opkg/status", "7373d78da2fb388b3d38db756d61c0493e512b6c", "e796aeac1e3d61f0e2671115d71b26520dcd3562") || abort("E3005: \"/system/var/lib/opkg/status\" has unexpected contents.");
apply_patch_space(151552) || abort("E3006: Not enough free space on /cache to apply patches.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
apply_patch_check("/firmware/image/modem.b20", "5f638f8997f2af2b7b9f81f24aeaf04fb4223e03", "4f553356ce05cded3f381ecaccce93eba21f5b8b") || abort("E3005: \"/firmware/image/modem.b20\" has unexpected contents.");
apply_patch_check("/firmware/image/modem.b01", "8bd7bc5f470ce04e39ff4fded6d85edf12abf8b3", "74c0daf19d9c253b97b51d919abd7cc87a926f49") || abort("E3005: \"/firmware/image/modem.b01\" has unexpected contents.");
apply_patch_check("/firmware/image/modem.mdt", "929c06379de68bc6377c04fb204505af752d5c08", "ccc4363250b4e55217afdcc1e91c017c88243302") || abort("E3005: \"/firmware/image/modem.mdt\" has unexpected contents.");

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

ui_print("Removing unneeded files...");
delete("/system/recovery.img", "/system/etc/version",
       "/system/etc/timestamp",
       "/system/build.prop");
show_progress(0.800000, 0);
ui_print("Patching system files...");
apply_patch("/system/boot/abl.elf", "-",
            c29faec0656d90e0d4e5fee6a623cc3ebcc1d35f, 151552,
            f150d16aa9dd6ace8da72951f69a978631b8d06a,
            package_extract_file("patch/system/boot/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/abl.elf");
set_progress(0.148022);
apply_patch("/system/boot/sign/default/abl/abl.elf", "-",
            c29faec0656d90e0d4e5fee6a623cc3ebcc1d35f, 151552,
            f150d16aa9dd6ace8da72951f69a978631b8d06a,
            package_extract_file("patch/system/boot/sign/default/abl/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/sign/default/abl/abl.elf");
set_progress(0.296043);
apply_patch("/system/boot/sign_and_encrypt/default/abl/abl.elf",
            "-", 51c2a36e85390a6e675b1af351751b5d4dbd532b, 151552,
            ea0a5846577f9e716eb60d6847981e7b04e45576,
            package_extract_file("patch/system/boot/sign_and_encrypt/default/abl/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/sign_and_encrypt/default/abl/abl.elf");
set_progress(0.444065);
apply_patch("/system/boot/signed/abl.elf", "-",
            c29faec0656d90e0d4e5fee6a623cc3ebcc1d35f, 151552,
            f150d16aa9dd6ace8da72951f69a978631b8d06a,
            package_extract_file("patch/system/boot/signed/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/signed/abl.elf");
set_progress(0.592086);
apply_patch("/system/boot/signed_encrypted/abl.elf", "-",
            51c2a36e85390a6e675b1af351751b5d4dbd532b, 151552,
            ea0a5846577f9e716eb60d6847981e7b04e45576,
            package_extract_file("patch/system/boot/signed_encrypted/abl.elf.p")) ||
    abort("E3008: Failed to apply patch to /system/boot/signed_encrypted/abl.elf");
set_progress(0.740108);
apply_patch("/system/sbin/powerapp", "-",
            4f51e42bfccb7f07460dd9d109503027e79ab6da, 9864,
            9457311f62d9f689ab9508970e4ed89dd52e9d7a,
            package_extract_file("patch/system/sbin/powerapp.p")) ||
    abort("E3008: Failed to apply patch to /system/sbin/powerapp");
set_progress(0.749742);
apply_patch("/system/sbin/sys_reboot", "-",
            4f51e42bfccb7f07460dd9d109503027e79ab6da, 9864,
            9457311f62d9f689ab9508970e4ed89dd52e9d7a,
            package_extract_file("patch/system/sbin/sys_reboot.p")) ||
    abort("E3008: Failed to apply patch to /system/sbin/sys_reboot");
set_progress(0.759376);
apply_patch("/system/sbin/sys_shutdown", "-",
            4f51e42bfccb7f07460dd9d109503027e79ab6da, 9864,
            9457311f62d9f689ab9508970e4ed89dd52e9d7a,
            package_extract_file("patch/system/sbin/sys_shutdown.p")) ||
    abort("E3008: Failed to apply patch to /system/sbin/sys_shutdown");
set_progress(0.769010);
apply_patch("/system/usr/bin/atfwd_daemon", "-",
            35578e0abcd327e4f1b5cddfd312b6781ef78683, 103100,
            0bf5aff20fbaa8638eff23e1e04a97e2401f36d4,
            package_extract_file("patch/system/usr/bin/atfwd_daemon.p")) ||
    abort("E3008: Failed to apply patch to /system/usr/bin/atfwd_daemon");
set_progress(0.869709);
apply_patch("/system/usr/bin/qmuxbridge", "-",
            794cb991bafa74e750afa83afcc8e5d646cb10ee, 34492,
            e091464864a2f3cac9bdcda9e167317e92e66ebf,
            package_extract_file("patch/system/usr/bin/qmuxbridge.p")) ||
    abort("E3008: Failed to apply patch to /system/usr/bin/qmuxbridge");
set_progress(0.903397);
apply_patch("/system/var/lib/opkg/status", "-",
            7373d78da2fb388b3d38db756d61c0493e512b6c, 98918,
            e796aeac1e3d61f0e2671115d71b26520dcd3562,
            package_extract_file("patch/system/var/lib/opkg/status.p")) ||
    abort("E3008: Failed to apply patch to /system/var/lib/opkg/status");
set_progress(1.000011);
show_progress(0.100000, 10);
ui_print("Unpacking new system files...");
package_extract_dir("system", "/system");
ui_print("Symlinks and permissions...");
set_metadata("/system", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:root_t:s0");
set_metadata("/system/boot", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign/default", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign/default/abl", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign/default/abl/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt/default", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt/default/abl", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/sign_and_encrypt/default/abl/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed_encrypted", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/boot/signed_encrypted/abl.elf", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:boot_t:s0");
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:leprop_system_data_t:s15:c0.c1023");
set_metadata("/system/etc", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:etc_t:s0");
set_metadata("/system/etc/timestamp", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:etc_t:s0");
set_metadata("/system/etc/version", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:etc_t:s0");
set_metadata("/system/sbin", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/sbin/powerapp", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/sbin/sys_reboot", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/sbin/sys_shutdown", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/usr", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:usr_t:s0");
set_metadata("/system/usr/bin", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:bin_t:s0");
set_metadata("/system/usr/bin/atfwd_daemon", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:atfwd_exec_t:s0");
set_metadata("/system/usr/bin/qmuxbridge", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:qmuxbridge_exec_t:s0");
set_metadata("/system/var", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:var_t:s0");
set_metadata("/system/var/lib", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:var_lib_t:s0");
set_metadata("/system/var/lib/opkg", "uid", 0, "gid", 0, "mode", 0755, "capabilities", 0x0, "selabel", "system_u:object_r:var_lib_t:s0");
set_metadata("/system/var/lib/opkg/status", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0, "selabel", "system_u:object_r:var_lib_t:s0");

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

ui_print("Patching firmware images...");
apply_patch("/firmware/image/modem.b20", "-",
            5f638f8997f2af2b7b9f81f24aeaf04fb4223e03, 12502636,
            4f553356ce05cded3f381ecaccce93eba21f5b8b,
            package_extract_file("patch/firmware-update/modem.b20.p")) ||
    abort("E3008: Failed to apply patch to /firmware/image/modem.b20");
apply_patch("/firmware/image/modem.b01", "-",
            8bd7bc5f470ce04e39ff4fded6d85edf12abf8b3, 7856,
            74c0daf19d9c253b97b51d919abd7cc87a926f49,
            package_extract_file("patch/firmware-update/modem.b01.p")) ||
    abort("E3008: Failed to apply patch to /firmware/image/modem.b01");
apply_patch("/firmware/image/modem.mdt", "-",
            929c06379de68bc6377c04fb204505af752d5c08, 8868,
            ccc4363250b4e55217afdcc1e91c017c88243302,
            package_extract_file("patch/firmware-update/modem.mdt.p")) ||
    abort("E3008: Failed to apply patch to /firmware/image/modem.mdt");
ui_print("Patching remaining system files...");
set_metadata("/system/build.prop", "uid", 0, "gid", 0, "mode", 0644, "capabilities", 0x0);
unmount("/system");
