From df71d5aaede9814d17d140e29963bb4b0707bf01 Mon Sep 17 00:00:00 2001 From: QiuSimons Date: Sat, 2 Jan 2021 11:03:11 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=9CReinitialize=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflows/R2S-OpenWrt-Without-Docker.yml | 172 + LICENSE | 339 + .../addition-trans-zh-master/Makefile | 50 + .../addition-trans-zh-master/files/getcpu | 8 + .../files/zzz-default-settings | 97 + .../i18n/default.zh_Hans.po | 234 + .../i18n/more.zh_Hans.po | 1160 + .../i18n/sqm.zh_Hans.po | 194 + .../status/status.lua | 250 + .../luci-app-control-weburl/Makefile | 18 + .../luasrc/controller/weburl.lua | 10 + .../luasrc/model/cbi/weburl.lua | 65 + .../po/zh-cn/weburl.po | 2 + .../root/etc/config/weburl | 27 + .../root/etc/init.d/weburl | 65 + .../etc/uci-defaults/luci-app-control-weburl | 11 + PATCH/duplicate/luci-app-cpulimit/Makefile | 14 + .../luasrc/controller/cpulimit.lua | 13 + .../luasrc/model/cbi/cpulimit.lua | 38 + .../luci-app-cpulimit/po/zh_Hans/cpulimit.po | 30 + .../root/etc/config/cpulimit | 6 + .../root/etc/init.d/cpulimit | 17 + .../root/etc/uci-defaults/luci-app-cpulimit | 13 + .../root/usr/bin/cpulimit.sh | 36 + .../share/rpcd/acl.d/luci-app-cpulimit.json | 11 + PATCH/duplicate/rc.common | 193 + PATCH/duplicate/shortcut-fe | 52 + PATCH/files/etc/config/AdGuardHome | 22 + PATCH/files/etc/config/AdGuardHome.yaml | 132 + PATCH/files/etc/config/chinadns-ng | 18 + PATCH/files/etc/config/cpulimit | 6 + PATCH/files/etc/config/smartdns | 96 + PATCH/files/etc/ssr/black.list | 3 + PATCH/files/etc/ssr/white.list | 9 + .../main/0001-tools-add-upx-ucl-support.patch | 132 + ...k3328-nanopi-r2s-improve-boot-failed.patch | 29 + .../997-nanopi-r2s-improve-boot-failed.patch | 57 + ...8-rockchip-enable-i2c0-on-NanoPi-R2S.patch | 14 + ...i-r2-add-handle_cpu_id-for-gmac-dwc3.patch | 18 + PATCH/new/main/999-patch-5.4.61-rt37.patch | 27767 +++++++++ .../new/main/999-unlock-1608mhz-rk3328.patch | 22 + ...mmac-add-support-to-set-irq-affinity.patch | 52 + ...e-random-number-generator-for-RK3328.patch | 503 + PATCH/new/main/chacha.patch | 40 + ...kchip-fix-NanoPi-R2S-GMAC-clock-name.patch | 52 + .../uboot-rockchip-update-to-v2020.10.patch | 767 + ...nel_crypto-add-rk3328-crypto-support.patch | 29 + .../luci_network-add-packet-steering.patch | 14 + ...refresh-it-to-Realtek-version-2.13.0.patch | 15707 +++++ PATCH/new/main/xanmod_5.4.patch | 51404 ++++++++++++++++ .../package/900-add-filter-aaaa-option.patch | 59 + .../dnsmasq-add-filter-aaaa-option.patch | 36 + .../package/luci-add-filter-aaaa-option.patch | 26 + .../luci-app-firewall_add_sfe_switch.patch | 98 + PATCH/new/package/luci-app-freq.patch | 16 + .../package/use_json_object_new_int64.patch | 31 + PATCH/new/script/40-net-smp-affinity | 205 + PATCH/new/script/chinadnslist | 13 + PATCH/new/script/fuck | 14 + PATCH/new/script/move_2_services.sh | 21 + ...d-support-for-rk3328-radxa-rock-pi-e.patch | 3449 ++ ...d-support-for-FriendlyARM-NanoPi-R2S.patch | 4373 ++ PIC/app.png | Bin 0 -> 58766 bytes PIC/fullcone1.png | Bin 0 -> 25686 bytes PIC/fullcone2.png | Bin 0 -> 58426 bytes PIC/fullcone3.png | Bin 0 -> 34879 bytes PIC/offload.png | Bin 0 -> 62715 bytes PIC/oled.jpg | Bin 0 -> 134702 bytes README.md | 68 + SCRIPTS/01_get_ready.sh | 7 + SCRIPTS/02_prepare_package.sh | 419 + SCRIPTS/03_convert_translation.sh | 51 + SCRIPTS/04_remove_upx.sh | 12 + SCRIPTS/05_create_acl_for_luci.sh | 117 + SCRIPTS/06_cleaning.sh | 5 + SEED/config_docker.seed | 187 + SEED/config_no_docker.seed | 159 + SWITCH | 1 + onekeyr2s.sh | 18 + 79 files changed, 109403 insertions(+) create mode 100644 .github/workflows/R2S-OpenWrt-Without-Docker.yml create mode 100644 LICENSE create mode 100644 PATCH/duplicate/addition-trans-zh-master/Makefile create mode 100644 PATCH/duplicate/addition-trans-zh-master/files/getcpu create mode 100644 PATCH/duplicate/addition-trans-zh-master/files/zzz-default-settings create mode 100644 PATCH/duplicate/addition-trans-zh-master/i18n/default.zh_Hans.po create mode 100644 PATCH/duplicate/addition-trans-zh-master/i18n/more.zh_Hans.po create mode 100644 PATCH/duplicate/addition-trans-zh-master/i18n/sqm.zh_Hans.po create mode 100644 PATCH/duplicate/addition-trans-zh-master/status/status.lua create mode 100644 PATCH/duplicate/luci-app-control-weburl/Makefile create mode 100644 PATCH/duplicate/luci-app-control-weburl/luasrc/controller/weburl.lua create mode 100644 PATCH/duplicate/luci-app-control-weburl/luasrc/model/cbi/weburl.lua create mode 100644 PATCH/duplicate/luci-app-control-weburl/po/zh-cn/weburl.po create mode 100644 PATCH/duplicate/luci-app-control-weburl/root/etc/config/weburl create mode 100644 PATCH/duplicate/luci-app-control-weburl/root/etc/init.d/weburl create mode 100644 PATCH/duplicate/luci-app-control-weburl/root/etc/uci-defaults/luci-app-control-weburl create mode 100644 PATCH/duplicate/luci-app-cpulimit/Makefile create mode 100644 PATCH/duplicate/luci-app-cpulimit/luasrc/controller/cpulimit.lua create mode 100644 PATCH/duplicate/luci-app-cpulimit/luasrc/model/cbi/cpulimit.lua create mode 100644 PATCH/duplicate/luci-app-cpulimit/po/zh_Hans/cpulimit.po create mode 100644 PATCH/duplicate/luci-app-cpulimit/root/etc/config/cpulimit create mode 100644 PATCH/duplicate/luci-app-cpulimit/root/etc/init.d/cpulimit create mode 100644 PATCH/duplicate/luci-app-cpulimit/root/etc/uci-defaults/luci-app-cpulimit create mode 100644 PATCH/duplicate/luci-app-cpulimit/root/usr/bin/cpulimit.sh create mode 100644 PATCH/duplicate/luci-app-cpulimit/root/usr/share/rpcd/acl.d/luci-app-cpulimit.json create mode 100644 PATCH/duplicate/rc.common create mode 100644 PATCH/duplicate/shortcut-fe create mode 100644 PATCH/files/etc/config/AdGuardHome create mode 100644 PATCH/files/etc/config/AdGuardHome.yaml create mode 100644 PATCH/files/etc/config/chinadns-ng create mode 100644 PATCH/files/etc/config/cpulimit create mode 100644 PATCH/files/etc/config/smartdns create mode 100644 PATCH/files/etc/ssr/black.list create mode 100644 PATCH/files/etc/ssr/white.list create mode 100644 PATCH/new/main/0001-tools-add-upx-ucl-support.patch create mode 100644 PATCH/new/main/101-rockchip-rk3328-nanopi-r2s-improve-boot-failed.patch create mode 100644 PATCH/new/main/997-nanopi-r2s-improve-boot-failed.patch create mode 100644 PATCH/new/main/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch create mode 100644 PATCH/new/main/999-nanopi-r2-add-handle_cpu_id-for-gmac-dwc3.patch create mode 100644 PATCH/new/main/999-patch-5.4.61-rt37.patch create mode 100644 PATCH/new/main/999-unlock-1608mhz-rk3328.patch create mode 100644 PATCH/new/main/DWC3-and-stmmac-add-support-to-set-irq-affinity.patch create mode 100644 PATCH/new/main/Support-hardware-random-number-generator-for-RK3328.patch create mode 100644 PATCH/new/main/chacha.patch create mode 100644 PATCH/new/main/exp/rockchip-fix-NanoPi-R2S-GMAC-clock-name.patch create mode 100644 PATCH/new/main/exp/uboot-rockchip-update-to-v2020.10.patch create mode 100644 PATCH/new/main/kernel_crypto-add-rk3328-crypto-support.patch create mode 100644 PATCH/new/main/luci_network-add-packet-steering.patch create mode 100644 PATCH/new/main/r8152-refresh-it-to-Realtek-version-2.13.0.patch create mode 100644 PATCH/new/main/xanmod_5.4.patch create mode 100644 PATCH/new/package/900-add-filter-aaaa-option.patch create mode 100644 PATCH/new/package/dnsmasq-add-filter-aaaa-option.patch create mode 100644 PATCH/new/package/luci-add-filter-aaaa-option.patch create mode 100644 PATCH/new/package/luci-app-firewall_add_sfe_switch.patch create mode 100644 PATCH/new/package/luci-app-freq.patch create mode 100644 PATCH/new/package/use_json_object_new_int64.patch create mode 100644 PATCH/new/script/40-net-smp-affinity create mode 100644 PATCH/new/script/chinadnslist create mode 100644 PATCH/new/script/fuck create mode 100644 PATCH/new/script/move_2_services.sh create mode 100644 PATCH/old/jayanta525/001-rockchip-add-support-for-rk3328-radxa-rock-pi-e.patch create mode 100644 PATCH/old/jayanta525/002-rockchip-add-support-for-FriendlyARM-NanoPi-R2S.patch create mode 100644 PIC/app.png create mode 100644 PIC/fullcone1.png create mode 100644 PIC/fullcone2.png create mode 100644 PIC/fullcone3.png create mode 100644 PIC/offload.png create mode 100644 PIC/oled.jpg create mode 100644 README.md create mode 100644 SCRIPTS/01_get_ready.sh create mode 100644 SCRIPTS/02_prepare_package.sh create mode 100644 SCRIPTS/03_convert_translation.sh create mode 100644 SCRIPTS/04_remove_upx.sh create mode 100644 SCRIPTS/05_create_acl_for_luci.sh create mode 100644 SCRIPTS/06_cleaning.sh create mode 100644 SEED/config_docker.seed create mode 100644 SEED/config_no_docker.seed create mode 100644 SWITCH create mode 100644 onekeyr2s.sh diff --git a/.github/workflows/R2S-OpenWrt-Without-Docker.yml b/.github/workflows/R2S-OpenWrt-Without-Docker.yml new file mode 100644 index 000000000..2b07c3720 --- /dev/null +++ b/.github/workflows/R2S-OpenWrt-Without-Docker.yml @@ -0,0 +1,172 @@ +name: R2S-OpenWrt-Without-Docker + +on: + schedule: + - cron: 5 9 * * 0 + watch: + types: started + +jobs: + + Cleanup-Old-Releases: + runs-on: ubuntu-20.04 + if: github.event.repository.owner.id == github.event.sender.id + steps: + - name: Delete Older Releases + uses: dev-drprasad/delete-older-releases@v0.2.0 + with: + keep_latest: 3 + delete_tags: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + Cleanup-Old-Artifacts: + runs-on: ubuntu-20.04 + if: github.event.repository.owner.id == github.event.sender.id + steps: + - name: Cleanup Old Action Artifacts + uses: kolpav/purge-artifacts-action@v1 + with: + token: ${{ github.token }} + expire-in: 14d + + Cleanup-Workflow-Logs: + runs-on: ubuntu-20.04 + if: github.event.repository.owner.id == github.event.sender.id + steps: + - name: Cleanup Workflow Logs + uses: ActionsRML/delete-workflow-runs@v1.2.1 + with: + token: ${{ github.token }} + repository: ${{ github.repository }} + retain_days: 14 + + build: + runs-on: ubuntu-20.04 + if: github.event.repository.owner.id == github.event.sender.id + + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Show system + run: | + echo -e "Total CPU cores\t: $(nproc)" + cat /proc/cpuinfo | grep 'model name' + free -h + uname -a + [ -f /proc/version ] && cat /proc/version + [ -f /etc/issue.net ] && cat /etc/issue.net + [ -f /etc/issue ] && cat /etc/issue + ulimit -a + - name: Free disk space + run: | + sudo -E swapoff -a + sudo -E rm -f /swapfile + sudo -E docker image prune -a -f + sudo -E snap set system refresh.retain=2 + sudo -E apt-get -y purge azure* dotnet* firefox ghc* google* hhvm llvm* mono* mysql* openjdk* php* zulu* + sudo -E apt-get -y autoremove --purge + sudo -E apt-get clean + sudo -E rm -rf /usr/share/dotnet /usr/local/lib/android/sdk /etc/mysql /etc/php /usr/local/share/boost + [ -n "$AGENT_TOOLSDIRECTORY" ] && sudo rm -rf "$AGENT_TOOLSDIRECTORY" + df -h + - name: Init build dependencies + env: + DEBIAN_FRONTEND: noninteractive + run: | + sudo -E rm -rf /etc/apt/sources.list.d + sudo -E apt-get update -y + sudo -E apt-get install -y build-essential rsync asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core p7zip p7zip-full msmtp libssl-dev texinfo libreadline-dev libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint ccache curl wget vim nano python3 python3-pip python3-ply haveged lrzsz device-tree-compiler scons + wget -qO - https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh | sed 's/python-/python3-/g' | /bin/bash + sudo -E apt-get clean -y + git config --global user.name 'GitHub Actions' && git config --global user.email 'noreply@github.com' + df -h + - name: Prepare Mixedwrt + run: | + sudo chown -R runner:runner /home/runner/work/R2S-OpenWrt + cp -r ./SCRIPTS/. ./ + /bin/bash 01_get_ready.sh + - name: Prepare Package + run: | + cd openwrt + cp -r ../SCRIPTS/. ./ + /bin/bash 02_prepare_package.sh + - name: Convert Translation + run: | + cd openwrt + /bin/bash 03_convert_translation.sh + - name: Remove Upx + run: | + cd openwrt + /bin/bash 04_remove_upx.sh + - name: Add ACL + run: | + cd openwrt + /bin/bash 05_create_acl_for_luci.sh -a + - name: Make Config + run: | + cd openwrt + mv ../SEED/config_no_docker.seed .config + make defconfig + chmod -R 755 ./ + - name: Make Download + run: | + df -h + cd openwrt + make download -j10 + - name: Make Toolchain + run: | + df -h + cd openwrt + let make_process=$(nproc)+1 + make toolchain/install -j${make_process} V=s + - name: Compile Openwrt + run: | + df -h + cd openwrt + let make_process=$(nproc)+1 + make -j${make_process} V=s || make -j${make_process} V=s || make -j1 V=s + - name: Cleaning + run: | + df -h + cd openwrt/bin/targets/rockchip/armv8 + /bin/bash ../../../../../SCRIPTS/06_cleaning.sh + - name: Print Disk Space After + run: df -h + - name: Assemble Artifact + id: assemble_artifact + run: | + rm -rf ./artifact/ + mkdir -p ./artifact/ + cp openwrt/bin/targets/rockchip/armv8/*squashfs-sysupgrade.img.gz ./artifact/ + cd openwrt + cd .. + zip -r artifact.zip ./artifact/ + release_tag="R2S-GC404-$(date +%Y-%m-%d)" + echo "##[set-output name=release_tag;]$release_tag" + - name: Upload Artifact + uses: actions/upload-artifact@master + with: + name: ${{ steps.assemble_artifact.outputs.release_tag }}-ROM + path: ./artifact.zip + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.workflow_token }} + with: + tag_name: ${{ steps.assemble_artifact.outputs.release_tag }} + release_name: 自动发布 ${{ steps.assemble_artifact.outputs.release_tag }} + draft: false + prerelease: false + + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.workflow_token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps + asset_path: ./artifact.zip + asset_name: ${{ steps.assemble_artifact.outputs.release_tag }}-ROM.zip + asset_content_type: application/zip diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d159169d1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/PATCH/duplicate/addition-trans-zh-master/Makefile b/PATCH/duplicate/addition-trans-zh-master/Makefile new file mode 100644 index 000000000..a46fb7a50 --- /dev/null +++ b/PATCH/duplicate/addition-trans-zh-master/Makefile @@ -0,0 +1,50 @@ +# +# Copyright (C) 2016-2017 GitHub +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. + +include $(TOPDIR)/rules.mk + +PKG_NAME:=addition-trans-zh +PKG_VERSION:=1.1 +PKG_RELEASE:=52 +PKG_LICENSE:=GPLv3 +PKG_LICENSE_FILES:=LICENSE + +PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) + +include $(INCLUDE_DIR)/package.mk + +define Package/addition-trans-zh + SECTION:=luci + CATEGORY:=LuCI + TITLE:=LuCI support for Default Settings + PKGARCH:=all + DEPENDS:=+luci-base +kmod-fast-classifier +kmod-tcp-bbr +kmod-ipt-nat6 +kmod-tun +luci-lib-ipkg +luci-compat +openssl-util +iptables-mod-fullconenat +iptables-mod-nat-extra +@LUCI_LANG_zh_Hans +endef + +define Package/addition-trans-zh/description + Language Support Packages. +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/addition-trans-zh/install + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./files/zzz-default-settings $(1)/etc/uci-defaults/99-default-settings + $(INSTALL_DIR) $(1)/bin + $(INSTALL_BIN) ./files/getcpu $(1)/bin/getcpu + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n + po2lmo ./i18n/default.zh_Hans.po $(1)/usr/lib/lua/luci/i18n/default.zh-cn.lmo + po2lmo ./i18n/more.zh_Hans.po $(1)/usr/lib/lua/luci/i18n/more.zh-cn.lmo + po2lmo ./i18n/sqm.zh_Hans.po $(1)/usr/lib/lua/luci/i18n/sqm.zh-cn.lmo + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/tools + $(INSTALL_DATA) ./status/status.lua $(1)/usr/lib/lua/luci/tools/status.lua +endef + +$(eval $(call BuildPackage,addition-trans-zh)) diff --git a/PATCH/duplicate/addition-trans-zh-master/files/getcpu b/PATCH/duplicate/addition-trans-zh-master/files/getcpu new file mode 100644 index 000000000..00f442862 --- /dev/null +++ b/PATCH/duplicate/addition-trans-zh-master/files/getcpu @@ -0,0 +1,8 @@ +#!/bin/sh + +if [ $(busybox ps -w | grep getcpu | grep -v grep | wc -l) -le 2 ]; then + AT=$(cat /proc/stat | grep "^cpu " | awk '{print $2+$3+$4+$5+$6+$7+$8 " " $2+$3+$4+$7+$8}') + sleep 1 + BT=$(cat /proc/stat | grep "^cpu " | awk '{print $2+$3+$4+$5+$6+$7+$8 " " $2+$3+$4+$7+$8}') + printf "%.01f%%" $(echo $AT $BT | awk '{print (($4-$2)/($3-$1))*100}') >/tmp/cpuusage +fi diff --git a/PATCH/duplicate/addition-trans-zh-master/files/zzz-default-settings b/PATCH/duplicate/addition-trans-zh-master/files/zzz-default-settings new file mode 100644 index 000000000..68d967620 --- /dev/null +++ b/PATCH/duplicate/addition-trans-zh-master/files/zzz-default-settings @@ -0,0 +1,97 @@ +#!/bin/sh + +uci set luci.main.mediaurlbase='/luci-static/argon' +uci commit luci + +#timezone +uci set system.@system[0].timezone=CST-8 +uci set system.@system[0].zonename=Asia/Shanghai +uci commit system + +#ssrp +#sed -i 's/local ucic = uci.cursor()/local ucic = luci.model.uci.cursor()/g' /usr/share/shadowsocksr/subscribe.lua +#sed -i "s/'cbid.shadowsocksr.'/'widget.cbid.shadowsocksr.'/g" /usr/lib/lua/luci/view/shadowsocksr/ssrurl.htm + +#HW-RNG +uci set system.@rngd[0].enabled="1" +uci set system.@rngd[0].device="/dev/hwrng" +uci commit system + +#feed +sed -i '/openwrt_luci/ { s/snapshots\/packages/releases\/packages-19.07/g; }' /etc/opkg/distfeeds.conf +sed -i '/openwrt_packages/ { s/snapshots\/packages/releases\/packages-19.07/g; }' /etc/opkg/distfeeds.conf +sed -i '/openwrt_routing/ { s/snapshots\/packages/releases\/packages-19.07/g; }' /etc/opkg/distfeeds.conf +sed -i '/openwrt_telephony/ { s/snapshots\/packages/releases\/packages-19.07/g; }' /etc/opkg/distfeeds.conf +sed -i '/natelol/d' /etc/opkg/distfeeds.conf +sed -i 's,downloads.openwrt.org,mirrors.cloud.tencent.com/lede,g' /etc/opkg/distfeeds.conf + +#uhttpd +uci set uhttpd.main.rfc1918_filter=0 +uci set uhttpd.main.redirect_https=0 +uci commit uhttpd +/etc/init.d/uhttpd restart + +#firewall +uci set firewall.@zone[1].fullcone='1' +uci commit firewall + +#upnp +uci set upnpd.config.igdv1='1' +uci set upnpd.config.enabled='1' +uci del upnpd.config.enable_upnp +uci del upnpd.config.enable_natpmp +uci set upnpd.config.external_iface='wan' +uci commit upnpd + +#SSL +sed -i 's,#devcrypto,devcrypto,g' /etc/ssl/openssl.cnf +sed -i 's,#USE_SOFTDRIVERS = 2,USE_SOFTDRIVERS = 1,g' /etc/ssl/openssl.cnf + +#neteasemusic +#echo "59.111.239.62 httpdns.n.netease.com" >> /etc/hosts && cat /etc/hosts | sort | uniq > /tmp/tmp_hosts && cat /tmp/tmp_hosts > /etc/hosts + +#chinalist +echo "10 2 * * * chinadnslist &" >> /etc/crontabs/root && cat /etc/crontabs/root | sort | uniq > /tmp/tmp_cron_root && cat /tmp/tmp_cron_root > /etc/crontabs/root + +#openclash +echo "/etc/openclash/" >> /etc/sysupgrade.conf && cat /etc/sysupgrade.conf | sort | uniq > /tmp/tmp_sysupgrade_conf && cat /tmp/tmp_sysupgrade_conf > /etc/sysupgrade.conf + +#dockerman +sed -i 's,/opt,/overlay,g' /etc/config/dockerman + +#dnsmasq +uci set dhcp.lan.ra='hybrid' +uci set dhcp.lan.ndp='hybrid' +uci set dhcp.lan.dhcpv6='hybrid' +uci set dhcp.lan.ra_management='1' +uci del dhcp.@dnsmasq[0].rebind_protection='1' +uci commit dhcp +sed -i '/log-facility/d' /etc/dnsmasq.conf +echo "log-facility=/dev/null" >> /etc/dnsmasq.conf + +#packet_steering +uci set network.globals.packet_steering='1' +uci commit network + +#SSRP +uci set shadowsocksr.@global[0].gfwlist_url='https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt' +uci set shadowsocksr.@global[0].chnroute_url='https://cdn.jsdelivr.net/gh/QiuSimons/Chnroute@master/dist/chnroute/chnroute.txt' +uci commit shadowsocksr + +ln -sf /sbin/ip /usr/bin/ip + +opkg flag hold luci-app-ddns +opkg flag hold luci-i18n-ddns-zh-cn +opkg flag hold ddns-scripts +opkg flag hold ddns-scripts_cloudflare.com-v4 +opkg flag hold luci-app-firewall +opkg flag hold firewall +opkg flag hold dnsmasq-full + +#sync; echo 3 > /proc/sys/vm/drop_caches + +#luci cache +rm -rf /tmp/luci-modulecache +rm -f /tmp/luci-indexcache + +exit 0 diff --git a/PATCH/duplicate/addition-trans-zh-master/i18n/default.zh_Hans.po b/PATCH/duplicate/addition-trans-zh-master/i18n/default.zh_Hans.po new file mode 100644 index 000000000..98a4bf14e --- /dev/null +++ b/PATCH/duplicate/addition-trans-zh-master/i18n/default.zh_Hans.po @@ -0,0 +1,234 @@ +msgid "Processor" +msgstr "处理器" + +msgid "Architecture" +msgstr "架构" + +msgid "CPU Temperature" +msgstr "CPU 温度" + +msgid "CPU Info" +msgstr "CPU 信息" + +msgid "CPU Model" +msgstr "处理器型号" + +msgid "CPU frequency" +msgstr "CPU 频率" + +msgid "RAM frequency" +msgstr "RAM 频率" + +msgid "Flash Size" +msgstr "闪存大小" + +msgid "Free Memory" +msgstr "释放内存" + +msgid "RUNNING" +msgstr "运行中" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "ZRam Settings" +msgstr "ZRam 设置" + +msgid "ZRam Compression Algorithm" +msgstr "ZRam 压缩算法" + +msgid "ZRam Compression Streams" +msgstr "ZRam 压缩数据流线程数" + +msgid "ZRam Size" +msgstr "ZRam 大小" + +msgid "Size of the ZRam device in megabytes" +msgstr "划分给 ZRam 分区的内存大小(MB),推荐留空由系统自动管理" + +msgid "Number of parallel threads used for compression" +msgstr "用于压缩内存数据的CPU并发线程数" + +msgid "Swap" +msgstr "虚拟内存" + +msgid "Force 40MHz mode" +msgstr "强制 40MHz 频宽" + +msgid "" +"Always use 40MHz channels even if the secondary channel overlaps. Using this " +"option does not comply with IEEE 802.11n-2009!" +msgstr "强制启用 40MHz 频宽并忽略辅助信道重叠。此选项可能不兼容某些无线硬件导致无法启用!" + +msgid "Disassociate On Low Acknowledgement" +msgstr "弱信号剔除" + +msgid "Allow AP mode to disconnect STAs based on low ACK condition" +msgstr "允许 AP 模式基于低 ACK 条件判断剔除弱信号的客户端" + +msgid "Base Setting" +msgstr "基本设置" + +msgid "Log" +msgstr "日志" + +msgid "Ethernet Information" +msgstr "网口信息" + +msgid "Ethernet Name" +msgstr "网口名" + +msgid "Link Status" +msgstr "连接状态" + +msgid "Speed" +msgstr "速率" + +msgid "Duplex" +msgstr "双工模式" + +msgid "Link Up" +msgstr "已连接" + +msgid "Link Down" +msgstr "已断开" + +msgid "Full Duplex" +msgstr "全双工" + +msgid "Half Duplex" +msgstr "半双工" + +msgid "10 seconds" +msgstr "10 秒" + +msgid "2 seconds" +msgstr "2 秒" + +msgid "30 seconds" +msgstr "30 秒" + +msgid "5 seconds" +msgstr "5 秒" + +msgid "Auto update every:" +msgstr "自动刷新:" + +msgid "Clients" +msgstr "客户端" + +msgid "Collecting data..." +msgstr "收集数据中..." + +msgid "Configuration" +msgstr "配置" + +msgid "Database Path" +msgstr "数据路径" + +msgid "Details" +msgstr "流量信息" + +msgid "Disabled" +msgstr "禁用" + +msgid "Download" +msgstr "下载" + +msgid "Each line must have the following format:" +msgstr "每行需要满足以下格式:" + +msgid "Enabled" +msgstr "启用" + +msgid "Error! Bandwidth reset!!!" +msgstr "错误!重置带宽!!!" + +msgid "First Seen" +msgstr "初次记录" + +msgid "General settings" +msgstr "通用设置" + +msgid "Last Seen" +msgstr "最后记录" + +msgid "Last updated at %s." +msgstr "最后更新于 %s。" + +msgid "Reset Database" +msgstr "重置" + +msgid "Save" +msgstr "保存" + +msgid "Show More:" +msgstr "显示更多:" + +msgid "Show Zeros:" +msgstr "显示 0 流量:" + +msgid "TOTAL" +msgstr "总共" + +msgid "" +"This box is used to select the Database path, which is /tmp/usage.db by " +"default." +msgstr "该选项用于选择数据存储路径,默认路径为 /tmp/usage.db。" + +msgid "This will delete the database file. Are you sure?" +msgstr "该操作将删除数据统计文件,确定执行该操作?" + +msgid "This will revert the changes. Are you sure?" +msgstr "更改将会重置,确定吗?" + +msgid "Total" +msgstr "总计" + +msgid "Total Down" +msgstr "总下载" + +msgid "Total Up" +msgstr "总上传" + +msgid "Traffic Status" +msgstr "流量监控" + +msgid "Unable to load the customized hostname file:" +msgstr "不能载入自定义用户名文件:" + +msgid "Updating again in %s seconds." +msgstr "下次更新将于 %s 秒之后。" + +msgid "Upload" +msgstr "上传" + +msgid "Usage - Configuration" +msgstr "文件设置" + +msgid "Usage - Custom User File" +msgstr "用户文件配置" + +msgid "Usage - Details" +msgstr "流量详情" + +msgid "User file" +msgstr "用户文件" + +msgid "bandwidth:" +msgstr "带宽:" + +msgid "downflow:" +msgstr "下行:" + +msgid "protocol:" +msgstr "协议:" + +msgid "seconds." +msgstr "秒。" + +msgid "upflow:" +msgstr "上传:" + +msgid "There is no password set on this router. Please configure a root password to protect the web interface and enable SSH." +msgstr "尚未设置密码。请为 root 用户设置密码以保护主机并启用 SSH 。" diff --git a/PATCH/duplicate/addition-trans-zh-master/i18n/more.zh_Hans.po b/PATCH/duplicate/addition-trans-zh-master/i18n/more.zh_Hans.po new file mode 100644 index 000000000..64dca83dd --- /dev/null +++ b/PATCH/duplicate/addition-trans-zh-master/i18n/more.zh_Hans.po @@ -0,0 +1,1160 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Last-Translator: dingpengyu \n" +"Project-Id-Version: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: zh_CN\n" +"X-Generator: Poedit 2.3.1\n" + +msgid "%d hour" +msgstr "%d 小时" + +msgid "%d minute" +msgstr "%d 分钟" + +msgid "%d minutes" +msgstr "%d 分钟" + +msgid "%d second" +msgstr "%d 秒" + +msgid "%d seconds" +msgstr "%d 秒" + +msgid "" +"Acceptable values: 1-100. This many Tracking IP addresses must respond for " +"the link to be deemed up" +msgstr "" +"取值范围: 1-100。这个设置项指定了当多少个 IP 地址能够连通时接口会被认为在线" + +msgid "Acceptable values: 1-1000. Defaults to 1 if not set" +msgstr "取值范围: 1-100。如果不填写,默认值为 1" + +msgid "Advanced" +msgstr "高级" + +msgid "Check IP rules" +msgstr "检查 IP 规则" + +msgid "Check routing table" +msgstr "检查路由表" + +msgid "Collecting data..." +msgstr "正在收集数据..." + +msgid "Configuration" +msgstr "配置" + +msgid "Currently Configured Interfaces" +msgstr "当前配置的接口" + +msgid "Currently Configured Members" +msgstr "当前配置的成员" + +msgid "Currently Configured Policies" +msgstr "当前配置的策略" + +msgid "Destination address" +msgstr "目标地址" + +msgid "Destination port" +msgstr "目标端口" + +msgid "Detailed Status" +msgstr "详细状态" + +msgid "Diagnostic Results" +msgstr "诊断结果" + +msgid "Diagnostics" +msgstr "诊断" + +msgid "Disabled" +msgstr "禁用" + +msgid "" +"Downed interface will be deemed up after this many successful ping tests" +msgstr "当 Ping 成功次数达到这个数值后,已经被认为离线的接口将会重新上线" + +msgid "Enabled" +msgstr "启用" + +msgid "Error collecting troubleshooting information" +msgstr "收集故障排除信息时出错" + +msgid "Errors" +msgstr "错误" + +msgid "Failure interval" +msgstr "故障检测间隔" + +msgid "Flush conntrack table" +msgstr "刷新连接跟踪表" + +msgid "Flush global firewall conntrack table on interface events" +msgstr "在接口事件触发时刷新全局防火墙连接跟踪表" + +msgid "Hotplug Script" +msgstr "Hotplug 脚本" + +msgid "Hotplug ifdown" +msgstr "Hotplug ifdown" + +msgid "Hotplug ifup" +msgstr "Hotplug ifup" + +msgid "IPset" +msgstr "IPset" + +msgid "IPv4" +msgstr "IPv4" + +msgid "IPv6" +msgstr "IPv6" + +msgid "Interface" +msgstr "接口" + +msgid "Interface Status" +msgstr "接口状态" + +msgid "Interface down" +msgstr "接口离线" + +msgid "Interface up" +msgstr "接口上线" + +msgid "Interface will be deemed down after this many failed ping tests" +msgstr "当 Ping 失败次数达到这个数值后接口会被认为离线" + +msgid "Interfaces" +msgstr "接口" + +msgid "Internet Protocol" +msgstr "互联网协议" + +msgid "Last 50 MWAN systemlog entries. Newest entries sorted at the top :" +msgstr "最近 50 条 MWAN 系统日志,最新条目排在顶部:" + +msgid "Last resort" +msgstr "备用成员" + +msgid "Load Balancing" +msgstr "负载均衡" + +msgid "Loading" +msgstr "载入中" + +msgid "MWAN Config" +msgstr "MWAN 配置文件" + +msgid "MWAN Detailed Status" +msgstr "MWAN 详细状态" + +msgid "MWAN Interface Configuration" +msgstr "MWAN 接口配置" + +msgid "MWAN Interface Configuration - %s" +msgstr "MWAN 接口配置 - %s" + +msgid "MWAN Interface Diagnostics" +msgstr "MWAN 接口诊断" + +msgid "MWAN Interface Live Status" +msgstr "MWAN 接口实时状态" + +msgid "MWAN Interface Systemlog" +msgstr "MWAN 接口系统日志" + +msgid "MWAN Member Configuration" +msgstr "MWAN 成员配置" + +msgid "MWAN Member Configuration - %s" +msgstr "MWAN 成员配置 - %s" + +msgid "MWAN Policy Configuration" +msgstr "MWAN 策略配置" + +msgid "MWAN Policy Configuration - %s" +msgstr "MWAN 策略配置 - %s" + +msgid "MWAN Rule Configuration" +msgstr "MWAN 规则配置" + +msgid "MWAN Rule Configuration - %s" +msgstr "MWAN 规则配置 - %s" + +msgid "MWAN Service Control" +msgstr "MWAN 服务控制" + +msgid "" +"MWAN supports up to 250 physical and/or logical interfaces
MWAN " +"requires that all interfaces have a unique metric configured in /etc/config/" +"network
Names must match the interface name found in /etc/config/" +"network (see advanced tab)
Names may contain characters A-Z, a-z, 0-9, " +"_ and no spaces
Interfaces may not share the same name as configured " +"members, policies or rules" +msgstr "" +"MWAN 支持最多 250 个物理或逻辑接口。
MWAN 要求所有接口必须在 /etc/" +"config/network 中设定唯一的网关跃点。
名称必须与 /etc/config/network 中" +"的接口名称匹配。(可查看“高级”选项卡)
名称允许包括A-Z、a-z、0-9、_ 但是" +"不能有空格。
接口不应该与成员、策略、规则中的任意一个设置项使用相同的名" +"称" + +msgid "" +"May be entered as a single or multiple port(s) (eg \"22\" or \"80,443\") or " +"as a portrange (eg \"1024:2048\") without quotes" +msgstr "" +"可以输入一个或多个端口(例如 \"22\" 或者 \"80,443\")或者是一个端口范围(例" +"如 \"1024:2048\")不含引号" + +msgid "Member" +msgstr "成员" + +msgid "Member used" +msgstr "使用的成员" + +msgid "Members" +msgstr "成员" + +msgid "" +"Members are profiles attaching a metric and weight to an MWAN interface
Names may contain characters A-Z, a-z, 0-9, _ and no spaces
Members " +"may not share the same name as configured interfaces, policies or rules" +msgstr "" +"“成员”用来设置每一个 MWAN 接口的跃点数(即接口优先级)和所占比重。
名称" +"允许包括 A-Z、 a-、0-9、_ 但是不能有空格。
成员不应该与接口、策略、规则" +"中的任意一个设置项使用相同的名称" + +msgid "Members assigned" +msgstr "分配的成员" + +msgid "Metric" +msgstr "跃点数" + +msgid "" +"Name of IPset rule. Requires IPset rule in /etc/dnsmasq.conf (eg \"ipset=/" +"youtube.com/youtube\")" +msgstr "" +"匹配 IPset 规则列表名称。需要先配置 /etc/dnsmasq.conf 中的 IPset 规则 (例如: " +"\"ipset=/youtube.com/youtube\")" + +msgid "Network Config" +msgstr "网络配置文件" + +msgid "No" +msgstr "否" + +msgid "No MWAN interfaces found" +msgstr "没有找到 MWAN 接口" + +msgid "No MWAN systemlog history found" +msgstr "没有在系统日志中找到 MWAN 历史信息" + +msgid "No detailed status information available" +msgstr "没有状态详细信息可用" + +msgid "No diagnostic results returned" +msgstr "没有返回诊断结果" + +msgid "No protocol specified" +msgstr "未指定协议" + +msgid "Offline" +msgstr "离线" + +msgid "Online (tracking active)" +msgstr "在线(追踪启用中)" + +msgid "Online (tracking off)" +msgstr "在线(追踪已关闭)" + +msgid "Overview" +msgstr "概况" + +msgid "Ping count" +msgstr "Ping 计数" + +msgid "Ping default gateway" +msgstr "Ping 默认网关" + +msgid "Ping interval" +msgstr "Ping 间隔" + +msgid "Ping interval during failure detection" +msgstr "故障检测期间的 Ping 间隔" + +msgid "Ping interval during failure recovering" +msgstr "故障恢复期间的 Ping 间隔" + +msgid "Ping size" +msgstr "Ping 大小" + +msgid "Ping timeout" +msgstr "Ping 超时" + +msgid "Ping tracking IP" +msgstr "Ping 跟踪 IP" + +msgid "Policies" +msgstr "策略" + +msgid "" +"Policies are profiles grouping one or more members controlling how MWAN " +"distributes traffic
Member interfaces with lower metrics are used " +"first. Interfaces with the same metric load-balance
Load-balanced " +"member interfaces distribute more traffic out those with higher weights
Names may contain characters A-Z, a-z, 0-9, _ and no spaces. Names must be " +"15 characters or less
Policies may not share the same name as " +"configured interfaces, members or rules" +msgstr "" +"“策略”把成员进行分组,告诉 MWAN 如何分配“规则”中使用这一策略的流量
拥有" +"较低跃点数的成员将会被优先使用。拥有相同跃点数的成员把流量进行负载均衡。
进行负载均衡的成员之间拥有较高比重的成员将会被分配到更多流量。
名称允许" +"包括A-Z、a-z、0-9、_ 但是不能有空格。名称应该在 15 个字符以内
策略不应该" +"与接口、成员、规则中的任意一个设置项使用相同的名称" + +msgid "Policy" +msgstr "策略" + +msgid "Policy assigned" +msgstr "分配的策略" + +msgid "Protocol" +msgstr "协议" + +msgid "Recovery interval" +msgstr "故障恢复间隔" + +msgid "Restart MWAN" +msgstr "重启 MWAN" + +msgid "Restore default hotplug script" +msgstr "恢复默认的 hotplug 脚本" + +msgid "Restore..." +msgstr "恢复..." + +msgid "Rule" +msgstr "规则" + +msgid "Rules" +msgstr "规则" + +msgid "" +"Rules specify which traffic will use a particular MWAN policy based on IP " +"address, port or protocol
Rules are matched from top to bottom. Rules " +"below a matching rule are ignored. Traffic not matching any rule is routed " +"using the main routing table
Traffic destined for known (other than " +"default) networks is handled by the main routing table. Traffic matching a " +"rule, but all WAN interfaces for that policy are down will be blackholed
Names may contain characters A-Z, a-z, 0-9, _ and no spaces
Rules may " +"not share the same name as configured interfaces, members or policies" +msgstr "" +"“规则”基于 IP 地址、协议、端口把流量划分到指定的“策略”中。
规则按照从上" +"到下的顺序进行匹配。除了第一条能够匹配一次通信的规则以外,其它规则将被忽略。" +"不匹配任何规则的通信将会由系统默认路由表进行。
来自已知的网络的转发流量" +"由系统默认路由表接手,然后 MWAN 从中匹配出相应的流量并转移到 MWAN 自己的路由" +"表。但是所有被划分到一个无法使用的策略的流量将会无法正常进行路由。
名称" +"允许包括A-Z、a-z、0-9、_ 但是不能有空格。
规则不应该与接口、成员、策略中" +"的任意一个设置项使用相同的名称" + +msgid "Seconds. Acceptable values: 1-1000000. Defaults to 600 if not set" +msgstr "单位为秒。接受的值: 1-1000000。留空则使用默认值 600 秒" + +msgid "Source address" +msgstr "源地址" + +msgid "Source port" +msgstr "源端口" + +msgid "Start MWAN" +msgstr "启动 MWAN" + +msgid "Sticky" +msgstr "粘滞模式" + +msgid "Sticky timeout" +msgstr "粘滞超时" + +msgid "Stop MWAN" +msgstr "停止 MWAN" + +msgid "Supports CIDR notation (eg \"192.168.100.0/24\") without quotes" +msgstr "支持 CIDR 记法(例如: \"192.168.100.0/24\")不含引号" + +msgid "There are currently %d of 250 supported interfaces configured" +msgstr "当前已配置 %d 个接口,最大支持 250 个" + +msgid "" +"This displays the metric assigned to this interface in /etc/config/network" +msgstr "这里显示了这个接口在 /etc/config/network 中配置的跃点数" + +msgid "" +"This hostname or IP address will be pinged to determine if the link is up or " +"down. Leave blank to assume interface is always online" +msgstr "通过 ping 此主机或 IP 地址来确定链路是否在线。留空则认为接口始终在线" + +msgid "This section allows you to modify the contents of /etc/config/mwan3" +msgstr "这里允许你修改 /etc/config/mwan3 的内容" + +msgid "This section allows you to modify the contents of /etc/config/network" +msgstr "这里允许你修改 /etc/config/network 的内容" + +msgid "This section allows you to modify the contents of /etc/config/wireless" +msgstr "这里允许你修改 /etc/config/wireless 的内容" + +msgid "" +"This section allows you to modify the contents of /etc/hotplug.d/iface/16-" +"mwancustom
This is useful for running system commands and/or scripts " +"based on interface ifup or ifdown hotplug events

Notes:
The " +"first line of the script must be "#!/bin/sh" without quotes
Lines beginning with # are comments and are not executed

Available variables:
$ACTION is the hotplug event (ifup, ifdown)
" +"$INTERFACE is the interface name (wan1, wan2, etc.)
$DEVICE is the " +"device name attached to the interface (eth0.1, eth1, etc.)" +msgstr "" +"这里允许你修改 /etc/hotplug.d/iface/16-mwancustom 的内容
这可以在接口 " +"ifup 或 ifdown Hotplug 事件时运行系统命令或脚本

注意:
脚本的" +"第一行必须是 "#!/bin/sh" 不含引号
以#开头的行是注释,不会执行" +"

可用变量:
$ACTION 是 Hotplug 事件(ifup, ifdown)
" +"$INTERFACE 是接口名称(wan1、wan2 等)
$DEVICE 是连接到接口的设备名称 " +"(eth0.1、eth1 等)" + +msgid "Tracking IP" +msgstr "追踪的 IP" + +msgid "Tracking hostname or IP address" +msgstr "追踪的主机或 IP 地址" + +msgid "Tracking reliability" +msgstr "追踪可靠性" + +msgid "Traffic Rules" +msgstr "流量规则" + +msgid "" +"Traffic from the same source IP address that previously matched this rule " +"within the sticky timeout period will use the same WAN interface" +msgstr "" +"来自相同源 IP 的流量,如果已经匹配过此规则并且在粘滞超时时间内,将会使用相同" +"的 WAN 接口" + +msgid "Troubleshooting" +msgstr "故障排除" + +msgid "Troubleshooting Data" +msgstr "故障排除数据" + +msgid "View the contents of /etc/protocols for protocol descriptions" +msgstr "请查看 /etc/protocols 获取可选协议详情" + +msgid "WARNING: %d interfaces are configured exceeding the maximum of 250!" +msgstr "警告: 已配置 %d 个接口,超过最大值 250!" + +msgid "" +"WARNING: Some policies have names exceeding the maximum of 15 characters!" +msgstr "警告: 某些策略的名称超过了 15 个字符!" + +msgid "" +"WARNING: some interfaces are configured incorrectly or not at all in /etc/" +"config/network!" +msgstr "警告: 某些接口配置不正确或未配置到 /etc/config/network!" + +msgid "" +"WARNING: some interfaces have a higher reliability requirement than there " +"are tracking IP addresses!" +msgstr "警告: 某些接口的追踪可靠性要求大于了追踪 IP 地址总数!" + +msgid "" +"WARNING: some interfaces have duplicate metrics configured in /etc/config/" +"network!" +msgstr "警告: 某些接口在 /etc/config/network 中配置了相同的跃点数!" + +msgid "" +"WARNING: some interfaces have no default route in the main routing table!" +msgstr "警告: 某些接口在主路由表中没有默认路由!" + +msgid "" +"WARNING: some interfaces have no metric configured in /etc/config/network!" +msgstr "警告: 某些接口没有在 /etc/config/network 中配置跃点数!" + +msgid "" +"WARNING: some rules have a port configured with no or improper protocol " +"specified! Please configure a specific protocol!" +msgstr "" +"警告: 某些规则指定了端口却没有配置或配置了不正确的协议,请重新指定协议!" + +msgid "" +"WARNING: this and other interfaces have duplicate metrics configured in /etc/" +"config/network!" +msgstr "警告: 此接口和其他接口在 /etc/config/network 中配置了相同的跃点数!" + +msgid "" +"WARNING: this interface has a higher reliability requirement than there are " +"tracking IP addresses!" +msgstr "警告: 此接口的追踪可靠性要求大于了追踪 IP 地址总数!" + +msgid "WARNING: this interface has no default route in the main routing table!" +msgstr "警告: 此接口在主路由表中没有默认路由!" + +msgid "" +"WARNING: this interface has no metric configured in /etc/config/network!" +msgstr "警告: 此接口没有在 /etc/config/network 中配置跃点数!" + +msgid "" +"WARNING: this interface is configured incorrectly or not at all in /etc/" +"config/network!" +msgstr "警告: 此接口配置不正确或未配置到 /etc/config/network!" + +msgid "" +"WARNING: this policy's name is %d characters exceeding the maximum of 15!" +msgstr "警告: 此策略的名称具有 %d 个字符,超过了 15 个字符!" + +msgid "" +"WARNING: this rule is incorrectly configured with no or improper protocol " +"specified! Please configure a specific protocol!" +msgstr "警告: 此规则没有配置或配置了不正确的协议,请重新指定协议!" + +msgid "Waiting for MWAN to %s..." +msgstr "等待 MWAN %s..." + +msgid "Waiting for diagnostic results..." +msgstr "等待诊断结果..." + +msgid "Weight" +msgstr "比重" + +msgid "" +"When all policy members are offline use this behavior for matched traffic" +msgstr "当所有策略成员都无法使用的时候,对使用该策略的流量使用这个操作" + +msgid "Wireless Config" +msgstr "无线配置" + +msgid "Yes" +msgstr "是" + +msgid "always" +msgstr "总是" + +msgid "blackhole (drop)" +msgstr "黑洞(丢弃)" + +msgid "default (use main routing table)" +msgstr "默认(使用主路由表)" + +msgid "ifdown" +msgstr "ifdown" + +msgid "ifup" +msgstr "ifup" + +msgid "never" +msgstr "从不" + +msgid "restart" +msgstr "重启" + +msgid "start" +msgstr "启动" + +msgid "stop" +msgstr "关闭" + +msgid "unreachable (reject)" +msgstr "不可达(拒绝)" + +msgid "%d IPv4-only hosts" +msgstr "%d 个主机仅支持 IPv4" + +msgid "%d IPv6-only hosts" +msgstr "%d 个主机仅支持 IPv6" + +msgid "%d dual-stack hosts" +msgstr "%d 个双协议栈主机" + +msgid "%s and %s" +msgstr "%s 和 %s" + +msgid "%s, %s and %s" +msgstr "%s, %s 和 %s" + +msgid "-1 - Restart every last day of month" +msgstr "-1 - 每月的最后一天重新开始" + +msgid "-7 - Restart a week before end of month" +msgstr "-7 - 每月底前一周重新开始" + +msgid "1 - Restart every 1st of month" +msgstr "1 - 每月的第一天重新开始" + +msgid "10m - frequent commits at the expense of flash wear" +msgstr "10m - 频繁提交,闪存损耗的开销也增大" + +msgid "12h - compromise between risk of data loss and flash wear" +msgstr "12h - 平衡统计数据丢失的风险以及闪存使用寿命" + +msgid "24h - least flash wear at the expense of data loss risk" +msgstr "24h - 以数据丢失风险的代价换取最小的闪存损耗" + +msgid "30s - refresh twice per minute for reasonably current stats" +msgstr "30s - 每分钟刷新二次以获得较准确的当前统计值" + +msgid "5m - rarely refresh to avoid frequently clearing conntrack counters" +msgstr "5m - 较少刷新以避免频繁清除连接跟踪计数器" + +msgid "60s - commit minutely, useful for non-flash storage" +msgstr "60s - 每分钟提交,适用于非闪存类型存储" + +msgid "0 connections" +msgstr "连接:0" + +msgid "0 hosts" +msgstr "主机:0" + +msgid "0% IPv6 support rate among hosts" +msgstr "支持 IPv6 的主机比例:0%" + +msgid "0B total IPv6 download" +msgstr "IPv6 总下载量:0B" + +msgid "0% of the total traffic is IPv6" +msgstr "IPv6 流量比例:0%" + +msgid "0B total IPv6 upload" +msgstr "IPv6 总上传量:0B" + +msgid "0 cause the most connections" +msgstr "0 是连接数最多的协议" + +msgid "0 cause the most download" +msgstr "0 是下载量最大的协议" + +msgid "0 cause the most upload" +msgstr "0 是上传量最大的协议" + +msgid "0 different application protocols" +msgstr "0 种不同的应用层协议" + +msgid "0 download" +msgstr "下载:0" + +msgid "0 upload" +msgstr "上传:0" + +msgid "Accounting period" +msgstr "统计周期" + +msgid "Advanced Settings" +msgstr "高级设置" + +msgid "Application" +msgstr "应用层协议" + +msgid "Application Protocols" +msgstr "应用层协议" + +msgid "Backup" +msgstr "备份" + +msgid "Bandwidth Monitor" +msgstr "带宽监控" + +msgid "CSV, grouped by IP" +msgstr "CSV,按 IP 分组" + +msgid "CSV, grouped by MAC" +msgstr "CSV,按 MAC 分组" + +msgid "CSV, grouped by protocol" +msgstr "CSV,按协议分组" + +msgid "" +"Changing the accounting interval type will invalidate existing databases!" +"
Download backup." +msgstr "" +"更改统计周期类型会使现有数据库无效!
下载备份." + +msgid "" +"Choose \"Day of month\" to restart the accounting period monthly on a " +"specific date, e.g. every 3rd. Choose \"Fixed interval\" to restart the " +"accounting period exactly every N days, beginning at a given date." +msgstr "" +"选择“每月的某一天”来设置统计周期的重启时间,例如:每个月的第 3 天。选择“固定" +"周期”来设置从给定日期开始每 N 天重启统计周期。" + +msgid "Commit interval" +msgstr "提交间隔" + +msgid "Compress database" +msgstr "压缩数据库" + +msgid "Conn." +msgstr "连接。" + +msgid "Connections" +msgstr "连接" + +msgid "Connections / Host" +msgstr "连接 / 主机" + +msgid "Database directory" +msgstr "数据库目录" + +msgid "" +"Database storage directory. One file per accounting period will be placed " +"into this directory." +msgstr "数据库存储目录。每个“统计周期”的文件将被放到这个目录中。" + +msgid "Day of month" +msgstr "每月的某一天" + +msgid "" +"Day of month to restart the accounting period. Use negative values to count " +"towards the end of month, e.g. \"-5\" to specify the 27th of July or the " +"24th of Februrary." +msgstr "" +"每个月重启统计周期的日期。使用负数表示从月底开始计算,例如:\"-5\" 可以表示 " +"7 月份的 27 号或者 2 月份的 24 号。" + +msgid "Display" +msgstr "显示" + +msgid "Down. (Bytes / Pkts.)" +msgstr "下载(字节 / 数据包)" + +msgid "Download (Bytes / Packets)" +msgstr "下载(字节 / 数据包)" + +msgid "Download / Application" +msgstr "下载 / 应用层协议" + +msgid "Download Database Backup" +msgstr "下载数据库备份" + +msgid "Dualstack enabled hosts" +msgstr "双协议栈主机" + +msgid "Due date" +msgstr "重置日期" + +msgid "Export" +msgstr "导出" + +msgid "Family" +msgstr "协议类型" + +msgid "Fixed interval" +msgstr "固定周期" + +msgid "Force reload…" +msgstr "强制重新加载..…" + +msgid "General Settings" +msgstr "基本设置" + +msgid "Generate Backup" +msgstr "生成备份" + +msgid "Host" +msgstr "主机" + +msgid "Hostname: example.org" +msgstr "主机名:example.org" + +msgid "IPv4 vs. IPv6" +msgstr "IPv4 与 IPv6" + +msgid "Interval" +msgstr "周期" + +msgid "" +"Interval at which the temporary in-memory database is committed to the " +"persistent database directory." +msgstr "将内存中的临时数据库提交到持久性数据库目录的间隔时间。" + +msgid "" +"Interval at which traffic counters of still established connections are " +"refreshed from netlink information." +msgstr "从 netlink 信息中刷新“已建立连接”的流量计数器的间隔时间。" + +msgid "Invalid or empty backup archive" +msgstr "备份存档无效或为空" + +msgid "JSON dump" +msgstr "JSON 输出" + +msgid "Length of accounting interval in days." +msgstr "统计周期(天)。" + +msgid "Local interfaces" +msgstr "本地接口" + +msgid "Local subnets" +msgstr "本地子网" + +msgid "MAC" +msgstr "MAC" + +msgid "Maximum entries" +msgstr "最大条目" + +msgid "" +"Maximum number of accounting periods to keep, use zero to keep databases " +"forever." +msgstr "保留的统计周期数据库的最大数量,设置 0 表示不限制。" + +msgid "Netlink Bandwidth Monitor" +msgstr "网络带宽监视器" + +msgid "Netlink Bandwidth Monitor - Backup / Restore" +msgstr "网络带宽监视器 - 备份 / 恢复" + +msgid "Netlink Bandwidth Monitor - Configuration" +msgstr "网络带宽监视器 - 配置" + +msgid "No data recorded yet." +msgstr "暂无数据记录。" + +msgid "Only conntrack streams from or to any of these networks are counted." +msgstr "仅统计来自或目标为这些网络接口的连接流量。" + +msgid "Only conntrack streams from or to any of these subnets are counted." +msgstr "仅统计来自或目标为这些子网的连接流量。" + +msgid "Preallocate database" +msgstr "预分配数据库" + +msgid "Protocol Mapping" +msgstr "协议映射" + +msgid "" +"Protocol mappings to distinguish traffic types per host, one mapping per " +"line. The first value specifies the IP protocol, the second value the port " +"number and the third column is the name of the mapped protocol." +msgstr "" +"协议映射用于区分流量类型,每行一条。第一个值指定 IP 协议类型,第二个值是端口" +"号,第三个值是映射的协议名称。" + +msgid "Refresh interval" +msgstr "刷新间隔" + +msgid "Restore" +msgstr "恢复" + +msgid "Restore Database Backup" +msgstr "恢复数据库备份" + +msgid "Select accounting period:" +msgstr "选择统计周期:" + +msgid "Source IP" +msgstr "源 IP" + +msgid "Start date" +msgstr "起始日期" + +msgid "Start date of the first accounting period, e.g. begin of ISP contract." +msgstr "第一个统计周期的起始日期,例如:ISP 合约的起始日期。" + +msgid "Stored periods" +msgstr "储存周期" + +msgid "" +"The Netlink Bandwidth Monitor (nlbwmon) is a lightweight, efficient traffic " +"accounting program keeping track of bandwidth usage per host and protocol." +msgstr "" +"网络带宽监视器(nlbwmon)是一个轻量、高效的流量统计程序,可以统计每个主机和协" +"议的带宽使用情况。" + +msgid "The following database files have been restored: %s" +msgstr "以下数据库文件已恢复:%s" + +msgid "" +"The maximum amount of entries that should be put into the database, setting " +"the limit to 0 will allow databases to grow indefinitely." +msgstr "数据库中的最大条目数量, 设置为 0 将允许数据库无限增长。" + +msgid "Traffic / Host" +msgstr "流量 / 主机" + +msgid "Traffic Distribution" +msgstr "流量分布" + +msgid "Up. (Bytes / Pkts.)" +msgstr "上传(字节 / 数据包)" + +msgid "Upload (Bytes / Packets)" +msgstr "上传(字节 / 数据包)" + +msgid "Upload / Application" +msgstr "上传 / 应用层协议" + +msgid "Vendor: Example Corp." +msgstr "供应商: Example Corp." + +msgid "Warning" +msgstr "警告" + +msgid "" +"Whether to gzip compress archive databases. Compressing the database files " +"makes accessing old data slightly slower but helps to reduce storage " +"requirements." +msgstr "" +"是否使用 gzip 压缩数据库存档。压缩数据库文件会使访问旧数据稍微慢一些, 但有助" +"于减少存储占用空间。" + +msgid "" +"Whether to preallocate the maximum possible database size in memory. This is " +"mainly useful for memory constrained systems which might not be able to " +"satisfy memory allocation after longer uptime periods." +msgstr "" +"是否预先分配数据库最大可能占用的内存大小。这主要适用于内存较小系统,这些系统" +"在长时间运行之后可能无法满足数据库的内存需求。" + +msgid "no traffic" +msgstr "无流量数据" + +msgid "other" +msgstr "其他" + +msgid "" +"Enable IGMP " +"snooping" +msgstr "" +"开启 IGMP snooping" + +msgid "Enables IGMP snooping on this bridge" +msgstr "在此桥接上启用 IGMP snooping 组播(多播)" + +msgid "Action" +msgstr "动作" + +msgid "Advanced Reboot" +msgstr "双分区启动切换" + +msgid "Alternative" +msgstr "备选" + +msgid "Cancel" +msgstr "取消" + +msgid "Confirm" +msgstr "确定" + +msgid "Current" +msgstr "当前" + +msgid "Firmware/OS (Kernel)" +msgstr "固件/系统 (内核)" + +msgid "Partition" +msgstr "分区" + +msgid "Partitions" +msgstr "分区" + +msgid "Perform power off..." +msgstr "点击关机..." + +msgid "Power Off Device" +msgstr "关闭设备" + +msgid "Proceed" +msgstr "处理" + +msgid "Reboot Device to an Alternative Partition" +msgstr "重启设备到备选分区" + +msgid "Reboot to alternative partition..." +msgstr "重启到备选分区。" + +msgid "Reboot to current partition" +msgstr "重启到当前分区" + +msgid "Rebooting..." +msgstr "正在重启..." + +msgid "Shutting down..." +msgstr "正在关闭..." + +msgid "Status" +msgstr "状态" + +msgid "" +"The system is rebooting now.
DO NOT POWER OFF THE DEVICE!
Wait a " +"few minutes before you try to reconnect. It might be necessary to renew the " +"address of your computer to reach the device again, depending on your " +"settings." +msgstr "" +"系统正在重启。
请勿关闭设备电源!
请等待几分钟,然后再尝试重新连" +"接。根据您的设置,可能需要更新计算机的地址才能再次访问该设备。" + +msgid "" +"The system is rebooting to an alternative partition now.
DO NOT POWER " +"OFF THE DEVICE!
Wait a few minutes before you try to reconnect. It " +"might be necessary to renew the address of your computer to reach the device " +"again, depending on your settings." +msgstr "" +"系统正在重新引导到备用分区。
请勿关闭设备电源!
请等待几分钟,然" +"后再尝试重新连接。根据您的设置,可能需要更新计算机的地址才能再次访问该设备。" + +msgid "" +"The system is shutting down now.
DO NOT POWER OFF THE DEVICE!
It " +"might be necessary to renew the address of your computer to reach the device " +"again, depending on your settings." +msgstr "" +"系统正在关闭。
请勿关闭设备电源!
根据您的设置,可能需要更新计算" +"机的地址才能再次访问该设备。" + +msgid "" +"WARNING: An alternative partition might have its own settings and completely " +"different firmware.

As your network configuration and WiFi SSID/" +"password on alternative partition might be different, you might have to " +"adjust your computer settings to be able to access your device once it " +"reboots.

Please also be aware that alternative partition " +"firmware might not provide an easy way to switch active partition and boot " +"back to the currently active partition.

Click \"Proceed\" below " +"to reboot device to an alternative partition." +msgstr "" +"警告:备用分区可能具有自己的设置和完全不同的固件。

由于备用分区上" +"的网络配置和WiFi SSID /密码可能有所不同,因此您可能必须调整计算机设置才能在设" +"备重启后访问设备。

另请注意,备用分区固件可能无法提供切换活动分区" +"并引导回当前活动分区的简便方法。

点击 \"继续\" 下面将设备重新引导" +"到备用分区。" + +msgid "" +"WARNING: Power off might result in a reboot on a device which doesn't " +"support power off.

Click \"Proceed\" below to power off your " +"device." +msgstr "" +"警告: 关闭电源可能会导致不支持关闭电源的设备重新启动。

单击下面的" +"\"继续\"以关闭设备电源。" + +msgid "Warning: There are unsaved changes that will get lost on reboot!" +msgstr "警告:某些设置没有保存,重启将导致丢失这些配置!" + +msgid "Warning: This system does not have two partitions!" +msgstr "警告:当前系统没有包括两个分区!" + +msgid "Warning: This system does not support powering off!" +msgstr "警告:本系统不支持软关机!" + +msgid "Filter IPv6 Records" +msgstr "过滤 IPv6 记录" + +msgid "Filter IPv6(AAAA) Records during DNS resolution" +msgstr "在域名解析时,过滤 IPv6(AAAA) 记录" + +msgid "SFE flow offloading" +msgstr "SFE 流量分载" + +msgid "SFE based offloading for Routing/NAT. Restart recommended." +msgstr "基于 SFE 的 Routing/NAT 分载(开/关后建议重启设备)" + +msgid "DNS Settings" +msgstr "DNS 设置" + +msgid "Packet Steering" +msgstr "数据包引导" + +msgid "" +"Enable packet steering across all CPUs. May help or hinder network speed." +msgstr "启用所有CPU的数据包控制。 可能有助于或阻碍网络速度。" + +msgid "Compressed memory" +msgstr "内存压缩" + +msgid "Compressed memory subsystem" +msgstr "内存压缩系统" + +msgid "Configure the compressed memory subsystem, which allows data in memory to be compressed to enhance resource usage." +msgstr "配置内存压缩系统,允许压缩内存中的数据以提高资源利用率。" + +msgid "Compressed RAM disk properties" +msgstr "RamDisk压缩设置" + +msgid "Configure the compressed RAM disk properties. This RAM disk will be used as a swap device." +msgstr "对RamDisk压缩参数进行设置。这个RamDisk将会作为Swap设备。" + +msgid "Enable swap on zram" +msgstr "在zRam上启用Swap" + +msgid "Enable usage of the compressed RAM disk (zram)." +msgstr "启用RamDisk压缩(zRam)" + +msgid "Compression algorithm" +msgstr "压缩算法" + +msgid "Select the compression algorithm. The one with higher compression ratio is the first and the one with the lower is the last." +msgstr "选择压缩算法,压缩比按列表中的顺序,由高到低排列。启用最好的压缩算法可以节省更多的内存,但会增加CPU占用。" + +msgid "Base memory pool" +msgstr "基础内存池" + +msgid "This is the maximum percentage of the main memory to use as the compressed disk assuming that the data is compressible." +msgstr "压缩内存可使用的最大内存百分比" + +msgid "Backing storage device" +msgstr "后备存储池" + +msgid "This file or device will be used when the data is hard to compress which offer no gain to keep it in memory. Note that the file or device must have the appropiate size, for example, the size of the RAM disk." +msgstr "这个文件或存储位置将在数据难以被压缩时使用。请注意,该文件或存储位置的剩余空间需大于RamDisk。" + +msgid "Show advanced setup" +msgstr "高级设置" + +msgid "Absolute memory pool limit" +msgstr "内存池限制" + +msgid "Compressed swap cache properties" +msgstr "Swap Cache压缩设置" + +msgid "Configure the compressed swap cache. This cache will try to avoid I/O to slow disks or to use the more expensive compressor of zram." +msgstr "对Swap Cache压缩参数进行设置。这个Cache将会减少硬盘IO。" + +msgid "Enable zswap cache" +msgstr "启用zSwap Cache" + +msgid "Enable the usage of the compressed swap cache (zswap)." +msgstr "启用zSwap Cache压缩(zSwap)" + +msgid "Select the compression algorithm, they are not ordered by speed. There is no gain in choosing a slower algorithm, since the zpool limits the maximum compression ratio. Because of this, the default is the best option." +msgstr "选择压缩算法,建议使用默认的" + +msgid "Maximum memory pool" +msgstr "最大内存池" + +msgid "This is the maximum percentage of the main memory to use as the compressed cache for swap when zram is not available." +msgstr "这个值是当zRam不可用时候,zSwap Cache可使用的最大内存百分比" + +msgid "Memory allocator" +msgstr "内存分配器" + +msgid "Select the compressed memory allocator (zpool). The zpool can store, at most, this quantity of pages in the space that uses one." +msgstr "选择内存分配器,这间影响单个页面对应的最大压缩比。" + +msgid "System swappiness" +msgstr "系统交换空间策略" + +msgid "The tendency of the system to swap unused pages instead of dropping file system cache. If your file system is compressed, such as SQUASHFS, UBI or zfs, use a slightly higher swappiness.'" +msgstr "数值越大,代表越积极的使用Swap空间而不是Ram,建议在SQUASHFS之类的文件系统上使用一个相对更大的值" + +msgid "Compressor for zram" +msgstr "zRam压缩算法" + +msgid "Select the compression algorithm for zram when zswap is enabled. The one with higher compression ratio is the first and the one with the lower is the last. Enabling the best compression enables greater memory savings." +msgstr "选择zRam的压缩算法,压缩比按列表中的顺序,由高到低排列。启用最好的压缩算法可以节省更多的内存,但会增加CPU占用。" + +msgid "Scale factor" +msgstr "比例因子" + +msgid "This is the percentage that will use the zswap pool when zram is enabled. This represents the uncompressed data size as a percentage of the zram\'s pool maximum size." +msgstr "这是zRam启用后,zSwap占用的内存百分比。这也表示未压缩数据占zRam池的最大占比。" diff --git a/PATCH/duplicate/addition-trans-zh-master/i18n/sqm.zh_Hans.po b/PATCH/duplicate/addition-trans-zh-master/i18n/sqm.zh_Hans.po new file mode 100644 index 000000000..4b0a20b02 --- /dev/null +++ b/PATCH/duplicate/addition-trans-zh-master/i18n/sqm.zh_Hans.po @@ -0,0 +1,194 @@ +msgid "" +msgstr "" +"Content-Type: text/plain; charset=UTF-8\n" +"Project-Id-Version: PACKAGE VERSION\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Transfer-Encoding: 8bit\n" + +#: usr/lib/lua/luci/controller/sqm.lua:24 +msgid "SQM QoS" +msgstr "SQM QoS" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:25 +msgid "Smart Queue Management" +msgstr "智能队列管理" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:26 +msgid "" +"With SQM you can enable " +"traffic shaping, better mixing (Fair Queueing), active queue length " +"management (AQM) and prioritisation on one network interface." +msgstr "" +"使用 SQM 你可以启用流量整形,更好的混合" +"(公平列队)主动列队管理(AQM) 并设置网络接口优先级。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:32 +msgid "Queues" +msgstr "队列" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:33 +msgid "Basic Settings" +msgstr "基本设置" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:34 +msgid "Queue Discipline" +msgstr "列队规则" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:35 +msgid "Link Layer Adaptation" +msgstr "链路层适配" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:40 +msgid "Enable this SQM instance." +msgstr "启用此SQM实例" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:54 +msgid "" +"The SQM GUI has just enabled the sqm initscript on your behalf. Remember to " +"disable the sqm initscript manually under System Startup menu in case this " +"change was not wished for." +msgstr "" +"你刚刚开启了SQM随机启动功能,如果你不希望SQM随机启动,可以在系统启动菜单下手" +"动禁用。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:60 +msgid "Interface name" +msgstr "接口名称" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:70 +msgid "" +"Download speed (kbit/s) (ingress) set to 0 to selectively disable ingress " +"shaping:" +msgstr "下载速度(kbit/s)(入口)
设置为0关闭入口控制:" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:74 +msgid "" +"Upload speed (kbit/s) (egress) set to 0 to selectively disable egress " +"shaping:" +msgstr "上传速度(kbit/s)(出口)
设置为0关闭出口控制:" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:88 +msgid "" +"Create log file for this SQM instance under /var/run/sqm/${Interface_name}.[start|stop]-sqm.log." +msgstr "" +"[启用|关闭]日志
创建日志文件到/var/run/sqm/接口名-sqm.log。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:82 +msgid "Verbosity of SQM's output into the system log." +msgstr "SQM输出到系统日志的详细程度。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:86 usr/lib/lua/luci/model/cbi/sqm.lua:99 +#: usr/lib/lua/luci/model/cbi/sqm.lua:148 +#: usr/lib/lua/luci/model/cbi/sqm.lua:155 +#: usr/lib/lua/luci/model/cbi/sqm.lua:202 +#: usr/lib/lua/luci/model/cbi/sqm.lua:243 +msgid "default" +msgstr "默认" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:98 +msgid "" +"Queuing disciplines useable on this system. After installing a new qdisc, " +"you need to restart the router to see updates!" +msgstr "系统上可用的列队规则。安装新的队列规则后,重新启动路由器才会看到更新!" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:112 +msgid "Queue setup script" +msgstr "队列脚本设置" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:129 +msgid "" +"Show and Use Advanced Configuration. Advanced options will only be used as " +"long as this box is checked." +msgstr "选中该复选框显示高级配置。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:133 +msgid "Squash DSCP on inbound packets (ingress):" +msgstr "入站数据包压缩DSCP:" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:140 +msgid "Ignore DSCP on ingress:" +msgstr "忽略入站DSCP" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:147 +msgid "" +"Explicit congestion notification (ECN) status on inbound packets (ingress):" +msgstr "入站数据包的显式拥塞通知(ECN)状态" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:154 +msgid "" +"Explicit congestion notification (ECN) status on outbound packets (egress)." +msgstr "出站数据包的显式拥塞通知(ECN)状态" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:161 +msgid "" +"Show and Use Dangerous Configuration. Dangerous options will only be used as " +"long as this box is checked." +msgstr "选中该复选框显示危险配置。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:166 +msgid "Hard limit on ingress queues; leave empty for default." +msgstr "入站队列严格限制;留空为默认。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:173 +msgid "Hard limit on egress queues; leave empty for default." +msgstr "出站队列严格限制;留空为默认。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:180 +msgid "Latency target for ingress, e.g 5ms [units: s, ms, or us]; leave empty for automatic selection, put in the word default for the qdisc's default." +msgstr "入站延迟目标,例如 5ms [单位: s, ms, 或 us];留空为自动选择,default为列队规则默认值。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:185 +msgid "Latency target for egress, e.g. 5ms [units: s, ms, or us]; leave empty for automatic selection, put in the word default for the qdisc's default." +msgstr "出站延迟目标,例如 5ms [单位: s, ms, 或 us];留空为自动选择,default为列队规则默认值。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:192 +msgid "" +"Advanced option string to pass to the ingress queueing disciplines; no error " +"checking, use very carefully." +msgstr "传递到入站队列规则的高级选项字符串;没有错误检查。请谨慎使用!" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:196 +msgid "" +"Advanced option string to pass to the egress queueing disciplines; no error " +"checking, use very carefully." +msgstr "传递到出站队列规则的高级选项字符串;没有错误检查。请谨慎使用!" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:201 +msgid "Which link layer to account for:" +msgstr "对哪个链路层生效:" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:207 +msgid "Per Packet Overhead (byte):" +msgstr "每个数据包开销" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:216 +msgid "" +"Show Advanced Linklayer Options, (only needed if MTU > 1500). Advanced " +"options will only be used as long as this box is checked." +msgstr "" +"显示高级链路选项,(仅在MTU> 1500时才需要)。 只有选中此框时,才会使用高级选" +"项。" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:221 +msgid "" +"Maximal Size for size and rate calculations, tcMTU (byte); needs to be >= " +"interface MTU + overhead:" +msgstr "大小和速率计算的最大尺寸,tcMTU(byte); 需要> =接口MTU +开销:" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:228 +msgid "" +"Number of entries in size/rate tables, TSIZE; for ATM choose TSIZE = (tcMTU " +"+ 1) / 16:" +msgstr "大小/速率表中的条目数,TSIZE; 对于ATM选择TSIZE =(tcMTU + 1)/ 16:" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:235 +msgid "" +"Minimal packet size, MPU (byte); needs to be > 0 for ethernet size tables:" +msgstr "最小数据包大小,MPU(byte); 在以太网中需要>0:" + +#: usr/lib/lua/luci/model/cbi/sqm.lua:242 +msgid "Which linklayer adaptation mechanism to use; for testing only" +msgstr "使用哪个链路适应机制; 仅用于测试" diff --git a/PATCH/duplicate/addition-trans-zh-master/status/status.lua b/PATCH/duplicate/addition-trans-zh-master/status/status.lua new file mode 100644 index 000000000..864b3ef6b --- /dev/null +++ b/PATCH/duplicate/addition-trans-zh-master/status/status.lua @@ -0,0 +1,250 @@ +-- Copyright 2011 Jo-Philipp Wich +-- Licensed to the public under the Apache License 2.0. + +module("luci.tools.status", package.seeall) + +local uci = require "luci.model.uci".cursor() +local ipc = require "luci.ip" + +local function dhcp_leases_common(family) + local rv = { } + local nfs = require "nixio.fs" + local sys = require "luci.sys" + local leasefile = "/tmp/dhcp.leases" + + uci:foreach("dhcp", "dnsmasq", + function(s) + if s.leasefile and nfs.access(s.leasefile) then + leasefile = s.leasefile + return false + end + end) + + local fd = io.open(leasefile, "r") + if fd then + while true do + local ln = fd:read("*l") + if not ln then + break + else + local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)") + local expire = tonumber(ts) or 0 + if ts and mac and ip and name and duid then + if family == 4 and not ip:match(":") then + rv[#rv+1] = { + expires = (expire ~= 0) and os.difftime(expire, os.time()), + macaddr = ipc.checkmac(mac) or "00:00:00:00:00:00", + ipaddr = ip, + hostname = (name ~= "*") and name + } + elseif family == 6 and ip:match(":") then + rv[#rv+1] = { + expires = (expire ~= 0) and os.difftime(expire, os.time()), + ip6addr = ip, + duid = (duid ~= "*") and duid, + hostname = (name ~= "*") and name + } + end + end + end + end + fd:close() + end + + local lease6file = "/tmp/hosts/odhcpd" + uci:foreach("dhcp", "odhcpd", + function(t) + if t.leasefile and nfs.access(t.leasefile) then + lease6file = t.leasefile + return false + end + end) + local fd = io.open(lease6file, "r") + if fd then + while true do + local ln = fd:read("*l") + if not ln then + break + else + local iface, duid, iaid, name, ts, id, length, ip = ln:match("^# (%S+) (%S+) (%S+) (%S+) (-?%d+) (%S+) (%S+) (.*)") + local expire = tonumber(ts) or 0 + if ip and iaid ~= "ipv4" and family == 6 then + rv[#rv+1] = { + expires = (expire >= 0) and os.difftime(expire, os.time()), + duid = duid, + ip6addr = ip, + hostname = (name ~= "-") and name + } + elseif ip and iaid == "ipv4" and family == 4 then + rv[#rv+1] = { + expires = (expire >= 0) and os.difftime(expire, os.time()), + macaddr = sys.net.duid_to_mac(duid) or "00:00:00:00:00:00", + ipaddr = ip, + hostname = (name ~= "-") and name + } + end + end + end + fd:close() + end + + if family == 6 then + local _, lease + local hosts = sys.net.host_hints() + for _, lease in ipairs(rv) do + local mac = sys.net.duid_to_mac(lease.duid) + local host = mac and hosts[mac] + if host then + if not lease.name then + lease.host_hint = host.name or host.ipv4 or host.ipv6 + elseif host.name and lease.hostname ~= host.name then + lease.host_hint = host.name + end + end + end + end + + return rv +end + +function dhcp_leases() + return dhcp_leases_common(4) +end + +function dhcp6_leases() + return dhcp_leases_common(6) +end + +function wifi_networks() + local rv = { } + local ntm = require "luci.model.network".init() + + local dev + for _, dev in ipairs(ntm:get_wifidevs()) do + local rd = { + up = dev:is_up(), + device = dev:name(), + name = dev:get_i18n(), + networks = { } + } + + local net + for _, net in ipairs(dev:get_wifinets()) do + local a, an = nil, 0 + for _, a in pairs(net:assoclist() or {}) do + an = an + 1 + end + + rd.networks[#rd.networks+1] = { + name = net:shortname(), + link = net:adminlink(), + up = net:is_up(), + mode = net:active_mode(), + ssid = net:active_ssid(), + bssid = net:active_bssid(), + encryption = net:active_encryption(), + frequency = net:frequency(), + channel = net:channel(), + signal = net:signal(), + quality = net:signal_percent(), + noise = net:noise(), + bitrate = net:bitrate(), + ifname = net:ifname(), + country = net:country(), + txpower = net:txpower(), + txpoweroff = net:txpower_offset(), + num_assoc = an, + disabled = (dev:get("disabled") == "1" or + net:get("disabled") == "1") + } + end + + rv[#rv+1] = rd + end + + return rv +end + +function wifi_network(id) + local ntm = require "luci.model.network".init() + local net = ntm:get_wifinet(id) + if net then + local dev = net:get_device() + if dev then + return { + id = id, + name = net:shortname(), + link = net:adminlink(), + up = net:is_up(), + mode = net:active_mode(), + ssid = net:active_ssid(), + bssid = net:active_bssid(), + encryption = net:active_encryption(), + frequency = net:frequency(), + channel = net:channel(), + signal = net:signal(), + quality = net:signal_percent(), + noise = net:noise(), + bitrate = net:bitrate(), + ifname = net:ifname(), + country = net:country(), + txpower = net:txpower(), + txpoweroff = net:txpower_offset(), + disabled = (dev:get("disabled") == "1" or + net:get("disabled") == "1"), + device = { + up = dev:is_up(), + device = dev:name(), + name = dev:get_i18n() + } + } + end + end + return { } +end + +function wifi_assoclist() + local sys = require "luci.sys" + local ntm = require "luci.model.network".init() + local hosts = sys.net.host_hints() + + local assoc = {} + local _, dev, net, bss + + for _, dev in ipairs(ntm:get_wifidevs()) do + local radioname = dev:get_i18n() + + for _, net in ipairs(dev:get_wifinets()) do + local netname = net:shortname() + local netlink = net:adminlink() + local ifname = net:ifname() + + for _, bss in pairs(net:assoclist() or {}) do + local host = hosts[_] + + bss.bssid = _ + bss.ifname = ifname + bss.radio = radioname + bss.name = netname + bss.link = netlink + + bss.host_name = (host) and (host.name or host.ipv4 or host.ipv6) + bss.host_hint = (host and host.name and (host.ipv4 or host.ipv6)) and (host.ipv4 or host.ipv6) + + assoc[#assoc+1] = bss + end + end + end + + table.sort(assoc, function(a, b) + if a.radio ~= b.radio then + return a.radio < b.radio + elseif a.ifname ~= b.ifname then + return a.ifname < b.ifname + else + return a.bssid < b.bssid + end + end) + + return assoc +end \ No newline at end of file diff --git a/PATCH/duplicate/luci-app-control-weburl/Makefile b/PATCH/duplicate/luci-app-control-weburl/Makefile new file mode 100644 index 000000000..b0df327f8 --- /dev/null +++ b/PATCH/duplicate/luci-app-control-weburl/Makefile @@ -0,0 +1,18 @@ +# Copyright (C) 2016 Openwrt.org +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=LuCI support for Weburl From Koolshare +LUCI_DEPENDS:=+iptables-mod-filter +kmod-ipt-filter +LUCI_PKGARCH:=all +PKG_VERSION:=1.5 +PKG_RELEASE:=20200923 + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature + + diff --git a/PATCH/duplicate/luci-app-control-weburl/luasrc/controller/weburl.lua b/PATCH/duplicate/luci-app-control-weburl/luasrc/controller/weburl.lua new file mode 100644 index 000000000..539e4f988 --- /dev/null +++ b/PATCH/duplicate/luci-app-control-weburl/luasrc/controller/weburl.lua @@ -0,0 +1,10 @@ +module("luci.controller.weburl", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/weburl") then return end + + entry({"admin", "control"}, firstchild(), "Control", 50).dependent = false + entry({"admin", "control", "weburl"}, cbi("weburl"), _("过滤军刀"), 12).dependent = + true +end + diff --git a/PATCH/duplicate/luci-app-control-weburl/luasrc/model/cbi/weburl.lua b/PATCH/duplicate/luci-app-control-weburl/luasrc/model/cbi/weburl.lua new file mode 100644 index 000000000..c40766079 --- /dev/null +++ b/PATCH/duplicate/luci-app-control-weburl/luasrc/model/cbi/weburl.lua @@ -0,0 +1,65 @@ +local o = require "luci.sys" +local a, t, e +local button = "" +local state_msg = "" +local running=(luci.sys.call("iptables -L FORWARD|grep WEBURL >/dev/null") == 0) +local button = "" +local state_msg = "" +if running then + state_msg = "" .. translate("正在运行") .. "" +else + state_msg = "" .. translate("没有运行") .. "" +end +a = Map("weburl", translate("网址过滤/关键字过滤/MAC黑名单/时间控制/端口控制"), translate("利用iptables来单独或组合使用多种条件过滤。条件除特别说明外都可以留空不使用。
* 如指定“关键词/URL”(MAC黑名单、时间、星期可选)则为关键字过滤,关键字可以是字符串或网址。
* 如指定“MAC黑名单”而“关键词/URL”留空则为纯MAC黑名单模式(如已改变默认时间或星期则成为时间控制)。
* 如指定端口(MAC黑名单、时间、星期可选)则禁止通过此端口联网。端口可以是端口范围如5000:5100或多端口5100,5110。" .. button .. "

" .. translate("运行状态").. " : " .. state_msg .. "
")) +t = a:section(TypedSection, "basic", translate(""), translate("")) +t.anonymous = true +e = t:option(Flag, "enabled", translate("开启功能")) +e.rmempty = false +e = t:option(ListValue, "algos", translate("过滤力度")) +e:value("bm", "一般过滤") +e:value("kmp", "强效过滤") +e.default = "kmp" +t = a:section(TypedSection, "macbind", translate("")) +t.template = "cbi/tblsection" +t.anonymous = true +t.addremove = true +e = t:option(Flag, "enable", translate("开启")) +e.rmempty = false +e.default = '1' +e = t:option(Value, "macaddr", translate("黑名单MAC(留空则过滤全部客户端)")) +e.rmempty = true +o.net.mac_hints(function(t, a) e:value(t, "%s (%s)" % {t, a}) end) +e = t:option(Value, "keyword", translate("关键词/URL(可留空)")) +e.rmempty = true +e = t:option(ListValue, "proto", translate("端口协议")) +e.rmempty = false +e.default = 'tcp' +e:value("tcp", translate("TCP")) +e:value("udp", translate("UDP")) +e = t:option(Value, "sport", translate("源端口")) +e.rmempty = true +e = t:option(Value, "dport", translate("目的端口")) +e.rmempty = true +e = t:option(Value, "timeon", translate("起控时间")) +e.placeholder = "00:00" +e.default = '00:00' +e.rmempty = true +e = t:option(Value, "timeoff", translate("停控时间")) +e.placeholder = "00:00" +e.default = '00:00' +e.rmempty = true +e = t:option(MultiValue, "daysofweek", translate("星期(至少选一天,某天不选则该天不进行控制)")) +e.optional = false +e.rmempty = false +e.default = 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' +e:value("Monday", translate("一")) +e:value("Tuesday", translate("二")) +e:value("Wednesday", translate("三")) +e:value("Thursday", translate("四")) +e:value("Friday", translate("五")) +e:value("Saturday", translate("六")) +e:value("Sunday", translate("日")) +return a + + + diff --git a/PATCH/duplicate/luci-app-control-weburl/po/zh-cn/weburl.po b/PATCH/duplicate/luci-app-control-weburl/po/zh-cn/weburl.po new file mode 100644 index 000000000..a883cf73a --- /dev/null +++ b/PATCH/duplicate/luci-app-control-weburl/po/zh-cn/weburl.po @@ -0,0 +1,2 @@ +msgid "Control" +msgstr "管控" diff --git a/PATCH/duplicate/luci-app-control-weburl/root/etc/config/weburl b/PATCH/duplicate/luci-app-control-weburl/root/etc/config/weburl new file mode 100644 index 000000000..331fc492b --- /dev/null +++ b/PATCH/duplicate/luci-app-control-weburl/root/etc/config/weburl @@ -0,0 +1,27 @@ + +config basic + option algos 'kmp' + option enabled '0' + +config macbind + option timeoff '00:00' + option timeon '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option keyword 'qq.com' + option enable '0' + +config macbind + option timeoff '00:00' + option timeon '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option enable '0' + option keyword 'www' + +config macbind + option timeoff '00:00' + option timeon '00:00' + option daysofweek 'Monday Tuesday Wednesday Thursday Friday Saturday Sunday' + option enable '0' + option keyword 'cmd.exe' + + diff --git a/PATCH/duplicate/luci-app-control-weburl/root/etc/init.d/weburl b/PATCH/duplicate/luci-app-control-weburl/root/etc/init.d/weburl new file mode 100644 index 000000000..c34d5f1e8 --- /dev/null +++ b/PATCH/duplicate/luci-app-control-weburl/root/etc/init.d/weburl @@ -0,0 +1,65 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (C) 2015 OpenWrt-dist +# Copyright (C) 2016 fw867 +# +# This is free software, licensed under the GNU General Public License v3. +# See /LICENSE for more information. +# wulishui mod. at 20200923 , + +START=98 + +add_rules() { +rulessum=$(grep -c 'macbind' /etc/config/weburl) +for i in $(seq 0 $((rulessum-1))) +do +enable=$(uci get weburl.@macbind[$i].enable 2>/dev/null) +if [ "$enable" == 1 ]; then + macaddr=$(uci get weburl.@macbind[$i].macaddr 2>/dev/null) && MAC="-m mac --mac-source $macaddr" || MAC="" + keyword=$(uci get weburl.@macbind[$i].keyword 2>/dev/null) && STG="-m string --string ${keyword} --algo ${algos}" || STG="" + proto=$(uci get weburl.@macbind[$i].proto 2>/dev/null) || proto="tcp" + sport=$(uci get weburl.@macbind[$i].sport 2>/dev/null) && SPT="--sport ${sport}" || SPT="" + dport=$(uci get weburl.@macbind[$i].dport 2>/dev/null) && DPT="--dport ${dport}" || DPT="" + havesMPT=`echo "$sport"|grep ","` && sMPT="-m multiport" || sMPT="" + havedMPT=`echo "$dport"|grep ","` && dMPT="-m multiport" || dMPT="" + [ -z "$sport" -a -z "$dport" ] && PTS="" || PTS="-p ${proto} ${sMPT} ${SPT} ${dMPT} ${DPT}" + timestart=$(uci get weburl.@macbind[$i].timeon 2>/dev/null) || timestart="00:00" + timestop=$(uci get weburl.@macbind[$i].timeoff 2>/dev/null) || timestop="00:00" + week_days=$(uci get weburl.@macbind[$i].daysofweek |sed 's/ /,/g' 2>/dev/null) + [ "$timestart" = "$timestop" ] && TIME="" || TIME="--timestart ${timestart} --timestop ${timestop}" + [ -z "$week_days" -o "$week_days" = "Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday" ] && WEEK="" || WEEK="--weekdays ${week_days}" + [ -n "$TIME" -o -n "$WEEK" ] && TME="-m time --kerneltz ${TIME} ${WEEK}" || TME="" + if [ -n "$keyword" -o -n "$MAC" -o -n "$sport" -o -n "$dport" ]; then + iptables -A WEBURL ${MAC} ${PTS} ${TME} ${STG} -j REJECT 2>/dev/null + ip6tables -A WEBURL ${MAC} ${PTS} ${TME} ${STG} -j REJECT 2>/dev/null + fi +fi +done +} + +start(){ +enabled=`uci get weburl.@basic[0].enabled 2>/dev/null` +if [ "$enabled" == 1 ]; then + ENsum=`grep -c 'enable .1.' /etc/config/weburl` + if [ "$ENsum" -gt 0 ]; then + algos=`uci get weburl.@basic[0].algos 2>/dev/null` + iptables -N WEBURL 2>/dev/null || iptables -F WEBURL 2>/dev/null + ip6tables -N WEBURL 2>/dev/null || ip6tables -F WEBURL 2>/dev/null + iptables -C FORWARD -j WEBURL 2>/dev/null || iptables -I FORWARD -j WEBURL + ip6tables -C FORWARD -j WEBURL 2>/dev/null || ip6tables -I FORWARD -j WEBURL + add_rules + grep 'weburl' /etc/firewall.user || echo "/etc/init.d/weburl restart" >> /etc/firewall.user + fi +fi +} + +stop(){ + sed -i '/weburl/d' /etc/firewall.user 2>/dev/null + iptables -D FORWARD -j WEBURL 2>/dev/null + ip6tables -D FORWARD -j WEBURL 2>/dev/null + iptables -F WEBURL 2>/dev/null + ip6tables -F WEBURL 2>/dev/null + iptables - X WEBURL 2>/dev/null + ip6tables -X WEBURL 2>/dev/null +} + diff --git a/PATCH/duplicate/luci-app-control-weburl/root/etc/uci-defaults/luci-app-control-weburl b/PATCH/duplicate/luci-app-control-weburl/root/etc/uci-defaults/luci-app-control-weburl new file mode 100644 index 000000000..fed829197 --- /dev/null +++ b/PATCH/duplicate/luci-app-control-weburl/root/etc/uci-defaults/luci-app-control-weburl @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@weburl[-1] + add ucitrack weburl + set ucitrack.@weburl[-1].init=weburl + commit ucitrack +EOF + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/PATCH/duplicate/luci-app-cpulimit/Makefile b/PATCH/duplicate/luci-app-cpulimit/Makefile new file mode 100644 index 000000000..bf0eced0c --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/Makefile @@ -0,0 +1,14 @@ +# +# Copyright (C) 2008-2014 The LuCI Team +# +# This is free software, licensed under the Apache License, Version 2.0 . +# + +include $(TOPDIR)/rules.mk + +LUCI_TITLE:=cpulimit configuration module +LUCI_DEPENDS:=+cpulimit + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature \ No newline at end of file diff --git a/PATCH/duplicate/luci-app-cpulimit/luasrc/controller/cpulimit.lua b/PATCH/duplicate/luci-app-cpulimit/luasrc/controller/cpulimit.lua new file mode 100644 index 000000000..2ff63233d --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/luasrc/controller/cpulimit.lua @@ -0,0 +1,13 @@ + +module("luci.controller.cpulimit", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/cpulimit") then + return + end + + local page = entry({"admin", "system", "cpulimit"}, cbi("cpulimit"), luci.i18n.translate("cpulimit"), 65) + page.i18n = "cpulimit" + page.dependent = true + +end diff --git a/PATCH/duplicate/luci-app-cpulimit/luasrc/model/cbi/cpulimit.lua b/PATCH/duplicate/luci-app-cpulimit/luasrc/model/cbi/cpulimit.lua new file mode 100644 index 000000000..af00b452e --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/luasrc/model/cbi/cpulimit.lua @@ -0,0 +1,38 @@ + +m = Map("cpulimit", translate("cpulimit"),translate("cpulimit ")) +s = m:section(TypedSection, "list", translate("Settings")) +s.template = "cbi/tblsection" +s.anonymous = true +s.addremove = true + +enable = s:option(Flag, "enabled", translate("enable", "enable")) +enable.optional = false +enable.rmempty = false + +exename = s:option(Value, "exename", translate("exename"), translate("name of the executable program file or path name")) +exename.optional = false +exename.rmempty = false +exename.default = "/usr/bin/transmission-daemon" +exename:value("transmission","/usr/bin/transmission-daemon") +exename:value("samba","/usr/sbin/smbd") +exename:value("mount.ntfs-3g","mount.ntfs-3g") +exename:value("vsftpd","/usr/sbin/vsftpd") +exename:value("pure-ftpd","/usr/sbin/pure-ftpd") + +limit = s:option(Value, "limit", translate("limit")) +limit.optional = false +limit.rmempty = false +limit.default = "50" +limit:value("100","100%") +limit:value("90","90%") +limit:value("80","80%") +limit:value("70","70%") +limit:value("60","60%") +limit:value("50","50%") +limit:value("40","40%") +limit:value("30","30%") +limit:value("20","20%") +limit:value("10","10%") + + +return m diff --git a/PATCH/duplicate/luci-app-cpulimit/po/zh_Hans/cpulimit.po b/PATCH/duplicate/luci-app-cpulimit/po/zh_Hans/cpulimit.po new file mode 100644 index 000000000..46e3a5799 --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/po/zh_Hans/cpulimit.po @@ -0,0 +1,30 @@ +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-06-28\n" +"PO-Revision-Date: 2014-06-28\n" +"Last-Translator: Syrone Wong \n" +"Language: zh_Hans\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +msgid "cpulimit" +msgstr "CPU占用率限制" + +msgid "Use cpulimit to restrict app's cpu usage." +msgstr "利用cpulimit限制应用程序的CPU使用率" + +msgid "Usage restrictions" +msgstr "使用率限制" + +msgid "exename" +msgstr "进程名称" + +msgid "name of the executable program file or path name" +msgstr "可执行文件名称,或包含路径的应用程序" + +msgid "limit" +msgstr "占用率限制(自定义时使用不含'%'的整数)" diff --git a/PATCH/duplicate/luci-app-cpulimit/root/etc/config/cpulimit b/PATCH/duplicate/luci-app-cpulimit/root/etc/config/cpulimit new file mode 100644 index 000000000..df66e8fec --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/root/etc/config/cpulimit @@ -0,0 +1,6 @@ + +config 'list' + option 'exename' '/usr/bin/transmission-daemon' + option 'limit' '50' + option 'enabled' '0' + diff --git a/PATCH/duplicate/luci-app-cpulimit/root/etc/init.d/cpulimit b/PATCH/duplicate/luci-app-cpulimit/root/etc/init.d/cpulimit new file mode 100644 index 000000000..e68580062 --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/root/etc/init.d/cpulimit @@ -0,0 +1,17 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006-2011 OpenWrt.org +. /lib/functions.sh + +START=50 + +DEFAULT=/etc/default/cpulimit + + +start() { + /usr/bin/cpulimit.sh start & +} + +stop() { + killall -9 cpulimit +} + diff --git a/PATCH/duplicate/luci-app-cpulimit/root/etc/uci-defaults/luci-app-cpulimit b/PATCH/duplicate/luci-app-cpulimit/root/etc/uci-defaults/luci-app-cpulimit new file mode 100644 index 000000000..7e6637487 --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/root/etc/uci-defaults/luci-app-cpulimit @@ -0,0 +1,13 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@cpulimit[-1] + add ucitrack cpulimit + set ucitrack.@cpulimit[-1].init=cpulimit + commit ucitrack +EOF + +/etc/init.d/cpulimit enable + +rm -f /tmp/luci-indexcache +exit 0 diff --git a/PATCH/duplicate/luci-app-cpulimit/root/usr/bin/cpulimit.sh b/PATCH/duplicate/luci-app-cpulimit/root/usr/bin/cpulimit.sh new file mode 100644 index 000000000..76c88df34 --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/root/usr/bin/cpulimit.sh @@ -0,0 +1,36 @@ +#!/bin/sh + +. /lib/functions.sh + +cpulimit_get(){ + echo cpulimit_get + config_get enabled $1 enabled + [ $enabled -gt 0 ] || return 1 + config_get limit $1 limit + config_get exename $1 exename + eval exepid=$(pgrep $exename) + cpulimit -l $limit -p $exepid & + echo cpulimit -l $limit -p $exepid +} + + + +stop() { +killall -9 cpulimit +# ps -a|grep cpulimit|while read line +# do +# killall cpulimit>/dev/null 2>&1 +# done +} + +case "$1" in + "start") + echo start + killall -9 cpulimit + config_load cpulimit + config_foreach cpulimit_get list + echo end + exit 0 +;; + "stop")echo stop; killall -9 cpulimit;; +esac diff --git a/PATCH/duplicate/luci-app-cpulimit/root/usr/share/rpcd/acl.d/luci-app-cpulimit.json b/PATCH/duplicate/luci-app-cpulimit/root/usr/share/rpcd/acl.d/luci-app-cpulimit.json new file mode 100644 index 000000000..84fa30435 --- /dev/null +++ b/PATCH/duplicate/luci-app-cpulimit/root/usr/share/rpcd/acl.d/luci-app-cpulimit.json @@ -0,0 +1,11 @@ +{ + "luci-app-cpulimit": { + "description": "Grant UCI access for luci-app-cpulimit", + "read": { + "uci": [ "cpulimit" ] + }, + "write": { + "uci": [ "cpulimit" ] + } + } +} diff --git a/PATCH/duplicate/rc.common b/PATCH/duplicate/rc.common new file mode 100644 index 000000000..3ab9409bb --- /dev/null +++ b/PATCH/duplicate/rc.common @@ -0,0 +1,193 @@ +#!/bin/sh +# Copyright (C) 2006-2012 OpenWrt.org + +. $IPKG_INSTROOT/lib/functions.sh +. $IPKG_INSTROOT/lib/functions/service.sh + +initscript=$1 +action=${2:-help} +shift 2 + +start() { + return 0 +} + +stop() { + return 0 +} + +reload() { + restart +} + +restart() { + trap '' TERM + stop "$@" + trap - TERM + start "$@" +} + +boot() { + start "$@" +} + +shutdown() { + stop +} + +disable() { + name="$(basename "${initscript}")" + rm -f "$IPKG_INSTROOT"/etc/rc.d/S??$name + rm -f "$IPKG_INSTROOT"/etc/rc.d/K??$name +} + +enable() { + err=1 + name="$(basename "${initscript}")" + [ "$START" ] && \ + ln -sf "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" && \ + err=0 + [ "$STOP" ] && \ + ln -sf "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}" && \ + err=0 + return $err +} + +enabled() { + name="$(basename "${initscript}")" + [ -x "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ] +} + +depends() { + return 0 +} + +EXTRA_HELP="" +EXTRA_COMMANDS="boot shutdown depends" +extra_command() { + local cmd="$1" + local help="$2" + + local extra="$(printf "%-16s%s" "${cmd}" "${help}")" + EXTRA_HELP="${EXTRA_HELP}\t${extra}\n" + EXTRA_COMMANDS="${EXTRA_COMMANDS} ${cmd}" +} + +help() { + cat </dev/null >/dev/null; then + service_started + fi + } + + trace() { + TRACE_SYSCALLS=1 + start "$@" + } + + stop() { + procd_lock + stop_service "$@" + procd_kill "$(basename ${basescript:-$initscript})" "$1" + if eval "type service_stopped" 2>/dev/null >/dev/null; then + service_stopped + fi + } + + reload() { + if eval "type reload_service" 2>/dev/null >/dev/null; then + procd_lock + reload_service "$@" + else + start + fi + } + + running() { + service_running "$@" + } + + status() { + if eval "type status_service" 2>/dev/null >/dev/null; then + status_service "$@" + else + _procd_status "$(basename ${basescript:-$initscript})" "$1" + fi + } +} + +ALL_COMMANDS="start stop reload restart boot shutdown enable disable enabled depends ${EXTRA_COMMANDS}" +list_contains ALL_COMMANDS "$action" || action=help +$action "$@" diff --git a/PATCH/duplicate/shortcut-fe b/PATCH/duplicate/shortcut-fe new file mode 100644 index 000000000..83f628bc5 --- /dev/null +++ b/PATCH/duplicate/shortcut-fe @@ -0,0 +1,52 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (c) 2014-2015 The Linux Foundation. All rights reserved. +# Permission to use, copy, modify, and/or distribute this software for +# any purpose with or without fee is hereby granted, provided that the +# above copyright notice and this permission notice appear in all copies. +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +# + +#SFE connection manager has a lower priority, it should be started after other connection manager +#to detect the existence of connection manager with higher priority +START=90 + +have_cm() { + [ -d "/sys/kernel/debug/ecm" ] && echo 1 && return + + echo 0 +} + +#load shortcut-fe connection manager +load_sfe_cm() { + local kernel_version=$(uname -r) + + #shortcut-fe-drv.ko is not needed because other connection manager is not enabled + [ -d "/sys/module/shortcut_fe_drv" ] && rmmod shortcut_fe_drv + + [ -e "/lib/modules/$kernel_version/fast-classifier.ko" ] && { + [ -d /sys/module/fast_classifier ] || insmod /lib/modules/$kernel_version/fast-classifier.ko && return + } + + [ -e "/lib/modules/$kernel_version/shortcut-fe-cm.ko" ] && { + [ -d /sys/module/shortcut_fe_cm ] || insmod /lib/modules/$kernel_version/shortcut-fe-cm.ko && return + } +} + +start() { + [ "$(have_cm)" = "1" ] || load_sfe_cm + echo 1 > /sys/fast_classifier/skip_to_bridge_ingress + sfe_ipv6=$(cat /sys/sfe_ipv6/debug_dev) + [ ! -f /dev/sfe_ipv6 ] && mknod /dev/sfe_ipv6 c $sfe_ipv6 0 +} + +stop() { + [ -d /sys/module/shortcut_fe_cm ] && rmmod shortcut_fe_cm + [ -d /sys/module/fast_classifier ] && rmmod fast_classifier +} diff --git a/PATCH/files/etc/config/AdGuardHome b/PATCH/files/etc/config/AdGuardHome new file mode 100644 index 000000000..40a98ded2 --- /dev/null +++ b/PATCH/files/etc/config/AdGuardHome @@ -0,0 +1,22 @@ + +config AdGuardHome 'AdGuardHome' + option httpport '3000' + option configpath '/etc/config/AdGuardHome.yaml' + option workdir '/usr/bin/AdGuardHome' + option logfile '/tmp/AdGuardHome.log' + option verbose '0' + option binpath '/usr/bin/AdGuardHome/AdGuardHome' + option hostsmd5 'f9b0e17e0cb418e3ffe3b13fab6c2c44' + option waitonboot '1' + option crontab 'cutquerylog cutruntimelog' + option version '0.104.0' + option redirect 'dnsmasq-upstream' + option binmtime '1604132772' + option backupfile 'filters' + option backupwdpath '/usr/bin/AdGuardHome' + option ucitracktest '0' + option enabled '0' + list old_redirect 'dnsmasq-upstream' + list old_port '5335' + list old_enabled '1' + diff --git a/PATCH/files/etc/config/AdGuardHome.yaml b/PATCH/files/etc/config/AdGuardHome.yaml new file mode 100644 index 000000000..4042ad6b5 --- /dev/null +++ b/PATCH/files/etc/config/AdGuardHome.yaml @@ -0,0 +1,132 @@ +bind_host: 0.0.0.0 +bind_port: 3000 +users: +- name: root + password: $2y$10$8GfLmnbQpS883RMTpGN66.TbyavsPmElcy2aR6vec7xL0YOG.gx52 +http_proxy: "" +language: "" +rlimit_nofile: 0 +debug_pprof: false +web_session_ttl: 720 +dns: + bind_host: 127.0.0.1 + port: 5335 + statistics_interval: 1 + querylog_enabled: false + querylog_file_enabled: true + querylog_interval: 1 + querylog_size_memory: 1000 + anonymize_client_ip: false + protection_enabled: true + blocking_mode: default + blocking_ipv4: "" + blocking_ipv6: "" + blocked_response_ttl: 10 + parental_block_host: family-block.dns.adguard.com + safebrowsing_block_host: standard-block.dns.adguard.com + ratelimit: 0 + ratelimit_whitelist: [] + refuse_any: true + upstream_dns: + - 127.0.0.1:6052 + upstream_dns_file: "" + bootstrap_dns: + - 127.0.0.1:6052 + all_servers: true + fastest_addr: false + allowed_clients: [] + disallowed_clients: [] + blocked_hosts: [] + cache_size: 4194304 + cache_ttl_min: 0 + cache_ttl_max: 0 + bogus_nxdomain: [] + aaaa_disabled: false + enable_dnssec: false + edns_client_subnet: false + max_goroutines: 0 + ipset: [] + filtering_enabled: true + filters_update_interval: 24 + parental_enabled: false + safesearch_enabled: false + safebrowsing_enabled: false + safebrowsing_cache_size: 1048576 + safesearch_cache_size: 1048576 + parental_cache_size: 1048576 + cache_time: 30 + rewrites: [] + blocked_services: [] +tls: + enabled: false + server_name: "" + force_https: false + port_https: 443 + port_dns_over_tls: 853 + port_dns_over_quic: 784 + allow_unencrypted_doh: false + strict_sni_check: false + certificate_chain: "" + private_key: "" + certificate_path: "" + private_key_path: "" +filters: +- enabled: false + url: https://gitee.com/halflife/list/raw/master/ad.txt + name: HalfLife + id: 1595502658 +- enabled: false + url: https://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblockplus&showintro=1&mimetype=plaintext + name: Peter Lowe's List + id: 1595502661 +- enabled: true + url: https://raw.githubusercontent.com/hoshsadiq/adblock-nocoin-list/master/nocoin.txt + name: NoCoin Filter List + id: 1595502662 +- enabled: true + url: https://gitee.com/xinggsf/Adblock-Rule/raw/master/rule.txt + name: 乘风 广告过滤规则 + id: 1600600707 +- enabled: true + url: https://gitee.com/xinggsf/Adblock-Rule/raw/master/mv.txt + name: 乘风 视频广告过滤规则 + id: 1600600708 +- enabled: true + url: https://gitee.com/cjx82630/cjxlist/raw/master/cjx-ublock.txt + name: CJX's uBlock list + id: 1600600709 +- enabled: true + url: https://gitee.com/cjx82630/cjxlist/raw/master/cjx-annoyance.txt + name: CJX's Annoyance List + id: 1600600710 +- enabled: true + url: http://sub.adtchrome.com/adt-chinalist-easylist.txt + name: ChinaList and EasyList + id: 1600600711 +whitelist_filters: [] +user_rules: [] +dhcp: + enabled: false + interface_name: "" + dhcpv4: + gateway_ip: "" + subnet_mask: "" + range_start: "" + range_end: "" + lease_duration: 86400 + icmp_timeout_msec: 1000 + options: [] + dhcpv6: + range_start: "" + lease_duration: 86400 + ra_slaac_only: false + ra_allow_slaac: false +clients: [] +log_compress: false +log_localtime: false +log_max_backups: 0 +log_max_size: 100 +log_max_age: 3 +log_file: "" +verbose: false +schema_version: 7 diff --git a/PATCH/files/etc/config/chinadns-ng b/PATCH/files/etc/config/chinadns-ng new file mode 100644 index 000000000..c513ca7b0 --- /dev/null +++ b/PATCH/files/etc/config/chinadns-ng @@ -0,0 +1,18 @@ + +config chinadns-ng + option ipset_name4 'chnroute' + option ipset_name6 'chnroute6' + option gfwlist_file '/etc/chinadns-ng/gfwlist.txt' + option chnlist_file '/etc/chinadns-ng/chinalist.txt' + option noip_as_chnip '0' + option enable '1' + option bind_port '6052' + option timeout_sec '1' + option china_dns '127.0.0.1#6050' + option trust_dns '127.0.0.1#6051' + option reuse_port '0' + option chnlist_first '1' + option fair_mode '0' + option repeat_times '1' + option bind_addr '127.0.0.1' + diff --git a/PATCH/files/etc/config/cpulimit b/PATCH/files/etc/config/cpulimit new file mode 100644 index 000000000..939f8ac22 --- /dev/null +++ b/PATCH/files/etc/config/cpulimit @@ -0,0 +1,6 @@ + +config list + option exename '/sbin/rngd' + option limit '1' + option enabled '1' + diff --git a/PATCH/files/etc/config/smartdns b/PATCH/files/etc/config/smartdns new file mode 100644 index 000000000..e23c1e214 --- /dev/null +++ b/PATCH/files/etc/config/smartdns @@ -0,0 +1,96 @@ + +config smartdns + option server_name 'smartdns' + option port '6050' + option dualstack_ip_selection '0' + option rr_ttl_min '300' + option server_group 'mainland' + option seconddns_port '6051' + option seconddns_tcp_server '1' + option seconddns_no_speed_check '0' + option seconddns_no_rule_addr '0' + option seconddns_no_rule_nameserver '0' + option seconddns_no_rule_ipset '0' + option seconddns_no_rule_soa '0' + option coredump '0' + option seconddns_enabled '1' + option seconddns_no_dualstack_selection '1' + option ipv6_server '0' + option rr_ttl_max '600' + option redirect 'none' + option cache_size '4096' + option force_aaaa_soa '0' + option seconddns_server_group 'oversea' + option prefetch_domain '1' + option serve_expired '1' + option tcp_server '1' + option seconddns_no_cache '1' + option enabled '1' + list old_redirect 'none' + list old_port '6050' + list old_enabled '1' + +config server + option type 'udp' + option name 'DNSPod' + option ip '119.29.29.29' + option blacklist_ip '0' + option server_group 'mainland' + option enabled '1' + +config server + option type 'udp' + option name 'AliDNS' + option ip '223.5.5.5' + option blacklist_ip '0' + option server_group 'mainland' + option enabled '1' + +config server + option type 'udp' + option name 'BaiduDNS' + option ip '180.76.76.76' + option blacklist_ip '0' + option server_group 'mainland' + option enabled '1' + +config server + option type 'tls' + option server_group 'oversea' + option blacklist_ip '0' + option ip '8.8.8.8' + option addition_arg '-exclude-default-group' + option no_check_certificate '0' + option enabled '1' + option name 'Google DNS TLS' + +config server + option ip 'https://dns.containerpi.com/dns-query' + option type 'https' + option blacklist_ip '0' + option server_group 'oversea' + option no_check_certificate '0' + option addition_arg '-exclude-default-group' + option enabled '1' + option name 'ContainerPI HTTPS' + +config server + option ip 'https://DoH.dns.sb/dns-query' + option blacklist_ip '0' + option type 'https' + option server_group 'oversea' + option no_check_certificate '0' + option enabled '1' + option addition_arg '-exclude-default-group' + option name 'DNS.SB HTTPS' + +config server + option enabled '1' + option type 'https' + option name 'doh.li HTTPS' + option server_group 'oversea' + option blacklist_ip '0' + option no_check_certificate '0' + option ip 'https://doh.li/dns-query' + option addition_arg '-exclude-default-group' + diff --git a/PATCH/files/etc/ssr/black.list b/PATCH/files/etc/ssr/black.list new file mode 100644 index 000000000..5d064162a --- /dev/null +++ b/PATCH/files/etc/ssr/black.list @@ -0,0 +1,3 @@ +dns.sb +doh.li +containerpi.com diff --git a/PATCH/files/etc/ssr/white.list b/PATCH/files/etc/ssr/white.list new file mode 100644 index 000000000..2ef603c6c --- /dev/null +++ b/PATCH/files/etc/ssr/white.list @@ -0,0 +1,9 @@ +checkip.synology.com +checkipv6.synology.com +checkport.synology.com +ddns.synology.com +account.synology.com +whatismyip.akamai.com +checkip.dyndns.org +teamviewer.com +bing.com diff --git a/PATCH/new/main/0001-tools-add-upx-ucl-support.patch b/PATCH/new/main/0001-tools-add-upx-ucl-support.patch new file mode 100644 index 000000000..a5444856d --- /dev/null +++ b/PATCH/new/main/0001-tools-add-upx-ucl-support.patch @@ -0,0 +1,132 @@ +From 85afb3c6ff67bd964620a4276ad25e15df2c83bc Mon Sep 17 00:00:00 2001 +From: CN_SZTL +Date: Wed, 29 Jul 2020 18:12:40 +0800 +Subject: [PATCH] tools: add upx/ucl support + +--- + tools/Makefile | 2 ++ + tools/ucl/Makefile | 49 ++++++++++++++++++++++++++++++++++++++++++++++ + tools/upx/Makefile | 35 +++++++++++++++++++++++++++++++++ + 3 files changed, 86 insertions(+) + create mode 100644 tools/ucl/Makefile + create mode 100644 tools/upx/Makefile + +diff --git a/tools/Makefile b/tools/Makefile +index 9bae09ece6..cddec94b7f 100644 +--- a/tools/Makefile ++++ b/tools/Makefile +@@ -26,6 +26,7 @@ + tools-y += libressl libtool lzma m4 make-ext4fs missing-macros mkimage + tools-y += mklibs mm-macros mtd-utils mtools padjffs2 patch-image + tools-y += patchelf pkgconf quilt squashfskit4 sstrip zip zlib zstd ++tools-y += ucl upx + tools-$(BUILD_B43_TOOLS) += b43-tools + tools-$(BUILD_ISL) += isl + tools-$(BUILD_TOOLCHAIN) += expat gmp libelf mpc mpfr +@@ -38,6 +39,7 @@ + tools-$(CONFIG_USE_SPARSE) += sparse + + # builddir dependencies ++$(curdir)/upx/compile := $(curdir)/ucl/compile + $(curdir)/autoconf/compile := $(curdir)/m4/compile + $(curdir)/automake/compile := $(curdir)/m4/compile $(curdir)/autoconf/compile $(curdir)/pkgconf/compile $(curdir)/xz/compile + $(curdir)/b43-tools/compile := $(curdir)/bison/compile +diff --git a/tools/ucl/Makefile b/tools/ucl/Makefile +new file mode 100644 +index 0000000000..cf1c25bd8d +--- /dev/null ++++ b/tools/ucl/Makefile +@@ -0,0 +1,49 @@ ++# ++# Copyright (C) 2019 OpenWrt.org ++# ++# This is free software, licensed under the GNU General Public License v2. ++# See /LICENSE for more information. ++# ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=ucl ++PKG_VERSION:=1.03 ++ ++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz ++PKG_SOURCE_URL:=http://www.oberhumer.com/opensource/ucl/download/$(PKG_SOURCE) ++PKG_HASH:=b865299ffd45d73412293369c9754b07637680e5c826915f097577cd27350348 ++ ++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION) ++ ++include $(INCLUDE_DIR)/host-build.mk ++ ++HOSTCC :=gcc ++HOST_CFLAGS +=-std=gnu89 ++ ++define Host/Prepare ++ $(Host/Prepare/Default) ++ mkdir -p $(STAGING_DIR_HOST)/include/ucl ++endef ++ ++define Host/Configure ++ (cd $(HOST_BUILD_DIR); \ ++ CC="$(HOSTCC)" \ ++ CFLAGS="$(HOST_CFLAGS)" \ ++ ./configure --prefix=$(STAGING_DIR_HOST) \ ++ ); ++ $(call Host/Configure/Default) ++endef ++ ++define Host/Compile ++ $(MAKE) -C $(HOST_BUILD_DIR) ++endef ++ ++define Host/Install ++ $(MAKE) -C $(HOST_BUILD_DIR) install ++endef ++ ++define Host/Clean ++ rm -rf $(STAGING_DIR_HOST)/include/ucl ++endef ++ ++$(eval $(call HostBuild)) +diff --git a/tools/upx/Makefile b/tools/upx/Makefile +new file mode 100644 +index 0000000000..fbf1dfbd2e +--- /dev/null ++++ b/tools/upx/Makefile +@@ -0,0 +1,35 @@ ++# ++# Copyright (C) 2011-2020 OpenWrt.org ++# ++# This is free software, licensed under the GNU General Public License v2. ++# See /LICENSE for more information. ++# ++include $(TOPDIR)/rules.mk ++ ++PKG_NAME:=upx ++PKG_VERSION:=3.95 ++ ++PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-src.tar.xz ++PKG_SOURCE_URL:=https://github.com/upx/upx/releases/download/v$(PKG_VERSION) ++PKG_HASH:=3b0f55468d285c760fcf5ea865a070b27696393002712054c69ff40d8f7f5592 ++ ++HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/$(PKG_NAME)-$(PKG_VERSION)-src ++ ++include $(INCLUDE_DIR)/host-build.mk ++ ++define Host/Compile ++ UPX_UCLDIR=$(STAGING_DIR_HOST) \ ++ $(MAKE) -C $(HOST_BUILD_DIR)/src \ ++ CXXFLAGS_WERROR="" LDFLAGS="$(HOST_LDFLAGS)" \ ++ CXX="$(HOSTCXX)" ++endef ++ ++define Host/Install ++ $(CP) $(HOST_BUILD_DIR)/src/upx.out $(STAGING_DIR_HOST)/bin/upx ++endef ++ ++define Host/Clean ++ rm -f $(STAGING_DIR_HOST)/bin/upx ++endef ++ ++$(eval $(call HostBuild)) +-- +2.20.1 + diff --git a/PATCH/new/main/101-rockchip-rk3328-nanopi-r2s-improve-boot-failed.patch b/PATCH/new/main/101-rockchip-rk3328-nanopi-r2s-improve-boot-failed.patch new file mode 100644 index 000000000..095e702d2 --- /dev/null +++ b/PATCH/new/main/101-rockchip-rk3328-nanopi-r2s-improve-boot-failed.patch @@ -0,0 +1,29 @@ +From: Yuan Tao +Date: Sun, 9 Aug 2020 09:02:55 +0800 +Subject: rockchip:nanopi-r2s-improve-boot-failed + +Issues: +When booting on some SD cards an error message appears as: +"spl: mmc init failed with error: -95" + +Solutions: +Add regulator-boot-on parameters to vcc_sd. +Add startup-delay-us parameters to vcc_sdio. +This will improve the problem that in some SD cards are failing to boot up. + +Tested environment: +SD Card: Netac Extreme P500 Pro 32GB + +Signed-off-by: Yuan Tao +--- + +--- a/arch/arm/dts/rk3328-nanopi-r2s.dts ++++ b/arch/arm/dts/rk3328-nanopi-r2s.dts +@@ -32,6 +32,7 @@ + regulator-name = "vcc_sd"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; ++ regulator-boot-on; + vin-supply = <&vcc_io>; + }; + diff --git a/PATCH/new/main/997-nanopi-r2s-improve-boot-failed.patch b/PATCH/new/main/997-nanopi-r2s-improve-boot-failed.patch new file mode 100644 index 000000000..ba261d5fc --- /dev/null +++ b/PATCH/new/main/997-nanopi-r2s-improve-boot-failed.patch @@ -0,0 +1,57 @@ +From: Yuan Tao +Date: Sun, 9 Aug 2020 09:02:55 +0800 +Subject: rockchip:nanopi-r2s-improve-boot-failed + +When booting on some SD cards an error message appears as: +"spl: mmc init failed with error: -95" + +Solutions: +Add startup-delay-us to vcc_sd and vcc_sdio. +Disable the jtag switching on the RK3328. +This will improve the problem that in some SD cards are failing to boot up. + +Tested environment: +SD Card: Netac Extreme P500 Pro 32GB + +Signed-off-by: Yuan Tao +--- + +diff --git a/arch/arm/dts/rk3328-nanopi-r2s.dts b/arch/arm/dts/rk3328-nanopi-r2s.dts +--- a/arch/arm/dts/rk3328-nanopi-r2s.dts ++++ b/arch/arm/dts/rk3328-nanopi-r2s.dts +@@ -32,6 +32,7 @@ + regulator-name = "vcc_sd"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; ++ startup-delay-us = <100000>; + vin-supply = <&vcc_io>; + }; + +@@ -49,6 +50,7 @@ + regulator-name = "vcc_sdio"; + regulator-settling-time-us = <5000>; + regulator-type = "voltage"; ++ startup-delay-us = <2000>; + vin-supply = <&vcc_io>; + }; + + +diff --git a/arch/arm/mach-rockchip/rk3328/rk3328.c b/arch/arm/mach-rockchip/rk3328/rk3328.c +--- a/arch/arm/mach-rockchip/rk3328/rk3328.c ++++ b/arch/arm/mach-rockchip/rk3328/rk3328.c +@@ -50,9 +50,14 @@ int arch_cpu_init(void) + { + #ifdef CONFIG_SPL_BUILD + /* We do some SoC one time setting here. */ ++ struct rk3328_grf_regs * const grf = (void *)GRF_BASE; + + /* Disable the ddr secure region setting to make it non-secure */ + rk_setreg(FW_DDR_CON_REG, 0x200); ++ ++ /* Enable force to sdmmc0, jtag_tclk/tms iomuxed with sdmmc0_d2/d3 */ ++ rk_clrreg(&grf->soc_con[4], 1 << 12); ++ + #endif + return 0; + } + diff --git a/PATCH/new/main/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch b/PATCH/new/main/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch new file mode 100644 index 000000000..292f6ae58 --- /dev/null +++ b/PATCH/new/main/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch @@ -0,0 +1,14 @@ +From: QiuSimons +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +@@ -254,6 +254,10 @@ + }; + }; + ++&i2c0 { ++ status = "okay"; ++}; ++ + &io_domains { + pmuio-supply = <&vcc_io_33>; + vccio1-supply = <&vcc_io_33>; diff --git a/PATCH/new/main/999-nanopi-r2-add-handle_cpu_id-for-gmac-dwc3.patch b/PATCH/new/main/999-nanopi-r2-add-handle_cpu_id-for-gmac-dwc3.patch new file mode 100644 index 000000000..f4d04f13e --- /dev/null +++ b/PATCH/new/main/999-nanopi-r2-add-handle_cpu_id-for-gmac-dwc3.patch @@ -0,0 +1,18 @@ +diff -rNEZbwBdu3 a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts +--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts 2020-09-04 00:42:48.504000000 +0800 ++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts 2020-09-04 00:44:34.096000000 +0800 +@@ -142,6 +142,7 @@ + snps,reset-delays-us = <0 10000 50000>; + tx_delay = <0x24>; + rx_delay = <0x18>; ++ handle_cpu_id = <1>; + status = "okay"; + + mdio { +@@ -358,4 +359,5 @@ + &usbdrd_dwc3 { + dr_mode = "host"; + status = "okay"; ++ handle_cpu_id = <2>; + }; + diff --git a/PATCH/new/main/999-patch-5.4.61-rt37.patch b/PATCH/new/main/999-patch-5.4.61-rt37.patch new file mode 100644 index 000000000..d66b1f28a --- /dev/null +++ b/PATCH/new/main/999-patch-5.4.61-rt37.patch @@ -0,0 +1,27767 @@ +diff --git a/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html b/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html +index 57300db4b5ff..31c99382994e 100644 +--- a/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html ++++ b/Documentation/RCU/Design/Expedited-Grace-Periods/Expedited-Grace-Periods.html +@@ -56,8 +56,8 @@ sections. + RCU-preempt Expedited Grace Periods
+ +

+-CONFIG_PREEMPT=y kernels implement RCU-preempt. +-The overall flow of the handling of a given CPU by an RCU-preempt ++CONFIG_PREEMPT=y and CONFIG_PREEMPT_RT=y kernels implement ++RCU-preempt. The overall flow of the handling of a given CPU by an RCU-preempt + expedited grace period is shown in the following diagram: + +

ExpRCUFlow.svg +@@ -140,8 +140,8 @@ or offline, among other things. + RCU-sched Expedited Grace Periods + +

+-CONFIG_PREEMPT=n kernels implement RCU-sched. +-The overall flow of the handling of a given CPU by an RCU-sched ++CONFIG_PREEMPT=n and CONFIG_PREEMPT_RT=n kernels implement ++RCU-sched. The overall flow of the handling of a given CPU by an RCU-sched + expedited grace period is shown in the following diagram: + +

ExpSchedFlow.svg +diff --git a/Documentation/RCU/Design/Requirements/Requirements.html b/Documentation/RCU/Design/Requirements/Requirements.html +index 467251f7fef6..348c5db1ff2b 100644 +--- a/Documentation/RCU/Design/Requirements/Requirements.html ++++ b/Documentation/RCU/Design/Requirements/Requirements.html +@@ -106,7 +106,7 @@ big RCU read-side critical section. + Production-quality implementations of rcu_read_lock() and + rcu_read_unlock() are extremely lightweight, and in + fact have exactly zero overhead in Linux kernels built for production +-use with CONFIG_PREEMPT=n. ++use with CONFIG_PREEMPTION=n. + +

+ This guarantee allows ordering to be enforced with extremely low +@@ -1499,7 +1499,7 @@ costs have plummeted. + However, as I learned from Matt Mackall's + bloatwatch + efforts, memory footprint is critically important on single-CPU systems with +-non-preemptible (CONFIG_PREEMPT=n) kernels, and thus ++non-preemptible (CONFIG_PREEMPTION=n) kernels, and thus + tiny RCU + was born. + Josh Triplett has since taken over the small-memory banner with his +@@ -1887,7 +1887,7 @@ constructs, there are limitations. +

+ Implementations of RCU for which rcu_read_lock() + and rcu_read_unlock() generate no code, such as +-Linux-kernel RCU when CONFIG_PREEMPT=n, can be ++Linux-kernel RCU when CONFIG_PREEMPTION=n, can be + nested arbitrarily deeply. + After all, there is no overhead. + Except that if all these instances of rcu_read_lock() +@@ -2229,7 +2229,7 @@ be a no-op. +

+ However, once the scheduler has spawned its first kthread, this early + boot trick fails for synchronize_rcu() (as well as for +-synchronize_rcu_expedited()) in CONFIG_PREEMPT=y ++synchronize_rcu_expedited()) in CONFIG_PREEMPTION=y + kernels. + The reason is that an RCU read-side critical section might be preempted, + which means that a subsequent synchronize_rcu() really does have +@@ -2568,7 +2568,7 @@ the following: + +

+ If the compiler did make this transformation in a +-CONFIG_PREEMPT=n kernel build, and if get_user() did ++CONFIG_PREEMPTION=n kernel build, and if get_user() did + page fault, the result would be a quiescent state in the middle + of an RCU read-side critical section. + This misplaced quiescent state could result in line 4 being +@@ -2906,7 +2906,7 @@ in conjunction with the + The real-time-latency response requirements are such that the + traditional approach of disabling preemption across RCU + read-side critical sections is inappropriate. +-Kernels built with CONFIG_PREEMPT=y therefore ++Kernels built with CONFIG_PREEMPTION=y therefore + use an RCU implementation that allows RCU read-side critical + sections to be preempted. + This requirement made its presence known after users made it +@@ -3064,7 +3064,7 @@ includes + rcu_barrier_bh(), and + rcu_read_lock_bh_held(). + However, the update-side APIs are now simple wrappers for other RCU +-flavors, namely RCU-sched in CONFIG_PREEMPT=n kernels and RCU-preempt ++flavors, namely RCU-sched in CONFIG_PREEMPTION=n kernels and RCU-preempt + otherwise. + +

Sched Flavor (Historical)

+@@ -3088,12 +3088,12 @@ of an RCU read-side critical section can be a quiescent state. + Therefore, RCU-sched was created, which follows “classic” + RCU in that an RCU-sched grace period waits for for pre-existing + interrupt and NMI handlers. +-In kernels built with CONFIG_PREEMPT=n, the RCU and RCU-sched ++In kernels built with CONFIG_PREEMPTION=n, the RCU and RCU-sched + APIs have identical implementations, while kernels built with +-CONFIG_PREEMPT=y provide a separate implementation for each. ++CONFIG_PREEMPTION=y provide a separate implementation for each. + +

+-Note well that in CONFIG_PREEMPT=y kernels, ++Note well that in CONFIG_PREEMPTION=y kernels, + rcu_read_lock_sched() and rcu_read_unlock_sched() + disable and re-enable preemption, respectively. + This means that if there was a preemption attempt during the +@@ -3302,12 +3302,12 @@ The tasks-RCU API is quite compact, consisting only of + call_rcu_tasks(), + synchronize_rcu_tasks(), and + rcu_barrier_tasks(). +-In CONFIG_PREEMPT=n kernels, trampolines cannot be preempted, ++In CONFIG_PREEMPTION=n kernels, trampolines cannot be preempted, + so these APIs map to + call_rcu(), + synchronize_rcu(), and + rcu_barrier(), respectively. +-In CONFIG_PREEMPT=y kernels, trampolines can be preempted, ++In CONFIG_PREEMPTION=y kernels, trampolines can be preempted, + and these three APIs are therefore implemented by separate functions + that check for voluntary context switches. + +diff --git a/Documentation/RCU/checklist.txt b/Documentation/RCU/checklist.txt +index e98ff261a438..087dc6c22c37 100644 +--- a/Documentation/RCU/checklist.txt ++++ b/Documentation/RCU/checklist.txt +@@ -210,8 +210,8 @@ over a rather long period of time, but improvements are always welcome! + the rest of the system. + + 7. As of v4.20, a given kernel implements only one RCU flavor, +- which is RCU-sched for PREEMPT=n and RCU-preempt for PREEMPT=y. +- If the updater uses call_rcu() or synchronize_rcu(), ++ which is RCU-sched for PREEMPTION=n and RCU-preempt for ++ PREEMPTION=y. If the updater uses call_rcu() or synchronize_rcu(), + then the corresponding readers my use rcu_read_lock() and + rcu_read_unlock(), rcu_read_lock_bh() and rcu_read_unlock_bh(), + or any pair of primitives that disables and re-enables preemption, +diff --git a/Documentation/RCU/rcubarrier.txt b/Documentation/RCU/rcubarrier.txt +index a2782df69732..5aa93c215af4 100644 +--- a/Documentation/RCU/rcubarrier.txt ++++ b/Documentation/RCU/rcubarrier.txt +@@ -6,8 +6,8 @@ RCU (read-copy update) is a synchronization mechanism that can be thought + of as a replacement for read-writer locking (among other things), but with + very low-overhead readers that are immune to deadlock, priority inversion, + and unbounded latency. RCU read-side critical sections are delimited +-by rcu_read_lock() and rcu_read_unlock(), which, in non-CONFIG_PREEMPT +-kernels, generate no code whatsoever. ++by rcu_read_lock() and rcu_read_unlock(), which, in ++non-CONFIG_PREEMPTION kernels, generate no code whatsoever. + + This means that RCU writers are unaware of the presence of concurrent + readers, so that RCU updates to shared data must be undertaken quite +@@ -303,10 +303,10 @@ Answer: This cannot happen. The reason is that on_each_cpu() has its last + to smp_call_function() and further to smp_call_function_on_cpu(), + causing this latter to spin until the cross-CPU invocation of + rcu_barrier_func() has completed. This by itself would prevent +- a grace period from completing on non-CONFIG_PREEMPT kernels, ++ a grace period from completing on non-CONFIG_PREEMPTION kernels, + since each CPU must undergo a context switch (or other quiescent + state) before the grace period can complete. However, this is +- of no use in CONFIG_PREEMPT kernels. ++ of no use in CONFIG_PREEMPTION kernels. + + Therefore, on_each_cpu() disables preemption across its call + to smp_call_function() and also across the local call to +diff --git a/Documentation/RCU/stallwarn.txt b/Documentation/RCU/stallwarn.txt +index f48f4621ccbc..bd510771b75e 100644 +--- a/Documentation/RCU/stallwarn.txt ++++ b/Documentation/RCU/stallwarn.txt +@@ -20,7 +20,7 @@ o A CPU looping with preemption disabled. + + o A CPU looping with bottom halves disabled. + +-o For !CONFIG_PREEMPT kernels, a CPU looping anywhere in the kernel ++o For !CONFIG_PREEMPTION kernels, a CPU looping anywhere in the kernel + without invoking schedule(). If the looping in the kernel is + really expected and desirable behavior, you might need to add + some calls to cond_resched(). +@@ -39,7 +39,7 @@ o Anything that prevents RCU's grace-period kthreads from running. + result in the "rcu_.*kthread starved for" console-log message, + which will include additional debugging information. + +-o A CPU-bound real-time task in a CONFIG_PREEMPT kernel, which might ++o A CPU-bound real-time task in a CONFIG_PREEMPTION kernel, which might + happen to preempt a low-priority task in the middle of an RCU + read-side critical section. This is especially damaging if + that low-priority task is not permitted to run on any other CPU, +diff --git a/Documentation/RCU/whatisRCU.txt b/Documentation/RCU/whatisRCU.txt +index 7e1a8721637a..7e03e8f80b29 100644 +--- a/Documentation/RCU/whatisRCU.txt ++++ b/Documentation/RCU/whatisRCU.txt +@@ -648,9 +648,10 @@ Quick Quiz #1: Why is this argument naive? How could a deadlock + + This section presents a "toy" RCU implementation that is based on + "classic RCU". It is also short on performance (but only for updates) and +-on features such as hotplug CPU and the ability to run in CONFIG_PREEMPT +-kernels. The definitions of rcu_dereference() and rcu_assign_pointer() +-are the same as those shown in the preceding section, so they are omitted. ++on features such as hotplug CPU and the ability to run in ++CONFIG_PREEMPTION kernels. The definitions of rcu_dereference() and ++rcu_assign_pointer() are the same as those shown in the preceding ++section, so they are omitted. + + void rcu_read_lock(void) { } + +diff --git a/Documentation/admin-guide/sysctl/vm.rst b/Documentation/admin-guide/sysctl/vm.rst +index 64aeee1009ca..0329a4d3fa9e 100644 +--- a/Documentation/admin-guide/sysctl/vm.rst ++++ b/Documentation/admin-guide/sysctl/vm.rst +@@ -128,6 +128,9 @@ allowed to examine the unevictable lru (mlocked pages) for pages to compact. + This should be used on systems where stalls for minor page faults are an + acceptable trade for large contiguous free memory. Set to 0 to prevent + compaction from moving pages that are unevictable. Default value is 1. ++On CONFIG_PREEMPT_RT the default value is 0 in order to avoid a page fault, due ++to compaction, which would block the task from becomming active until the fault ++is resolved. + + + dirty_background_bytes +diff --git a/Documentation/printk-ringbuffer.txt b/Documentation/printk-ringbuffer.txt +new file mode 100644 +index 000000000000..6bde5dbd8545 +--- /dev/null ++++ b/Documentation/printk-ringbuffer.txt +@@ -0,0 +1,377 @@ ++struct printk_ringbuffer ++------------------------ ++John Ogness ++ ++Overview ++~~~~~~~~ ++As the name suggests, this ring buffer was implemented specifically to serve ++the needs of the printk() infrastructure. The ring buffer itself is not ++specific to printk and could be used for other purposes. _However_, the ++requirements and semantics of printk are rather unique. If you intend to use ++this ring buffer for anything other than printk, you need to be very clear on ++its features, behavior, and pitfalls. ++ ++Features ++^^^^^^^^ ++The printk ring buffer has the following features: ++ ++- single global buffer ++- resides in initialized data section (available at early boot) ++- lockless readers ++- supports multiple writers ++- supports multiple non-consuming readers ++- safe from any context (including NMI) ++- groups bytes into variable length blocks (referenced by entries) ++- entries tagged with sequence numbers ++ ++Behavior ++^^^^^^^^ ++Since the printk ring buffer readers are lockless, there exists no ++synchronization between readers and writers. Basically writers are the tasks ++in control and may overwrite any and all committed data at any time and from ++any context. For this reason readers can miss entries if they are overwritten ++before the reader was able to access the data. The reader API implementation ++is such that reader access to entries is atomic, so there is no risk of ++readers having to deal with partial or corrupt data. Also, entries are ++tagged with sequence numbers so readers can recognize if entries were missed. ++ ++Writing to the ring buffer consists of 2 steps. First a writer must reserve ++an entry of desired size. After this step the writer has exclusive access ++to the memory region. Once the data has been written to memory, it needs to ++be committed to the ring buffer. After this step the entry has been inserted ++into the ring buffer and assigned an appropriate sequence number. ++ ++Once committed, a writer must no longer access the data directly. This is ++because the data may have been overwritten and no longer exists. If a ++writer must access the data, it should either keep a private copy before ++committing the entry or use the reader API to gain access to the data. ++ ++Because of how the data backend is implemented, entries that have been ++reserved but not yet committed act as barriers, preventing future writers ++from filling the ring buffer beyond the location of the reserved but not ++yet committed entry region. For this reason it is *important* that writers ++perform both reserve and commit as quickly as possible. Also, be aware that ++preemption and local interrupts are disabled and writing to the ring buffer ++is processor-reentrant locked during the reserve/commit window. Writers in ++NMI contexts can still preempt any other writers, but as long as these ++writers do not write a large amount of data with respect to the ring buffer ++size, this should not become an issue. ++ ++API ++~~~ ++ ++Declaration ++^^^^^^^^^^^ ++The printk ring buffer can be instantiated as a static structure: ++ ++ /* declare a static struct printk_ringbuffer */ ++ #define DECLARE_STATIC_PRINTKRB(name, szbits, cpulockptr) ++ ++The value of szbits specifies the size of the ring buffer in bits. The ++cpulockptr field is a pointer to a prb_cpulock struct that is used to ++perform processor-reentrant spin locking for the writers. It is specified ++externally because it may be used for multiple ring buffers (or other ++code) to synchronize writers without risk of deadlock. ++ ++Here is an example of a declaration of a printk ring buffer specifying a ++32KB (2^15) ring buffer: ++ ++.... ++DECLARE_STATIC_PRINTKRB_CPULOCK(rb_cpulock); ++DECLARE_STATIC_PRINTKRB(rb, 15, &rb_cpulock); ++.... ++ ++If writers will be using multiple ring buffers and the ordering of that usage ++is not clear, the same prb_cpulock should be used for both ring buffers. ++ ++Writer API ++^^^^^^^^^^ ++The writer API consists of 2 functions. The first is to reserve an entry in ++the ring buffer, the second is to commit that data to the ring buffer. The ++reserved entry information is stored within a provided `struct prb_handle`. ++ ++ /* reserve an entry */ ++ char *prb_reserve(struct prb_handle *h, struct printk_ringbuffer *rb, ++ unsigned int size); ++ ++ /* commit a reserved entry to the ring buffer */ ++ void prb_commit(struct prb_handle *h); ++ ++Here is an example of a function to write data to a ring buffer: ++ ++.... ++int write_data(struct printk_ringbuffer *rb, char *data, int size) ++{ ++ struct prb_handle h; ++ char *buf; ++ ++ buf = prb_reserve(&h, rb, size); ++ if (!buf) ++ return -1; ++ memcpy(buf, data, size); ++ prb_commit(&h); ++ ++ return 0; ++} ++.... ++ ++Pitfalls ++++++++++ ++Be aware that prb_reserve() can fail. A retry might be successful, but it ++depends entirely on whether or not the next part of the ring buffer to ++overwrite belongs to reserved but not yet committed entries of other writers. ++Writers can use the prb_inc_lost() function to allow readers to notice that a ++message was lost. ++ ++Reader API ++^^^^^^^^^^ ++The reader API utilizes a `struct prb_iterator` to track the reader's ++position in the ring buffer. ++ ++ /* declare a pre-initialized static iterator for a ring buffer */ ++ #define DECLARE_STATIC_PRINTKRB_ITER(name, rbaddr) ++ ++ /* initialize iterator for a ring buffer (if static macro NOT used) */ ++ void prb_iter_init(struct prb_iterator *iter, ++ struct printk_ringbuffer *rb, u64 *seq); ++ ++ /* make a deep copy of an iterator */ ++ void prb_iter_copy(struct prb_iterator *dest, ++ struct prb_iterator *src); ++ ++ /* non-blocking, advance to next entry (and read the data) */ ++ int prb_iter_next(struct prb_iterator *iter, char *buf, ++ int size, u64 *seq); ++ ++ /* blocking, advance to next entry (and read the data) */ ++ int prb_iter_wait_next(struct prb_iterator *iter, char *buf, ++ int size, u64 *seq); ++ ++ /* position iterator at the entry seq */ ++ int prb_iter_seek(struct prb_iterator *iter, u64 seq); ++ ++ /* read data at current position */ ++ int prb_iter_data(struct prb_iterator *iter, char *buf, ++ int size, u64 *seq); ++ ++Typically prb_iter_data() is not needed because the data can be retrieved ++directly with prb_iter_next(). ++ ++Here is an example of a non-blocking function that will read all the data in ++a ring buffer: ++ ++.... ++void read_all_data(struct printk_ringbuffer *rb, char *buf, int size) ++{ ++ struct prb_iterator iter; ++ u64 prev_seq = 0; ++ u64 seq; ++ int ret; ++ ++ prb_iter_init(&iter, rb, NULL); ++ ++ for (;;) { ++ ret = prb_iter_next(&iter, buf, size, &seq); ++ if (ret > 0) { ++ if (seq != ++prev_seq) { ++ /* "seq - prev_seq" entries missed */ ++ prev_seq = seq; ++ } ++ /* process buf here */ ++ } else if (ret == 0) { ++ /* hit the end, done */ ++ break; ++ } else if (ret < 0) { ++ /* ++ * iterator is invalid, a writer overtook us, reset the ++ * iterator and keep going, entries were missed ++ */ ++ prb_iter_init(&iter, rb, NULL); ++ } ++ } ++} ++.... ++ ++Pitfalls ++++++++++ ++The reader's iterator can become invalid at any time because the reader was ++overtaken by a writer. Typically the reader should reset the iterator back ++to the current oldest entry (which will be newer than the entry the reader ++was at) and continue, noting the number of entries that were missed. ++ ++Utility API ++^^^^^^^^^^^ ++Several functions are available as convenience for external code. ++ ++ /* query the size of the data buffer */ ++ int prb_buffer_size(struct printk_ringbuffer *rb); ++ ++ /* skip a seq number to signify a lost record */ ++ void prb_inc_lost(struct printk_ringbuffer *rb); ++ ++ /* processor-reentrant spin lock */ ++ void prb_lock(struct prb_cpulock *cpu_lock, unsigned int *cpu_store); ++ ++ /* processor-reentrant spin unlock */ ++ void prb_lock(struct prb_cpulock *cpu_lock, unsigned int *cpu_store); ++ ++Pitfalls ++++++++++ ++Although the value returned by prb_buffer_size() does represent an absolute ++upper bound, the amount of data that can be stored within the ring buffer ++is actually less because of the additional storage space of a header for each ++entry. ++ ++The prb_lock() and prb_unlock() functions can be used to synchronize between ++ring buffer writers and other external activities. The function of a ++processor-reentrant spin lock is to disable preemption and local interrupts ++and synchronize against other processors. It does *not* protect against ++multiple contexts of a single processor, i.e NMI. ++ ++Implementation ++~~~~~~~~~~~~~~ ++This section describes several of the implementation concepts and details to ++help developers better understand the code. ++ ++Entries ++^^^^^^^ ++All ring buffer data is stored within a single static byte array. The reason ++for this is to ensure that any pointers to the data (past and present) will ++always point to valid memory. This is important because the lockless readers ++may be preempted for long periods of time and when they resume may be working ++with expired pointers. ++ ++Entries are identified by start index and size. (The start index plus size ++is the start index of the next entry.) The start index is not simply an ++offset into the byte array, but rather a logical position (lpos) that maps ++directly to byte array offsets. ++ ++For example, for a byte array of 1000, an entry may have have a start index ++of 100. Another entry may have a start index of 1100. And yet another 2100. ++All of these entry are pointing to the same memory region, but only the most ++recent entry is valid. The other entries are pointing to valid memory, but ++represent entries that have been overwritten. ++ ++Note that due to overflowing, the most recent entry is not necessarily the one ++with the highest lpos value. Indeed, the printk ring buffer initializes its ++data such that an overflow happens relatively quickly in order to validate the ++handling of this situation. The implementation assumes that an lpos (unsigned ++long) will never completely wrap while a reader is preempted. If this were to ++become an issue, the seq number (which never wraps) could be used to increase ++the robustness of handling this situation. ++ ++Buffer Wrapping ++^^^^^^^^^^^^^^^ ++If an entry starts near the end of the byte array but would extend beyond it, ++a special terminating entry (size = -1) is inserted into the byte array and ++the real entry is placed at the beginning of the byte array. This can waste ++space at the end of the byte array, but simplifies the implementation by ++allowing writers to always work with contiguous buffers. ++ ++Note that the size field is the first 4 bytes of the entry header. Also note ++that calc_next() always ensures that there are at least 4 bytes left at the ++end of the byte array to allow room for a terminating entry. ++ ++Ring Buffer Pointers ++^^^^^^^^^^^^^^^^^^^^ ++Three pointers (lpos values) are used to manage the ring buffer: ++ ++ - _tail_: points to the oldest entry ++ - _head_: points to where the next new committed entry will be ++ - _reserve_: points to where the next new reserved entry will be ++ ++These pointers always maintain a logical ordering: ++ ++ tail <= head <= reserve ++ ++The reserve pointer moves forward when a writer reserves a new entry. The ++head pointer moves forward when a writer commits a new entry. ++ ++The reserve pointer cannot overwrite the tail pointer in a wrap situation. In ++such a situation, the tail pointer must be "pushed forward", thus ++invalidating that oldest entry. Readers identify if they are accessing a ++valid entry by ensuring their entry pointer is `>= tail && < head`. ++ ++If the tail pointer is equal to the head pointer, it cannot be pushed and any ++reserve operation will fail. The only resolution is for writers to commit ++their reserved entries. ++ ++Processor-Reentrant Locking ++^^^^^^^^^^^^^^^^^^^^^^^^^^^ ++The purpose of the processor-reentrant locking is to limit the interruption ++scenarios of writers to 2 contexts. This allows for a simplified ++implementation where: ++ ++- The reserve/commit window only exists on 1 processor at a time. A reserve ++ can never fail due to uncommitted entries of other processors. ++ ++- When committing entries, it is trivial to handle the situation when ++ subsequent entries have already been committed, i.e. managing the head ++ pointer. ++ ++Performance ++~~~~~~~~~~~ ++Some basic tests were performed on a quad Intel(R) Xeon(R) CPU E5-2697 v4 at ++2.30GHz (36 cores / 72 threads). All tests involved writing a total of ++32,000,000 records at an average of 33 bytes each. Each writer was pinned to ++its own CPU and would write as fast as it could until a total of 32,000,000 ++records were written. All tests involved 2 readers that were both pinned ++together to another CPU. Each reader would read as fast as it could and track ++how many of the 32,000,000 records it could read. All tests used a ring buffer ++of 16KB in size, which holds around 350 records (header + data for each ++entry). ++ ++The only difference between the tests is the number of writers (and thus also ++the number of records per writer). As more writers are added, the time to ++write a record increases. This is because data pointers, modified via cmpxchg, ++and global data access in general become more contended. ++ ++1 writer ++^^^^^^^^ ++ runtime: 0m 18s ++ reader1: 16219900/32000000 (50%) records ++ reader2: 16141582/32000000 (50%) records ++ ++2 writers ++^^^^^^^^^ ++ runtime: 0m 32s ++ reader1: 16327957/32000000 (51%) records ++ reader2: 16313988/32000000 (50%) records ++ ++4 writers ++^^^^^^^^^ ++ runtime: 0m 42s ++ reader1: 16421642/32000000 (51%) records ++ reader2: 16417224/32000000 (51%) records ++ ++8 writers ++^^^^^^^^^ ++ runtime: 0m 43s ++ reader1: 16418300/32000000 (51%) records ++ reader2: 16432222/32000000 (51%) records ++ ++16 writers ++^^^^^^^^^^ ++ runtime: 0m 54s ++ reader1: 16539189/32000000 (51%) records ++ reader2: 16542711/32000000 (51%) records ++ ++32 writers ++^^^^^^^^^^ ++ runtime: 1m 13s ++ reader1: 16731808/32000000 (52%) records ++ reader2: 16735119/32000000 (52%) records ++ ++Comments ++^^^^^^^^ ++It is particularly interesting to compare/contrast the 1-writer and 32-writer ++tests. Despite the writing of the 32,000,000 records taking over 4 times ++longer, the readers (which perform no cmpxchg) were still unable to keep up. ++This shows that the memory contention between the increasing number of CPUs ++also has a dramatic effect on readers. ++ ++It should also be noted that in all cases each reader was able to read >=50% ++of the records. This means that a single reader would have been able to keep ++up with the writer(s) in all cases, becoming slightly easier as more writers ++are added. This was the purpose of pinning 2 readers to 1 CPU: to observe how ++maximum reader performance changes. +diff --git a/Documentation/trace/ftrace-uses.rst b/Documentation/trace/ftrace-uses.rst +index 1fbc69894eed..1e0020b0bc74 100644 +--- a/Documentation/trace/ftrace-uses.rst ++++ b/Documentation/trace/ftrace-uses.rst +@@ -146,7 +146,7 @@ FTRACE_OPS_FL_RECURSION_SAFE + itself or any nested functions that those functions call. + + If this flag is set, it is possible that the callback will also +- be called with preemption enabled (when CONFIG_PREEMPT is set), ++ be called with preemption enabled (when CONFIG_PREEMPTION is set), + but this is not guaranteed. + + FTRACE_OPS_FL_IPMODIFY +diff --git a/arch/Kconfig b/arch/Kconfig +index 238dccfa7691..a886cbe86efc 100644 +--- a/arch/Kconfig ++++ b/arch/Kconfig +@@ -31,6 +31,7 @@ config OPROFILE + tristate "OProfile system profiling" + depends on PROFILING + depends on HAVE_OPROFILE ++ depends on !PREEMPT_RT + select RING_BUFFER + select RING_BUFFER_ALLOW_SWAP + help +diff --git a/arch/alpha/include/asm/spinlock_types.h b/arch/alpha/include/asm/spinlock_types.h +index 1d5716bc060b..6883bc952d22 100644 +--- a/arch/alpha/include/asm/spinlock_types.h ++++ b/arch/alpha/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef _ALPHA_SPINLOCK_TYPES_H + #define _ALPHA_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + typedef struct { + volatile unsigned int lock; + } arch_spinlock_t; +diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S +index ea74a1eee5d9..29a45c2f0b17 100644 +--- a/arch/arc/kernel/entry.S ++++ b/arch/arc/kernel/entry.S +@@ -331,11 +331,11 @@ resume_user_mode_begin: + resume_kernel_mode: + + ; Disable Interrupts from this point on +- ; CONFIG_PREEMPT: This is a must for preempt_schedule_irq() +- ; !CONFIG_PREEMPT: To ensure restore_regs is intr safe ++ ; CONFIG_PREEMPTION: This is a must for preempt_schedule_irq() ++ ; !CONFIG_PREEMPTION: To ensure restore_regs is intr safe + IRQ_DISABLE r9 + +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPTION + + ; Can't preempt if preemption disabled + GET_CURR_THR_INFO_FROM_SP r10 +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 05c9bbfe444d..d3f02889760b 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -32,6 +32,7 @@ config ARM + select ARCH_OPTIONAL_KERNEL_RWX if ARCH_HAS_STRICT_KERNEL_RWX + select ARCH_OPTIONAL_KERNEL_RWX_DEFAULT if CPU_V7 + select ARCH_SUPPORTS_ATOMIC_RMW ++ select ARCH_SUPPORTS_RT + select ARCH_USE_BUILTIN_BSWAP + select ARCH_USE_CMPXCHG_LOCKREF + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU +@@ -64,7 +65,7 @@ config ARM + select HARDIRQS_SW_RESEND + select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT + select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 +- select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU ++ select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU && !PREEMPT_RT + select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU + select HAVE_ARCH_MMAP_RND_BITS if MMU + select HAVE_ARCH_SECCOMP_FILTER if AEABI && !OABI_COMPAT +@@ -103,6 +104,7 @@ config ARM + select HAVE_PERF_EVENTS + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select HAVE_RCU_TABLE_FREE if SMP && ARM_LPAE + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_RSEQ +diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h +index 46d41140df27..c421b5b81946 100644 +--- a/arch/arm/include/asm/irq.h ++++ b/arch/arm/include/asm/irq.h +@@ -23,6 +23,8 @@ + #endif + + #ifndef __ASSEMBLY__ ++#include ++ + struct irqaction; + struct pt_regs; + +diff --git a/arch/arm/include/asm/spinlock_types.h b/arch/arm/include/asm/spinlock_types.h +index 5976958647fe..a37c0803954b 100644 +--- a/arch/arm/include/asm/spinlock_types.h ++++ b/arch/arm/include/asm/spinlock_types.h +@@ -2,10 +2,6 @@ + #ifndef __ASM_SPINLOCK_TYPES_H + #define __ASM_SPINLOCK_TYPES_H + +-#ifndef __LINUX_SPINLOCK_TYPES_H +-# error "please don't include this file directly" +-#endif +- + #define TICKET_SHIFT 16 + + typedef struct { +diff --git a/arch/arm/include/asm/switch_to.h b/arch/arm/include/asm/switch_to.h +index d3e937dcee4d..285e6248454f 100644 +--- a/arch/arm/include/asm/switch_to.h ++++ b/arch/arm/include/asm/switch_to.h +@@ -4,13 +4,20 @@ + + #include + ++#if defined CONFIG_PREEMPT_RT && defined CONFIG_HIGHMEM ++void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p); ++#else ++static inline void ++switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) { } ++#endif ++ + /* + * For v7 SMP cores running a preemptible kernel we may be pre-empted + * during a TLB maintenance operation, so execute an inner-shareable dsb + * to ensure that the maintenance completes in case we migrate to another + * CPU. + */ +-#if defined(CONFIG_PREEMPT) && defined(CONFIG_SMP) && defined(CONFIG_CPU_V7) ++#if defined(CONFIG_PREEMPTION) && defined(CONFIG_SMP) && defined(CONFIG_CPU_V7) + #define __complete_pending_tlbi() dsb(ish) + #else + #define __complete_pending_tlbi() +@@ -26,6 +33,7 @@ extern struct task_struct *__switch_to(struct task_struct *, struct thread_info + #define switch_to(prev,next,last) \ + do { \ + __complete_pending_tlbi(); \ ++ switch_kmaps(prev, next); \ + last = __switch_to(prev,task_thread_info(prev), task_thread_info(next)); \ + } while (0) + +diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thread_info.h +index 0d0d5178e2c3..13be9c2137e2 100644 +--- a/arch/arm/include/asm/thread_info.h ++++ b/arch/arm/include/asm/thread_info.h +@@ -46,6 +46,7 @@ struct cpu_context_save { + struct thread_info { + unsigned long flags; /* low level flags */ + int preempt_count; /* 0 => preemptable, <0 => bug */ ++ int preempt_lazy_count; /* 0 => preemptable, <0 => bug */ + mm_segment_t addr_limit; /* address limit */ + struct task_struct *task; /* main task structure */ + __u32 cpu; /* cpu */ +@@ -139,7 +140,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + #define TIF_SYSCALL_TRACE 4 /* syscall trace active */ + #define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */ + #define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */ +-#define TIF_SECCOMP 7 /* seccomp syscall filtering active */ ++#define TIF_SECCOMP 8 /* seccomp syscall filtering active */ ++#define TIF_NEED_RESCHED_LAZY 7 + + #define TIF_NOHZ 12 /* in adaptive nohz mode */ + #define TIF_USING_IWMMXT 17 +@@ -149,6 +151,7 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) + #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) + #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) ++#define _TIF_NEED_RESCHED_LAZY (1 << TIF_NEED_RESCHED_LAZY) + #define _TIF_UPROBE (1 << TIF_UPROBE) + #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) + #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +@@ -164,7 +167,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, + * Change these and you break ASM code in entry-common.S + */ + #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ +- _TIF_NOTIFY_RESUME | _TIF_UPROBE) ++ _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ ++ _TIF_NEED_RESCHED_LAZY) + + #endif /* __KERNEL__ */ + #endif /* __ASM_ARM_THREAD_INFO_H */ +diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c +index c773b829ee8e..f3a0e1cd1f04 100644 +--- a/arch/arm/kernel/asm-offsets.c ++++ b/arch/arm/kernel/asm-offsets.c +@@ -53,6 +53,7 @@ int main(void) + BLANK(); + DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); + DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); ++ DEFINE(TI_PREEMPT_LAZY, offsetof(struct thread_info, preempt_lazy_count)); + DEFINE(TI_ADDR_LIMIT, offsetof(struct thread_info, addr_limit)); + DEFINE(TI_TASK, offsetof(struct thread_info, task)); + DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); +diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S +index a874b753397e..1e689a727cb9 100644 +--- a/arch/arm/kernel/entry-armv.S ++++ b/arch/arm/kernel/entry-armv.S +@@ -204,13 +204,20 @@ __irq_svc: + svc_entry + irq_handler + +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPTION + ldr r8, [tsk, #TI_PREEMPT] @ get preempt count +- ldr r0, [tsk, #TI_FLAGS] @ get flags + teq r8, #0 @ if preempt count != 0 ++ bne 1f @ return from exeption ++ ldr r0, [tsk, #TI_FLAGS] @ get flags ++ tst r0, #_TIF_NEED_RESCHED @ if NEED_RESCHED is set ++ blne svc_preempt @ preempt! ++ ++ ldr r8, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count ++ teq r8, #0 @ if preempt lazy count != 0 + movne r0, #0 @ force flags to 0 +- tst r0, #_TIF_NEED_RESCHED ++ tst r0, #_TIF_NEED_RESCHED_LAZY + blne svc_preempt ++1: + #endif + + svc_exit r5, irq = 1 @ return from exception +@@ -219,14 +226,20 @@ ENDPROC(__irq_svc) + + .ltorg + +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPTION + svc_preempt: + mov r8, lr + 1: bl preempt_schedule_irq @ irq en/disable is done inside + ldr r0, [tsk, #TI_FLAGS] @ get new tasks TI_FLAGS + tst r0, #_TIF_NEED_RESCHED ++ bne 1b ++ tst r0, #_TIF_NEED_RESCHED_LAZY + reteq r8 @ go again +- b 1b ++ ldr r0, [tsk, #TI_PREEMPT_LAZY] @ get preempt lazy count ++ teq r0, #0 @ if preempt lazy count != 0 ++ beq 1b ++ ret r8 @ go again ++ + #endif + + __und_fault: +diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S +index 271cb8a1eba1..fd039b1b3731 100644 +--- a/arch/arm/kernel/entry-common.S ++++ b/arch/arm/kernel/entry-common.S +@@ -53,7 +53,9 @@ __ret_fast_syscall: + cmp r2, #TASK_SIZE + blne addr_limit_check_failed + ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing +- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK ++ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) ++ bne fast_work_pending ++ tst r1, #_TIF_SECCOMP + bne fast_work_pending + + +@@ -90,8 +92,11 @@ __ret_fast_syscall: + cmp r2, #TASK_SIZE + blne addr_limit_check_failed + ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing +- tst r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASK ++ tst r1, #((_TIF_SYSCALL_WORK | _TIF_WORK_MASK) & ~_TIF_SECCOMP) ++ bne do_slower_path ++ tst r1, #_TIF_SECCOMP + beq no_work_pending ++do_slower_path: + UNWIND(.fnend ) + ENDPROC(ret_fast_syscall) + +diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c +index ab2568996ddb..50d43ce823bf 100644 +--- a/arch/arm/kernel/signal.c ++++ b/arch/arm/kernel/signal.c +@@ -649,7 +649,8 @@ do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall) + */ + trace_hardirqs_off(); + do { +- if (likely(thread_flags & _TIF_NEED_RESCHED)) { ++ if (likely(thread_flags & (_TIF_NEED_RESCHED | ++ _TIF_NEED_RESCHED_LAZY))) { + schedule(); + } else { + if (unlikely(!user_mode(regs))) +diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c +index 46e1be9e57a8..581caf6493a9 100644 +--- a/arch/arm/kernel/smp.c ++++ b/arch/arm/kernel/smp.c +@@ -682,11 +682,9 @@ void handle_IPI(int ipinr, struct pt_regs *regs) + break; + + case IPI_CPU_BACKTRACE: +- printk_nmi_enter(); + irq_enter(); + nmi_cpu_backtrace(regs); + irq_exit(); +- printk_nmi_exit(); + break; + + default: +diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c +index c053abd1fb53..abb7dd7e656f 100644 +--- a/arch/arm/kernel/traps.c ++++ b/arch/arm/kernel/traps.c +@@ -248,6 +248,8 @@ void show_stack(struct task_struct *tsk, unsigned long *sp) + + #ifdef CONFIG_PREEMPT + #define S_PREEMPT " PREEMPT" ++#elif defined(CONFIG_PREEMPT_RT) ++#define S_PREEMPT " PREEMPT_RT" + #else + #define S_PREEMPT "" + #endif +diff --git a/arch/arm/mm/cache-v7.S b/arch/arm/mm/cache-v7.S +index 0ee8fc4b4672..dc8f152f3556 100644 +--- a/arch/arm/mm/cache-v7.S ++++ b/arch/arm/mm/cache-v7.S +@@ -135,13 +135,13 @@ flush_levels: + and r1, r1, #7 @ mask of the bits for current cache only + cmp r1, #2 @ see what cache we have at this level + blt skip @ skip if no cache, or just i-cache +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPTION + save_and_disable_irqs_notrace r9 @ make cssr&csidr read atomic + #endif + mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr + isb @ isb to sych the new cssr&csidr + mrc p15, 1, r1, c0, c0, 0 @ read the new csidr +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPTION + restore_irqs_notrace r9 + #endif + and r2, r1, #7 @ extract the length of the cache lines +diff --git a/arch/arm/mm/cache-v7m.S b/arch/arm/mm/cache-v7m.S +index a0035c426ce6..1bc3a0a50753 100644 +--- a/arch/arm/mm/cache-v7m.S ++++ b/arch/arm/mm/cache-v7m.S +@@ -183,13 +183,13 @@ flush_levels: + and r1, r1, #7 @ mask of the bits for current cache only + cmp r1, #2 @ see what cache we have at this level + blt skip @ skip if no cache, or just i-cache +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPTION + save_and_disable_irqs_notrace r9 @ make cssr&csidr read atomic + #endif + write_csselr r10, r1 @ set current cache level + isb @ isb to sych the new cssr&csidr + read_ccsidr r1 @ read the new csidr +-#ifdef CONFIG_PREEMPT ++#ifdef CONFIG_PREEMPTION + restore_irqs_notrace r9 + #endif + and r2, r1, #7 @ extract the length of the cache lines +diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c +index bd0f4821f7e1..865fd8fbfe59 100644 +--- a/arch/arm/mm/fault.c ++++ b/arch/arm/mm/fault.c +@@ -414,6 +414,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, + if (addr < TASK_SIZE) + return do_page_fault(addr, fsr, regs); + ++ if (interrupts_enabled(regs)) ++ local_irq_enable(); ++ + if (user_mode(regs)) + goto bad_area; + +@@ -481,6 +484,9 @@ do_translation_fault(unsigned long addr, unsigned int fsr, + static int + do_sect_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) + { ++ if (interrupts_enabled(regs)) ++ local_irq_enable(); ++ + do_bad_area(addr, fsr, regs); + return 0; + } +diff --git a/arch/arm/mm/highmem.c b/arch/arm/mm/highmem.c +index a76f8ace9ce6..eb4a361d47d7 100644 +--- a/arch/arm/mm/highmem.c ++++ b/arch/arm/mm/highmem.c +@@ -31,6 +31,11 @@ static inline pte_t get_fixmap_pte(unsigned long vaddr) + return *ptep; + } + ++static unsigned int fixmap_idx(int type) ++{ ++ return FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++} ++ + void *kmap(struct page *page) + { + might_sleep(); +@@ -51,12 +56,13 @@ EXPORT_SYMBOL(kunmap); + + void *kmap_atomic(struct page *page) + { ++ pte_t pte = mk_pte(page, kmap_prot); + unsigned int idx; + unsigned long vaddr; + void *kmap; + int type; + +- preempt_disable(); ++ preempt_disable_nort(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); +@@ -76,7 +82,7 @@ void *kmap_atomic(struct page *page) + + type = kmap_atomic_idx_push(); + +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++ idx = fixmap_idx(type); + vaddr = __fix_to_virt(idx); + #ifdef CONFIG_DEBUG_HIGHMEM + /* +@@ -90,7 +96,10 @@ void *kmap_atomic(struct page *page) + * in place, so the contained TLB flush ensures the TLB is updated + * with the new mapping. + */ +- set_fixmap_pte(idx, mk_pte(page, kmap_prot)); ++#ifdef CONFIG_PREEMPT_RT ++ current->kmap_pte[type] = pte; ++#endif ++ set_fixmap_pte(idx, pte); + + return (void *)vaddr; + } +@@ -103,44 +112,75 @@ void __kunmap_atomic(void *kvaddr) + + if (kvaddr >= (void *)FIXADDR_START) { + type = kmap_atomic_idx(); +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++ idx = fixmap_idx(type); + + if (cache_is_vivt()) + __cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE); ++#ifdef CONFIG_PREEMPT_RT ++ current->kmap_pte[type] = __pte(0); ++#endif + #ifdef CONFIG_DEBUG_HIGHMEM + BUG_ON(vaddr != __fix_to_virt(idx)); +- set_fixmap_pte(idx, __pte(0)); + #else + (void) idx; /* to kill a warning */ + #endif ++ set_fixmap_pte(idx, __pte(0)); + kmap_atomic_idx_pop(); + } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { + /* this address was obtained through kmap_high_get() */ + kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); + } + pagefault_enable(); +- preempt_enable(); ++ preempt_enable_nort(); + } + EXPORT_SYMBOL(__kunmap_atomic); + + void *kmap_atomic_pfn(unsigned long pfn) + { ++ pte_t pte = pfn_pte(pfn, kmap_prot); + unsigned long vaddr; + int idx, type; + struct page *page = pfn_to_page(pfn); + +- preempt_disable(); ++ preempt_disable_nort(); + pagefault_disable(); + if (!PageHighMem(page)) + return page_address(page); + + type = kmap_atomic_idx_push(); +- idx = FIX_KMAP_BEGIN + type + KM_TYPE_NR * smp_processor_id(); ++ idx = fixmap_idx(type); + vaddr = __fix_to_virt(idx); + #ifdef CONFIG_DEBUG_HIGHMEM + BUG_ON(!pte_none(get_fixmap_pte(vaddr))); + #endif +- set_fixmap_pte(idx, pfn_pte(pfn, kmap_prot)); ++#ifdef CONFIG_PREEMPT_RT ++ current->kmap_pte[type] = pte; ++#endif ++ set_fixmap_pte(idx, pte); + + return (void *)vaddr; + } ++#if defined CONFIG_PREEMPT_RT ++void switch_kmaps(struct task_struct *prev_p, struct task_struct *next_p) ++{ ++ int i; ++ ++ /* ++ * Clear @prev's kmap_atomic mappings ++ */ ++ for (i = 0; i < prev_p->kmap_idx; i++) { ++ int idx = fixmap_idx(i); ++ ++ set_fixmap_pte(idx, __pte(0)); ++ } ++ /* ++ * Restore @next_p's kmap_atomic mappings ++ */ ++ for (i = 0; i < next_p->kmap_idx; i++) { ++ int idx = fixmap_idx(i); ++ ++ if (!pte_none(next_p->kmap_pte[i])) ++ set_fixmap_pte(idx, next_p->kmap_pte[i]); ++ } ++} ++#endif +diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig +index a0bc9bbb92f3..0ba73283452c 100644 +--- a/arch/arm64/Kconfig ++++ b/arch/arm64/Kconfig +@@ -35,32 +35,32 @@ config ARM64 + select ARCH_HAS_TEARDOWN_DMA_OPS if IOMMU_SUPPORT + select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST + select ARCH_HAVE_NMI_SAFE_CMPXCHG +- select ARCH_INLINE_READ_LOCK if !PREEMPT +- select ARCH_INLINE_READ_LOCK_BH if !PREEMPT +- select ARCH_INLINE_READ_LOCK_IRQ if !PREEMPT +- select ARCH_INLINE_READ_LOCK_IRQSAVE if !PREEMPT +- select ARCH_INLINE_READ_UNLOCK if !PREEMPT +- select ARCH_INLINE_READ_UNLOCK_BH if !PREEMPT +- select ARCH_INLINE_READ_UNLOCK_IRQ if !PREEMPT +- select ARCH_INLINE_READ_UNLOCK_IRQRESTORE if !PREEMPT +- select ARCH_INLINE_WRITE_LOCK if !PREEMPT +- select ARCH_INLINE_WRITE_LOCK_BH if !PREEMPT +- select ARCH_INLINE_WRITE_LOCK_IRQ if !PREEMPT +- select ARCH_INLINE_WRITE_LOCK_IRQSAVE if !PREEMPT +- select ARCH_INLINE_WRITE_UNLOCK if !PREEMPT +- select ARCH_INLINE_WRITE_UNLOCK_BH if !PREEMPT +- select ARCH_INLINE_WRITE_UNLOCK_IRQ if !PREEMPT +- select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE if !PREEMPT +- select ARCH_INLINE_SPIN_TRYLOCK if !PREEMPT +- select ARCH_INLINE_SPIN_TRYLOCK_BH if !PREEMPT +- select ARCH_INLINE_SPIN_LOCK if !PREEMPT +- select ARCH_INLINE_SPIN_LOCK_BH if !PREEMPT +- select ARCH_INLINE_SPIN_LOCK_IRQ if !PREEMPT +- select ARCH_INLINE_SPIN_LOCK_IRQSAVE if !PREEMPT +- select ARCH_INLINE_SPIN_UNLOCK if !PREEMPT +- select ARCH_INLINE_SPIN_UNLOCK_BH if !PREEMPT +- select ARCH_INLINE_SPIN_UNLOCK_IRQ if !PREEMPT +- select ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE if !PREEMPT ++ select ARCH_INLINE_READ_LOCK if !PREEMPTION ++ select ARCH_INLINE_READ_LOCK_BH if !PREEMPTION ++ select ARCH_INLINE_READ_LOCK_IRQ if !PREEMPTION ++ select ARCH_INLINE_READ_LOCK_IRQSAVE if !PREEMPTION ++ select ARCH_INLINE_READ_UNLOCK if !PREEMPTION ++ select ARCH_INLINE_READ_UNLOCK_BH if !PREEMPTION ++ select ARCH_INLINE_READ_UNLOCK_IRQ if !PREEMPTION ++ select ARCH_INLINE_READ_UNLOCK_IRQRESTORE if !PREEMPTION ++ select ARCH_INLINE_WRITE_LOCK if !PREEMPTION ++ select ARCH_INLINE_WRITE_LOCK_BH if !PREEMPTION ++ select ARCH_INLINE_WRITE_LOCK_IRQ if !PREEMPTION ++ select ARCH_INLINE_WRITE_LOCK_IRQSAVE if !PREEMPTION ++ select ARCH_INLINE_WRITE_UNLOCK if !PREEMPTION ++ select ARCH_INLINE_WRITE_UNLOCK_BH if !PREEMPTION ++ select ARCH_INLINE_WRITE_UNLOCK_IRQ if !PREEMPTION ++ select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE if !PREEMPTION ++ select ARCH_INLINE_SPIN_TRYLOCK if !PREEMPTION ++ select ARCH_INLINE_SPIN_TRYLOCK_BH if !PREEMPTION ++ select ARCH_INLINE_SPIN_LOCK if !PREEMPTION ++ select ARCH_INLINE_SPIN_LOCK_BH if !PREEMPTION ++ select ARCH_INLINE_SPIN_LOCK_IRQ if !PREEMPTION ++ select ARCH_INLINE_SPIN_LOCK_IRQSAVE if !PREEMPTION ++ select ARCH_INLINE_SPIN_UNLOCK if !PREEMPTION ++ select ARCH_INLINE_SPIN_UNLOCK_BH if !PREEMPTION ++ select ARCH_INLINE_SPIN_UNLOCK_IRQ if !PREEMPTION ++ select ARCH_INLINE_SPIN_UNLOCK_IRQRESTORE if !PREEMPTION + select ARCH_KEEP_MEMBLOCK + select ARCH_USE_CMPXCHG_LOCKREF + select ARCH_USE_QUEUED_RWLOCKS +@@ -69,6 +69,7 @@ config ARM64 + select ARCH_SUPPORTS_ATOMIC_RMW + select ARCH_SUPPORTS_INT128 if GCC_VERSION >= 50000 || CC_IS_CLANG + select ARCH_SUPPORTS_NUMA_BALANCING ++ select ARCH_SUPPORTS_RT + select ARCH_WANT_COMPAT_IPC_PARSE_VERSION if COMPAT + select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT + select ARCH_WANT_FRAME_POINTERS +@@ -159,6 +160,7 @@ config ARM64 + select HAVE_PERF_EVENTS + select HAVE_PERF_REGS + select HAVE_PERF_USER_STACK_DUMP ++ select HAVE_PREEMPT_LAZY + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_FUNCTION_ARG_ACCESS_API + select HAVE_RCU_TABLE_FREE +diff --git a/arch/arm64/crypto/sha256-glue.c b/arch/arm64/crypto/sha256-glue.c +index e273faca924f..999da59f03a9 100644 +--- a/arch/arm64/crypto/sha256-glue.c ++++ b/arch/arm64/crypto/sha256-glue.c +@@ -97,7 +97,7 @@ static int sha256_update_neon(struct shash_desc *desc, const u8 *data, + * input when running on a preemptible kernel, but process the + * data block by block instead. + */ +- if (IS_ENABLED(CONFIG_PREEMPT) && ++ if (IS_ENABLED(CONFIG_PREEMPTION) && + chunk + sctx->count % SHA256_BLOCK_SIZE > SHA256_BLOCK_SIZE) + chunk = SHA256_BLOCK_SIZE - + sctx->count % SHA256_BLOCK_SIZE; +diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h +index b8cf7c85ffa2..2cc0dd8bd9f7 100644 +--- a/arch/arm64/include/asm/assembler.h ++++ b/arch/arm64/include/asm/assembler.h +@@ -699,8 +699,8 @@ USER(\label, ic ivau, \tmp2) // invalidate I line PoU + * where

b!C}UpA`7G-a17oUz zTzT2_hu3856cUw(_d02-U!xK#w-rgb@g*Opm%nAzcpOC7d3YPR<~!J_3>KQ$@jjv} z-VKAwlTooY>nn|Ctf_aojftV#2C4OuolCMKZ;OZbvewH6iwi0< zjfK}IhMZfoD!F8>XJePit87#I!3AtaA&D8MHi@kwQk^b2_-9s~s8$B}F2R3bUJ?*5 z{u3pw-ZQbi@O$*Wn5Bz-m0}$y z8*4L6W5aAk++F8xHe$xqlqnk)MBl97^tCk$X&erj6)&l}nUdsE46pS~foRl=z&w^3 zCPO`$sGBt1cTD$GZwH=0DYiNhy6@!-7{|njON9#5)aQ-M1+uxqQ4PMLIYQ;tW;;g9 zomzFbsC7C`qwkDEzNhD0C5`BCFnm-R_*Ulx>USijd?%+ud&lFqw+@gLugMCTaoHIi z8yj@R-q=i)Y}ZfSHEd5l@Sa*{gWNan5Y*UXR2(9nWamP09z0bUQy0JY9n)RElgx_5 zZiz&pMRf-zd)?X(ZMQWpYO=B2%wwH5Sjqbs=sYT(SpiOb`iGWedjd*@C^e>df<1fcSB!WP@k? zZcTibj9{G~FyTfEdh!M3iZRVTT0&S+9D}rGa%HN?nASLCU{%SqQ~^0=4bF0s^@Qbd z350yFE{Mi1+s0^pZ-6IEC(6$|8pNLC=8{BZX?{RA2nj^941g8&A^Nq8ADC*P_+PpJne&5u)FGc{d4-C* zYhBr`_FylHYm({am*0-`EENCpp*i%htn6N$)A=Td^?hD#*gd@T!4Y_F_en#!y?Uc2 zhGtBark^}CX^xdBbaAtTQ8uNc8^61g71WRl=N& z@sHgN6!lbC#>7YxeLv z3YpX#SxX4HaZXXJ^f&-K|Eij{IjOu(WEekqr48NY%UtkmA4%6gkIowWUMryg6cG-; zxxAqkrixwpB-$+#&JUuaJA1dvClr-`f+D#QWB)5|1m(YtE5N^D0SQX^ueI$nqt9nx z=F4bXK+5pSRP$k267ooRsIUh8e^Z1JWvR)~EcYj!#>76x)9dW>mC}OOXS(deB2~MB=pG%<_6wyP@&Bm4}JV_tFaU&7n-kyPJ zIdBEo8S6W922AoWoZIwJwx_PuTBcMY!p1!gEED7W_}WeiT8wmU*esnwRnVjHMQ2?Z z@cU2uLssldvqXPiQCEe}SwB^6sJva^tFID(vq#4GbWg6R%+oM+9}!*?Ka(LoDKk6G zx4tlS6Ie`gX9H2s_sDHdv$yVX!$H|GN(XkoSFf4vtF9>(NSKIKVQ1RJI7GhOZ6+nd zUU-$L?`~BIh48R1sM_&%J$Q|$m1sXey;b-64?t0fY_nK`OqVo~=gBde8KVRcK9$Sg zX^yg1QKI5|c;3|jM#IeKo7Ovq_g!B|NVAKa6Hv5sD9@+kTiVqQ!bc`Pe^ zvgc-vF8TIl4fieGBN93gFDbT)@PoyG7dW(EAfJ@(@s0=#dfIcH`2N+~H-fjPygx0@ z-aP6GhZMNER}9-3(RCkS7100XHk=B-mb0fUso&euAQA&}EIuizCXzd*h zB=Ie)c4Ca=XC`Tpgc%u@EQH6-wq0U_Y%3{reQY-h3|#8C#dwsdQJ?Aj=>^7~AW^N< zVobK1S8FYlF;@ zOV~ITNgHauG7t!^M;HPF=i?Tr2o&NM2L}$Ir$Fkj_4_Q$2KJoV8s+w2O=c|JR~*qI z>X|^KjNtf2;E}b-dN+`&!mjqh%k`!+Aj96Bi9_&51s#7OyR|O!t&Tt!HlfnvnXsBM z8RIRgJSLT5B3XYDHP1y=kJ0ij)3VGDV%5N{{BN8H`A^sYu10F6z5p;EvExECu)jr_ zlC^?rLWCJ-0az6(n!aYcy47iuRJ6z~Mrih*Qv+z#_l-s=`+BlW2`h^mrM7angW?J zD4W`3^@d&dtyhvjDsd>DTlQlyX+QV6l2q|p-HFEFHqrt%`QCjIMwUQxP@KbKU688R zARUJdD{GY?b}&z!fYth>d*S1!BpQ7b8Y;>QD7IwPU7lDI644!~&rl@owF;cs@2(`Z zMv36PI&6FEj#6JPHim#s{GH76bTRtk7FV;-4Zgh`lQVxI+u&eUjV_opCx`w8~$XVH8ZC*{v7+zj+Wj-idOpb8fI8Z`&@btKt?`X5J=l8pFtD znCFv3Qf6`Gc-eKGu>a}7;NSoKcQ~LpH8o!+_*SS%P~jO>)FA(@tW)M$AZ1kH=yK3w zJPDlS)}YT9L0Y*b-pON>{D*_G@WA|g?n9Q4M*{jX!)z#w%P?OTV{N*xd}wmSg=JK; z>eE)0zNxltwqDx)ih1P}L6BF4Ne!=}GnqzPnPekIJp3D%PYHw5n28(h^$Pp6)pxSz ziP^?~7u^Rokv~w^zCY}g$oTV@yWirumq}2t+SWEzhp343F{%lgjI)m+>%h3MuU`0m zzV(Em8v^qPX8EFtXr02W_uSe&a(A?0O+L2{5);bSi$6k`?K`@c^;?Ry^3_a@$mpAB z*ZZV%Qdj$m4=Is9In)XUYr6FapeO)6NA{H>U(p29-rm$y<=4mpo>jtTM8QD>$Hsq_{n{nwc<~mLq z@2xw_z0F9yo3iM~;O7XAVOCvBU@A>bXuEUsOk(FGZj#|;p$!l5SBF_Y6_RXa^$s*r?jokZUO-n6Wcf2sE#90uD!NBT5 zJ}hjO4}Xx3zWLTy(hvl;#@%_{+YC_kO0=5^;{*hl9{TiBrGFV#2@t)*g55N0I`EWP|5mb_5OJU9XqoIZ+0Dv^bg(hBw| z0)H^}Zta1Yn9S?oM6=dr6Q@?e_jG!r7&C``x;2wOS-gO4LX#YbBZ|cM6I**px|L?$ z2@x+=nNM7ma6>3{q+Zn|VtY;xY#O3Em90u~1Z;OsoD!!W`%;=Tmt=`tX)}EA*fu=w z8BplL_*3a90JD+-qHJGAy7c%FYneXcYRV;7(!1#wsvzvWV z$AlVd#%z`LnsD?xlE%eW%0yj*tCSQO-{Y-I#}VO`sePzPz$u=BDc{eV;4Vo;>1a2( z{g*>=j3km>$Y#4CGy@44iqI9>N`qn*Jd?@Vu>qMWL%-6Gh0P~oB3-H|ZtsEXDYuiJ zON$lSTo^b-PrCB?qgAx0y?6Xw{%4Fjl7(>6{>3w5aCX|ILK@R>VC_aS zvL%c5@0~3GX^Az-#*RrFU7>U>Mmf+yB!C0^Fk72N-tmm6=SyPcBsG+pta-be);BRphB>`e7ssnC-;JV0F+bVZD{uJ8UU7PedFN3N08=EmphY4QjsR&zQQ21)Pt!}oTs?|& zBsz2~`ml`3hj#XRnK(rMd;0~ORBd;|<>@IB z0wKlGPi!YoO|Bm6p|)>WBp&l<9Hp7{L$Fk)+{|+f`$$Yfi!V zoQ^uN(O*y0uvTV^Q%ZE;@-o_FLE=QvT=J~nC&9;)frH;vVJpkcNVQ1t-MeYmAMTF@ zA5t1%n=|SR1Nlq(B9JG-Ht>>&?Nqh8aaD`{&x)g;1vAp#^uJOdE{^+u;N!~G}u`ad1Qjk;OVdL9l+BF`}*w5%U4!Pg40|G_;A-7F zv-F!-Z@WM0hOSNi@`^`N)m~?}r+p;&mYU6r44og%sIQAtwoWD}9hTW9j=WOBn-+ij z$_@=e+5H~t=Nfsa{(RfjBfrPv&?d)0I_6G~v59^mH^l&u9R#i+Hx0nx_RW*!=Ac+zq2D3&qw8MgUYVmWK6FiI$) z#?HlaW9~u*jkl^vsK=689c8_8n9&X3QDq%lLr;rxuNb>j^dy^u7(v`nK4Zj^hAePl zrKz`^jTk-nVX4XY-80_+rqk?VBLk2=#zKs7guj8aUHh8Zs~elQOQ4*!lY&;^)8Xq$ zb$^PDk_zaH8AC&!%0gUYr?GbNMQ_XBq1^7iaLrW%X}+VEXnzegrtql3Ee?aWM3Q%V z7`-jYp2TfqW#(&_k_EzZW_+adjbO>mjFys|t*M1bWqSMXFDtRj?sbgmU?Z$19T{1m zm4j|g6{X=_XviSPMp~CxwQmzx7BkJLOsYG3A3u@dQmb8$YL}nbQl*>GkD`R#e7P`c zWNuOUR>k@A?OQSpG;Xm=rQ8;J)WOn4qcjKWPaxbv_l6XqH81M)^G|IjbR5||29Zx{OYaP0Sm(fGvwBJuhR%M1v_CC*bRP zCzDyQ6V3w1N~mcbZV>gLp+7x>i%Hcug=Ie{6No@$C6FSSAvWNx3~PXpwPZS+nS)BA zHA=gdrXT)zmg5( z1~OnQI%jStW1mAoYzr>#MS|D(#$#__e1UITL z<_N@RFkKE_&r!5!xhiQ&qxWED`b3I21 zY7lEY*kflS8xU6WYV9c2a&T>Mvnc8|bw5HJ^>oVrl~aopl9f6g{iJMd7C7ImTg%O$ zRN@rE)=f!AKl&d)RJ92PBM?9CuFc(~QO%RR{V+$noUM1+l@CW<=1)%y0!01?a8lec zk+IfhOnnQ7G|Ds^c}Eu!iFO}hN$}gud8hlXHclj&h0Zh57~O{$KXK2{1)j8=+LN)# zh-}lbiM$aO08Vg7GKA-dA(3kk5bWh5}yom4a*juz&sJRR>s@O^8n3Z2Nv>WCmsI;pqcppg>_U)4g?>7bjoj8 zLU>#MjRFnEek2Ro62b!cZ@Lb_GFmP4U;T%SQE{G>C5K3=dpiMe%O$_h~Wih)eQHNUaRLCMZT2}I`lD$Kj-&Vdlqj5@-#j1i04dk z#YPF6Ehql25Nw!j=-Gd}+|jH~LjNId=aHi`GjXWbBA)M5Ow7FI4P*vM`&wK-7b@IR zsZ~X;YnwQs4jiHN16bNj> zLWw$KU%GQFf?Y$adykX08@w#0vk0E*2{3Vbrm*D4o>oO0B=KEPVhpQsQ5*ZzPhe{f zNo(0H;9m8F(u(8)gtT#f5ayBSrtny*woRBOW!$YDcVD&9Z z(|*k9feFQBwH7miZc9U~Qz_b>w+_X5G{U4OtPZV9-Qr10m=!JAWy7o#@Qi8KicoFg zO9hhykId5wpa;{m=Ya>-8Ol8*At*_t;AZ$}_aQa9i=u4wjVn`*6V^6i-J!dBB#`G`Gq1_B`=dF{w979I5{8PIADK1oY(I6I zT`E53xcNu-Vz&fXx&Nk{;^JF{+lj7(xg@AZiqQ77j)VhLoUL;3vE8=$%wNc6DQ4KJ zHnPn+a8aQjEESOk*#LA42wh5ND#t&Tqhjv7bLy3K*JN%B-!^_r`ChkpkmwW65c}nX z`+1l9=-*};oMcl>TbzaN665)b#!C2k{A&4QARsw#DPc(Bo&`(&nQI;FC*EA6>ZwGL z8Ci0$Xl0qaV-;UdB2S#5&ZaPMq2bLDUo3L|zog-@}-z2!j)*k0I z?&ZJRSP<*~NsZ-0V7f9RokWgdTQ#c0#SoZCoq~vLU!ia_ z4Jn$%vQQZnnNE3D;I1p~kCCx=!lut~o8aph#{l1^c+chM2Rb9ZYA?3HCbviP>8Iqr z4oZVfWK%bvjVFo?dj|lcOO8ivO3B!FhQzBZloeLHu3pxM$8nKj8dQc_wWaRDr*p|Uw6|-)z@mB`{AoZdEI8+EmhxSJfIK65pD9Zto<*jj!?_aU?}DsaG}Mi8trJU+*K z(U@`RA=<`5(De~SAvN^>f1G|0C9bS`bXd4AT z6kG(>+CRz*K!f!UH%bheib0|*#(^#myJ`gAe1ZxdwVRM$1N}Bcx#8AArn?0BI<8K8 z?}BtqR@?Nv&E~^zv-gx-nHFyJPTV&8{N%+874*#T)V`LDva{4uMbe<(!;WtOO{v5c z&MBop#?F+72q1)4_Tvpp4=vvZ$3h@2P!c84}U}*@_ z142^Cwu$@8<6Z&vk!Xp?)wkCL_R`GUJ(HvDbL0BQcy;|ktGEH`Qce2%f$2&%-JrV4 zeEE)B3bf+~NCmh6<^yM8&nk4}MygFps+F&qm_@tThU-PG2hC~*Xe8{Y8S@K`F?0W3;mdSeZ6WCT?fO8#(YwIZm6Nd^wW zQX2DQMM0~9qklez;fq|FNf+_B!9fvrYcPNPxq$~9XGUVa>F>b;2|gCCbhs#Ijs&O+ z<@OwvGi1qzACJpO&4Y~Us2d(3A7lnFQ5tagiV0lQnb9nh%_k-%Ez)SA9im!tklFYOM~iP#(h9g^sN74R)uBAwuq2hiaM9WO%Ij`Uu&PzPkh$24UlVy z<{A|si%~J<&`Uq|!`X5~w+RLom*hzn)0}ZlKEE_=y#5busD3w!!MzuGEdJs&e$5u;>|+^ zo9bNXu>&F#ClL#KUHPBL#5aU{*Gus-@)&US<=Axb;vE^~$?Z$%z~2saSEppW%!d0( zvK1AxjZUXj@!XJL3#u?j>dLP55g$1%4=m8G*^8hPgLdwm$IA$ z>MT=P<(M?a_EyEP{_qsf7K0W_{hR&QN<#~Sx^X)V5!`~+3cG)W zl)eMk?2d-;FuEfEV*51n=1I6;8YvZl*xVGwQ$&Z!Y5rA3Io^E2BHFzk_q8VGI$ved zedIpwe@%g*AWxsO1eN9v%<~~FCG!~=L8T<^J^2G0iKncwU`1zJ$M`@1Lq4P=z`s6*(Sk)EK&9kUo@!N4vMN97@d@#s1>Fg_aBBzJkP2>m z9c#y0eB+E##eeLj?3C#5HX``l58^*MZu1r(6*!rXzV$)HRYkRQbAH`wXPJ}ummRC$Uc!tVuI0%7YLGER^?sA-d$1Zv6QU;UEY0t0B_S#>ZiII|?sc`XQ85i+FQ1p*?yw&d**&731m(Q-hy>@Hejs5ymv20IAp*at9 zI?yiR1y^q#VV#g!r=|IhUAr{~k*tKjgl@7K>+w!wR!;Il+H1E->n92` z4~85!&er3axmzPw@6~^LpGSi0x9vd+bZ&L@_}P6B=Mi=a`NB_XG#dlXM`sNY3YfO4 zvi&bOS+o6tOZfqhYqgbZQa(f<+h?{i_U4W=^ac{%7Ar^Cxn5~dWd-^V93Us{hOkUVYAobi zFa$jQX>o^sfwfriWhBj^RY=CfZfQ1PAYBQ`$)E7nB3FJY>k47vm!x}#_rRJ)-4%0c zWjL^5!%|pc#!r!0&4ZkfEK6Edzs2ZSWLB-Y7{Ih1){r{nRie~7FkpQSidqZrN@9hy)SFNB5{;AxisPQz=;(M(>Lbz z?>omQuZ+mbctpJ)mF`{v%gOAj$g-&{Xv-SQ(JXTVq6aVPH>W?XW+ca8X<+k4TrPc$ z?*;91PU!Xt%UA8*WiGq9K5y#B-hcW|r7a3fM;N$|Fx;l{QAKJtyNp&hLYIbP#=eWFT{%k-5IR&PRyCbJ>%1O zu-E{xs(ac}hLzSBBw@|-;TxA#_8~~Z6AlV#*a9sOAGqxenI5pCO`&L@x<#|?U{{Xz zTC`1jqaoU3ITor7p01kc%2W3{H#6I3Z`YPoXOrG*LcVHeH#UaWuXugQRXV?HLJY=Z zr!{)BJ8(kx>JOSI-W=vp&)3#-4v_c$u^*At57`s#{#9TSgP^&Ja4^y=oP2|bS>q_I zbsORT(k*y!64%A?mRJ6wNkMn$qr5THFO~QWp<sR9B>X=+q8d8@HoT!eY^jYWd z=rlFgSAL9iKeZ@YVbCQ-iqZ1oM z9UGWO8rsIxWebw{DEu9VJj;dWTacj1+#;#pkm9QrN`klnB-kN%Jib(3%J?{D=5b+4#PV%8I+qYb(;(r}F)cOE3~srrpqMU9y9=)d=`=%ihKP<1;` zni@~*zC6q6yAX&a2~=;%`z|>o8Cgmh_rbbR>bG+E$(zOu){ASj>!WVbWmrf9fz~s8 zMJ>hFIM0@AiGPu{pldPIk7ge0C&M2Qj6#Gpc*F>`nNzkp{5*qygRUgyKG1Cmb=pa+ zNq$J=b2ymmh){>lt>62mR-Wc|MPw9JLr@ zlLreGU#A|mnLKi8d<%l!GAXNyLGX+ojFEK9=P@rU7c9O=?q31Bn(U3kU9!cg1kw!b zz0$zCnAkB@23Eii2ePLp3-&GRJ5wGIGsBcZ=G@|TeK&8h@39)E1ds8<_d!~iX{G8e zcw6_{vU_P&IVh1oKmU6ia*((Dvnhu&t9qTlhCteAns^R7u+wx;@Zk7?+s$b8vd!9p zP?b$d&Obi|8y`J})-7!UYVH?235dcIU~^ zr=>+2{&&K!ZTVa7k(y(=w*yTnBvomcI2bm|db$e5U^jw2Ccjg!RG8<4y7%P&UetHF zW}BK{>nS5Y@j=>^8ob_#VY};^rWq6G>B*4hlu94rtMH~*vGNPfZp~j-*$|ZqFn3qh z6$z=ccyd=cD*D}AP~FMrO~+iD!|o05vTu!d%fk7?)4c^10jf&v9{yu*NuoL_s2lx1 z9n$49(1RpAVOwU!`^7a-wBIY8qA$%o|H2kb^SdIS5EpLT zZ+2D)ugCr%tf`#W{>-pi;w(@%t!8)0{tM|yGQFEO_M683=IpQ*#q3Y`^^@&|7Y3-x znX5b;KB-D?aj9?UQIgv4&*!)IyBiN)ikiLux)J#IjJyP9i;jDLWF5$IxLFoyOnJE3 z=YC%hjrDdH-6Lk9?wr{_Q-F8Vmz>C7^T9j%25Yxj-lCWlt()59_nc6u5W3t%9R4iq zSqs0W6GvD3otv#|78dubwem2#rGM79WaL{$-SiOiXuJ2>WsH)rFY;oyFTD&_n00EF z@n8)sXn$7#Vr}+xlk?e^UiCS?nVugBAFQ9U3qSi0pt<|>8vS@}k;+m(Q(= ziT!mhofI!v0n<}#frpkB>|bl-Oy;Xuf6mM3ju01U7H5U~O!|YJ8pBc=avt)&?7Yc< zmQ}2r=B=nQ&AUUIsT4?DT=kApv!-CKaVwRTo|~YShSQso?Q9i-N3pCyGrzSPU3B%T z#20{ngTXN-oWnE23Rp$l+gT5*<%s#jbA(MItzQPxH8p$qW>eODHO0M65_uLtdn;o8 z{JXDu%CeyE7N~~<&!_jn!iFB_UL=?2LN=}6#^PhHr(P#U8i1=5^?}};iVv8KD01CK zXk+0~&Zq817V^V)r~U?uxHn{id8H@=D7pRQG8pn!ZIEp8Q<(u^8?vAC>2{c8LTC%2 zhc*f5UhGa?W9BCQ9EYmQoYda$Wiy)AJZ`F{bKcRGZE5ShVG~IBw9dFZfhd1|y?lsw@dRtiq`C`HK6)gG zubE)*)OP&T(VAUmD!4gs0%DMo&o2TdHQa2tb$>>$4;fQe(fb*sSzXn4H@;^{kDr)U zk%$)AT5mS>C;y2-ePhj-qw}q1gcx553iclu2;c}|HqKNf+l=`dHJBSoZ2lfdn25;& zCj){4b6Ho6=@O4McTRB{mQ*5jzJw@zR@bQXeN1X*^NJ>Mhama#Wj9%5M(o^yEYy%I zDXmm6SGxZM39u2uez){n2pwPp2^0t%afpcRYJz%Qh1X1#sY{99gAvKn)upHi^O@b` zr4rvUsB+0^$H{xtu=)0wZccmAU%Ie`)fWFwMzq$xX;t`($8x>*L!(9I(p537d% zMSVUN3#b=wbXTf#TS~(5U&+o^&=o{i3lj&i<>)uj>ZW;$fECw0dT|tpQ=Dy!Y zzs7pVMri(_G}Zp0YXE|tPzx8? z=Wdwp#2e{bGiYX+(zcBrD6~jim%067nF3|XVbkj1E(Sxj>U!qK>WB*}74miG>bZ-O znuD)9@wd$PIPFRs7#q#}zzhimM54J1p9a!#+x7WKjrCV+|^t;UK;R!{_zzF7O^3JYYTZ>vmPvrv{frZ7kOLH>hl0_S#y;tk>*VOdmlBIRM?t#R*KELPnI`Cf#J6wWqmvzU zvyeoIPp6X53qLz=U%}MxA=i(URJ|v@Rk8d;J$I_i9TDS|(wL@FIdHJx2!}M^mNA&r z!rAT!(=38 zVvyI_(_DWSMWRl&F%EGzTsEIh{@$l#%ZtN5%K5rD$O`1yjTN3cFe530$G7ARKbmbx z@MN?f-P~<^JmGQdBDclXwN$&^*f@URQyvTIL+}Md=6TzzgnKWW+s0#~3ELg1W_uZg zqbAOT)sSb`S$jS{UM8kWfRzsHJ@nS=#nQVu!75aoLo-B|VBMZtJ+eCU%_kji@lLLrr-r*^Yepxi)$g5Dz^zZK6uB;83I4TPicu zR|flzI>g$Nb%q`2<0!hwvCCAXT+@t3wINHFPN!Bjeez~ii_wir5PZadWpx>Hl?bJL zZ0643&52n?thUvwlgnVKo!nV8Br7s)oXK-Phng~D3rwp)QxQN5P~vV}WFr>JX+P(( z^7MOs?JPRU-`0_HBQ=LMyDj;$mRbG)>A&^LqhUdn<&X@9-)GZ3q|v@R^Qk8yl;K&r zCjJQ0aFMGDIwvFz9q#)Q9PE!og`mv_sP?e;`N-&{Uf0m3JBMoShT_-Iqih&2|3(ZZ za*I?Y;tSYYFADbmcCJP}X^9H`Y!oaX3_2)N8NX@5NjvDmI&GHB5Wa;^%nYxV6fx)( z@#a*?M19jJ;}>^Dj05+?IG)w=HpBf=drDhnm#TxvlIq)DY6dr?R%7S<@?{5qgSD6a z`_WvXdjfRc1ar@&I+o=t&nZ`=dQ8W{EY1qh0M8v2$o)ycfn+VlsR`*C^n)X6Q5b`F z7u7MqKx<#*9csx^26K-l@tEC0$Mmb!s;Xw~+NJpX^8G!(e}Dfb_qjKDKhM4A z-1j->^}0);ak=HF`!i(p_h;i32wnGdnr}D5SY7np=a*t5#R~nx=Ipvgpr{o5WLwxA z80T6#AUjS>*pkr^Y6Qdo$fvYI_13DIMpn3$r&@q2M0>z;C5We7&X%99_```Xf+y=f zxv*GNIBJB<+gPCCXl0)PehAq z+d`1J$ImiR$dxmL!?uI35F0RYW1l4(z%YM{ZYSG~dHlvAgO7w#j{C>)emT^1_*3AM` zvrb$TA$`B^T7OgI*;H{v>s4__q(@cuG+8#JdSZfp(?SKsJRODSEzXrrS{ybW*6t@@L^Fp$uAuj=w*FR?1rR? z2(fM~C5c9j?4<7BO16SVb11!7R>HshzQ^Ix#6ry-u?O#O#HD^&`Ku>ao9m-mR`iKw zil?*w`+W`F+xgsoE7{+l-^KSv6@ytN1TsBl6WQ*mzyI-fTDj;ovhcCrrl~e#%vtGB z&!x15fluyjMyBrVZ>beV^&?#q=lg^`I-b(dNQIJ{DnP-_G5?UscQnvJ(%f z_oR_c9Uh;COHMIYo-K%iw$EP|!1;yHG(~P$D*E{jdk#}(s@ZW3GnYne->-xXVnq~{ zzm~RcFgSIrY?CchRFLn3kZZK!xTke2d2Zq#*^JJ*WG^=NpmZO~$bs61_sqTHA0E)Ghk~bKd>`jh1;|z~!x8PyO`OIUA-H|M;)D+xzQB91q*HYF}+w zK0c7Rd>JFD7X6a#^^tqU{|&g0YO3e2=Wa^KEWiI?^zbBauV^g%z=~(feU0E!V(zgf z;q-XAxI(hiiSbq?)QTg_-icQaboFG^pwrvL&P~5+B>v=iyF1=s#o)0;)7@~g`pqz( z4Q0mEAshbJI2V3M7}m0;Na%x1m&;)xaLdTNpkFD`+-mB|&vw;%q%@rb*is>$Qru4{suODuA-2xR#*yFq>MvC8Ib8u4<@V=+D|L&!_ek)p0~)TkC#&g#S5+R?cDu$<_1Dc z)hwj!OOOxf&h+SH8@;y(p(V(t((T0=CyY=Oo2P|d*wOFWF6t2oqM z%mTymB>oX!hFPb*0CtxTpAu%z4S({{PyHfOt}LNX zCP0^%yoN_-SS9ME1Tj_Ad()2cj;D$Ed{Mu1d=^+!FFS74>Zd4KH@<%!(_}EhlNJ2n zz($@-|Mdi$Sa75ytiD9T9)^vL|BU4O8dF!b$CWa@(e7Z}x7a0O^Jw8Ncirf|=1oI! z0}r$_8-b%7euB0BS3UTrhN7ZpljYhniJ5Ob#^NevrR8=c4PEy5<$-4b{>`0D5GAkO z&MwvbN94-!=iv0X-?M%Xo>u!{5gV-i3DZThPuVJy9COCKtoj`!P3&rJ{ED-|br9}? zmfxT26n*vVWg^v0*2H`hl#i<)YuLc+O;?LJ(1k4X1e&UC%XBJ7BL_o@8nlb?KP;2B z>omra)|JdE@m8lQ>cx&qaf?EmGQkLT9tFjEXqgu0m(s`r9#$&Lr#%QFwW#4A$S9cZ z4R-0@R?Y&B+r`oVi>~Nw|7lSSJLy+_rGs09I)^^TYi+$x$@V~2eE7R+A)HMPgkFa7{4J&NmzbD_&)<}<3V-Y? zWH##H$bnG#cB|r1nG*+w?@W%U6Mm!mGwnAygz6}Z;mEX?rZt~`qw#Z?IB<+E@Y`Ls zy%*0YJ5@C_gl{>}2iFo7zua<5>L23%4OXFVmGbCaRoK8fJ||IOX1{r`3?SY7_WwM8`u&NzdjpU0JISpMG5uEpzz&d`eX99UH5yqmdaZkIKV*%l) ze(1^?TugpX2Pi_;8#85Dt@$WKfLD^i3~717UO$r1E445=eS`_Yva=A=tzOd7Q06N* zLU=rU1EQ5eEaGWoD5MuydxrXvVoUXX_=-S5kd+gkjN?bZbY?sWe5c!;x0WSOy+36c zL*X}{57B7zBUVx=GhuTkh=Qa!O{Ub4NSu5IER{o|IBO!l%Ci9^*eS8QZCwVcKCT@i za~6A?CIYy&lzK2Hb#5P}P1~rW&2STm{Ccyh43-0RUQ*oYw_rYm^9555+sz|iqG3w+0w-A_ncF=s%lN01lhvZyZWcT z=m9aDL$-5Z8Us5Ji&7S(!n0Pdh>i{ksxT`>Saxddyvj;ys+Tll6!yNi-@(s@kudQ>C1y)`A_rkv_HlInWwg!{ z+i_)59XEK{EbUYJ0{w}X{SS>V0X#|o%~4BK`p=+$KR*$OCZ?gbxEt;|^i+qb>uN2l zMH0d=vB&KGX2eoi#LHN(Qk58sexXo(bg??4hX;$s(+A%|Xa|gaNW%&cgQva&h7{hI znW9q1sym%vJ}c$8l;8*CEc*j~<^>-r;0>jq4Dqxg#ii-L0{0wmiFK#u%Duex{@}HB zk9j22>i1U`??+-_Xt5Zf1rm6B{6+%%xeNDQ1{1sL2fL?fYq>my)A^%cthZzGW{*;l z_;0eBXrBHfvZY2@(@faAn>&r`*$+;m%U>C$Hb~7QzX&I0VS*o?=sOpSw*^p;${CuQ zf352X)(3UHpPHaa2in#YwNqyiFwd7;0s1{14*&d2)!JS0zkZ}P<1Ro2YF<-iO^-fF z-&u(LzNJySzYJ3n5>;!!HCijnmW{HGsC^9bi!(d6YY=VLMz0c7WHifpi^MOsbXakYOVul>9{^B*9`hwS>G(eY}_scdN4H1XXX>^{Q}%SZT8 z^UO~nFOoD1lTHCNqwp_bQ*1Sw&*k`Yt){qK%@G?{J67qxx~#1!^~|o1SnSjwG*-drZf;Fai6HHdEf&wDT=AZaupVkjBMMhB|WA ze`6?gBeeRuuCAw;hre?El(Vc5$kS?@n$sfLi3#`25vTrrtg52yee=lRi34Y{3kkREpPVb1~JVy`_!zt@;feI90_O?ta<^&6?i~;VRlQpy=9_e!;oIF z407(QSg>6o)(PSp#WS9hXG!m=%SVr3y|K{yG6!vvRS;!14v7_e|F*T(-zU6IEt2tj zrO!&rlyBmQxSwTp?LOxHfy3_jOGa2GiN;<9~p@d^NV@?{!R9qB(=`b;2>fk=UFRNSmA>FW;k(s9EPl zHAbhkw7ZS#X@jSm+V%YhP?<@a>y2E?tJ46q$V8GR^}5u`h6uCq0!f);9x5kzbB{o$4Es!76F;14ji(*= zY~CpJ3?KRxOUce(y~=53Oqke{#XU5!lg0-4v_!8+V;Q>cIGDRdEl3-w7bz^KC{Ntv zAmSWSj+aq!DP|5RP~jxi9&DA!>3CP9S_K=_k@q}%K$W_ZB)x}6ug0zW{RfaJIg;a2 z=4sSFfx92#|4hppI6h4lI`l*Q?}H}%G+?2)vs|cA*1)JAv|vt;l41avVP&zD@RUKw zQ)v2PAzBkp$tXRUsSCK6+$6YRXz5z=ARQ;=5Wowd0VdQUUR89^4&Wx$v8k)h8N^Y} zzKNiW(v=FT!UPcgH2Oiit5a@#epBluqoN9M+RB4nM}!<)yOg}%>46U_06+yPm=FMD zubMi`NiE!{7A8J0-McLM2>#0^J5KtDZvnvcfIP74WCXb|2=&7OMcZeFb>T9HC zXN8+*Mq%Ya11*L!Ar?&ZJJZW#4paO9uNW;SCkry4AmL;}v4;>Pd2yb~Bs;mrN-L17 zIdn4535AKSD$XL_O4YyTt}s-(O7F{{md%uqhS)Yuvr)NRJh9g541xK4;%x57!YGVd zwux5q5$7A6rLR6bap4+^9dW?y+Xi|I* zAj$ot+H$16BaCHsa;=k$o5pWTy*I8EGz?$Q9iwkVZV0(2S!V^xFS=l`?Ee97azEi5 z>i8_aM2}Gag*0W8d_-gN5GEI39-y1`OP}l~O^9=;^dJ{^v%4U$qqg1S;PySEE_CJ? z+9=7`$vs(yGN`64D%{|k%mW?Ie1B<@*t79I(ealI6{rw>KGmd>sT-BH5hxa7l^c+l zKqH;{7WHtR^+~>YuKSUlG4;QX$qvzB%@l?QW2lszLnPFDT&t+|3Qzynwwuq#gfdai zQGa1CO08vQJ^L~*S7r>Ws^4Afx6P^Z`f9I~UUL8#9VvE^%N90*yN#oB`Mg3$b9>o$ zmEo7J;+0s|qS|D-N#;{{eESgKa=1L3zov*ymRPi=_`5!mW<~gKyrMJzWN*s%ivIv) z_a}pXTBj$Pfg=Af51zp9v+i>K4xx_i&6(@oCYB0xj)S+q;o{1i-(@L)o|`H(rbp50 zl?r4Uly<@7b@fIK*eM23pUilfX)>S7pO8B+QbI5qmtswVIotX88kP&!2Qg#sTg;E(zJ3Hg*o}?sX3Li@s(Lk?0cTPnX}dW^v5j4+r!+ zNwm}lfe%UM^!>|iVvwiF^RV(kBjqD*zn~94Y}S(VR@#wOcVDiBCE&YHgkS5_sM^v5 z&cy`_VH19dHbxh_n>7qKo)i?M1wM7S(yw2(ZIbib8B&}#nJE;|ycBo~;mgiYyzVkT z>(oqp`w!cwgHm#7HTBVE+JE>^Cd);WkWK|#&)??*xxnNZ%`0pzM#c89yMPWhS=nz>;Ui%+_ z)pzP|>NDDp0s5S-mOUgjS+uRy>#Ss=0JVmRXWlK9TYQKYeC3Z#UK4jJp%vj-UZaNQ zMQ_&dq#z`%J5unN3xIDl=g#t~X}d6MdkKcokC0o=ma~`jt?|#1zK1wRG451()ky1# zaJuvb&iN`_Evf9CkSpd z{Eav2l``u7MW?z2sV5mRyzDymc4NSJjz+(J_`Q*zh<4HpwMc*w2Yz%W6D~B}=sNa@ zqjua+_G**;T8`2Kp6L550F<$i;ZeB(af{Y&2&KdngziPg=LKLANW2V}gOcT$ao5d_yp zsR4Zk2(;!ggvyj~Mj(M+Q1JMDQ}Rh^6M#SAKR^hEYaf9|qDh@$d}O$1)@P(MNdWXx zj$1gjHKLQ;lISXPAp^pyF!lclAOMBtOV0^CKSo9IARyE%rKR&ybfuLKpspn4F{+$$ z3@`<-Iht=^t!j(sb@+ z{Oa7a9-^CaD-8{65+}ww$)KAipa+IDVC0K+xdDah8Ec8?Aa0nD)#r-W9q`NO_bHyQ z`KlF%s=(kVJy8d9LiE6A?e%$wOo`ljGhubl5J$pV z8f8

#b>#>sNI=eNQ_{mX=ZILisAuv_C2(^up?vzkt{Qdl)gK4Ej<3%dzQ9l_YTiV9u(-y7?ReyvzHqbKHYve_?E22*ZsNdS^> z7JDwecnbJHsWf$0U;J~{qg<8ZY}$(D`THr07_$y9gcVT6U9I@|?=79%8Nx(kbs7vJ zHl~{IV!0}5P^=yI9&6&Ld8;{>J~jP&myB~9$tfK(EC+jjqfHX=zxG>XiIQu~(7r{0 zd|D#eEJ9IXiKg1CQ6E}!< zvmmW2!`qPQCpzDSmt<2;+-wU!5&J|Xu82DKie{JVU$znF2fo(gg^K-#DJwhMux>J0 z17L;vCnEV(l=lX}>UI-3n}&w}dw>qbAGUF0_l)a{kGJ+76CSfFyBrNEvA0 zjC0D8+t8US(R_F_hTr-YD&z3|WLi;Kfyj@>%s$UAgcUk#uhe}Cn}}BD&+#B4MQ0WI zjIGWpamH_UBIbFQR9hy+g&}B!HZ~8{!O_O^zt_Qo5Y)`AqVIF zT>1KUlnehYmr5GAW|(}0Cq0ztN;T;`IBAY%>Jgm84R#)^HdcKGU1#_1pRFfPB`peg z{dPa_Kd#pZ3pX+?vG2-GaT8R_&N1RwycFdhGpSKt_$=}>Jtf>o*S5GaA4iRk`@SHH zH2JKLLkXmj38!Tm=+9svyg6w&C9{EfO3>vL(~*U&0S=&8K@iS_V`OmvxH~Zy4&Z(J z6M4EVME$Gi7S(D`$;^8bLDYKJFy)V%2<-t02&uLk-(DSs99IZqHTWw_kZ2IVM0*IIWI=x0EJfNxr9l?#58x*u zHv*lr{(aS8O4lQ1U2SQJk`YW{mz-3+G20rx=_O;S#AsCywPPxiUloF>4IKMAfV&Xq zqC#_XvROf_@#SRj?qVTAAS(7Q;OjT`edC_N4m{<`OwwA-Cr+w);MHIK^a#)G;mfUnEhJp)YaC^6xCqNF*XbiGoDa~hbK1#C-; za4tFA9a6b4m9DSej+QkmK)p^4|xdMqOrM zu83Lw;28wA68WrAQd&d_RH_{1Ml7i1Y zUFCYL=geR=)bG&Qd{i=O!xwooBzEaAk9}-OX{s{bP3^ny(WGDnC4}}?ik5A$jXJTm zqmy>$Jq&8z1391w^k#s|RZq%ER0?QE4M9^-nM0}5%2V=(>u$ifLCwYbVP*a*waNtOGznPJkEpq4S(qID5Dvdo3W) z_sgdom#MBElW&4JLv2cTgL%? zm0IAB4si3q{lgzdk_MxK?*G1cbS5>0r|$$ll%I4Q-=7qGtypjHDv_-&oo#*aO!L(p z;Y?hhOpe$ym-f!TiN5EIpEORK#f4V}I0+kxtg@St5ZCdeaM+3_J}lMMiHYHvYt$G)DOb`%jqJE6Zzj1K=>nHDlZHnww0 znkcNj;8YO6Fs9}%79{zZ2(cWOVHlaY1RLn}yH#td6gbK=aR9@>O+%7Yc&NMqKoU0X zE+?7lRgeQzJqFmaXeR(7!r#cluw{3fMLxT6svaZjG^)hAONJdM`6D@Hnq^-;XJm5E^u0@h!)!8 zD%V|}AF!%L3{(N{Qd7<|SrkFqv3!Pg2Zvm4PEPQp||v;vG6ZRsx&m0HHP+G6V1{J*#SW0P8#aefq zI~_^%Rjbhd{H5>qP;_kVchKkq`dAGu=@cCWt#rJv4E6E;{q_k$!sD!VAz-Q*F2sSF zN~6H`xnP&{;K)z@K~LLHP9*Sk%5hwy>RLK`+UiR6D5ZOL+*o)=ffG=S|sTOD1cjBUf|%hGZo*7XU2*-MRZiOs#vhSi;?Xc zPbYuh@kBjM3+3~nYOdR|ldV?mSn3|%znQJZJEhSAjI)DCi5mUi_HV*R%>Ft}To4z& ze`lrFkjVh6tiN%}p3#-0a{69@QfVXZfSd+jg^X6_>;Jf49HLNFb6%4VUqX0ZoQC17 zT?bWbT7WpM&)fZ)0rY;F>-p>Cv(U`VQ4{Wlg%OoHl)V~O$7s+Q++*>uZs~iB{0ls( zNjegFG#hreZh`EjdH&u&7fWx*hCJL znOF%P*B?rGUX_08YnRhCi+2oVx%}N0D^kM&nTRl_9zYG`=`dx!d<$Kwx_R@B0AETY z;FPd3g(I=oeh0lxTCU1+nrU!A4Z2=#<_k_(3|DfFSkBEAHdk7HQG18}lNqYAu8NAg^(cAqI7KUVETArLKsknIG$DR zbEEF2OvS0VB{}E6KgBn}DF#;-qczs^$3whfw82hoX-)9SKC|@sC@v9BI4c-#}d6J%N?ntk-`=}B^ z^T$B?!^NC*#-y(L!IJn-e-Z;|nO-9+_0bWr%%0Q2F25@FxROyR1?*(v5(n?gEcCO5 zKWAdf;o$Z-9fzzG7k}ugdH)nJl}yX$y|kRR(V+5YaAFeCuTQwQoK$FDxW`d0bTl#J z)kHP!Nv~`+xv5DRCyl485+vDX+51fW&ds8&OOq*;i?gx_VIPskp%Vk_$M}sdFj@70 zZwQSJU{GY!Nb$!wWl{PhH>@&^8vBrfLsi*aUU>q*P(@4`+&kLV;q4zL0DS_8p@9`5 zq{%S^`W?;@8UdLsMjNX{Ko-o&^3R)C=2Qa|levYkh)a;lMyigv7iNld# zf{Yrf9;%e0WYR{%^EwJ8A*gZaY5;*O#ZOc9-PfK=j{!yDJX-MjcnE`wF<;<%%vnSh z2K-~CdRv2iHN+wqdRpbacHKfPHQpsjxrmb8oFXR225Z@?`VFXM<$W3wAA~TNX#%}9 z_lc>$216X#Mdp*7Qak`>6#$%uu#)+Nt{w#AlCD7`rIyu#VJZpnIqv5t8CFS9L%xcB z0N*jZW7imZgp&%uQNkGt();iHA#NO241OL&0u0UeM7MFK>UP>J9Hih1rI8*G9k3BR z#Df9knMq%Fb=5lYv=d}0%So>5Np2WX_Oc{O2d0^vEM7Z6La!28&la7ov*j2W>l4-A zd@^aenx!Pn6c(Lfo04}@W9YeM+*9(%F0EVo@K9BZZ85o>WWb|in1%moq!LWG z`tgHs%wBcV@%#|NCzi)>%K*o;xT=(1bN9n{yp=MSND1FCCjRz{{LEJ(LLx`(U zwyJIcw3b>Rk{veJiYSbZiRU}Gx8PNEW> zlCPTGOcnh*cvxq)Z-j4K3US8MBu2j)tX5cVWCV$A`R&>c<30r!Lc}aUXZ_alLx*cW zL9|hYZZSTW-hjqXzl%vWK{z3%`!`BYbMaRihVP-~67IfGapMu{(nK`Q)?gEUgl;;(mzp(WSrG59HG95dgvs#_UU89+H44$ zKpiuc%6f{+-NbMPt5yj^G%JV76Ud`tl>Bf|VpnoqD%+#c ziCFMAT&d)%NM-JCv}DK2H5p(}vO$F!uhHquAJ`+rZf@YS8adtxi!412vc2wR}ttQ*x7FGCRxER@GcstO) zthW=Uu%6rvt6eR52$R)tDB=5O?tT7tO7Ti`yn@VEYo$VZEQp{8=|vM05}T6y;hFP= zpKwkJ+tvuEg+4*#PX!)ONOX(QBhHQ)0(r2u~gaz|Flxm<_Y~N+{mUki`y9W8s#BGsV@m>@jlxx^z^^s(aV78yoT?25VT~eR5JghCCV&b5Ubq!Q7ki`^>sV`e>G_F8J|ag~9;|*9@Q0^Cf=`H_ zp2#aRq%N1LM~~bsT9pIMeub+Q%{5QmI8NE`koQkTy7>RqAsi9kyDKvnCYuIA%@8ie zJ9ApmH*ApzlOy_s<4#09_;bFGZ>jF?wZJKj_$#24cbi- z>J<$PBn6^M47s0vRQpUWPiJ|_LsFQ@S!sZ;1d2d*EYK-k9%M>)p{BCK6@v58ipv;| zQNRigJ>Qw+ZxRN<|mJ4<5MGC*B=A;2Aqf*vWJ*5v%mZM%?+H!ku& zK&%wHkVw`|HW+C~J=g{J-!#U1fW>une>Sl1z(OQLX#fEASPlY+M{`tCYIfXCn>&3T zL%B#Nspb$s0CS51RF>#b=zRl(f+r9;ABqK#uJ{uN056_Z(e7=hd9d#fomPO? z@IY{(IT>k*D0BHp1S7x_0w0TxgHEdI-1+T6&e1SNv?AmA;aN~ln;}KvNt6+K8OL$` z9A@upXV{aL)_r7g>oYn%-QvN0gO2x4I>XUJPZn0&+2f(NRNBoQ-*NA53E^2l%)C0 z?VJD0Y8;@}{gJeAI_jYRXc!pCzKN|p?aV~0GMJ6tr_x$d94xI4ka$3AbM6a0m?yM# zK2OJhYS=eNtu1MnYWPwXTSb4eFb+wXa5w2!yq=u;;FiQ_%TgT7%48W%yhCEmlBOZ? zN9p6N3V>H5x(uE#ZQm^}Z>Ci5si_4^Kw)N2WeeL* zwv+yx)d!2&6ww?ZTC)-rVws|sp_Il@Kd3s>adka=z~C7RrBNZ%_%Cw@WI)!kKa#H`O8K3p%YY)3;U`h)s=>0 z;n*0)-RD)EOT2DP!g*i4TsVF5krl;O8~9T%eO5~3u)d%qA;eYVTys^ha+;6x&;`Z~ zxR`hxX=nU&=K)c9yCmUAO{c37Tqji@TEe;YriN@9{7+EisL}Qv4>e&i#I0h)P%*zr zzCBV=*r1a>WNFFjW>HaMphU?&bo%MsfDyl1HZ3$?F*5fR(#gk$VvEs;ziQ;BkW5s+ z)ChpIe_+m{2a~`)Qq>W@^r4VdT*etmbsTOS;5!u+D|zhF(n~zqAEXYe9_dDSx#gz? zS8hPBTd0B+FU(nvEcDOc64{OkH+k&Whw-?CR(?-KjRH7}>Hgpf5=yx}%3rBYT4{^0 zuZTw~>$##146Se+^{CWFgN#(mw(+cyWVaHI`VB|a+o%#`1OT7Stytk(FAJJrEN)p|dS00ee}Ekd7(va# zWQ^F=1M;=@fEE0n^1ORro73(m53BxOFNRoP$kS|JqEtoajw~1a3H{>nqTQH74;rvt zMkbsVK%RP54L4_Bn5=M9 znd>t}VWlmCpHmI*YTnZboBE^X==mTIFDc5=zI6O^g^r&A)uWCPxv)X3azKwhvs`34 zyo#3`C|VZhDtq_I-1Sv;&(LLZV8-0s;ye8+W4!cuCamX?W9Up;hS@ur3~xIQhKvPl z(x2G|*z=di(C^X!cQMWJZ7ZI!b+tCqT=g%~E^oZG>OkqOiFzBA3k#~6%LxDeL7W5q`wokCg$zkf29 zQ3d*XA7E984=ZeMpciENQ}Mo8w`MCYEnT2iKX;O~QR*(ayqeeWUj$E)YlqdrU#45y zok(Wc4t9l6F!$DffK$mbdv#Y|lgUd|-@U1X^*M~6TOE%3Q*!V`KvlQMG^MAIIg>;q_?hjRp^HuqE)NOU(7ee*jMOgq)1} z%6AO9FZG~&zOTb~=<@)KUfkxI>B=zasvz~Or!tjc%U#I6X7Ev-`RVJuM?y(o%u>*c zE#vVg(ldiXyDFDvC9QZnwabL6@5=eYnIi zbJ^6>0guzBJ!rFZ2Y&TAYkk<=>Xdvv*@RARb((Dsm}E z+ym~mVM_(dahS(qNnM+Z`{-$QUH^% z-#CRdQ+AQG^h+#PK^2@r+9kWn&dNThP((cGkUt0g%7V}AX0Ce@Hm-%`uR8(h*uYbX z*X&C5ieL`gVcxOSCrtn3UD9KDjtS@}d*0ccj^SzN!D?+{-tz)E-b2=;{{Y`*ui;(w z+H-G&LY8y?8Y?vT5o{?yTc3wkm{>H3UN`qW!+7#iajLZpZeK9rCXipnKein=l{~!t z<$Jip8b8K@jV7%SN=dO8kh64*UaJmi)k?-vfM~nVRVW?(yN3tgKX05{^v7k{2wXdd zmy=LX=BEj&1=5%b=*-92<0AaachL-wvRosw}(S`W(dA?OQ&1AB%uf^|4 z`vd=Gn%ch(3fmXb|J}YYr)oiu{VOA-xukQM?J}Oz)?Y-l_&3D9)Dc6z%oY4eiDS{5 zC)^qy8Xg`{{m{}?wgas+RyL2iu94Gk*xcz@r? zkUi4xx$?Nn8L<=TzNQCc<{kLoxr*JqWj;h_vNxEat0>1$BPTah!cpdjeL^=tOT6y~ zzg>!+7Hh5Qn)WM4P0f^iza0a-%4g(0{8Ta$74D@EG;SXVWtnVOs2KYP7LZksZxH2H zwyx=llBugAW#FNq$Ar6IDb#b(vd2 zg@ey%9qD~q^8?YhYrmHWf&pkNw(kP^f^utP2qD^|O-*MA)6jOmwIc%H4YC|cx%s{I zd0tLwi706k$QY3?v=|!~?kS3aB4s>h#RYaOqQR`R9nrGye1lF{Wrw0=k|LalH3P1R zL*5WhujZPtonh{Noz@$_6V`8kv-b4zx>i7Urd}l z7FJpnU==+F1uWNhXS^^U6blJ|BJr!R=3F+aM+DdP)Ym0Jh~OhVSt0z6{>}s4p9@qK zJ-U1cCED1mM@m}NmSo=o+lh4sHGKl_z2Ze;6_@KuBUs0Q>Bm)1<>;RpXYR@$&F2Jg zVOF*+OZ@}S87aZho(Ub=-WH19-Ime@GKPdwAoqZ{+zqhY=)Quy*#$0oSuQY{RqBVn zs<@<0CtasLe@aL|RpOnq=q8plCI3-qo7kB`@+UO0p!l3H&QUJX8m@l?8XEi<5-il- zU}ODT>_PYQ8jqG^2+nZw#=i+J5pK1XPF?lltLjmyPVOy%{{VMt@HaU2b^j>HJqrG@ ztLasE4WanVH3)geyI6Y;-zn+M)b12y^prsnaMU7Q)IdjlDAw&zRAGDDP=Q;N#pUH> zpjmnwrW4XFi_;3cqxtoq%y}VIN*nX%GGcqfK<$s*_*ZXVh4I< zQnFLFbeDZ;LQ09qy`IEPdeza`H|Q{b3ha_(wEPXER*e<;5|MSNyFlYa;xdv26t5?j zcS&^;hSibet0khF2#4pDj$dP@k|u7FYG4Z{Gr5kt8b}*5z%8_qn5U_fsCr2DptD3} z(HmA_0HOaTy``)->@Rs1sr?Ne$6n5d*7Z;i+}7xW`{QYk%S+cW+=ff?Fh4{vft<+e zNqydAq%t8rl~p{oB&$Jv3I7>phE<@$YA9t^A?=U=3i}q{6gq2-`>(4_h_AleefitV zbW*=Mjl~AORZ3QJ&5$A-&A$pZ`)Er4M9{b`UHWaSC2J#0B%J=Qa>G4&R7>{Ce3=wU zUvr-#72sAZ@#DKPTI=n?Q;{Z1lHv(o!!33($NYXe_KnUKtdjt3$R`)^PBgD5Ow!dA zHxxqs7L_coq=OlC#SbM&G=MAwdGH4hXeE&;is}_kw+Tad9zVN3(wl_`GmZP1=9~@} zTsiHsWf&o+l*0c2$j+;ZAWG06ujYO04e<b>RHvmaD>Gm}L_{2RsUYW z*fVCq;8tqBPUWrKzO}n_g92$=HU+-kynF$wU1DvBrKRP(N1!ys76atm)Zu?W-WK1P z3I2&iO*Kx(%`HF=smHlHYs>k4m9g}c#9$%6bBi@i-$~EADzTkD%E_N11oEDFBcxx( zi&USduHkBZEGa-uV-Z>85zYhv)%GSXtXeTKd3T)3JuFt0Ix_F zQ+NU@o?ca(v-fX&WVciLX7Z6uBi2gbTodc1e}9FKXCw{N=m;2nkadq4r@{|GBdt1f@|CJ?u8M5b#mH5%)hKz44j zDCfPS2P`rCsSu*Pg#evGx_{X+;**YW=vj_tM9&I07;W5xw#3v*Pqu=hx+6l(p-rS~AE37<~g8niAcOF+cCM`WznKWh)iYaufmQ+#nzfCQKK7p+HSTc404mXlw zO1lYcGy(uViL;~>lXCdWJz8UM*z-X*{ zW6qXo>96W6Yicj1FapofU<|4kWw%F;I6aqPqI7#D3WNF5Ov9O+F$%aH6JpxJ3$Wtw zOSM8_^4QUawu@97wNN0#$_oVFgbQYD=Vg6MO9NO13$g-j;=@A!`?YWDJ+(M;$OQ?7q(6aX z!#H!Os@pBA)MGi4?xEY#&?4WFF+AY_;TR=Q1qJTO~mhWEu%HqfW z=30hH-s@Llx)KaRz6Cb#>(!@=k)k)vcf~}7{Zb%`oO%hx$uw-t5lI_WL+s9)ED_|H zp`YJ%4ShO!_l&6#MM!#MjF{Wl=Dka%yCk5W);^bX`+8|l!fMcYLKm+#UGt5!J+s$s zdlF3$hxRM6RzWByo)*xnReIJ1v;WvHx#bH%?-DO3-Tg=yp6AQt6GykDC3bc4x>`&V z<(w+>1K(M(c=T!FEaKfLuRK`+N|Q+~+0i(H=wJNoSBrn>pQEf_7w*UUCTmjT;`>QQ=DL}Hy_n`1aybsT%VCQf#-kvwn;>f2tT`Oy<_MW2ovIoLF z(X>#XUKAn?H>|=rFqf+$e<1VLgq|i9MFn*n`Q(Q+DzqJ&EMdK05<%xyrsJ>_$o4Ke zJ6|R;errF^N2U8UXv~b6G?nVXijz#rp}Dl5m)xtEsc35FF+Z2y`u(9$;T*x}D&({4 z71b4O2&+}VmG|@eFn3oVP-*{JbKZtR{fc2TuM4Q*+(YDgXFhB_Gw%|QAr)gp&u@!P zdNvN}otR$4EQ993-PzuRPOF#kBk?f0&Sajt%=!~EPb`4J0`=EomfUZOPGad^mK*Sd zxVmS1U?u1-F|&+6%XU)64?7Pgc0QyAY)a~e6k=KQO@?wIn~Q{AK$yx~=H38=Vb1m0 z6Qt7t3E?ZLbSR1kb(I3_Xo_N$nE**rm9frbJCz0j83+jNXBYiYxzJ8emi%MPJ~e9| zzb?Ytz(_FYwSH|_pFq3@Iw)aKRNDL+c&#!aPE<|5tTlGf&doYv>bM4u8DoS%SjyZF6wnq z^+hksyo~2Z_C6rB)6ANsj_b)-%(J8>yLpuw0$lM0<3%~K?|9?gJ0#@I*Bmo(LwUm+ z0*Jc)YDe4S_weCJ>O7$<_Qd{Oq`%zYFU}azt7HbP@2iqF2BT5AegcTJeVUXQ*U<*2 zfSkKVJ9hg;heoB5@@p>XH~L@RcxcMia;2j5^ll)-D#XovXIWAY`apYme?S_-mwsi=ee+k1THM*F*oUn!1g;DEQ?rQO}J`~^Ze z`%WKwMR?j){osmKs_m~UTrCdxFtDv7WC8F5l|ue&h+IwD5&84Bi;^etxUoj408CiB z`}5A5H!E@rg%$4Kh`z}0)2IW+&ZUgaO4GwbF;izVs#Gas5l0K; zE2V6#=nF11Bl+I`12CdXR}D8AyOu^`kg?j3B_Z}rQT(8$wZF*_ugDn9hWnS>`GaZN zli@GIc#lum^@TXt{_gMR;9XE+Aqu9q;pfX68J&NA>^jB{74(5*AcSKXJETBJGWGUB=S9*oQvm=^oWIPjzoal-lVsGBzEDpWh>wJ&&|Zh+A2X1I zj!BwhSjI?rCL$v3Wanhan_hLEEWM)Bx8=~4M~nYB+X?SNwM&2+gfkb@`z>Z)pbxfs zWxKeMXPS}+nU)C9gtd1J6qT2jbl~Cb++M5WPv#v3g)1fl29(l zrgab$qEXG`BzyH6DqCGbUc9NP<%(9DOA_!lWX;^rv>jvb;XA{^-&cVBXGid3#z4y< zsJ(EP^9CS4_YIgf!p%!~A)GaaF{Hc08$NCL&@b%2F@}qDtsrbh+Q= zlNKX6nrhd5A97z>1$6Z;n-m16rfUB+Tr)(}P)cIFlRgG8r?MK&#)t}G;!b^o+3RxK z$R++H(HsZCP%VBd2$RhW-qZ4n;rkfIJ_<=GV=#x9Y5G72`g;x=31rg$X%gZ0hc~Yg z2N?V`2XF5TJNoA8vv|eHGy!dHv;+X)}%}dj}csWCzoGpOZd8$;O`S- z0gxcl*)Q~o>PovPWLp?9pvt7~C^_%^=dy$!UK`yaIEV-1$Bn6lYxP<0z%if>(AJhJ zRWDo^9j5H%i$By6Pn+3mZU_M zV1{pad)?YcIoOB#1rY-w_Ib7b0YwRDCe>Nh87ivaw+koL&jguysz3c>q^q8xKZs|F zB@&1fyog9Zm?Q!7<$4eke;T2=&r`vS;Xm~G4uw~Rl9|bN2}~^=(lwy#d{~1E*IW-x z807b3efZ~Gh7#UD;KiBAEvR(Savu9k6PV-f&OF^PG^N*Uh3ygdm8!n;jx7miD&Z0gT+ui#@b9et0BsX07u=!J=R^(?@%rV^ zXPvgE{HCfRG#fACuhL+CjxN}FM(fkBbe^E?o%4)K)K$ryDZc!==NYQ~(S6hyX!Eg} zy;PXhw=aTX5=K_bdDRl{1dN}31Wk!<5{3xvcV6P#9QFz$BR7raA7{PQvM<(nE+{J_ z@I!~YT?8DXX+)jHe-S!FrV^bBwlE|5dj}ZNmFrKCH_`pFY)>!j5tnufCaySk&G^FZ z(T!K89Rb_{CR*xyH5sI;0pWus_ZMuY8gyX`vSO+>s5&zTi|I7uVjH zmbWG!8JsAoY5%OB(kdt3;n2S0O)mAbYchbGv2I%S%v%sbfEhDXF$+l zfj-_R%5-JZ4B92_Gba{B60}4N)Q!{i%UgHNPrc4LPqB(!Q z^1{@rBo9w6332qDb?jx{zWcwwnmniLFe)rT$=tO!_Jd-?aW`bUdi;xDIlgSFyeI!* zTEoVW9MbuEp{bI7_eZdevBQRk8vK%Zc0gk zex=4Ly1x6Ixfu6J>OdLx&RVar;-%!*~p&Ci|rp}43E9r=T0As)6sPiRa+r=wf zp4M=LC7Y-GkRGWu&(p{|TdwAIsiKZdYIHdqftFuf{;6Q9gjKFA8V!d*7{*Z$1D8XODik=%zM zSaH91SYI^W%25T6YnmF(PA|OXH@)Ci__tPisqus7XKo$qHo03BH7^w2Ay^Yeizek% zCY0qD*B7diT!cVS|?t*<1)m{uP6iMTaT!=c;$Za;(VckyI-%jv#c% zqXk!{7$A$?kStUuH&075l8_c7KL}2u-DaR*{`8vu_hx3pr?Z}t$_P?1RR@#C`0`?E zES1|(c`@o-NUsizQq^4uhaQK{wNw?B5U-)rqfFS8;WmzV`60v)KqDNQBoKl92tw?# zQdMhPEec@m8I7`u8>em!Is&PA6=n={5za!yj3=%+uiOH^Nh|@xvQPyx&{s!9(2qI~ zII4LGMr9qznkZ`31_JKhsXod-lG^vIw#<$W^sSH^j=`dtRFuU*oqvw<#9uc?q%9$R zq6cGmi^fnw4z$j@dEtgL=>4NC?P)zJLcg(g9`dSOS{7|u;Y#OVxJ2VYzZERJF%v1V zgcAG*lxQ!UI|8w*7;3@bX?%+?lD{>j%Sit@IMrrBBAXl4uawZ+CP5oZq$WI|B!9)m zVG4~H7^qF+)Pu#vuW^hmTSGFOX;h3~1@F-TwP7tQFQ{Nf;j2^5R(E5-wz1G9}VRN7fucJyL&J5rdCv>+op9acIZ5V5z z7m49@im}a^X)NsFK@NqPfKK8(R7#aM$V(Mmc;CgV8V`vd#u)=t>A5vp4FGJ-BvvH9 zn|~&CWJgh7SXV!;6BFVhxJbLJ^=Cz;R57iPxk^NlbhgZ(8%__o&+75wAj=To{_3;8 zV$gR9B%NxL3qiq;x-!FIZ0J7G{+K!-jUq%TVbbCTe7Z2A_@N{30Kxnwh3I5z)XY=i ze?XbK!ln?R52|1vUgzZLv#x9fxPbj67|%4&YV@7zWL9`?hc#j2{})+7^vZ@dFkeBT z-HSaL!gnwVEeQ`z?&YODUujv#hydV*a?AxJi=_LD7^u#Qp|_^g3pg#SuBq36gHl8; z!@G~(Dt*$V3s+ut8GloA()1#qQ^ojX1<70V_>U?gPBO#D)jpHjC&o(6githNo6&jn z@Ehs2bH2A|$~U6lK|Wq>{{-QiEhOQqED7(Tt_oB%s^#Of!VF!FXGD$=5koStek7F+ zJAWD$Kp^_^`lzrV-G$f~mHqklOW_4qB^1(r)G{}7uhP--=J;)CnY;vv*?h*(OJ}&6 z(-w5wHXc#mcc}d96rOcfwS}8E000e`*3ql6Hwc2GaagyS?Q96Y|0paH)NR;kNA)HJ zfc*fBvXPaY1Z#?fn1uFWzm*3-@q-NQ=6{6QP!tLAQ$H#^$Ghz%*HrLZ%;hW+OTuMK z+EADyxPu`VNykkS&u!a`XGHTQz?2JEV^DDJr7~Az#u--ckiE{`JQ2uq$`EfySUL(J z$;1QB+S0zF&BG*_29Cohcf2L%)acz-3p|)NO9@}~)fE4VOt|DHuD`Nj-FkI4 zWNCfpiE#|(0*m*UFqu4D3KOBhPkBDQE+zjDAXiHvlNY)n)#jr0xL6~S87DZ-Ys%Dh zCd2!QNKT4}CU)?O^i2K(*Vvoc{s7q(dym&UKdaFF{h$FGGmC`4w(^6%vT%*k-nW9p zCGMhimhu=z$gruPM5N#zDG|Ev+J!5Bb+2XKPo~h@sTt|j-EOvL@)15uSiXSadQBfq zUL;uzyJ~E&h_j)PQAU#4pWuBEt4PUc4>Mu3Y?cRy<|8D1hY{{YmX3{Pomf^^7e+(Q z`X`i0pk>Xp7sjI=-Kca#O|I`L9b{}58LNHjiO-xL;*F{0Eo=eqyMQ3@vK%GvHkx)tp;GhoqU33e^UCux-?|-M>zTlnNBh88)zAWl|$sHdi5|dIiv<+8caGUW?o~D zM8^(fsyO>xsF?O#dYou}Dn0j~f?mYtVtg(j$_?XOnU2{rSW%(JHXr8w1DaHua{%u< z@oT!FTd=ohqCh*qyRitEeGPK^?E9Ah%9xK;&GaSJ?-8i;o%2L!j>-GnYu*oSQ|Q!;GP#Q- zvB_pn-{3KmQ5#uLAm#f)Dz z(K)W#{8SYbxSkU#8C9NYAKfT@C-+kn-@Tt&)CAQs_HpaN?{5WnbLz=og9|<<#db#2 zWF%;G0jxO6RBN8=(V7`%)r6OU<__hHA3aX3 zAJfEq$oV^(hB^B+i62CyuFDuPu8hiE3z}@|CvI!E?04d7b<}-iZF`r^nsz>X^kC0BFx#&l3NRr!Q+iv}(HeT->twCiPUF{cv$i%Um(E zI`gQ^ts!_XMrmcSe6t$u93L3WzGA_*@T=bK@38l;sn0>;f?0ZFw?cI+bQGPZUp1oo z_gYW+R50SwUk@+gN=vwM(~Pcv2wf%4_zMpNjefX)jI-q%1WOlowH#uW6C4ud=nn>3)>Yya#t2Vo({~P@6je%+QVA3ndK4(P>_UcBj^8#noqhcPXgu)8c$SU|9G$+C81AR!C6xONltzkyqU0gJ~KGaCURU%Rcf9^vDVT_KyguQCP+Xo*UPFIIZtHune zp-eCGy~^%od9b7?>tEiVwAUr1?rwm=_bY_YabfEBv)xpIG$J&y|D_c#+`ad;y}E<) z`KR=bJDD{d14euqRv%Bx9;R-)o@!NGAdXuv2}5K#VpRKroc9XzkV?!nIer@(#^HMG z!|`j~%2oyI98-*RRB)3K96b_~R$(6q`2utDr!t@2lcT3mFNty?Vv))`*7eAY*6`)f zNAq!#%K=;3Mm^7k0XtUQLx|_!Hs^yp;5!Y`?&t_yCNtPa%^1EG&~F?x)NSw;g68)} zK!b3@j&W_AqBJtPOAAia^87#B!w0E zOc>t5T3fAl7r{wZz@5u%&)%I$gQnzNM0dMMVuGG#UC}}B_QZJM!!8rkZh33bMjMLU zoZM}Br5I;qvSEO_f%hS&SD52*Y}P!jP{TQexo}1cVIpx?es3g(4bI}Yt2M+|l^H+0 z1P7kB16M@+|D=eZyZ1Bkuusn?R|Aw^W(D?n#s1#O3{OFI1oqqbr~tI_BrV1LJiOoh z?cSm3@V0^poeskbh+F7>ngSJoiCz_)i*g|P3@lBgNZlh*Y1yZ+%-Hx&!xveZKseWn zvM>`>S`Ma}gEjK-oQ+t-*pBY_FH*vL8VB({P$syJFXeDWSLFtQjH6r3{i~RzIhHFH zLX9Pm|7jX;bpa5QA30^2^GZ9Zhh6zPt1tf%!l*wEI3 zk4JmyYU%r~MH?BqG>d_R@KDO+igs2MqX#P_FUTa4IqpRna_IoJoy8;ke3@ZsO<(YO z;7W%J2%uB#_rO!5J58QjsKG$LPtVO~@P#vMII?R0ldq}9k!+Yh$U!%CCZ!S22rw_} z7ge3|UDZy$#<@K13ByohhCZ~gqVr&i@uuQTnE%jpWQT0Ln2vfKF2h3<=(#{~{Rc>| z7>O}^d*OA^)a+UZCWzT6rfKDcNNb(@JPiaz1x;Dd-5uI6Hkxpn7(*}e^gfF_8f7{@ zhX)aw)%&n2fHPV~v^AlbyI;73foM)*IN8M%z)yoG@6Pa1O2BjkZZPI#E=A`?4333D z^*-6oA3#Ry&lB(r++BY^Hx>K|i(Fb6N${*|;THZssG%XiBOXioOc}((yc^(gVSRL{ z@FEB|I3EWF#=&Xx&Ka%A*_@p=a;)@OVRuzKB)+{}?BVSPR?{1BHqRIY~L5N4i<8#%nSt+Vr zZD*?m@hIUMoW_Ts89tnN1#+SBXRg;mjQsv$R)n+qxq<#lwJPrkQ}60Gt1HS?Rrl^| z%U-d)PGqOr#c8shAGUBWW(XOlxuGc47wa~=`KB*j?G(b9&1va>n%^1BG^HfqHZ!WE>KG7=qFfZvcW4~@7C1n32Q6X2_|yW9Yc_g4t6u)|f9=!G%&jY(C2F?EGL+PRF<87=u* zPp+3lzInGSURk^St193sEF<)>;SD*41U7u^+CBM#pTf#0(TsS@`4c#vhO}nFMxs>wFB<&jn!D9RjnlNsYTF8gf>0)xN(a) z2@_;du%1O+0#dt&<=()EGBw`g=15l8%8Ty=?Z}`FYd|x@7m$V3O19PeTYyLMHrBC@ zwPJax5p*Q&!a;^?8(OY+{&RZFc0M=fF!G_kuarsd5f1_7S4D5oA9=L}KTb!XfFN@N z39g=r%T{olNH zx5a%--nLgVoW%YaB|mua*X*qsi}iMi=#Z_x>oC?uYRRT4{S}s>|Dib_*6B(5*wXND zG@P3Ak_Yb#C{2h%TR$n}7B0w}`59fQZT`7Wsj4?+F4g6EO8Zr7!4jLxiDS|B-&#T- zT>3E=Zf?DcGVJ$`fBbOk`o|jEu`>f{z_-voJm@(ii{U!Xox3zc?Kmu~s4skVQCvi) zM>@CXPNKE9}lptp++SL^SM zfdu{mPoHuP^zI0%{E(S-XKvpurEAKu1FajWT5BdHyY*S{b@LhUe|^H1z+r2B^@DRG ziIE>)u&Kx;+xRlveP-KmDl~D_=2ZK9Fr_TvN@P4CEiEX+s^UqYd*I&n%=oc`Qdd%6 z*K)q$nrRqgkNfQ7OWs)^Zu{cB+cl39cb-Ih`1X{ zX(LWO5~QU$Sqp)moNRHkUTj+{+T$GHgqhD zNpG(GbWc}Q%=(njYd}5(z_U!7%z+$Qg z$+?WCQT_}2n%S}bxYrld%u@bJyH<2!G*8XaiYXe@y%v#X9tct$Cn87zEA8ffoR?J; zR8al2CrpoaRRFK^FnO=5Y~-A!j0FS4476^mbL|cdJBQqEDi~#p)>_9OC;u6y~0*z&zH7;jHk?${3$vcH$Y; z84kF#nC;EPs8Ie4I^gh{03Z$hRj7IIv+?bxokk^^QVJX>+8_&#n<}=mth_pktoo)B zAa8mjo3IDx)uObwX%UogWq}Qq32R71zhPh|tq_fh&`E56DK;m3OmQhr1I;@e9!YeL z9rMovP?U(FRC`d59TYe{UQC#;0U=0D{jkVzZ3t>p;Y?JGWyw!Ux*rFGPT7$tw5FFZ zQYy{7sN9a9Lfe)Q$RBgZBzvFX`JHLJecWvze}{U<3K6Bg9F8i@7?@eoa7WqPZk!~~ zfIOt2A|+xlQR`b+N30=(aEzvMo{Qp5E#Z91eqMHO){Wg&gUfo-4EDrEqN;^ST)>8{ z)(b^U{x8?whXqqxpV+t91ZG3Jx6F<;KFIuX<&|G3`3F>QUb$H;f?_@!z&Z04TY2#W ztWJ08TZ;!32w)xGa{9o!=;e4nMf~0_b7p-;v{-107G!@NpP2n#_*2!;x}t2c`sL=@ zq{GSFT^N`hxzVy7Q0n&&u#t~$We;hz){bNNZ>rEf-(wTaUBZg!^|=*!AgZX0iA?zi zME?Vj7djN#ynVXYwrmhz*gXCLvvdYG8kH}NUA|TMI_XUfH_)Q=uCjmR(_Gb`G^)3B z*$?Y{2`^I|c#u>cR5zlk82N31#5iGOs9mc0fc`jjtv&h938~tbFN1-jJM<$Lk5{uX z>cVfX>g~T4KW{0rd-)6A>!C~VD8K$=A)%meD57-+8gf=FtrqkTxQP9fR9w1dYQ4fL zoU~JbsL`aCY~}{b>aMPyFl{~c4ZXBuK&~#cSw68|{MI+N9;cra`;mT~{QiyRV?AZs zwWJ?5y#a@>YOrs+t}ms5C%JjWAv)WymvO&HS=o<8FUDV~>b?GADOSs3lBB7e_+aPP z{HHGw&W%3~Zj1~_{M8SVOE#4xkw>lE5fpI-X-IdNX6_Wko{5l=?$ zwN9GKM%k>E+4O6-*pErOkKQJSl*FdLbc;?X-x^!0_DK%olzkn|`uVluokjYWYMnhT z699Oht0MdO(PWzv&8MGbzCmwOfAFktGb#_$2|fH=x6&@lO_nK2$gyHhNcj=QM^cqhk?~ez(Zj-qG)hjq(_f2j<4l$dznM99X#tOyb z*e3Polw`RDcdj-PgeMMLxMJU`qJ_idQ};x;zhzx-hC)|#=ly99`Hid&zeHUOn+)Z! zwL*I!{~}U$JucCGRG|!vzDVh^xKJm6?kt;Ki@NjUa;v{qO@L~(b^kM~D*X>dQZx>vd4u8#VfzI`w_ri<`&jGsD`JQSz_Q9M|!wfa!0ntjD!_b=3{& zH*(+JylF8nRb4kFjn~=lF5IZrIk@$jF(}v7B+#c#{}Shg*q&XA%l#!Z|1%%H3qen~ z0v5S;ZhZfEmbsmRN<40@QD9Rx{P|$+Mk7v(C|p@i&tv`QLFHHO=9e=ZTAvMFs}2To z($|A*6DEFcz6-e&g$)0pCuS|hCN+*^@3)yD7{&E%>D1lbZ(^J3Dy)7oUuXMAknSbM zXd(5_=2nN*!CA5O^lCC^+g&#Jd?6&9)nUsZjQcoJz4EX3P6U*UMI9;~B)vpm^(h++ ze!};*ECBzw_7bCP+Y^rKR6oc^)td@_#a|e)UrR3k=`D^#i73+62@*{;4#<4q^M3&bq?`mmOmbDbqM#IzZACyLJd5Oyt z9lLy@^@pWaExn5cr@pV^iqV4n={EzW=ZkLeqzb=EHf-3ZtVcK1J3qTJxEXxS&O?)I7pLk#D-{JBu?iT!HVv#{{n-k!U>oX(_sYx~S4gl1LNQ zC*GA7Xd7*KbCq&8(UEMtDLf*L zlns|TefU-fa7Hdg=rT<1DX>Ac;r%mM&@=!BSe#F>HHi1~T&OO19wLo?nH~f#K?yMB zc#oqFGh^ifHcbHjr*U2?EdN2!aFf%* zOg9H2TVVH^q3{JfN|4r}J0aG$8YR|(r^tb4_yTI?04KIWXPokmux&pQ=s8B1E| zeoCGerBx7y=c=x1Y6qbBs#EV)!aNpB6yA2<_2YcPpQ!Ek4B6Byz#<3eEKcz61=-C?b-p3osA2FMd7`O#~F65Q>>6j7{o- zwm_MfeC+hgmuOmNa1);?)ewBy^Xer+hMBtS*J0yOJGiH^Si%)HruYn9$Nw$@`!ahx z+2Bz!H4KbZWD=f5LCldO+wkZm?!2lN^JmSy^oy5FqrXy!=DQWYu5b(PS&IDwBwcGA z?_X)Dr_jHDa9u2M=BTg+{VbjJfzg^ej%I3Zn`S^0oh!J|7l9)O-ZdCuU^=5nWzi&)ND#fedgX!l$A=TD`4n?Jeo_+eiSov zyBY~2`sWSrO!h0$dNu@6qWj8PX4h6K>S@5osmVew;5ANmJy)gAHv%Z;v7q8X}pgc%~ z1rf}yHZ(jmj$aqQZT{0(d(pk|291PNaOYX+)dy8xyYsSwQd5% zt8=iVGw;8~if%5&T9f~B8l&(mah+U={&TkSKXtGzN)e|nHs5)orhc+(@JYN+v!R;- z#Gg0qoHBe*>W-6VleSsdB3ARHJqy9_O7~(BisVJpHdQxV9Dh6f zE`C$1v&V$BHg;IAHRO%$DR6fDI4v&SruIa*tKX@5T%7+`O5(fSO#HF|c0G%(FrzkM zUz_x|bLjItfx)a9>2OerTYK=O-rma1dFa%2q+!J^ntM#Ni zTKZCHY$2}c^K!XbsSo0=+TYwpwO)VIuZ z#f>C$xIw->8gSkVxVHF|DCCb%?NF_+Ku{zBaNGnKQ*Xb`TkrBA|^u`>F;AedeSRoKB`lDpoj1rNm ze@2{g-}J6UR@EfkQ4B89J~eXvncSLuI8uTcQfCJ%-3zXzkP_+#{lsI(dOm%r|NO4E zzAnxZ3{-LwmN9fHI=v85!jBEZIRqmd`7`BK9)Vyf$Ys1^$nTf;t3|Fx-r9)s8%$`- zccs@RV86sRuvIr`zujwpdC{dypetvF+%9?~x7jG{#b;3Y2fq(Fb$wj+;#{D5$l=Rl zR;f$e->)OeMj;Uv`&(>N6CcC>7~^j19wFBT45YXA zUbYh8pS%-EeABttQl?ifTxKkN-}1folI=%c$lE@p=S{j@5qSBfsHHaLrz>BZ4AyMc zSLJ^uqqtActM3f);2h{ns01H7Nx|}&u@=VWK?qDQ<#hiqA@r(0E z1wG)ZCrBXdEUd(wwj)tMz1#^vfQcb45GD{Bxs*SYzo2@(r`&OgKyC^VjjXVpkJD*^ zjAE$E{49pf>#9N=xWA8xk{w^`U%MmxJ6%CjV~P&BGW7xhE5CR009EmfIev=a^+gqK z$pHd+xLMUUpP3l-p*BE~ld$fUYS$9lxUsTz9++jm;RHcE zrFw0C5P*w<5i92!5;VGnNN3*Yl~gUH0QWpJzidYIS>FJDJMc6BF}QWLHoA$B=0{1j zr!hiqcY^aEhWlUp-MpgDKVvs_+?EP^uc>xJ)>P;{8}STi;X*3T@l!=GOOX7FAurr7 zje}}?+0W+y^Jy~7A1Tidu{mx+gvnYs&^%~uBo#i-PB@wW5ySnG!m9y5(BLnwo>$9R zZI(y|+yWqOF?7orwxG>10v{%3r$8&gqTOHF12q*92f1>t{HJ- z47ItIaf+8NK7b$Of1(vi%De0Rl`ddiDI?eW9{_bP+0S5b{VWh9SO1CRX)8uXcf$h8vafIc|#xU8lHyz1& zD>XP*LnE?%$BH?J-2U2c*;hWL6MEYRGF(ArHJvyoCqecY9Td3Y@Z@B)bZYrdvYv-; zI*(ChszTTKw{o`Nme`oD2%_JI5(WLC2Xncr%y7i)>36&e4?X?w`_(#m>7O`*q;Jp4 z#Rr`8j5ztd5omnb!ba_$z$4=npc)$6n?r4W7mu)5pFG(zvVGjds{ZVAsb=Uupr5Pd z_wOEuLR;%e`R3rk%P38-9R)avjsDj3WOgRDk=Da~wwg5G*DTxB+{tU*B<%F`c1UmJ z&;57%EYa*j3A)gCw1cihus0H%KeMTC5SgV(iDi3Z4&TK^Ibcu17hv${m8WCVN{#k zTd#k>$eE;#(D~)^FUQ4&D|vl)D*to7TVf+%R)q*RDtm(K-oEe^J1twS;p@WZ#Yl2X z|E>ezA;wT2%WvspvOe`Yo7D&-;88-FkzLg@LoiHH7yJ9?6 zJyC0exq5p3^bN8i;HtKEQ@bIxfki~={525M^OwD{d?xYIrfR91_%t^!G zuS>dhKq+bl;We1P6U4ur8n;b%g^R`F^Y*$A>B58Kn{V91itqDgJH2wEM&UchPUf2V zjdoQB+05;4fgh)SxZs7&@4e29BsM&RQaS)(azL-+>L-nn#DadOfM++e+_W1X8cNXz z?T{X?1}RKhAK%+>in>eNm6-*<@Rh&wTK(g(eSX+u`M%fJ(i!7K^y8*(alC+x)_NRV zmfL4_8B+2J^4FNQ1n}Of&HKHU;-nzXkE3MI&)$Y@ohD+lmAWv-Wc$1Q4^G!E9xc^QM4~ot^$E%ncJoL#DfH}ZR zmu9yG%^TG~cdC%ZPZh(Zk4O2Rcnp4jSxDtsIf)r1IDSIaQteP#*)LdQ?|d846Hdcy zcmB5EolO2EpDb@{y{lw{AD`vAyG_QxQ`CsMB#rAjCe5^mCl;;7*k(?VJMo)cQpTiA zzPTbc)pkRe5oTeX8v|wE)Z@UN2JA3V_^>p8CqxT2&2kYDiYyAPh052>8HJo%qGG?raCC# z46FS$czlT-&;8~bLnk~Rkc-1XS*yk8CA<3tbK$gj3GIVCFyuG#HZ4g+SezKWH%K-o zvZ2t+F3N!q5NTe~t$0DfEHHIjc@E?2Vi2x}?Zk}p8a;4j0I4Dz_GIEgS<&3;L(x{C zsd~iUq0aAtKGY?RYI*}ObN*CL$+&xhQCXC_`_I+9?Weqydrh*>ha_*BMmOUCvjOa$ zuB{oNt~1WXg!91r2l0TNkzfHYl`v!wvhyqQhod{evYruDGusLl+}+p5H@!7boBB1< z9=qm*-%&*lPmNXjhf1v8u^b;Qrl_12XSooqhVA(i=zm3r4sTt%WCw)|<+9vnfl8Y& zOi{SIPK)qQYo<-ZOPPK`glcV42b?|MF$h_hD%oozhF*tgyL>2M<_IVjNilq|z-49b z)rDG2WPaJ*&8JZ9P|lVB>{bx96<)XZ|;W2wZI%;i&q7h;t;jecF0#f-4QK_%O7tH z$LR&<#nTmbb4aHeGoE527ouH5{{hL=+76f9D}pR?xG1c!J8e7}H^@oNO=3BJ3cW*g zj$%Ya0TKqcd84iT`Jc(`j%U(h&}(|l+59)I`KWv?yOMA~6EElj$;UzIB~?I>CK!So zWM)KVATq4b*=RRkhcSyfnV!ic8U^Q;%_%CtHHDQkpGO$$h?9Q~SO*v`s_;3FeU4Ht zakD-)97N`J9B$Pu?HBl7dBY_t{pvrgH3M<}&?NN>{fjW~W`-JQ{S%{He`D-Oc>z@! z9iAt8A~kqaTK0MW&#ym5$gg^hoOAd@W4bZTGk2=eqDl>~|ZT*X?|c*~3bFil5mKa;RYQaW(DG5gB1h+h1* z@eecfemVILAOIfTxkLG(^LLA|V%4F-Lz9)XiP~G#eno0XVX}-Lt9oB6XdpFxm6jMg zHQaI~dNcD>?8~Hmd}Jcea&s#2d*CAJ&JjeY=B5mFQ>u0(080u6br-#n+`4Dgw5s9q zH-j4y;+k-?D`CA1Th_eN5`@@6Y3dZXJ*KG&DF(Rczi}jM;7cVU?5A)oS|0lQv4e zc7zz3kjYF4Tq$6zI&&yRQ$@1G=c>ndE@ z@(r3iJ=EaT_ZbYp;xikL^>-qFiF+CL7qmQwN0!K;xbzWqZ0>h`s;p?bC8y z6&*gQqRtw|wfph2TM;omj<;ktEWa`Lw0Ho_o$7*~tV6OkC96hKTCvjP*0dNSsRcnl z-f!VrOZU6OW~h|D_3gwwYoQMkmo;O0`bTpa^HgGst~?zfO?tqZoQ3nSfRC-cw7@Wcic{ zZx|x!WlZ2;<4%9kCuRX7k0yW^a`Qa0oC9_aL>811!Qp)VpnaCd_xy9i_W<~WoIdiwJ z4PJc(G*4u*Hs86hnD3A4>`Q!!G4~Y9u%cd>VOOXFKRMjz*mP!)db_U#v@exw|x`U8%T&bleT?8 zNPj~Cmanp$ziDWexa~w9Lj;DZAXoT3zcO=+p!95YwX+IC}{wCSKGX3Uw367qLolYIs6!D4ez=#OB&y#V{ zUnBI@clDmzd+MBqV3{dzPUDBdCG~~eh0@|<3~@uu5BJjMeKA-e@i-c-Uwx20>Ob{x z!1Xq8MD4Y3!2aD{#IQG};HE?~;@1D&X+IelglYL0x(~Ajg($#0X!)^c;~m7Qze3QCcoc2g#jegFDk}&A3n3_@v6_r-Q0b|snE)O{<>C(p=Xa$EX$M;q zDc(BZEo1r_nxmP&sdkE9!#ksVpNCU;RGM45`oj8U1~e%oh6B_RrYRubaT75>6MoyF zaAV7Izu;lh<0iR>yZ5!qHx&HH49Y1qmEB)`$UlX=;fp$utA;)s(=}O2I(grVzLGES z@)KlUzY7X6YCUkf_5_Q+Xy4L)G z4Kq9D?pr+81NoJD8Dcu-7bUk<*PDO-hD^HFd~CEL=2-{W`Kpw{Nm_G^^P>Y-H+?jg zgV#6nA9>%J&A5cU{3dc$Fs)=j;!?b4_x~t5?|7&mKaL+KXK!VkQD=+H%rmq17803f zWn_m#h|auF#v$WKW@f4EGcvMwID7Bx@9*>blfOJ3K9A4m{eHb)ujfl<_Wll>q%uoL zeeOK=RAQbV-5JFr7W|c35JaK|pF=DX>I%!BB3R({eK?<26+Ybk;vTa@L>L*S z@(^2e1f+}2+5|I=uXVNI+G#QY3eB=Tub)M71*v1Xc7ypdjBR>4k>Q)YL;ry)e+0J8 z=$-vK_{l2g6eSs&Vb4{|?j6hoo@mK7;lC-CeQD8|h{oh#1b>~w%jP)fyGmF;vP|}; znZ+qSXpoWKabrcyvq~@Unk`k4xP1d}-5s@=?h*FryI7hcTDiteR)(7Y%wt?3$9DLY zBEH3(i0{Ojz284N@MQ{=_y5dJ)|_#P?<7_a{l&+WF`Wcr&0d8Jk7o<9EXhADd7elm zBu4T(;mVQ9CS5M%)mrTQ{O^#vwq5(#CSvCy3kzx#1LD0YyU{(Z+rw*>>i-_UU`0Ht zo1FN_=-XpfY@6?YRHSOSRX6c+Ck6YB?8LpK*Dlm?^-a6~focn~ zRyw{3mM}X>%O}Yh2YUUclgB=LXO`FX?PGl{hCC)fOwEft*s{%oc9!jCJ88(;FjffRgLb&>@5bpQxQE*5z*X}z82JI#n8Sp zPjS0@yfaq8{TF)AkRDnHlTpZRs&I1mvepx1`}@{&x1zp6uv6S!$1Z=z#Zq*QkV*>N zJEUE+%o_9aAZGVAv+RrOXB&C%;1|Z?M=Pgm1&2JzE*15O8I^04YHdoMf3hUE>wHDz zOl@JcO$`S^T^V1`5Zq?uh%?P8dt|p|M59`M%&!j^A zR1k;pgqJ*hSSg$Ff-1;4fv#YhwQSBnDWbc2=O;U2GLJgXGH0Hrr1bX#B7&4T!lreU z`F_U`wS+Cjc!t&l|D!gPApgyj4JyxOU1GlCSZHR3>6>Dl=e3T#;@cKIp|L})`|%Iz z@8pQ^a;3;TS2mS5Dj7I9a{6&_GxyHrbL$J&b;G9?V9vwIyox|}5`=X}+UA*Ygo|wl zznJbsXQ8k@S(JBBmv7!ZN2$!aMj8x9Lxi4LW^ZHOFG7)uLvH%lzYWKyaOZ*L?wMIX z8s52-G6@yG?_0N%( z3nzVkZCqYN`^e#IACm6RQ$|Q_enpI6%Gk?Ff4R-7M_k8VJf26IN_UcEvqog~KQX5u zCT$KPUd`R+3j8|LJO2;#!G8k2=(d)tXC+&pKl8DShBvE`5&iA!oA%P)A!x{QeT77# zxrJG@W=<`-|A`W8E^G6o3jAzNB-8T4ljvj~@eCN8bVo4Dq-K=NGiM@ksrR&eHHspb z%=Z`rvIV>cZYLJ83=NIdb$Vw;ASC}q%H@r(pB0U@wdG7jdICuyH1X%pqJNTiy4s({ zklAHH=K44E!<6eQ6dHw?f&gVmCbxdt zi=I8Yi%GfVgYUD`2Yb4>9Yvx{SDd~@g(MKJrv*V%f*6)MLPN5Q37$7c?`yC6q6Y6p zM^Q6lkxc8&-NA(r?{&<2J%xe?4T%D#4ulfHf}} z=`G$JT=IrD$L=a2h*PS1Ti;NYKB?s@#K`->Oc2ou0qzt_#EsmX%yBuuBK7svM-&GU z<;W?In00CS+gC_u(MfCwN#E%@@WV2->Yyt~(4}c73^7M+w=3^61(b*p?X{j@DbmCN zk_(@-2fLWe(8ab^^;`C*Z*5-T8>UZ}bQE&EfbF)$M1zY8>7Q>0+C~ywZ?s)S z=Z$8G&Xyqh2y8GXHpJEKIftn;U)OojQ{nyve1u}^BGO-`duFs&PRe5eQrCZ=P>EcN zEb51y!+zEuqVNGeBkz%6WhD7_hMX`sB9X54KnAD8tIY;ICt6EFA#-cK3_%hAmAGZ9J2Fp_GiimUZq zI%6MevaWI&I%IIF98v0xccf1xLMx?QFoh$Z-n$6Pnzj*KZKx?rWZwf98_yZ&;o9@d z?=s$Qi=T6O>El}@-?Kmk@r+$K_`XGZY1}EfjH0KrD8)V6Rmu7 zUa_c+4}a65oe4FEk%s;cej{7;skeg*38eX)>Qzrk~xcx~smue+8I{;kIo z5LMJy|4dcOrN1UI4F?0)=fZcn6OHSH2>B4JE(&px&y-X*Z`|h0O|*YK^oXD! z>od!iOeCoif6%X79f{ObYTdeHd-qTyr7#i*?Z#=oui9tg+)r{F3(>3d%(yeu{3X|R zZ7V$^mP~zb3WVMruuay@Q0rAuT&U>M{Iq09VdzAlHRuMNohl|m^_)18$>Vyre7bCO zSY4Y*s0$>f_X{Eebp$v$7Nlu0l2 zcu3dHWABm3&$j)0HBIAn-;TkRhD5u&<=dNpTNl72tJ@ez8g#7n-g5&~eK)LXY=(r3>|I`uc9+n-8c1h##wx3Hj zuo^gOd@-74A@^ZDVOiu*+B-C1VEh$6l$0nH>8<7+642=5#K$)fITlcPr9O@}iAy0u zI@OF6x8Y3Pnaj$>V}DjRkFLlKf9PF8_FTKg6RJyBnPd87h6_14ubi6`HQLM4&hlZt z+Gi4Dr(^LZHC?RUmY^%GYc=}m4-9geU*MmQHz&({??3*^OnRYGCUfo9awf(7k+P)? zXU3;IRBV;{E?!mO9vXlUGWxR7-3BN&O%;~Q5Z2}Yd6li%zh&XEC#%7F2Qmvc*tB5N zT9rB4v1VQYU|ZXO&X9eDVr=xro@cLeSk0oXM?Dqv#0`=ZKo7+;;Jv))r=!~zjSs`U z6M*G-l(_Hf@ zuf$-8bD8TNr6618+gmPomg|~3vz{+$f4hCLTp#~%s+ev!e;#M?3paC09L~l<(~OizZi;&z^DbVxS%+j4KwYP;g%6bM*ZA1 zRbrTRu)Mfck8x0+RMV|#yI3>h)+l0v^lMkFW0t5+tW^yd*=y}Xbm&J?R*R#DUoGX#IZL5iy zjP!ire$&64Tl4Yd80l{!Q$->Tq#h#A^-tSY8sTos*>lFVQyY)2?IV1@yuGzz@9(nf z_m|kw>FLZ1u?N>buG4}^@pNY@WKu%J=AgLtbPUcT%|Za3!5cPNS;-(n@_Szgm$waC6*WHC?p0JQjw{i zJRVi_aMqjXW+mV`Ovtj&T?eHo{VVk~U4%xWQ*Q(cYp8ul`(JHQ508cbr!%7D!-9Bu z47Nm?xuEC{5GfgwURTJ|9Y@)7hz=5*@}dCp-@`&)$}PWB27oQj7Bo9WW-m>2jG5Zh zqnTXCwH21ByQU5HW)A_lVvW^8g6U!AUfupz}GML_utmX7F1Ob}2?L6E}} ziiu7@P>4{8Ph`=Yasqrymn?hE8i+z1_$NR0JdEu)1%WK^5anbqGSMWB=T@GM(y)37 z2D~~deyAK5OoV{(x~obsgCztS%Wa^Xc1PlXn0kF85%1c%{xcNQv8fq;?9%xBd5E3V zlyF!XK8J=>W^*D1i~+Su7etyft%ScP31yp>^A4-gy^~(sLK7s>+=u=}L~uS#A`n8K zVgT@Fh&5EZ-yJ4Bcvhr2kp<0B;-_M6R(qbIF}DH^{x(gT)i(8VPiD^<}k&umdAU6|gnT6rQ2 zQyJU;>vC9)5D#4Swmuvt7Pm2-R4F7|W^oe~#2kod*>F@@<+dnku60i>q8vGJl4Hjb z|KbO0cco+zCj*c5MzYDD+8igAXI#7MXn!5ueVf7jpf;0<)eyWn(PXgOOx7UeISCiR zg4Px4mMV2g{{v|>a7NTdbQf+P?noig=FJ-o9L^f)Bj;*Oj*Rzp{CQ!M66-CES2nIQ zIf?9~$KWI?Ig4ycuSIcM#$Rx84ufKO_dxI$Z}ui05yXEWSHXqui0P{4&C~`|($Lw& zMK{Tu`o6=qSyi@r+Uo0Gb29;DXBp13l}QYx*S4$D129uB@Nn~ zoJIZEu{iU*%(X85_Lbp^)2JOofNR1k`=(Tr`_O@WRdnjY({cZS+@B>?7Ro25I2z|# z?HoPR8Vp}Py)Fa(h@vye%P6-=xyL^=+N6xqr2BQ!6s>rESlEP>JWzs4yh-lJ!YkHS zF-IZ>HB=)GQJ~t_MtuXpK4CHsnDEu@trZ% zq=1_BEkV@1#`}%&e*^qdLYFZwy{u)L&?(BS$@-^?GoG(F&R#z^sb)dZ7VvCwGYy$s zQiQ*sYNj-OBi$hQ#EEChTn~`x=qnvaiPd*pbIst8aNx=+Pgb*PWQ3_3vvuPo$EV zg|S*^rMWs^;=ud=cjJJ42=y|X+rV6oG#!oLUyY3MxUs9tkws6^;eV2-@&?y3F4s9X zJK_E(PMj;6KB*^czpMthGGw-bd7BmLLaAgJXdbU5`y^X+8^823V`!ji@`{^?5~Gra zf1N-on?$y)y~me?j!}r_(6<3^cvmo1pBR96GS7+cE497=t@tY6zM`;s-2!!J^aw1P zA%C?pf&xx1JFXzlA@fb`#rr0WaFWGQZ>{yTh#u@tJ04D5A)TB_b=udEgU5+-;&T^e$Q&b}73<-cdD4eg!5~g|H-rg*pI_R>1xhjf?_49xsWJK(2qb#CLiS5B~6wg zvU0kf1v)MK$*%;i5TRETVsC$sI#vU5GHn}xyh=_kSptji$C4D@Y>8$;UZV`b+TdPB z*4geI-yd$TeMXQ9HY0ik5+9Z8#^ejS%spjYr)n4RjUiKmvL?wAV>9<2IKxOyI17d< z`9H}J?m+=$!@L05;<2vi{jI{0@)`O*@8F>y%pHyaYekK9&EK79thIPTKj(z|S9vZ8 zX}@L;P{LN?(H9nVE14#}hUlqwUJPHa5K?R*8u+EV=i+w>L$8uF=RF8vgJ<14R_?C) zTAt8U^u>f%tu>1V)xtVvc2hQHmVolh8;)iB$cu>|*l4d+Cn@nFrBkz&uqawG*j^SoCciz)*YT7-)#EAsw`kwCzBZhoZq3@-Dw+1LHF6mB@CG@?V01ME2H3IBf{D*VOKawM+UX_ zd_!Vs#_Y1NL`HEkp$E(6s{xP7+1=)>pgOnp{bADOYjy;CYHHkl0vUlM`2c(u#J-lk zGG)a_H#l+k;)Si;zcSr~ib$kj`q=BRBFnE2_x|%DyyyFGB41V>>=9C47cvkjYy7mEKf_+zs{_RW2wBLRfB`1JI-<+ zSwrcx_JS+$u{wSj%b&R7zptOv0qjV6ZS`>HMGL7={I2;1L;M6IjLFERrbikEKn#$| z@{1=GW_*RD7TJ&BgV?ejB`NVn?*z-_Qbq{{)=6Pj5!ZkFm|InfTb`1G^|xLvilr6v zHEmE4ILRK#p5U;gB8v1Tt5EOjz%kX+p`M?MftSYFX#ok)hvO@Q5lROX;zKLvse5%e zzpLW8=)juozDG9nxznxB z?c~U!_RiLB#`h}Ooy}V3w8-F~-P5AYfxR8Fq6c5n`(=O6IQ|=am2Dn19`x+D)=NM1 z)9?E8^D&Qj6J)xnwZ{cv#Cv<-*gibICP1>uv{-VKb@JB7tZ9j6KY|+X<>EMd(PAlI+ljf?`%SOdpo4 z`|n#`LH#rYRKGhicayNWkKfV-`AE7nVRoe6tB=q43{^&u9dAFPa0{#z2xhlhXU%S0 zvdt|HDj8b(7dJA+`|(w4>a5SH!lx{s>4Xuh3QC~3h!tY*4{pt4CAwL-Xm>743@6(Hw9_VOed0?3mjt+^(S2)kqcC;Y}7woq__|yUAqOVQs4Z$qU$U~YE!R+ zdK6X7lySPWo4`@9s3VY`E494b-&nfxk=cPQ_aLJ#(&Q#g7y)6y< zD1o}#m=^?GE){N#ai^9a(L2*^-Da_rqOTv7>rP#XC~pm@r2Sl6-mOV;^j(M^$s%=b zC92txksRTT^%NrB)xS_B$P)rc1o*Pe2{IFdx@Ysbv3mD*)V_ZV_{MlMOyxkU9xTKQ z4HGyYIVoox7;kHO?{Bu~{CRF`GShMYeas1zti;zq{&LjlrT1FG)HKVo_2XF`*JYz& zJWrL?dH2~})~MRkHY1yE1uH{HNad492;n#^0wYrM%@Cc;e}(zl)?~^ zw#uW9?mvU&j3;&+`<%Bg>WXVd>U(@+Wz?nFNUr6Ky>xtL9+?JvbDgYTjD7%34K2Et zj=iRTsB7DM`+QI8L~`hv<=l*j*5WILB1et_EVE7K-Gn0hW~ThGJ;VwC;)H9s*|)x+ zCJHx0{DZy!iuEb8j+j)ojdKj~nP~Z^{~stNu`yzS>_qU<5?j-zTY;Q7aMA*tmyTGWw*934 zKrsk9OBcn!=;6pAM&_OuaB8=d6eilE-07Yz#mjMKPzL;)3qbtRBVkBvg2_N2(j3W4 zT@o1lHcrV;Jx~JQOUMKU*d%3O4y9OzR4_QHxN-H@l(W4A+zP{d1 z#hh=2*LC@5!N8MnK6ytf(J@+GW4Yx1k=)}XYSqbRw$M=!P=+cG&~hML(cN&lTZxg* zYCL+hQV-0_)CxJd9KPRLWz27({{UHCxC5d?LZ$>c>E=q`V-2@+Z3jbjZp9Dsm5& z1`p#Sq9NUoGXzwvh&a3+FWYmOO-)jLu+Nx@SfEQzp8g3%1_-=+<0^E@X$U@&^6R=Y z{FvA~43Y1(Ua8bAJ3>f$d8i9PCtC$^@^eK&iq$as2Kv7I7k&7@6`WA&{yc3%r8c6I z(l%~Qj(CRKfT(HQ$tOHVUPh)OAN!9@1OEy?L8kl~ zLF(_T1Qm&D$^E!8gy_ejdA))d@+n)BqJMy-Q52{v7Kq^Pa25f#vivYr=pu^}_L<9ya~9E2h`e)3H&TN*ifU;?&ZJH5YZ9Cv zgfkgIR?p|-;Rf6KZRXN4IINW+)$nc3u|DS=BIp`W4hD9WzFbC%r}U@lw+f|&*X7ek zkFhu~qspYWCy@F}2|-KW0_2S%hZhr6n1Z=z2juyriF}j?mr^G$E)A&|zm6pki${g5 zB9Q2jgM6K@$#k38<@+uq#aTKy?qSmA8CXyaPyCtLc zblt@VzVnwD;KHj_`#OV0uJUEjAV_rNe{E7F~lgRnt&s}5< zB%GHl#S%R}u1c<)BazC3`xTZ*pP>pc`}??klQK}#`ULtMA%0;JiJL%DI3q=-2SC?j z*TzhPbri z>s~*m^SjN&MdnV<*PG5k+40Uld(hRhZaEk9h56a3EeJ%dY}C>;C_8rCo8FVLN^)ZD z1RikqRV1)*h+4Qq@IVds+V5hNqNt1)DT|4!Ipv^7u=s`F-qLg^3OvT2wC<~*ig@r0 zULTdL-u4lmRz8S`mo*lpRrBLKoq>dWEeXQujXPPUF7O)=IJHuqNPa5ds)x;XedqC~ zek=qyyf{6H>PgTnkwb&PL(FN_gQEVP ze?uV!KF$ZbD^S!8#BI}{0LS%D(B-s{vl7&HS{RuURI<2>FMbMsN9U{WrsT7`53p26 z(46cB+BSs@DbibfL?@EW9*^%Z`;9Gspo0=~X6f~Qha+m#kEN6N7M@b8sXa7UdL|i% zl-CHY`#kT||iOm-p zL>H4}4oYw>IN&|XbULum7`^|rMYTelPV7%BAz@g2uVPA-{P%P8vfRfk(;p&UgRiRz za5m1R)XeVA&&8}Sa^nHJ;Q%EfUr?%SD|G{NcckjgjQ-oo9^cwIan102QT$QaBU?|k z$YzgEIiHi>oiO&f+CFalZWen@va-2G6}Kg4VO9K0wagfsqTB=9wi)%^@;5;V6+G`v z;u-`Q%HRO4*x;U+&9>U`s<{XVez9wt?MIV!?`;~G0_tBSb@(_n*wc5?UN^;#&@}9? zZi2U_zyeNS!|P^oPAPsy@{R%5?xt5cyELGH%aO>VWBpl_iO;6Fu%U9s8N-{^ z&+2!K4E^P^lCeOB%lJ=sf zQkPkG+0{Z3nxHf3FIzl#M})SP_K~dhUuO3ZwPWjNo12I_d>?J8O#lv>Ff}T#y!4m; zPQ!TJwgYStVoEl>+w%o`p7zMIQx=ow8Bkc7ArfIbuJVW(@$L0r#Hc*n1=tRrYD4)? zK@-r#a%&TRX>90*D!z)OYw6tvWnI^RfY?7>MQ)-`Di*U6KMp+3sk@tfZN{n%YE?`Z>BHq;>pkn`5e5yYkDRs*jTG>H z2SBYDa-DbSH(lSG*et0OWn*!kuV7*_8{UF{UQ^0Z$|`-)G?v~mP_=2uU1C$;jUFVT z_2*7jym8wR@)x4+Fn9O(O8Qh^8`sM__vd#5KTmxKTb)vEl!l>zT$yKu;g8>CET{c6 z;^!8*TZ%L<*C;Y*ztCc&P9^*2ZRc&9L$l*j(0LyYpMKWc8elW6)5v!Vml&z|m@y&l zjYo!%t-QQ8EB!0}pea`TT0j&xQ6qZn2ejO}tLgLgj-eUn=ihzL;B8(RaRAul#nOas zJb=T|Xs$iTT- zO^&~QRI$2+Q(VGmeL2g)VyM-)BZ{H-_e-ShV7NKs+Dz9i_|ZLf;v zt%vIQa|}G$ZA(aAwb<=5EQN%Nld!6XciV6*HGEtCuRiCNIUerFxM3c*W*j;ysYpI8 z$U0ScwEA}cP7q{Ez*+-{B@~%UKKoP8G@X5>L3tVGc8oLy2z&!|Ts2H9epW85zO9Q% zf3*+YUu#quEQziz^?=FKl(%GGmHLwOUd<*c-m|xcQrz?5DX-p<$C;rnt^9@sKHU zIOq8Kt7+;3y9`eMVhCtuk)7o9WB^p^^&AY;{3UX7Ez&iwV>y!C-Y^j;bLAwFZ0d2v za6(-ge~rXGWS~XLfX7%=ye~YlIX6N3Dk==kb5J^x4doT1ru2>A{fQ66mh5q3!0Zg! zi=1=FvePCN#B}_!ou`!Ib%h@UmGCGkEc`q{Qi%oQMv@G9T7_a{zy*b%8UoQ-04Xfv z*#U;y`2e3e-%zm*F9$IDqvHz6bVZ zJrYllbxfU{tsp{ArU9f{6@xN)pBn@cjH0^^z((hUIIz_sng*qJk$k_!i{`R-E~6fh5f_}W&EWXXK-FCPt+@W=VsoI zhi4pv4G{?C0x7#RLW<*nS#IIS28=@0i!DfTFfumWnA$*Fmr6ajn0*~I4CzPXwl(d< zETk7%0`J#Mj(i+V|NrB`d5Fmcyw$CCVT!qOyp4Fh9-(CYI!EYY*c}jfAJBHoTJbpm zB)%nPWjRX80~6w>gd-&Po5_qGwhQbMFNcm0!?qWSBSjR2`FiJv++1PN`b1}nR>bn` z`8h5>_?Yof_PSQ3?a_%C?;zroUL^s)nfK6YCP09s2&4%$iCm#=W%$qq!73*NF~1PU z8R>%1JA6)?-hOY={JZ9SEX%3Ka!Yy({WDbZOodYruTtj z#b=DnP`pc?D#Rs+Od-ec@!LTI-qMqj#XV*`N3qT|JopCq-x7RU{`lx ziIQWDWh;ES;$D*QT?6jo7`!d&;(W?=TX(+4{WdC141ZNL28-d)rshZtX|QHDo8L=( z_ma--@fIZahlcZ7gXe2EP*>Nlu`f1e*<7Wl{oK7KEVYu-=;F=_N z^s}aM<6C4%wei2ul*B*XHs@@?Oh?ALsK6=hox;}|sp|a1Teo1QU)osVa)FERQ z>C-`94I7;38FL9%q#ztt+jWV)Lh8h+q~<2ECgWj>WGiJc?h&wM==+TjT8*rE=%W3w=MK|0C=CvRHYZqy{hURa@uT8EmYj7KvS6P*+nL2q2` zkUl3^$M9EnH$LhhD^)mS5hx{C(rWFN{E2fjM%pwmwLN*=RxJ!a5Pp!JwCZX2ABci9 z`U2yggIU)3C^aOmbAM2$ndgV*QfLlcS7lt~^J}HyU9mFne+D;GH27o5em6z>M{9E# zk5jGrHwFV6&n;+k4)tW9EDI8xNr)FNLUj^Vr@I!$FHg!ZicGHWS1aCsx{_E(p42Qe zi1=7;o@HJT{$(P=Py1bm<~@>M=JI4Sy~5o>eQL(ubI$2Hu|3iX^;IQ7um1)`QHt&D z2}-0kd<24BrP7Q109I0wWk>iY%aq!>WunURUlUYRm3MQri|_Ay&;nM}m`zvi);qYa0$nK{mEeATmSaoI!8KO`NR9_VH>RVZ@n!by-z7^4^ zvOT%AhF6d1Y&Lx#dfhtJD2mbl3v1hPbJBww6$#WA!c{-7efrj@Qyvii(^#3HCa*PV zIhV3shvl1ZWkKW_EZPJwnNgN4r^W8zU$ij$yq98Ps+Iex0-oA1qS!14wA$waa+InF z`O?rU&&{p05dxl_WAAP*|4TaXaCP}3i9BU1A+ap&-)$>?plKpqMs2gE+xpoX74C*u z-9V?c+C8UWo`Gh+NgH^eVZPIr&%mT|)fi!>j`wT@*Qc%7!qFEQQ!V>b$OvjzGVLWGjZ0<;)tiA6K3c7 zKTs4Hhfny$8`lC}`u875e{6kx)n-pk4#qq6$mo2MEn*pP*bdF?ulhfw~pjtWbz5IxHMettBn`{Elh`pzc@GBfY+qJKB;V3R|yub;oOzQch4b43ny z@e3BwJU8<_VRu*fhp&#!ykj{48;kF>=+e+fm#JCq2fz5#vDURj(d#kL=T%FG2jAfI zU71m-xC}a) zOVf3{F1iY_fWccPzDm%m8>?OQ{rw%1aOPT^u*RLi`xIv1!QUg9`+4JTR)R+sr{>ic zDzY0&zQGxhbcs`ql)7iy2L=u!pZHXLMcnJZ9|-4v*?;jz|1;^-y1PR)JNBqj4>@NR zOTtCF5jv46>NaGAE+D5T=nz(<2`&{qH%BTBX9qVvQrCc`OYiTfnFQI28D*w!4gp|& zMD!EKfc)s~1TmS5ZbUJ1ALvSwBTleSp?+C)ZbI>qmsuiPNz;b9svf2_i`{a2ShIy7 z)_G&71!oNA1$cf1tG&h{Hwa*a;Y}E=JvhUL^f!PRT*`l)M_iVdjmnb~*8W)7oC02> zY=uXFUN_;Jrj$S3uKZGH?7Pr%u;rOi-tV)@q>eVJNf3PQok!mM^N-0V92Fswu`!h2 zKI7;<@#rhiLt0?pw z{n(9rQg(-eT$pC(CM+k-i^UFxs|*bjjE&j~b*833p=5fbE7w)dvqN3qd6wpXYlIO= z8Oi~J-sN_ZDVEI~YwFe>V4zy`>ySG$PM(`5uhfm!?OS$t@2bWz=Mac~Lv}Kepmk{T zS;V`&*ZhGDejC*WjQE_M{M#L>>yTTsUh}&9{j8_X{_6ve?iU#o81!8J*$bIi1B+^F zZ0qNPM;SoBU)SZEeEg$uxIXOv`N-x?50P*Lz445y7Mg}|HR+D}Xq^@4MBHCwVgg=a&=Xu&l#jpwgTc1dQ6j&Y31ORXmDzhlT8YnbB?HebDjqp5H`WiibM7;#W%Pd zY?fcn%IUsg(*t$#V}iU7KC@LL#qaM2aP8uh4Hs#nTcy`4Xs6=6L~jr6QPiut1Q(o+ zk!cZB1|yjMW6wdQp34LWJC_t1uaaUupEul0!2J87D-{E?}6rUjKuMAK-iT2 zpTqDV9wGLb!XE+tG!+L;y-tqdfPz*^nf}x9PagDe<6j2>=4Bc|5>lXkf!6)tif6ny_;nRK;NPe%tu}E zLuFv*f*!aSPy}qJ$mz8Xk(PMGMd*Vmx(q0x@I2cbkbsr};t8#=Ptr8Lf*A^){Z;y} z1htFD8eoAMohSp>cf~C1oRMBidT$z5;1^DN4d;o%KaKsAR7bQIK6}sF2 zF%F7!U|b2_y#CoSk)42l}tPDgj4x zl=yT>~)#^;jdm()mF2pQpAv6k)fK)bVNQO{%zRw5ewu%Z(5jSaQTDbL zWZ(=VElH-aNs1@<$B)(+|Laiv;-LTc4pnglyV(~DjwD4E)Ryev{`t*UqT?ezc?%x@ z{<$1^RfW_9)OO&HHKYBSi1w_GpRI>e;W*35Zxh4%Sh8pwZSp}0>%1i)RV9H!DwTVN z?D+Katd(1k2~}0V0NS?$9%5qpl$uSoW{fr0Y%ep6@h|JyMJf?Q}+s}`k=Aw-gLmdy1Eu4IInvY zlk!;{nm2S^d;v_t&hx5pTj@fbvHkK7aO*iz@EFzr%4;mhDR7&b zt-HJvd8jBk6YeGIi!S4kw>{sv8c2KC1i@Amm#;UFFP&zHm6*Ax4BQsJUv)-jt+wc& zk2rzweth`tXHEXWu(a>Bj*mI0PRn~Hp4u*uB>P?sDnxyi*IL??mkVS2Iui3)*wGznx_Wj*c~#yE6a#!F;7kd=E+5f$v)T#XZNusP z{zSZ`NGAIyYq;kQAn|L!%Ru>Sjju($tKD=fugssorgBhZ?OX&ow#&KI|eG$k-kj?IbWnshlPPt~rdY_oVosFZ2-8lE zQF5lj*f6kK<~v#qwNFNO9J+<@e3~f(zfLG+kahS>aioD&9I1Ov?YE@ou8dY1JJ}X= zPb-q>Btjq+LxWc>Lws%o<40QDt2WFjol5?G07@X4IvC-7=#d(itfy;fPv=_FL<60> zEzxQJ=N#~Sna2CIxuu47hB!4OR?Izpx<&JMw(Pgxlh(rx+*JoQq>pO^KWt}gmsjD2 z*6w~}@d_F}#9Ud`{!=HY|S4JEeQ1MxKZWeQu#z93*bmk|HsDgON{i+zO8>|MjJ2Reqv4)b@X1>9 z_J1JO4fBLvXzjD6jp~B#hy}^j#(Uz=G@Y6;T9!E(&Rk>9+|0Pg*aB4<% z{klt8LFKuh*}>|p^;Sa_DTG`g%E4!=;zm)s7hfOX{aWvk#WGu~xUuCe>cti#`nYHP zv{FSwcmTFb(U~y=Vji-e3N@_q)XFj2dwWp`*>H39tQ5W{Vr{^8n#2<^2FxT{PAaX<4v2HP zn;xePz4T?uaEMc9i?sb~RWC77;+2CQUR?R{e&+o&2W+2#=r-s}33b!zWzMAOE!hOv zgPPR#V=qUs!Xwa}z(wO^Y6p!Bmz~dM8iJpTmv~S}mQ@tSS+1^9U1rgKt!UM6@onCaB{h1L`TB8q?Lpl0!gGH7^vBo|sm4^ih#){X}p_+}NS@M}~VB*i`Y(B%#0;&$9|iQDG7 z;-95IuI5WFJL)kb7D)0UN06d(JG{NEFVteUDiv@qM9W8QwzF zz(q7_k0&1Iyb&JvLjzT5Q5?!%_{sWt`wI-W&t&RgShCxaWCYQW8;dpJvtR`ie-71! z9GA)>?QE;UOezgFQD8etl&1;W2%~(gxxnkXs*)sIPCruLyW+Z_X4vVQi`(eVAU`>;C>yz_)dK`h2i=Got}-^e z(YbuE3JNv(@sMu(li3pL7e8c_%{^56KrrL!%RHp=6gIi@U**j0S%4zk zBdJu?|K2<%xgF5_api^OH4e6iPS~bN`7BHE>dRJ1#<#4|w3n(c^|?~0VbFI z4$*m_E~ddbahXEnQpPdT0(2YDZX2KLy1!BI0h;FMH&GZhb7#3=FmZ(qN;9~X1A8%G z;;k;C#O1e{ljIr;^b*T~iWvIo({Q64c%w9LEp-N+5+_6QwU`%pze?;@TvNB63PlKvF34EI3}F-3K=1 zdD%dC>CgE4ABvucA;so=!+w-KwSYy_zei6v(E2&qA>}2{iC}^P^m> zPjuTpP@Dkzth9*XBk}?l;3VESL}{FxOv=SC(h#g6861zOVLUNy4pB;qSiHuaYGQ(Q zW~}hDC_2IcJ75_o`$>B<-q`}<+C*C| zpQcD=$BW?d=@xh)-gbRc_JR8?{EqPp*90Y5DsfG3hRE5;Dj*#MY{Wj8AYO@XV`*N@ z`(9TBC%=Al6<*Vlk$EveM8gZhelh`O^HTv2%9~{#GENxi<f9F_RDXl6M=oWEHO%`@-(eW~w6v@s;c%$|0}QBL7f3%cy?vUd+1Z z0`47+VvC~evuNr0o+=0TWUAoENwvhUxH&_m-pzApI3xeqt0FVaS4Fz~Dsz6VM6Wix zcoT0o9@6av{cH{D9guJJCGH+78O=J&9Dm4VLn-j!g2}l}a6>#cK*D9 zu?EtgC{AEy-{}l?f=+GdsAWz!F>ba1(vNR~7(PVJ!t?33(&%1%8@>;gzYak1j333F zsv;%67p7?5OmF^WuitGqcjkK2#sqq#Pl7+VRVk683gByxdC_6F=$FHRyBL%2I^(yy z=hta>Fjyl8%5oZ7&Zlss!p@CP$+K1UDJAQ?Cln(WOHx!&NZ+yUHCFESr2?^)3a>T? zFt4MiE=q&n=c%e8lg)!Lr~ke|hLphytg4MO57J5*120&<)_A)5Ypk1XdEj4i0F;@Lz|_5!|G z*%)1uPwnR219)7NOIt%Ud=2WqN5sh67TAyo58YJTXDuUg1J%;_a24iPh=;QtRaD}6 zbE)ShKPRq`ckemUPTI9z9;-#IOfk?X%Ep)E@Bz_pvecBoZt2r)<*Zd@>XO0#0VF}& zzMN+bBxC8GXs{CCb?;G2{;ce{{TQdoO5u3m}k6_KbFEU2stfsIQQvIEkx{P zU6IHm0C8N0isZ$NX`JqpkH8%LE3BC=W{@PZ+gmFf76iE;r})<);>i*_Xku60nKE4c z5BS%khL60C97Mg=a~T8cNKF~fN;>mindSu_Q9(TYXvG5zarB^^Qi2C0)V8*-cP_;| z^aJ{zK}&5|YV<@|qF_EO}<`$E|3L z3goRzNu&uR(u`crdAPFk=!ZYg40=|}^+ZBg|!&>7omjFVR(j7Gks^)xqP zQfzV}A_QK8)}-g|&NNO{LfXvaAn=>a|Iao&Ic0A4BC8%8O=g&F74fIQzM zWS*3Sf!`*Ya(O2-05<>+C!qDOp*#WGk5Dm9IX!caO4Nfu)Mklhcoy2+pY_*HB3ySM z6O;G@S0vN?GiMPKYj-#I1aP)6ZH-QO%fDa9QEe_W2q?{OSa>hQI-CaL*Gikn115Qh zi2(lqd5F)`nzy2A{vFcpW1IUr?dC(3nqsfC`i1G5^t)YNKM+E&dGz2{S|JL# z7!=?D{3{nyOx`r2iWb^r5H2H%GzX|v01v{OtI75)Chln8W2{ZFy$&!j_?pq^o)Ls==rhJWcob8EZ*Zv8B6)M8rwlUPTRqRMLP_1m1!xyZ*JE(rz4KLN zgsWp2Cy+-&{{Yvnl=?G~tLj%g{xl4Jbo>$2Qe)<-5R`_2PCU>dD5S@FcND;HPP7kN zbsW$Fe+_#kmEc=F55dcn#$^8p?ATla3X8;2ihqUOUut(zdj(7i-!qUR8#v zJW&IY9zjv`2c>0F5^F2#f8=;8&?+r(C zi6W78c|HV=Pu|D5>7Pz33Dc9cjiFL1_c(i$jytL2f%nF;GREKDP)G;z0MsY2?M~n* z9RQ}12UCjaS|gR}#5C$@a5MdC6CpkG-iE`JoRB)6l^Z@faqem&%uk>c1j}U7Y-7x% zo-%)x2YvxL0GwnFKRRN9`3Q{Ub=nEVY-!#e)$j1Jz+#84`FI1|3YR2`Nxp{nf-WRi zxLBRCsu*L}JOlaHsz6IbrG^Ork?-EPEh+Rb3fh#pzgZ_ZGAv_rG5U6>ul^>>w5FM4 zs1E{J&QIXK{STI}~HMr|r#XK+I8(T7SwqkSNM^+&?-%kjzr! z<)?rdatJ?4LJcq*j=WKfwg(>ml;AT)DF}a%?Iy^-dy|2*V4uRClib)!8GOi`9F4$? z8iyntinA7{c?#@XhAY!+az7(U+^C&~iR1YZRvkr5vGm+AxP5(Vx3;*n)Zp`NWl2!= z$5HhitH%ZOFOzX$Zy`U#s!;xFMP9Jft*s_mZKu1maCj)e)P5KTADv@3CT$9q(Vl^- z_-@ltOic(Z1{Hz9U!ne$!Ro#fzSEez2xo|7@%MoBBfWOIM~f{kRb#!rwk&w_Fi?~3 zq*p?1QtB0!9kRxHI*`J%yG+rj$sQ4qSgQ;$;DS0)$R4B9xcVCP9cRK8dW$o%G*fnw zcs|)3>w?vMIjHFjT%n%abLODw^&P6?G|b!@Gm=sUGrQRENBGm#(YObZ*zjrvbdg2~ z9<-`(z&b37J2&{&ob4I7rdR~vgG^}^8<+eCCYg66SOObi7#&D*bNFVe7jnGu>?r5H zz~GT(?npRMkA9}BG>ls#uc_qIG8dD_)~{IU8jh!jwY75@IP)8XACG_5lYPdc*rG{1 zlbVtXdG6&ATSC&g?4vmPp4HlEo&$_Bz4VPMb=sL!{7+N*S7BkJ!)Xe~1PdH%(Ntrf zU#(>7C9$MwH@U!Rz6ZISt6#`bf9IS;5`L}Q^{(4X(5PBJs^Q_U$m8gj-e<$XuQ8di~!EWT{xBg>1E zpF(?nwaDszIMi;{qqN&;3CP0z;yus*0IIo{cMMC6sp#EuDFzDUbTzDLrRHNQjf*6* zOy%Tuc0EfRnr1&5eh+FfTA4Rjh=J2iLj(^fD(67w;2GHARG(nv44@!6B6!UY(a9 z5*r*~oc-Tg6<;B9Ba|zJ!Q?lm@}zbS0OW-j1CfE(rF7C-cqT8O`)=-1PB0YkJ$~&y zQ@~~R9YX5>F)fz-0Qq^N+IcbF$mN}YI0HEE)A6Q;KosytUOJ9>uAL_E8jz+-#wV*1 z`RSeqdSSWn4jKHr!c3U~S@>Q(`e!w2qkR}V9Mhe+O@kvj_vawf!TD5-oc@*2uA|^W z%wERuoNz>s*Z%tFnt%3}f!E9nrd>8z70Wh2$0P4jbtTz`mpRR!HUKy$IXV0|r=W41 zBYkoGYk75l2J#MzI}&hrG0r<2?(0te)$of&8m5OKah=&d=ii>xy`+~x*2aMht7v+gsD|NSR*+Y&mUTU_Pv5I^0aF( z2O|gvJ&#Y)r`k)gqE|Vev|EM9xQnKEasD*JcWtx}v_*s8c&@tJ#8&WmY;@R0&BTOI z1Lrs$IP3aVapHH1O~XyIC<(wT)04(%Q*WU*)tt}UEw+#+jN_BE=ZXd0wn14z9E^o0 z`d2|Gi>^{q(OX)tuu@03C({)g_{&gORyBs)1uQ|@azQ!us!g@9J0@a_h;xnXN&f(* zZT=LiI&+1T{ULMxD{KA|{Yjk}L?M&?lgY<^d7${CQjvxpBp3r|Ku1b0`wv4n2Mh<< z?v6k>7SeS5x>U-t5Tz|I4o4epU!T&nQ(e^`XcqwjfB@P69ChheBh~MY3reJexEv0& zn`22Bs3s}`>G#L}-N@#wMlM-SG|fPq5=WE)1L>O9eM<61E$6a=Ms|QZeJK{^=XUQs z$smm9x8+gH%@Q+}Z(o(tZw@^+1N`af4yNiEbbF#Z9r57v^{d`&#fkGDpL#smytIr+ zz#%1YPXwIj-(5$V(5_OOS!(LcKEVQ&>aB7C9{o8K)UeeiiHcfTjihe> z07)kq{{VpWt1cbedloH>Wb?F>4G*Tak$`1DH)aUUT?0Z#W3pWIV(;)Ik z{{XJEi<2eUGXDVfO~tSiORL(DFh~~QgU_aE*BUZMEBTu2L;@MMK)Aui3iHVJtcehT zoRN;al7Op-fRP?&|}XWzX`9H6dq%|xJDk+%e-V<)fWS7Maz z0CDSz#ENsYVB}+wS0I>{9OK+p5`na4ZLEZmhQ(V`m0oaq@mX-mo&n;oME?LTN3C;8 zCedZAfxr~(gU4Y}2l=uGS~uZNdiz#-o}vHh?paLz7X03umTzr>p1g`u_lvQtlD3xa4=o zO!JC%0bW4qK<}P;?Mui109uvD$}?c-1_wckaRjzW&#fpP)a(OA#mYsBf^`BW1x5{8 z+m+**hU8`zs*BW3XmXdB=i0bW7CAE7u6r|nqPx593lGcQxZP&TJL{kfyCqe?UI-(T z)9YTg6{Rb)%*5TR9H?RqSc7A+4qh#(5+>qL zPQ%>$S6yRbmdp1+k-26a>AGH-9fTkenOFkN>+C%RX@P;wa#gE$WOdP{ZCKS9YH{j& zP;tA1O=FTqYXhW0KvHRhlED{}X{<)>GD+=MEuiw(dykm@f`;sbwH*W^CCTNFTATsi zlkug-Fgn(4+|?@vDL;yo`U(KUQUTZ;4yJ%dOm(9eHy*z zEeg@FXS&p!c17|dKT>kX^rj7NduAt2x3{q48=+0lk9TaG`|(sTn=muGJ$njHPfGd| zz`GV{Ww?;bG_p$}>deHS&Y9AW=}yPXlS~GT=L5ZH=~~6!jeNH@l3|Aor=t%-Ju5rb zf!j4MH_?qYo`MG=C zD~^=%6!om)++ES5N=nS}J$Bym+gg@8yFqO!IaOXmkM9HDHCZs|QO7+oUd^lN7Mjhc z*{;(nrzq>gA@v9PSCwn}P2Pccv0TI&7C$8G(Z{!;_O0VJEzWtKqtcHZfTbf(}MkpWw z??A)?k8aew&~O)%kF5Y818pvG?rDu82I8YKlfXZfE@V3s=Nys&rZkK7s7WX4Y0iNd z203mC_V%fA8bIztVB`_or8PlyB%PpjC%@C)rInDfmgUNUv~qEdFgj50FZX9A?Rx0>!@Yik6P%;aGrLhOEk3iKT_!1`1hUiGKc zW$vm>Q3L7yj%yEI3os{N6pCTTE+=#VCpxZm?x9X9Qsr7lf@Xv*0dmIJ*dI& zPsV!CN6kPC_cZVi)|3qOqk%vPz{w{7b*}#aMDPubwt_rE;@hb$bn*j7YZnqo58cV^ zPoVt8aM0`%MqM(Yfg`c6brR`65PT#w@3e@gD5q#6d{QXjf!uNW))l7JtZhmO-us*Z z@y3a!Hr)flmM|zdS*};jk%y@#q5SI2x5ZnZFblmaPnJIGRUb&DgS|*~*PXODnABjCFFJ{&551l=aPq4P|SB~On&Y2aS zpg}o<UhdK_271WHhL}1C!{#<4`@xEJkoYy1&%cZqG(I-80*KIpT!ZtzFdYo-7FysK;VG zyJECuM3GMWc%M8Rt}Dv?0jRx>sW1t@%|Z%~LC+rj>((H2o)nP|QP&{XJm8bMI-xtO zGnLf*8=>CF(wioNQ^{+23Icsd=D8cs3X4Y|Lw~cgDM?4=g*EF>2yd-clFeU|0I24Y zFP1Fw2|PSzU?QGyeI~SJ=jsWk!{A+B;lL8w2+vn8K?BzZ8Lv&hTMa%VHSF=ggS#9P z^d0Mu)qHhn6Eu2Nxs``Wr5GQA_o|OO*qJCT%Q|;~Evytxa*I2TeA!(}gX}sF*0NEMT_5CS2O$}9x zJCXnyuPpJE#lmT-E`QfG$@6pDgO9?!Mhn=k?bd5)W11%D%Yr}p$J(oEHdfd0l)1Hn zP(}fG!6WI#5q8`rud(2ZA`Vr?Jr7Dk5S*(7WB7wzwzuK^YQVIba$8)$26nBqVnzHh z&*Ax3E&aEtBb0fXHXIcQ6pvyt#afekqc;?{DS+dKMkBK*BvZmUT!eG~00BSYRz|O= zmfkNVBm1R}DTh(JX5#X6bJ?7be;n~tq{y^-57QKlTF@0B`J=HF)ZKA(!_kQMu6s|u zy?svBDW;T$kw+{@HPGH*UP<++o4KSCMuv?qm312wM+!+Q*&(}g`R2U}*t6RyZsR2P zuQ$^O^TrQTgIi835ayVBq}SMmv5r)fEEcb&fcP)XcydUHv~<4h*1$W4Q>86@XE zl@k-!^rsWhem{joNG*f-8mOd8U`h4s-jgI8iaPLUKXlayGn@m~j(TSUG|qENlfX2> zeH=hm{5 zNYX0gu_+^eIQ=T@D}Xb{e40ohIT=I1^y3wAA}4@20G!qmk~fS&5F7#24E`CZ8B{45 z>w-A`N7kMr2nIPLs01Eq7?QYRI$-`^{d&Q>vt5Wu0xg7Kk_JdVzy7bztIXi2$KJu? z)O!B_^{Lkrg;EDR`uE3b&6?nbKF1wF#cK$*M5K`N<)dZoRtwf^G)RQ(M zT(AUVy-rW6}-*#4i5S}94ebjSYys)WSRK)^Ph{+)ACNe)=#g(UD#bMIOu zK3+LEraWNhI3k*xCB(=!^klz~pm*=}j7UQ+1~cBQgMbcr_3d1e)a#DLlH+a%;Y>FGan1n$06(o(l3ZkykH@w;)hTX* zWESM)oM3VOc&UsV8=Z{@yaNRECmGKb3*Ldi#&O34=l=k$SaV+kkgwCGeLbp~)V_T0 z=N*5heJgm-xr?lk)r-(waQVo=3OZGYuT;Lw;XoYv{cDUGk-9hWx+RBTtE0D$uScMt!KD{!|}Y`Xj*%5kc=qzG%k>-hmA{=d~F1r*-R1 z$IU5>=k_aGz4oFOfIur%Z|p6# z8%ZrMAX#8>f~TlGh&_!=jt(DNJbGra zFKyn=?n`M(vmgYNIRp`qbM&ufn%yRiqLmfmVTMK-3_S?06U5#WDXV{J!hqO_N=X{$ zF_lxaJm0&&yPH8E&4hauw zzFrSL)fskU$A0FTKm#O!TN*co^{)^~vrE$FxIxxjY>j=(o&{c{nD{5HIFPH7ahmiy zPllG3iXUIsBN73VX{N85-$Nn!N9$8bf8k95fYWsN7G>kiWA>SkxnuIF`c$@&N)4P{ zhlaJCMm3t+!PXD??=~Y(u1{aqx*IP7#Jgp_zk7zxOjgQ5=iSKX^89MHqvK2ax6DIf z?D8G$_zr@xZuKk6#@%ysE0ff3AbwPulNxbbo}H&?DQwKvR&ZPAtcts&C;j8k@~wz8 zfLIs#*z#GqB-e~vUfkKtvfJEC6pP4Zat(SHhCU)Iw04@?Dz`$f)XT*A=Io8w`~>Fx+Ujd|CPG=mL?+Ks%E ztb8Q#E?ow5hacVd{#Cp=d2IJFs-=7MI9Vb93~puZ>OaI)axv8IAKs~8kd@?uDeoRv za^Pq3YP8xiX)?GJ>|v+?fj^i z)MMtO{{Y#b1Eo&|)b`RV!y_RFAgLgarA1BVlR%qJ=; zmcnhl!xUicrvdX*URdM%&6DUkH9^a88Sg>BT(JNiw?_dE)OvrQ8}n7=5_(s7Yh2qm&kPrX>Qvbw*x7WP)NT+De9!iCS&f!p4p zw#v~EmS^kJ&{J{-YoOD-BYk*+N!VM)bA=-=Pt!beT^5<(J3DpruiwwW$qaTN`ufy5 zk&mfyrrxGcf^06Qzc)yPqN!E%Vt6E;!x^t&uz*2t94nF)ai3pPTs*!i(DW#Ln^YGP zD8P;Y0)y^x{x!^MzB<;mC1|6Y?3U+^knl+NZuDzEBCi;Fo~Nq#pGeV_h27$LgZ^1Z z^Ep14?OZ0W@izA7bXrskYZ>FrZ<)yU>??yTUAHkMyOMHg0Q9R+NQqT%Vtbq0o7tLc zspOhN)t!ko4u2|6fBkf4(yYn0_Y@J{ot&*VCX9BVV}boB&JPsOaY>%k0jH&Fx{i-9 zmd@pqKY4SI!_bcP=(-og8w>ETYG^GdJZ~8>vG?@-Ysvj-a(8v8aZISqqv#fiCP3&_ zk%mJl1QF^DX5M&zOun67{=zB9I3(l}Ki(eQ>&o;`7HXOk1-G4^-#KU>ls>$6`te?u zp?K3w*41Kn7Pn`QDnr8`_FKQxip9aFbZ(~^D>6NM;RTiaLg&JFgLwxwcMr=S_FJ*w zoE&toF4c64{TlJC^(#p&r%(x51`ZEG4{?h3WoaQ|@jD}6jDv%WVE&b2eMa9sk8hm~|Nl921aFagHfT7Yp?!)14MTPi+4HE-TQq zX*b%AazGhBrYp>BCB__b7nAE<_lIUe#vtnX0G3{TIM1$Y#K%VZo~{;JSkt(NEW|0v z9-Xs_%(=32h6$F*0|$>>kHhI*3&)i>9eMm}7Km_5#Y`ukN<2w%dsZtV)n#IoRL3t3a6sU-Bk{ID@yu##xzlzB?T{Ko^H zb4XjCtqgjew9NPXt5l4e6t~POGEUyu_oF#pd7yLBm^K7_x$j3ieW*G0qaUpRHwSG4 z9ZwYENX0_VIr`I%qGQGnBUcLWO^T7sxWc%#cV@nHjJi7$pqsS!&0i)?1eT`g3pq}BaC(F zQ;T#}AfEpK=LW9`HZDlx(A7)Zl($p8xdb14RtdQ~BU>n~O0tw2Nf{u3M@)OxUCrVJ zC^;vSk4}GHDxL1Gh0fRHH(dT)Ry?~Q>G0qtE>=(npm=T$8cqc!L`9ANYM)^pqf zNZrR@#;ZNUllAB-GQ_Sk^{%+VBbHNan9O>UoKrl~8#$;+`MLMWqdzTZk|UXxl5#)# z^=2!>xMs5f!*NO*A1|#Z6v~X6Iyf(e056PsR;(I`EDk}(r})J zG|%`-v;cY4BK({DDfm>Nk!@*DdOq87VjgR!GU&lTk zRv=$U!`c@A01CB2qx&Ltsr6>Th!rJvjB|`sO>Q>i4n}eQ6^`E!Gy&1>5BsqH0QKq< z@e4y7gu6U{&oDFk(^M;VA=and*OJpL2pJy~ z(&oYM=72|G+nT2@j%}I0ccr$|jE0}SIp-d{*F-5*Tca6Nr`(cDTsH{ECxiYp#EG}4 zDV6?}PEQxcd0jC_JcBVg{VEpmb8Z_nyK|14or(T+x~EaCjGUo;&XV5PhQ`bc@O^7u z+SD8j;~v}!;Md0&aW(~ovg5G~f2~Y>f2%tF<||br_(WN(rG}{@qll)rJsDyMy(yDn z6dk!8>&#^MiLSo_NL2LsVHFI%F4v_`-(NOQK&Yc1UMgdNo$lFE$3ZO)`tIl|GqE6J z7_NTrQ{31cIV5L_O;%-hMv zDid(uG0$4U2I%tBx27{r+cDtG`TEwXl15IeX2_h5Fi8BfP8TFDLF9V&{3{Vrw+zi7 z9=S9av&nWRKi)L`nisTY_`Q9&J$j6BkF82ICsV_aPrpj$L<`W8e-lTNm^sNmT27Q$ z)mbC2i(PcUXB>05H#w~fe-=DUH%O&G?!ag2D}Wa1({Jle5XLfgip}Am_bFl~k5#tu zwW6+OkpKg;gOThi?bnO+R)tjRFsWgj7Reu6bgv%rV+;2NX$l}bC?ADq^%_^Xuh*uP zj>lK=O_Qr7mg(H&2Ehux`8{incO{Fl%MwXGri1rspu-_L zx$D)wh~9-OYQUUv-hxzhpzz$B=9*4=S2RwM2|c=0PQ-KT`BFP!cr>v_)3F4dtJlzd zDeNuuL!f}l+uQDcI=%)J0sa&!1W>Ec55QCXdE`_#c3M^$gZR?+=7G=Bf)82-9@Ln} zy(q?g>D+BRQW$knMnTRgxWMytk7oEh{y&0)1qr;ROU6}~s zsK>o4aNJRY*R^O!oOYuaU!^F{?E2Axx`7GPr4(c3!5t~M$KyZ_@KPLEf}g8diFl%9?toW6iHV8F;$YNuI{lSElc^razrii{bszV)xh4 zAp<)gQskdZ^dDYpqSgK&>9H|ODCE6=?>Q)$`t>!(-}tju)Jp?!Ac?s0;2TCg3F>HE z&FF}HscPn40Ce6O@s;j^;u1{uMC8E7?)sHIk9zg3D_64B?M20u;za%> z=*oQv?Op*_bj?!pNW5E{DcUJV2ONeS!5zhAC?;zPt!{kGtlnQiY!9$7p;9aQ@JS5z_FS3HwU>Wq^|pX>erx1L!p^r+T37?Sq6!a4r{ zWd8sO?~mnPdvlb&k{JPxR5)nea97xjSHCo9SEfy1_=Cc_e!U<1N_lrmq(^fY`Pa}N z?+e9g%0IW=AG@xp*T z&nA`93o_XtE=j=ms9NeY;YQ*+^a81~$sjIHKs`zRl)?dSPDd3D_9-H1Zr$=XV0teC zp~JHDAxYyMDWnB#9u9hUt?fI)`la}d+A(czc@j^N$6ST#f6p|V>e)#*vM|Dp*Z^d5 zO=)Q!AJsLv3TgI_DueS#NLbW*mpl)r>0PFs;N3dVhL$$Io380b5Fcb6e;n4u?yY5~ zLaBRpfly%}ix~sZDCt@IMblE%C%m*UEIb2YY@zjA_PdyMx3tKNdo+Y|^cecrRc(21 z;oTx@Yjm~J?B+kcDlqOl4cXjliofy2!{s#C1-j>kY%~4?wR0CYmlv{`Zf1F0^=3Jz zX-jY)Resh&&$OF?uuMyjC|E(Tu(|dPZ=KBrsExX&q@R)D9HS&f8L`QpakNVJm!-W zzfQCO8YweJY*H9!3qdD7#)IveX{G_1c7AM(f;wWF2dx;#(9kog(7bu6X)2K1{{W@h z4mPp*lz+0_zMR*h>0TkzHRwUJn0cFW&_52phkvbjmJcV=h~$zf7D%0u!OF6n5Pdg6U*Ffjf8hc(MqimI)9 zT;82mPoeClC+@WyC<}r@k8%ZgJ?5LKm1#81LgMxyH!_ziGLLo7&Gi}lD+}$CmMb&L zNH`&w=wA z+~%qmC9nxT)ueLB{{S&E$N3)Vb}UM;7xrL-k(tx3PC3sUAA07m*4XnE&9Pj#AS441;huSihCC{PI+_FI< zBToQea6-zb2lJ|?`q($kaUULyn!@`l1>jlly}oN-Y82LjM43*#7{}RzATEAKLbK zIn^n!T|+7d+$c$>YYmx3|`O%?os_Bs~URl`Sa8xw*kFV>Tj{c_ZZ{?QQ@)M_!eO zb!Bs>+_kmsw6^oF4IHRckHf##rQqnjY**ImtsaMYKg64xsES%?Q6nCV(-Vro)qG8> z-OSHDx~MqeNxLHMCH35{jGR-`y!vICZjr~ z;r{@aWgfg5vXa`*oH32P4@y>v)pLxGRpzegbQY~{Q#z&YbL2)3`=*ooO8E3e$NQCJ z0lPivK*6J#b`_s;k<_ot90eVZ$SFSEsGR)3XRpdC=>VEAH*}+!b{8w|Q5Twt=XoFS z5&jgvXw*pi?f3vH_9(#UDCS**mG>zux`7~>9QzvT?k@DJ-wI${-C63a(bTs08G?^-S&_NHPfet=iG8Q>~Y$rUk%JxARKTx6@$b;*-)9ut+6K|dQ<+) z*x+Cq>&J$sBz%|{$4Yqc#N={>{ZACWvjWy0XBaJsUIuC6*q#D@HQA2~$`}AS@7#WL zf5I;*P)Iy~Dwm0X)*43{_EK9NNT-WZ7nS7xb=pVaS1dy-WDli1d@AL79w_?U0b!(Z z0?hT=aqCYuPurz;L&B$=qXGQs>)})w8#;TMkFCU|g^|D;HVu$Cpjs2@^)=`#;Z)j2 z&WF7y@UjINLB~Ny*CGoGBhUWCdSfJY#W(CHb~+!WdN}aPCDc$A<#DLkh~)9woJKm)fH|eW z+d)DSI*u_-?}~B#D8@LTLviy{!4#O|r2rCrsf-U4&^yzH2VV3M^5eH!05OKm7|tjM zwE~a}{6n6!oR0k{95=lf{OJMG4QIlhIlh9@_S)&$G9p)YRR`Aq^{!XqKZG=&4ke|| zn(q;rikKP80x_I}*i+*1XNP<;r1)=2l6#UcF7DWpK7;=N)m&z;tY7PQ&3S)t(@aJI zJrsHY*jKGioRqG#N10NjTy@oy8g=8>EQ&2}83{{R+$Dl!LCih#;HQ+Ki8 zaZ2R!lNSS#`P3~gMg<@QoStb)0KT5|YW5hyNzM-*lmVVkHGa!Tztm1F?Io3auoyx0 zCxKeAcpp@ERFU9CJhKMKQT6XoHNEQgZL#FO~cT%Pop z{{R}b6pWmk+z;NRBa8!z0HYr@Q6Ynmb3h%jigpIv&miBoO8Q0U>-3@2Jz6EDaSoKQ*qxPjQ}|v<6!9JSx6v`2tQi%KMMRq zBW<3v`Cf^0j#t@-aqnJq2YNG(eJWg2T9p~Nv*_5RNupUJb$HliSx!R_P-*1>>s}|} zpBY~04kAClwJZsR&rfwdje72pu2^e!qI)?*0r!yb%6$m_waqwK?1a-rmqHbj8Acc? zdJ*VriujLVcY9-PcW(nqZP@wc0N%0VkEjQl???rBsGdKUBd={?d74`!tIr zK$#<9%8yWcjB{JYN?RP#i%(NDj5baXpW^-&KK_+7c2|<2cNeJKIQ6<0`{~81$--aO}9;e-4!EgaSfIC)}L=wGk+*l5i@N zn?$se035Mma5~a$1E{UN8^XH2x`C{$o66tK#Ox!9N4p-shHJ5~@CJ!xwCXoBrvw?6w6V&}qYewHp3c&2iJwRr(`n(CW@-Oz_o( zgYSaa2|LRF06UZ4p5KNmO7z<4mJ(iGk|RPn>R9#z)YnH9k}qL_(zwrwWFco;Ii6Biz?K#Jd+~EXR_^lb?DBF_F9G zjGh>OUrIItxg8C5Mky^0DN0T1GZYcppR$d;`qhv(7-~WQ=AK126abj^quaG9`cP;A zC;)C!!0pJ~0mess8Zq-{AB`F3o+ty?wC@V|6UJIH!=i@MwFO+`%q<{2_bER(_v7%d zJn<)l^=}K@`Ff4H5iuewh2}Xvhq3lJth;NOtu7XOd7ddydOzePyI(+Nj>MNb8!QE<&(}dNYjPk5wsG}b#BE3VzUkhWowf@!cjLUOv zAlxlCgU5Z3-~H470M@Jx6XB1Db!QKAZ~dEU3EeHm0Rz4lzv=a=Rif3~CDN7bjyr(3 z#W0N5r(W6oJMgufwzG*f-9V{U+T;Z|>_Nhh&b-lr?j=SPlYmZeI}G=$jPKA>g@%5j zjC{OP!2IdH*{U-WA2)hv13ylb{2s%OnWG<#FcOS@bh!Dk>rTZXf)AUTzhx}8(<{R4 zt)8n?RDsDLDC)<7LtptrWH}6fi@)Jn%T;3Iqq*psKwV`n5l(I`$PxwPAdV07AB9aW zfjCq9zIz(yJ|0L#_3$z>$nggZ4?G|Ky?W-AAilHn9T&_-D8vq@*YY*Nic+Mx*2jJw z#;fILo}CWlHc=Q5dgG9Ns?g$oZ3o1N#1z2{dQYhOUIPXI-XfmKvIu zvAI`q$&7rgzlUGPn(CsmY3#+0vuzHkW&sMfBQCu;SNp*6UQUve%&NW>pP|+^h+fuZW+F{XHaKqJ4LOuDfa?>@WBtxFxu(Kc1`zK8s4({*2k zb~hWJNxU|aVB#6_@v-y`)PA+WYhD`GJU+wwLdoNZoGi*i#@|LC%Dbu7r&V4o@z(ct4$Hf)7!g)QKZSgAB(Wup zQiFSv=9Y+jw+|`DMf9k6A5%dfbm?6Nf#EyNW<_$0kYr@{Bj3`k$}m@Y5R|6uwKD89 z+pR`$mhtYv0I~b3eb004UYp_11i@f}dDOJza?RHrz#WBeXx<;S(xF6+2Ic-NaqofJ zwp9RLE6K#;+xKano*M#|vna==z={IK039j+0Az?a+#G)@ya%l}73NB9>e=Y1rJ_Y| zvd6nSDEm5Xz+Mkpvw=oC(&uC4L>@u|_XPsoH+{j)PDLgFYA(Z-5qV3u7~+8t^r=l4 zqU+l5C=Ce84AOup#L-5gu-pyQV0ut!8SO@( zCIw>a{v@-|p(^;6=!~Qae^xz(Wq6my(CNYLG}l>fhYc{nNY9}4Kj)hBN$w@MndO#7 zc^$G@j!8bG*Q15PH}6!?;lyH;bct_O)$a9s#<{zcyB+`>1s;HQ6+n_`CYze|qZE~q z=1Oi(>~?xkKs@6AGZ1k?PPWX{)DOA+08UlLD z2`s;go=59mbDA^Kvz;1p-D+(L@{d#28pp!^DpqAndFDUG6M1rvsN+AabDF2ad17Mv zUD$OUA-Lgz_F=*OD~(qngR7Nc$YmrDeZ4DtPVtVlr|m;?_K3$==NpDTy+vj0>cilb z*Jf$$DbM3pG4%~2QPP}?+eu;>`^05W(T4`80uQ}Yxu z^Qk8AkB4>WO!|AQYb-=$P*w5?HCmxof;4D$qcM#?cCO0t)E%1;W)4}L)v zzo>WvRJ1v>WxJ34f)R(d4_fCgZ7!_b$9HWsOgl(~XZ&k*C>@=3Sd;JD#)mYL3P^)= z2$Iq%jP7(GDKSbqhO~rpbO@svFuFSwq@-a?KuWqh1X20E&+q+z$F}3x@$A0t>paiT zsry>&331;+l(S0jKrPPEu+(2yE@`V-(n_#0jbMp>pili^!bE-i9H$3ah z^&t#+^6=M=l3+UTrubajl}(LRZwcQ-u&eu3hhgTgH4&b|<3rPYHs8oxv;HB4*vc^? zrYr7d#E7>jgQzBMk32h3$!7kwdm+H3)Zq`v7Z!Lk{@dN0Ep0*=;k{Z-{UFPnX$NWV z@*cPA_jK?^L6TOG`%@KoC^6HFw?!>sD?S~5#~$ARfLE2>sobDX3}WU3HotRGGF0l; zdF2m@lk|9p$Fx(BD!ib>DBgPpnde$k53)d$N7M2N%&@D{ArUy}a)g_7ARlxjV;Yd_ zM?=9CEDpjCnU{Myq!O0?m3UH9{ERt^y@>M)^k#1GQ_QvOvaBjw{C^;7G$BiWjW*Pi zM6iqF3CO>S*6a!7{l-H9s3(^k{s&^kq|!iSVB`_IUogh4^`zzk9F8->nh=mVXVmY` z7QxjFau|zLiM}4Tsd-sNv*X4f8UjpHas6Gt97FXE7`f!KKHW4r>`4)x*D1~Vv*O>r zRHbTpFZvTqbm^J$digG8Az;uujOUy~SuT^o_lU%s6ICJKEC0D=sH>|X!08z*ZKQ^8 zqQ`nb7c4YvQ*pb_)tPbRK^55Xj*`Y?w=pqeV$}^2bFX?MWCHxJpAoK`P>}lGPP=x{ zoV?6wiHM%B5vPE8G4nFzet#rcN9{dVpqbC&DlSofm?#ZIh>x5XEci<)$oAgs=C^t#&1YVYi~E*>UGx7 zesM2+rp;2;!TBUeqpCtX3NJsX^m>A>cM1a1dDjd8NlSb85r!Ig;>*m~Bj)DzO=?oT zKwM1iKBQ$eEuig1nz+yN8yMAzY?5nAI%k|@NnddCmLM!09>6_;yL5)8LUW}LG z1*U-BApAJ6AtB}(M0P3G6l*yZf`8SB6Gorl6EjbWipopXxy(vX1;p4qF#R*Cm}e(t zY1;6e_@~PLN1rqV^8HXzv?i&~@gAaZqn6ZxJ?lW9yW~|PH2jqiK;4u3Zc1Bt zOaMm?1+p`Z#|Z^8mzlqCw{1mHUkJMSEypUByPLip1#>o3A)VtT1iAe)F(;}VsU=&i z<)^0C0oU%dPu(+;g5eW{T)|cBoCXBawTk_Ult=y^t@D2bJrhBmDGhhOB!0ZXFW+*R z(G`BGP8eyey}2|3l$@J$kkUtdJ5Gtb8kRWJox*fXQ3r+1TDOQS7im7p+Eu>fJHBSY zZeU<=XiL$iuPRM_j3x&sxpL(Ydq+?^N40x+hKp;bUQv-wgAJI}Jv>n6B2hlc;n);B zVv>kvq8fD1M=~AT__X_lNfWlqLkAoH`>!@XS+92TSZ@j}sl0r|Wq}yRf{xmR%E`5Yqcszm%f{qOQCai)_^B#}ZosZ|0t8^>E6g2Pjw z1zJA)5A?AmoJ?oJ&PUbbrqI*yGpgZcqip`2e_c={M7C>|x#K@jCMDU2+q-!g;@uYd z;TCnyw;{BZngUiJ+{ob;f}~xrXmNF-6WuZL#V;Tr!;5whR2s59*@qhtPvYaJ2ac3m zuaPS%8?8igkN6M*+=qvgRlUEH_6^0F{*Zr7_MSF*@k5hSpi5±7rMIsZgP!eo(D z>>Od{%fI|mEL*>7Z~A|dy_-mLJ?;9EM!$Iu0FFo|OD$&2(TD4YRL6MeR^A1$MN_>##}Kt?G}QN|In!YJO3$ zm${4J8>_$Z{HZ69;mp;j$$6o>5B>o|OUUP>px>8)2%a?P6ZdphWFQeL`zq;vvm zPw0$^^2Tm-y78RJ(Hd$7veX3nnb325QzKh`AnQ~L%>Q-$bME9h>x`lO$@4x>r0+~# zoEGzsb&Rvi)iiQK8SB-ag+J9puDS&h%RL&<`1a_jk$O3vIV$MoAY|@K^~WHO>Z2n& zM)V&!koON|`H}mUxN}zP``Nj{Ts?+|a)ov)iIPlr0e|_aODEi@*U~+G@Ze7Rb>i=5 zH4pOz-XP-AfSg9Cn4%#4b=ecvf}H&Hi61B_SK?muC{F&`wB=%UftJ|q>^98^Zo2L0 zfUq)Qz9=wdh{n2$VU8^ns&t>HF)o8j?^^8{)uPo}vRTA~S z%-ld*C)MQ7i?44pK1WIp5Od`29+U9E;m z{O+lQg`UOjmA1LB_j~l(?b9z6n$*{z54cv>fFO`bH{Ez%fEl!f(nd!DE6)Wt8Z~3nCy~R zkx=*U-^rnC^7Az?>IU&jLFVj!V=|)xq)6)NjiqChG=L3>w z%=)!A`WB7{KmTq2Y}A6rkrODH>G4cmq5JF+f9Gp#X{j41^v%JUqgLj5hkRA>boUeg ziuIF>%b-EZiMJU>`+Td$>r6!3qPzS#I^S7BqgF#7G6T~7I8}f?j zQ`~3P;>M}+cjH7))s>GFhku(FT0+!39t}R?XWOfksv?Or2O0NX(QM2Q=v7_F!^EFz zLffbDWjKobZo%<}0t>j}i1u_ta2O@L^+i->3Bh@$Z!*yV%xOPl*j7hk=NoJUVv`M7b z@IW_s3jWUP#$H=ca8cG?_|k!lr<^6K;jiXKRZoC@L{>F+o9*TB_atAdOIFDB*@6Ts z4AL|d37m#4kmw@j(ey>{giR);&eLrT(KOt+kAPf~9#nX{l4| zE=JDyI!3@_Z^lei$MJ;1S$0@;%JQM1-iyrY;ZOZAtAtPWZJd_{&u|NRO@1wMQCe#l#*@Z-@C?U|G1_207&KDlr=+TIIOpTF;4&&C~B{avX z0^Ls;W=i_ZJ+6WBYD&J7y3ofjzUek)2$k6SGaqybiSmyKQ4r!`-{$?0yM&aDxKt~x zM955o%@dn1i1!p_h;TD$ps6!f6-+5}Szt)D2ySAbF&*v_$dsEq-b)*1OeEV#NFxn0 zesSUDtt$%Q;Ao-yUGdkC+JR{nCyN=1mi~pNQf3xg%p$uf8I-++YW#-ALmwmt?AGw$ z1ecZ&=0l)Q=C?wTKj8V2iny1x1$t+UpBYZToL8oFga>X-_1G)Av#58Hf8tn2J3};T z&&TIC>-&qS=~)u z^-Mg{wtsJ?)ehvJdo?_^o~e{u?Y2OO2&HNR2QRhB;535UnT!A>BbVRQu{T;)>$5zBv>gQ5X(S@th-CSRN z4yJ<9?1*p%>^J>GEy9UG!rTz!hRZj`IE8`YzBf?p&s_~WOy1=3b=l?)YQa}2=AJ=+ z4v~jFJ=DPkB}&ztlHQix^qX(EFe5l4IaSa4_YW%)t{O`mx2SuS&YZI5=F_ zLQjGfwKo5XtWig~oLtjFIho?q*OhPN?=yamh1;PPt6ndw;kkD6$!#u}iB|YKRy0GK zPp)35>z9hU#S0dRS&cCnCRQJTXm%k#2YEMFXp;zb_PEl$uOD>Zn4S}$s&z1{%iZsD zBlJLb6V(JI74u$Yb#KKhm+lI3|p$TbvU;5482Hu?|VSuaBQKM{hg#@Z^E*R z_rxy9=>yk?c1Q2zaEe3g@Y-9NH9>#W$s0mJSG`xE(>E+XCwnxfS%@kzOSqFFNm`>P z&sCO9GSTn1qp4GfY`yv-@mPM-JO-O;7|>Ig$Wvf?Y;4YY%BoAZ^!fKdcn8u7Ie;>9 z2k`Yf)lL##i~-V2K-kg8(fVHspTAc-Wg`k_(zcUJi|kE&46bd^CGcJ;Q{YfB+ibV;Qpsrv2%+;UsKRdkH?Orj-- z_KU{d?iIsjEOqHBEAwi6f;n#%Wr05E_RJk{W-x;$W2Tcd=O5%~;w!r}HbTPF=iVps zu3NrpGCPtZ%*ty?U%O1{`dkuuUQHYfr|Ixu($h2xkXZySBl~kXNHP)f33~DIopc6} z*rAeqg>-2lg)&A?6Lss`JNQgUwX>&}Yu*muYBx0$REv|_CDy=|wUvg=-^m$<=-g+J z@X1~?=D7A(bd=>of3POJ;?P8ivqEIb%N~UD%kO)+09Z*J&6yz7zXSRGcrkUYx4@$e z0CF)Ax`N`#PdKMjB&pXB49DHX8#$2`>cuOgm_Ggjz;}eg$?G_glGwdmd5`}j&B*1G zXkQIvdHAWOVV@bUl%gI0H8`4Qfk5En0idrM1*)KwZH!ZV<2o+WIa zl?j?$?YZoCG^s0(izAKj#%xJ{8CqU+^m7k^raqqQihX`QXCMt)nY!gK|ggl z^njbP&NF3`3+h}i4s>9NycIEMiOMD>5i$LaQ}59<6|N5$jVZ7h9?+R?9>2fXbDtvg zhY|hpJFF_ytV>>Ca@iUE2h^-8K8bsc!G=CXq%3Kx9kd)jw^0hphd=nYR^8_)YA0{<3EQ% zpH?5myY=_CigMh+kez;|MrNvdt|Uh@^MAD+i&S1Vj`^vNfaH=?R-?L6=5ufTKceK9 z$9D@2d;eFHYFaDA)tR@G4^CBgZxR{dSuMP0_{D37(hPJ?v!UYa5~RfNxompE415$a zu)f3-^uyxKdA|#B(Fz&+He}t(D3?yIbL`tx;*wm-Qq5;YU?RHR+Mz_{wWX@mkNIzmrG?L$Z1`jp7^ zVYr~^6K{tFQc68H>=oI5S)~Y9pol>T>6v1U*JrBf6Xwse+(xuR-}fvJkF66to@7== z*n*_$#F)(leFXK@@wGHB8`sb{x`z5R+bmi3Z~{K!VVEu6dT@F6*#cV3gwr?wT9de; z)^|`i0=nhc2#sSxn7tPjOZCDRj%?#Dk(*@#5r9MYizwT~zY@aIBX5m0My@6x_D|V7 z*RamgY-juqdF|{-cj z8zdR{tfc>~xVjCX-j~ibglV~6yp$6?=Xy+ASA_+xpfa&3BXcmmRrFlv&xg0gZVy{X zx1z!vd2r%p8)}tsTXRdlH!|Y+5Y-hzB^z^8K>dczDw6iizyi8+*YJ*jVO}LRly9hWs#PgGIvr(a=T@+CjTeQXj z3HHgGDcW}3ziN;UN@tE2F#)dfWs&bf@uS)9Z z>F7xwk(=U>G#Ws@Ctu+sTp4^zrzS`qJZS`r{IiTnbQz@Ehfs3!f^JZRiF{bl?65WO z&Zjz07hJOZE0F(Y54VW&ZJh@UA8^U4ng=sBxBW zZ8n%EqPfbdIz#LtYW}*&_o%nPLQA)6QLezc_F04Q`lsJi3-gnISp@XK=j262%O5;= zY&(7@U(ms*EGCg5j9-BU;gu}}Q?!ZDk$rpQI+81s`_Jem+db=C`K|Ae8N-zuqfB4$ z3<`*KF965Zo=))Hyx2#beMEZ7wl&+?vuWCnnH!C4&ZWnn43pLs2jsux`8+VN80NQ& z>@yNpKA|Y83&~tyiQcywj(^ADSY6>{!+u)WZaDJGZaL&T7zGjK(v&yc*7?F`)U_dZ zEU!L|Rj@2RjXzb!2HJdW_6JneX(72B;IjktM?^0W|G$l-u4=uVWL#`DIK%%k6#f-%7urp28#=@<*)A73C|lTc zpl3m@SeTmdqeMKvklDDwNk4O#6z`CsBcXtnbs-BxESRZ=z z&>qL8xar)19 zgIqg7opZ{x#JG>a@B<*xz8mO$JCpn3Lc?z66R=gl94vy1ieKlr9R|kg*XIGA-+`R||}kv}<_?TVw+DI)AnL2UmYbcE0Bn=D27URZIH z*K0EB#pN$Z`2)^&l|s!J`6PpIhV*|kdu}g~%QND?aJ4m$l}a99n66QGh6R9KDx87$ z?y9tqz&?s^C|Zf^KM*W44HLx|DcI9I@B55)dPKbD#!P~<;4AvejK92y>1nl)N52naA?uE6zURqI8fAMgxEyJVn!@N-L3-Cw0I^L{%GZrVXl?H|%`eNY(47kIHf z;n)CG|1`ekt;X697BIqv1JXDj=efylkLou-50@HjRl`pkhb1zK=cFxqE_(WAP{iC;uvw!DF@5tA6q8n*gcJ!W*9YI>WQN zNV{41@@nIhpNx=#=^gp*YH^KA-|G`77*TfADk;a~DA-fdCK?OQjiPDq1+8t)Blpxq zo;-wmKc()Hi80J{k^;fftZB>+^!`mbAx$PmVpG(9>Q$3c<@dF#J=<_V+f325O z-`tAKp9gzgBrp42Do3a`>+H&3Ck~(i=y`ra?seI{5d1>!HN%*S~6dq<4{o`ed#R2bmF$S3OE(Yk|PII3X?B@SUinMY_kl50iJ3 z&+J{k-~P>Ii-P^`#0qz=!-%AbgAb31##WhdIiU97x;ck7bBChs_U)_qH%l>sOmWk! zTH7t5u76%-J9Y=Hs#8L`F-z-d``4>?519Pb#JW5?km}0?f^OmLWls`vi zNYKrli2Qv?vK9{6{E|nHmJvpNe@udj9slJaHn3<``M`38e-t*zGupoZo6E+NEDci7 zumvkK12s)UZOv132a8Tvv46$*n`1fut7hM*h&;q?&6kj$vMf;y=%^7GhM3-Cb8|G4 z=sXPy9A2}_Xhd%M`*A!?-=ey%<(o;jE@{U8MvtZXxiIv;$+s)Z0-s!1qm8lMZ7dOvJnL8+3xlZ-Q8hB}WXt=$st8C3X<-jf0)?38LCG3xeXy~vC$4Y*q z7XLQ`dA`lXWN)xWxl27KiJkPXQinqw9=U+B(308s3GpP?MpZ^Vd1#{W0(A-5 zfMIl3zDs<(25ue9ZZ}D*9t^{(nih$J)yFW!a%Z|aN=&mv%=qF1Dqw01)y3s%2?vu= zIIRr4fyzsIQ2266E11rcPgsV<^}VWBP>DcNjfN80pqQuZ4p1<}b9Sc4;DYA^U7<_F zVu+JsjhU_#hs zIMHp+iKWi(mtRxE0GvCd=K=l8$S5MYEry+Rh_e+Zl8cwZb$HItLPA!PEnAe%|LTfk zwGD?L1<4}GJ$oINnDgR8fJd#5gY*S(8dF{=#FlGCnaIb>nKvGGGBMO3l1J#A zEENilgjPnz=MI4xP*rc@`$A@Id?6dGx3b;sPO*WA%A>5vULp&Ok=@`*V6PM8`OlC*Ud7@(oD|@^$uq zAo+c(chx$NTBi3`@y=P$WqIIv{fT;`KBSsauYa#R^fSdY=Q&}#;4w(S!1m2sC25|E zy4SaHbuZWJNNQqGL_2wMSsAcOoTza0u7yb@Hr;FoyU)Yo6huGejqrkY3~Tv5vdG^} z(`D}@rOOTTgCVWcf%FlG9z|a|{HHk@6Y+%JJ;ccN1_ioY1umtaWdmh75|QPZXy7tt zu@#gnBW*^=mRQ_F_!Wq(zllLLfBzCpN%!i@hfuKtfvI|Zd8kM}%)V$)eiX6jJQHvu zY-3sd3sc3Klf1>FcE2hRr%z5M z(0JeK68-jNW1i|iu=T=AU%X^}5^d6G(rQuQiL+VlKD53K7p&}=Og-id;yIcat82{P zT>3pzg!% z+d*erzuJ^;)>>J+VuWv$_V+{9xOq_xhJ$s}kZK2>%d$$afX{2bks}|KRkPO{FE|#Q z+M1IHejadHJG!vRFI7?4E%xAQob}Y^R#H6_VHFb@;qD}=Q4z8Lp(^$S_{`HV-1YsX z)rsL6XL+&N(WFnefF#-9Lsa4qD#-?-!Z)d2gqs$fQy=|m=(Vb*Haga9HeUxI*I?@|INtKR1l!vM{J$YktOzK2so7!G%*wG4ezpIM#>g@8Qn3 zl?|`+4luyt>0?a@RA9MH3Ae5AsCd3u$VA9PjyhazKQL%*kcHYm#;BtXAdaml_h0h{ z>T;ygX7u#eguu03az2cy+Vv8u&r#<>moRoEKio#MFXL2aSH1M1+LKlp(dbP6#n6m} z%|~OT+EjDaX)@iFV|VK49s4gN$pN|30ysvN4keXqYu1}Pkj7mmttynHXPoatyxSdq&%c&AD@c>7G{^-? z`7A`?0T;5-m;#zUy(im%AG$M)u*LN-jQYDD*X4GCr{4v5?9j-Xmbo$f{U0VXHr^GO z*`(z1h}Pg$26NQExhuu#n+i>iC;>@MA<**YSTua?jF2syST3okx|DpVGH|&G=~c#o zYNh_W8W*iUC3kMHx!it0Uly%*QP{kEgjUb46wYeK3TP*Zy2%p%- z)R|-_-dF4IV6lMGNOnfqGEOu*OY-COHCpdi|UF)eHs@DBdgD{TTydcW$V z`M#&@g)|p?xWZcUliZzqve?&-4aY>T9&`^6SPS*c-Ke}@T6B(2zgRsA`6s}Be}8D) zDfz@#yfJ^b@P8gnNDl*@MZbARpC$Eb%A;sy0))8@--vgK5hg`fx=bKGxO50+b8V-CJB7M#J}{L(v?)ld$a{eCNz_XXzK`( z_1nYWo*QAdA0|w=>@TjON)`TSe^Q&`*E9L2=IrP0U-)m|)%hK57KpJYS5nX2wbwnEii&oH4<6&@$(=5$RDv7rMWl2n1jGAenq zI8!;ROvJCML*D1doUI*7=TciN!wrNDb%OKn$jYH77+_#1=^G&-B1g#+okC#F0}sEw z7!IdvR~}ju?hOr@e+30xW|b7|+p2N5tWgwgHI6h!A5RiWj}D)U4QcxMq@p;YqpFG6 z{=kJv{t3)o+fXdJ5~&R~ej7$PkSfIHl>8Mso2z?K zX&v9JQZbk>+FEN2osHbrdrYyR6OwdRyE|Y*{LZlOB$d$-do;}MX00c$<RK8)Z3Vci>kk~7b!5@~s>;Om9GO{JBm&$2v#xlm$!6u3#*Zfe_m8QKU z3knHFSzJqB#yDYh>pAqjwK?FKCx-sZ5sMYye1t7_f19#W?2(m^a%B^}r&RxAx*uSsiN_Cb z2if9SS>&ojZCmD9xQpfNI2_eH;v}hv5C+kde26Jg1=;#lfQBI#Ts%Ahuo+DOHUqvj z63~N0d}W6Z53)4NQhf&n6%5+nW8Q2;=VNgbn=M{y7T&=jIt7rD_guoe73j1JOgNbc z*$A)_kuyq#QpiIifJA>#dHj%u_~kG`bd(6ZJaq<#(2G0KcTg@O zbp`Rr-7Mop;ByeU|24JKPHDtO>c4R-~|{_{r1vxWh0Nu~~R>B-Y55 z!Jd8!CXDN=9icCNL}AT~JJGB7&y`$_S>{rgXL};_>E&0Lfj(ONvHCnx=~Z)gNN{wN zce2~;Ux5v^cGb3w3m8Ei5B)>)tHa%vYz-ff9M!^{k0we(Z~Tsc2R}SRvyW!@)_H(9 z@R1tF`Y>o7l1P&1Yt{Hs=LnIe^o;`3ar!6-MrJ*cG3{w>+EoGA9+)sP54sW9<4V4g z@7b5v|5_&V!p`(!nDz1e><;+5aQI`VCg9hA{WZvy*$jJZrGe(}uPivLd)8AQD&s(k zeiWr_JQOGLU1E^+a%#(DvbB|b!^6(dP>I0a=|YXb2oI5>*6#8 zKaJHz(C&F{@W!JV#(vV(>NP<*f$*@AogLnYbyz`-e`nx(k3!pb$&-p7I;3j9l8IBS zf$W>v8%_5F2&J3K#MfEH2$&`8tTGHhtP!=c1Np*0b_dfNL5Lr*b+?J>`bnJzEnJpi zl2&;F$OL3BE(WKhfnMbKnsOuEm8|)4Oe5{iMM%X%-KX{;X$DltFww$U4csphiy4XB zr|skZXosXyy5IHEC|s`z5waoK8AO=)nuzw)N+BNZ&aQOf-5Xyu+!*O&B{B}?CUuDS zCX!Gb=g@|vWrgKoKs}Nd)n%_3G%C9KKvbFmYst*Zl)UIJ{Tf6Uj`Mn4Y^A;w6RQUJSHao%|T zp;=(33Hxl0kC5L>7zl-UTU{+LFCF;li5N630JNC(*Fp8U;SOz^{J>kty^}bH{s+p^ zpa)DGWA_sEVb9%Oqmr%wbK%SL5KFoD%C{6}wFN(!CdET??@?>4kD&pgtJcsi!43L= zSEleJE2oZC8Tg_9mw4D@o0CUbn!E0I<01f_wRBapKJhl_D_Zc1v2Rcc-44#JdDFFzQ%#5baT$(m_a-$HD52+{jF;>(xDhf6 zCfHJ(0|5cB&j=f9pfpQHqgZQ)Q}t0m->Rg59BzQOfqXITq^O$`0Bg(!kQ;eWfG1-|c8; zIRlZtQrvtfXpL{p7-!E_`Nmc2gZ=2Qov-UoE!i9XfUgkfO(q;L$;=L z>z?*$M$Oe%XbHN$)vGR^D%?Oameaa$zH;zPM6+j|Kk$)KXxaE5$eoPAcCM-3>hHJZ zDhd?=jJQ4{^scztTu881pV9K9;g@_>Y$@MMlYrSO`n`#eHy#Q{V-#bInWFs>4xhY0 zCq}}0pq+MB`r8*jPB^jRL7CIiV-N&TYl6NF%h-2(SsTQLh+cr#NHoeME3us^@2U5^ zma{5CahE+3TwzuCma5D>Vo-4~JqxA*=_dfv!c->6bPV_3cs{Y>nM(uoYbiDpD#WR);%qo90$ z9;thj35jXWoagIT=j~(FH$0s%9G*z_a$SDBtYs!1&EbPqoJ9QX{*IrHdeC2RO5Wlq zBz9A;eiL_VrbouWSEm2hBwCyRylp|HE)O%wlu67*#%f}?xN@B_<@&IbL6bEG?~iY! zIU)Jy?0C3ouP!DpMMl2fk;HH3aBg9onON{W=zvP~7lVKyyaDRy9WE6$$DR6e!H?B= zv2LG%^zJ?Uf*|qdJe}YX;dPznOt&m^H-GZrwi@=vNudObtzvLJs`M+BeB&78_SG!F zQpnT%II!>pC?NDMK>MD)9yh~ijd6{A@}8B$Il|ZVc#~YNW`$$^0B5m#^tMA^t>Iwi z>k!GQ_aosak#LWRaoT{PkZd#F`6`in>z0?6^EJ(~Mwjm{QZB$UX{X25uWQ_HIK-O3TR}NfHAm#q4qPVi zHj&rR83awrHnxhdt3mpz6h-gJCv#8JkY+csue901OP$Ra*6b4xQQ_U!(p=IZVC@17 zLDz-m04WQ?NA$ZKw1Euz3tcEfDhcusWFkX(=~y9z5Svl#dL#pg&&)#GTdv_-n7TD`cJc0@a@bk45`Rbj= zmfF+M|GkZ4w8@uG@P~!Nn8Scx zOKta6AT<-;U-fIUT$kSF7|p8u%MX{KIB8f`#D$p0^{t8_)a#(<{eEFKQV$Rm<#zvk ztskO+jkT{6{las9x#(MSV|38y+!nu$`gX&n&xInDs;de5bGfH@Ww0nK!#kPK$A)i@ zWRuz!J(dk~gFhUfT8YKM%`^>DmA_lq0&IVO7J-aMi_3(Bo%!nPCfCd|^M;F`=JpPg zB{%UxqV*4ndrUtBIc3bDKM9j|fN-?|9<-9rlUa$Ly4yFu_q@pDTS++mJHk^k7-mh^QrJnntu>q?QrbooG322{;c(sNcU6W{Vz8iN2C}(>OqT zD(is@@|UP833~T)g@ElhiB~Ay_kW_}u3qJ|t4d5_&%w2`di5IYCTciJwN~J#%CDH| z-pS^4EriCTS`JjkgK!aMm24#Pd>ksm-ta6^Z)>@dt&=HxKDAdQ3h8IE7#wX(VWHHL zhJKBBfgY52f-`C@?3$Uc4Dp>P5CYxIzk1_&s4QMB>~N@w6w~D{PnMh3A5(i;hO0-o zuAwO~`1}mR@&pq}%9e(Ng8WYP2)8$ozH?czER3u*Pg$DLr@p|eFy#cfSa&gfo;C;+ z&yb3gmBCE;gb0uuFBPDNplwzG{TbM2f zh2(jM9n|{MFFk{~b8@fI4m)M}`pj{lC6;MxPlf2M~pg4VWQl`+FvgbLT|v9<{r@-nQj!*13JsSXpNFuNgnH)%C- zH$4x}5EUtLG;(~lcHlf>c!!A!Vmto~t>@{2$=p6NLg zBz~HRf{LfyF7=9sgepJ7-qd4}<;fTQxD9e%XbGR$uK=5de1BUA)+TZI^M~2ofo8%J zrky6w>xmcrUZQ*)_2s`VU}_W#YOX&f_w(^vV@%P;9D&@ORb;eMG=}UXGG4M~&;Rmd zQnfyKL$U|ZnxKo(c+V*F38jbU($IznV;`dy=A!z*IM#&w=BYmn5L|jWFXD`dIM@=i zDwG+0_;@)j(;R5In5GB#QwhBFC!vVKC#u)*m-@xh+unrbhN}dlD-{SWAOTjE;N|U_yGPc`dDZb;d7ZI@RY#+seb?uF$@n zI*oE4br_o6-QK*-(45|C(y+B(_FQ*Rk?n#{FNXU+q%3EXNe zpY4BbZSr6`^;vJL`a7rMNJ*;XM|LFbqNz5M-G(X9uHK450<5+j9SPq9$40M7$Rx#2 zZ>oGjhsR(S)(~-2J|8G5-B(>JfC4BW&LZojCeN1VBQ2Ldpy%c(m^SiY(`K@4d5(CzB+U%iY4s~U8hq8^x<>QNE8wM`hO;pBV`1ITWsGGog>Y=vuMWSd$AJ5_b zOQ=923NU<+M`Jpt2=^sFncK~Yri4$u9Nvj4sTbo>sPU;7=#ZO(=dT>{?;17F7E$<$7Bb_=6%^JAyuMAQvSyaD z-DK=6xNqUD&|Ut~-e++t!R$G#9g~0HXhgU|2x!^63Qun{#Q&_##%1Ovto#R(S+Bcx z>j4{Gj*jcwyCxAT*7$*umbp#UtMN_#A>P3pnsSJ(+*~a6a+p&RY`U-Y24@PB>)VN# zIaXF80ECPA{*N_*x~cae1&vBLyo1Vur&rad1VK(Vl!tuuMuPJ@DLqxw@4`1M#C5s+ zbme=~T*%rg6Q%B3rhr^~hwWQE6FlRkca37XnGOZk zuHy{gQooWV3#(B=X^Tn4jJJ*0uk$c!KoMa1$M=dsl6TKAeXZ&Nk$fL@_V3_A{BP9j zgJNh%(6AOLXuIO~@LZNGE~bP~VBcUg{sD9oZo7GgMqEjdHp?;iq)HPKwg?;d4bzae z=P7*H)P1S#2sam7!W~uQ1QwM&Pc+WSVw)&mV9L{2#dZ4#m*%>47?6x{QED!^DBONr zt7~2`q=tS*uR9ZQE8y86$@WXq~180{8;y{V z(4XiFCh{2da$9UUec-~vWu6a6B2KOzBaVL%q4NN{+PwDG5^}aR__l^|jPS$k4wyMH z#N0FCwY#_M;Exld*bR~U&w{Inl4#Qt&&S>ue|tY8ptMRbtPy2!xuJQ7p56dw*R{9< zF5C-0i@)L-0O#TEta;pLyvo~wwOF!D1n^~y;Sn`PV(z=osy+RQ-@j-OYdBC>zLu}* zn(1bB#B;rrZvRY}A#m}$Ox`W5UniEx=%KbZHAnlw>ejq6)INn*R=QRW%r9(andc{5 z>v@E>E8*0s{YK0z;KUnM3mTNB#HXXH06pl={+_<_<3J_XwmJ?6ZWU3I4?1wE4u8Dd z(;Dry=cNHEP*&v#=9C`Gu(}MVKllkfXWC#;HhCqgPS*pR4UlA>|rlorxl>kr5CdRY(uHM!`kkwseJC zf)4EtdvJ>r)d zAYd)ScU|~koSHO~jiN@IF1zqw5KUEiP>As?o90QO;bTOVKrCxgDdfx}CKI*6Yx||| zBVJ`guhS7l9j0i4_h*AE+2{~gcH18l@IL(-sa$VKlzLf+dA+68E9)TWvu;^fvJU)# zKr6*`!J+B9mm4_iU8OBaTJcNAqivZ)?2X6I|4MHV*W1%RsrE`$&cOQv->%>h&#O-C z^fm}MFbsbbl-7TlB@vXp&VvW|5?F>(wZk6<#gL}39xWA%Wo#4QFn`gS`8+2<_Q0n8 zkgD`JEp!erTg)#4tsAcePr6t5xg+(6bq5eP!-Z&?iTbkR4wd_9ixoNcH|c!6j(h4g zW+R2EmYk`fP}Ir1%93$*^J>i4YptD0gR}9`{?)E2^1}~RgWI~1UOhp7`sWwsb7*mq z(`PH2ONaFe8`QZkJ!#GO zL-~g>r;4X9WO)MTa#G;LjK1IyhL;b*AjBnd#yGz#BK{^|op;I#dQMjn_kN)Ff3Z%{ zx+8*0agU?tkh=7z8XDBS#Dn4mnNgbVz!0XRoN_x${JTMU=!EZm$`zUtcS=02=s|?9 z@-QTj5+ijtOR<7}^kP=Ol!`JAv6DRn-D2=0Sals37}B51MqKLetAQjzGm(I+hJ^U3 Y3l7D~Ac(BJbnW^tpJELt{J$Un2SPJtWB>pF literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 000000000..d77da0338 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +## R2S 基于原生OpenWRT 的固件(AS IS, NO WARRANTY!!!) +![R2S-OpenWrt-Without-Docker](https://github.com/QiuSimons/R2S-OpenWrt/workflows/R2S-OpenWrt-Without-Docker/badge.svg) + +### 请勿用于商业用途!!! 请勿用于商业用途!!! 请勿用于商业用途!!! 请勿用于商业用途!!! 请勿用于商业用途!!! + +### 下载地址: +https://github.com/project-openwrt/R2S-OpenWrt/releases + +### 追新党可以在Action中取每日更新(可能会翻车,风险自担,需要登陆github后才能下载): +https://github.com/project-openwrt/R2S-OpenWrt/actions + +### Docker版本自行fork,更换Docker版seed,并在自己的Action中自取 + +### 本地一键编译命令(注意装好依赖): +安装依赖: +```shell +sudo -E apt-get install -y build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib g++-multilib p7zip p7zip-full msmtp libssl-dev texinfo libreadline-dev libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint ccache curl wget vim nano python python3 python-pip python3-pip python-ply python3-ply haveged lrzsz device-tree-compiler scons +``` +```shell +wget -O - https://raw.githubusercontent.com/friendlyarm/build-env-on-ubuntu-bionic/master/install.sh | bash +``` +一键编译(测试编译环境是Ubuntu18.04): +```shell +git clone https://github.com/project-openwrt/R2S-OpenWrt.git&&cd R2S-OpenWrt&&bash onekeyr2s.sh +``` +### 注意事项: +0.OC至1.608GHz(未提升电压,原则上不会增加大量额外发热) + +1.登陆IP:192.168.1.1 密码:无 + +2.OP内置升级可用 + +3.遇到上不了网的,请自行排查自己的ipv6联通情况。(推荐关闭ipv6,默认已关闭ipv6的dns解析,手动可以在DHCP/DNS里的高级设置中调整) + +4.刷写或升级后遇到任何问题,可以尝试ssh进路由器,输入fuck,回车后等待重启,或可解决,如仍有异常,建议ssh进路由器,输入firstboot -y && reboot now,回车后等待重启 + +5.从2020.8.1开始重新交换 LAN WAN,解决千兆环境下IDM下载掉速的问题,用户注意!!!!!(当前靠外的是LAN,靠中心的是WAN) + +6.sys灯引导时闪烁,启动后常亮,是上游的设定,有疑问请联系OP官方社区 + +7.预配置了部分插件(预置了DNS套娃,要用的话勾上adg的启动,并保存应用,就好。然后ssrp的dns上游提前选成本机5335端口,openclash还有passwall自行触类旁通。adg管理端口3000,密码admin) +如果要作用于路由器本身,可以把lan和wan的dns都配置成127.0.0.1,dhcp高级里设置下发dns 6,192.168.1.1(这里取决于你设定的路由的ip地址) + +### 版本信息: +其他模块版本:SNAPSHOT(当日最新) + +LUCI版本:19.07(当日最新) + +### 特性及功能: +1.O2编译 + +2.内置两款主题 + +3.插件包含:SSRP,PassWall,OpenClash,AdguardHome,BearDropper,微信推送,网易云解锁,SQM,SmartDNS,ChinaDNS,网络唤醒,DDNS,迅雷快鸟,UPNP,FullCone(防火墙中开启),流量分载(防火墙中开启),SFE流量分载(也就是SFE加速,防火墙中开启,且默认开启),BBR(默认开启),irq优化,OLED屏幕支持,京东签到,Zerotier,FRPC,FRPS,无线打印,流量监控,过滤军刀,内存压缩 + +4.核心频率1.608GHz(稳定与否取决于你设备体制,求稳可以在CPU性能调节优化里降低最大频率) + +### 固件预览: + + +### 防呆指导: + + + + + +### OLED效果预览: + diff --git a/SCRIPTS/01_get_ready.sh b/SCRIPTS/01_get_ready.sh new file mode 100644 index 000000000..e00b116b0 --- /dev/null +++ b/SCRIPTS/01_get_ready.sh @@ -0,0 +1,7 @@ +#!/bin/bash +git clone -b master https://git.openwrt.org/openwrt/openwrt.git openwrt +git clone -b main --depth 1 https://github.com/Lienol/openwrt.git openwrt-lienol +git clone -b main --depth 1 https://github.com/Lienol/openwrt-packages packages-lienol +git clone -b main --depth 1 https://github.com/Lienol/openwrt-luci luci-lienol +git clone -b linksys-ea6350v3-mastertrack --depth 1 https://github.com/NoTengoBattery/openwrt NoTengoBattery +exit 0 diff --git a/SCRIPTS/02_prepare_package.sh b/SCRIPTS/02_prepare_package.sh new file mode 100644 index 000000000..c97602c04 --- /dev/null +++ b/SCRIPTS/02_prepare_package.sh @@ -0,0 +1,419 @@ +#!/bin/bash +clear + +##准备工作 +#使用19.07的feed源 +rm -f ./feeds.conf.default +wget https://github.com/openwrt/openwrt/raw/openwrt-19.07/feeds.conf.default +wget -P include/ https://github.com/openwrt/openwrt/raw/openwrt-19.07/include/scons.mk +patch -p1 < ../PATCH/new/main/0001-tools-add-upx-ucl-support.patch +#remove annoying snapshot tag +sed -i 's,SNAPSHOT,,g' include/version.mk +sed -i 's,snapshots,,g' package/base-files/image-config.in +#使用O2级别的优化 +sed -i 's/Os/O2/g' include/target.mk +sed -i 's/O2/O2/g' ./rules.mk +#更新feed +./scripts/feeds update -a && ./scripts/feeds install -a + +##R2S相关 +#3328 add idle +wget -P target/linux/rockchip/patches-5.4 https://github.com/project-openwrt/openwrt/raw/master/target/linux/rockchip/patches-5.4/005-arm64-dts-rockchip-Add-RK3328-idle-state.patch +#IRQ +sed -i '/set_interface_core 4 "eth1"/a\set_interface_core 8 "ff160000" "ff160000.i2c"' target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity +sed -i '/set_interface_core 4 "eth1"/a\set_interface_core 1 "ff150000" "ff150000.i2c"' target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity +#disabed rk3328 ethernet tcp/udp offloading tx/rx +sed -i '/;;/i\ethtool -K eth0 rx off tx off && logger -t disable-offloading "disabed rk3328 ethernet tcp/udp offloading tx/rx"' target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity +#r8152新驱动(可选 +#wget -O- https://github.com/project-openwrt/openwrt/commit/d8df86130d172b3ce262d2744e2ddd2a6eed5f50.patch | patch -p1 +svn co https://github.com/project-openwrt/openwrt/branches/master/package/ctcgfw/r8152 package/new/r8152 +sed -i '/rtl8152/d' ./target/linux/rockchip/image/armv8.mk +##HW-RNG(硬件随机数,可选 +#patch -p1 < ../PATCH/new/main/Support-hardware-random-number-generator-for-RK3328.patch +#sed -i 's/-f/-f -i/g' feeds/packages/utils/rng-tools/files/rngd.init +#echo ' +#CONFIG_CRYPTO_DRBG=y +#CONFIG_CRYPTO_DRBG_HMAC=y +#CONFIG_CRYPTO_DRBG_MENU=y +#CONFIG_CRYPTO_JITTERENTROPY=y +#CONFIG_CRYPTO_RNG=y +#CONFIG_CRYPTO_RNG2=y +#CONFIG_CRYPTO_RNG_DEFAULT=y +#' >> ./target/linux/rockchip/armv8/config-5.4 +#patch i2c0(服务于OLED,可选 +cp -f ../PATCH/new/main/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch ./target/linux/rockchip/patches-5.4/998-rockchip-enable-i2c0-on-NanoPi-R2S.patch +#OC(提升主频,可选 +cp -f ../PATCH/new/main/999-unlock-1608mhz-rk3328.patch ./target/linux/rockchip/patches-5.4/999-unlock-1608mhz-rk3328.patch +#SWAP LAN WAN(满足千兆场景,可选 +sed -i 's,"eth1" "eth0","eth0" "eth1",g' target/linux/rockchip/armv8/base-files/etc/board.d/02_network +sed -i "s,'eth1' 'eth0','eth0' 'eth1',g" target/linux/rockchip/armv8/base-files/etc/board.d/02_network + +##必要的patch +#luci network +patch -p1 < ../PATCH/new/main/luci_network-add-packet-steering.patch +#patch jsonc +patch -p1 < ../PATCH/new/package/use_json_object_new_int64.patch +#patch dnsmasq +patch -p1 < ../PATCH/new/package/dnsmasq-add-filter-aaaa-option.patch +patch -p1 < ../PATCH/new/package/luci-add-filter-aaaa-option.patch +cp -f ../PATCH/new/package/900-add-filter-aaaa-option.patch ./package/network/services/dnsmasq/patches/900-add-filter-aaaa-option.patch +rm -rf ./package/base-files/files/etc/init.d/boot +wget -P package/base-files/files/etc/init.d https://github.com/project-openwrt/openwrt/raw/openwrt-18.06-k5.4/package/base-files/files/etc/init.d/boot +#(从这行开始接下来5个操作全是和fullcone相关的,不需要可以一并注释掉,但极不建议 +#回滚FW3 +rm -rf ./package/network/config/firewall +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/config/firewall package/network/config/firewall +# Patch Kernel 以解决fullcone冲突 +pushd target/linux/generic/hack-5.4 +wget https://github.com/coolsnowwolf/lede/raw/master/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch +popd +#Patch FireWall 以增添fullcone功能 +mkdir package/network/config/firewall/patches +wget -P package/network/config/firewall/patches/ https://github.com/LGA1150/fullconenat-fw3-patch/raw/master/fullconenat.patch +# Patch LuCI 以增添fullcone开关 +pushd feeds/luci +wget -O- https://github.com/LGA1150/fullconenat-fw3-patch/raw/master/luci.patch | git apply +popd +#FullCone 相关组件 +cp -rf ../openwrt-lienol/package/network/fullconenat ./package/network/fullconenat +#(从这行开始接下来3个操作全是和SFE相关的,不需要可以一并注释掉,但极不建议 +# Patch Kernel 以支援SFE +pushd target/linux/generic/hack-5.4 +wget https://github.com/coolsnowwolf/lede/raw/master/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch +popd +# Patch LuCI 以增添SFE开关 +patch -p1 < ../PATCH/new/package/luci-app-firewall_add_sfe_switch.patch +# SFE 相关组件 +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/shortcut-fe package/lean/shortcut-fe +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/fast-classifier package/lean/fast-classifier +cp -f ../PATCH/duplicate/shortcut-fe ./package/base-files/files/etc/init.d +#wget -qO - https://github.com/AmadeusGhost/lede/commit/5e95fd8572d5727ccbfe199efbd5d98297d8643b.patch | patch -p1 + +##获取额外package +#(不用注释这里的任何东西,这不会对提升action的执行速度起到多大的帮助 +#(不需要的包直接修改seed就好 +#luci-app-compressed-memory +wget -O- https://patch-diff.githubusercontent.com/raw/openwrt/openwrt/pull/2840.patch | patch -p1 +mkdir ./package/new +cp -rf ../NoTengoBattery/feeds/luci/applications/luci-app-compressed-memory ./package/new/luci-app-compressed-memory +sed -i 's,include ../..,include $(TOPDIR)/feeds/luci,g' ./package/new/luci-app-compressed-memory/Makefile +rm -rf ./package/system/compressed-memory +cp -rf ../NoTengoBattery/package/system/compressed-memory ./package/system/compressed-memory +#更换cryptodev-linux +rm -rf ./package/kernel/cryptodev-linux +svn co https://github.com/project-openwrt/openwrt/branches/master/package/kernel/cryptodev-linux package/kernel/cryptodev-linux +#降级openssl(解决性能问题 +rm -rf ./package/libs/openssl +svn co -r 90110 https://github.com/openwrt/openwrt/trunk/package/libs/openssl package/libs/openssl +#更换htop +rm -rf ./feeds/packages/admin/htop +svn co https://github.com/openwrt/packages/trunk/admin/htop feeds/packages/admin/htop +#更换lzo +svn co https://github.com/openwrt/packages/trunk/libs/lzo feeds/packages/libs/lzo +ln -sf ../../../feeds/packages/libs/lzo ./package/feeds/packages/lzo +#更换curl +rm -rf ./package/network/utils/curl +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/utils/curl package/network/utils/curl +#更换Node版本 +rm -rf ./feeds/packages/lang/node +svn co https://github.com/nxhack/openwrt-node-packages/trunk/node feeds/packages/lang/node +rm -rf ./feeds/packages/lang/node-arduino-firmata +svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-arduino-firmata feeds/packages/lang/node-arduino-firmata +rm -rf ./feeds/packages/lang/node-cylon +svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-cylon feeds/packages/lang/node-cylon +rm -rf ./feeds/packages/lang/node-hid +svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-hid feeds/packages/lang/node-hid +rm -rf ./feeds/packages/lang/node-homebridge +svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-homebridge feeds/packages/lang/node-homebridge +rm -rf ./feeds/packages/lang/node-serialport +svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-serialport feeds/packages/lang/node-serialport +rm -rf ./feeds/packages/lang/node-serialport-bindings +svn co https://github.com/nxhack/openwrt-node-packages/trunk/node-serialport-bindings feeds/packages/lang/node-serialport-bindings +#更换libcap +rm -rf ./feeds/packages/libs/libcap/ +svn co https://github.com/openwrt/packages/trunk/libs/libcap feeds/packages/libs/libcap +#更换GCC版本 +rm -rf ./feeds/packages/devel/gcc +svn co https://github.com/openwrt/packages/trunk/devel/gcc feeds/packages/devel/gcc +#更换Golang版本 +rm -rf ./feeds/packages/lang/golang +svn co https://github.com/openwrt/packages/trunk/lang/golang feeds/packages/lang/golang +#python +svn co https://github.com/openwrt/packages/trunk/lang/python/python-cached-property feeds/packages/lang/python/python-cached-property +ln -sf ../../../feeds/packages/lang/python/python-cached-property ./package/feeds/packages/python-cached-property +svn co https://github.com/openwrt/packages/trunk/lang/python/python-distro feeds/packages/lang/python/python-distro +ln -sf ../../../feeds/packages/lang/python/python-distro ./package/feeds/packages/python-distro +svn co https://github.com/openwrt/packages/trunk/lang/python/python-docopt feeds/packages/lang/python/python-docopt +ln -sf ../../../feeds/packages/lang/python/python-docopt ./package/feeds/packages/python-docopt +svn co https://github.com/openwrt/packages/trunk/lang/python/python-docker feeds/packages/lang/python/python-docker +ln -sf ../../../feeds/packages/lang/python/python-docker ./package/feeds/packages/python-docker +svn co https://github.com/openwrt/packages/trunk/lang/python/python-dockerpty feeds/packages/lang/python/python-dockerpty +ln -sf ../../../feeds/packages/lang/python/python-dockerpty ./package/feeds/packages/python-dockerpty +svn co https://github.com/openwrt/packages/trunk/lang/python/python-dotenv feeds/packages/lang/python/python-dotenv +ln -sf ../../../feeds/packages/lang/python/python-dotenv ./package/feeds/packages/python-dotenv +svn co https://github.com/openwrt/packages/trunk/lang/python/python-jsonschema feeds/packages/lang/python/python-jsonschema +ln -sf ../../../feeds/packages/lang/python/python-jsonschema ./package/feeds/packages/python-jsonschema +svn co https://github.com/openwrt/packages/trunk/lang/python/python-texttable feeds/packages/lang/python/python-texttable +ln -sf ../../../feeds/packages/lang/python/python-texttable ./package/feeds/packages/python-texttable +svn co https://github.com/openwrt/packages/trunk/lang/python/python-websocket-client feeds/packages/lang/python/python-websocket-client +ln -sf ../../../feeds/packages/lang/python/python-websocket-client ./package/feeds/packages/python-websocket-client +svn co https://github.com/openwrt/packages/trunk/lang/python/python-paramiko feeds/packages/lang/python/python-paramiko +ln -sf ../../../feeds/packages/lang/python/python-paramiko ./package/feeds/packages/python-paramiko +svn co https://github.com/openwrt/packages/trunk/lang/python/python-pynacl feeds/packages/lang/python/python-pynacl +ln -sf ../../../feeds/packages/lang/python/python-pynacl ./package/feeds/packages/python-pynacl +#beardropper +git clone --depth 1 https://github.com/NateLol/luci-app-beardropper.git package/luci-app-beardropper +sed -i 's/"luci.fs"/"luci.sys".net/g' package/luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua +sed -i '/firewall/d' package/luci-app-beardropper/root/etc/uci-defaults/luci-beardropper +#luci-app-freq +svn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/luci-app-cpufreq package/lean/luci-app-cpufreq +patch -p1 < ../PATCH/new/package/luci-app-freq.patch +#京东签到 +git clone --depth 1 https://github.com/jerrykuku/node-request.git package/new/node-request +git clone --depth 1 https://github.com/jerrykuku/luci-app-jd-dailybonus.git package/new/luci-app-jd-dailybonus +#arpbind +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-arpbind package/lean/luci-app-arpbind +#Adbyby +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-adbyby-plus package/lean/luci-app-adbyby-plus +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/adbyby package/lean/adbyby +#访问控制 +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-accesscontrol package/lean/luci-app-accesscontrol +cp -rf ../PATCH/duplicate/luci-app-control-weburl ./package/new/luci-app-control-weburl +#AutoCore +svn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/autocore package/lean/autocore +svn co https://github.com/project-openwrt/packages/trunk/utils/coremark feeds/packages/utils/coremark +ln -sf ../../../feeds/packages/utils/coremark ./package/feeds/packages/coremark +sed -i 's,default n,default y,g' feeds/packages/utils/coremark/Makefile +#迅雷快鸟 +#svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-xlnetacc package/lean/luci-app-xlnetacc +git clone --depth 1 https://github.com/garypang13/luci-app-xlnetacc.git package/lean/luci-app-xlnetacc +#DDNS +rm -rf ./feeds/packages/net/ddns-scripts +rm -rf ./feeds/luci/applications/luci-app-ddns +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ddns-scripts_aliyun package/lean/ddns-scripts_aliyun +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ddns-scripts_dnspod package/lean/ddns-scripts_dnspod +svn co https://github.com/openwrt/packages/branches/openwrt-18.06/net/ddns-scripts feeds/packages/net/ddns-scripts +svn co https://github.com/openwrt/luci/branches/openwrt-18.06/applications/luci-app-ddns feeds/luci/applications/luci-app-ddns +#Pandownload +svn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/pandownload-fake-server package/lean/pandownload-fake-server +#oled +git clone -b master --depth 1 https://github.com/NateLol/luci-app-oled.git package/new/luci-app-oled +#网易云解锁 +git clone --depth 1 https://github.com/project-openwrt/luci-app-unblockneteasemusic.git package/new/UnblockNeteaseMusic +#定时重启 +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-autoreboot package/lean/luci-app-autoreboot +#argon主题 +git clone -b master --depth 1 https://github.com/jerrykuku/luci-theme-argon.git package/new/luci-theme-argon +git clone -b master --depth 1 https://github.com/jerrykuku/luci-app-argon-config.git package/new/luci-app-argon-config +#edge主题 +git clone -b master --depth 1 https://github.com/garypang13/luci-theme-edge.git package/new/luci-theme-edge +#AdGuard +cp -rf ../openwrt-lienol/package/diy/luci-app-adguardhome ./package/new/luci-app-adguardhome +cp -rf ../openwrt-lienol/package/diy/adguardhome ./package/new/adguardhome +#svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ntlf9t/AdGuardHome package/new/AdGuardHome +#ChinaDNS +git clone -b luci --depth 1 https://github.com/pexcn/openwrt-chinadns-ng.git package/new/luci-app-chinadns-ng +git clone -b master --depth 1 https://github.com/pexcn/openwrt-chinadns-ng.git package/new/chinadns-ng +#VSSR +git clone -b master --depth 1 https://github.com/jerrykuku/luci-app-vssr.git package/lean/luci-app-vssr +git clone -b master --depth 1 https://github.com/jerrykuku/lua-maxminddb.git package/lean/lua-maxminddb +sed -i 's,default n,default y,g' package/lean/luci-app-vssr/Makefile +sed -i '/V2ray:v2ray/d' package/lean/luci-app-vssr/Makefile +sed -i 's,ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305,ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256,g' package/lean/luci-app-vssr/root/usr/share/vssr/genconfig_trojan.lua +sed -i 's,TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256,TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256,g' package/lean/luci-app-vssr/root/usr/share/vssr/genconfig_trojan.lua +#SSRP +#svn co https://github.com/fw876/helloworld/trunk/luci-app-ssr-plus package/lean/luci-app-ssr-plus +svn co https://github.com/Mattraks/helloworld/branches/Preview/luci-app-ssr-plus package/lean/luci-app-ssr-plus +rm -rf ./package/lean/luci-app-ssr-plus/po/zh_Hans +pushd package/lean +#wget -qO - https://patch-diff.githubusercontent.com/raw/fw876/helloworld/pull/271.patch | patch -p1 +popd +sed -i 's,default n,default y,g' package/lean/luci-app-ssr-plus/Makefile +sed -i '/V2ray:v2ray/d' package/lean/luci-app-ssr-plus/Makefile +#sed -i 's,ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305,ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256,g' package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua +#sed -i 's,TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256,TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256,g' package/lean/luci-app-ssr-plus/root/usr/share/shadowsocksr/gentrojanconfig.lua +#SSRP依赖 +rm -rf ./feeds/packages/net/kcptun +rm -rf ./feeds/packages/net/shadowsocks-libev +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/shadowsocksr-libev package/lean/shadowsocksr-libev +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/pdnsd-alt package/lean/pdnsd +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/kcptun package/lean/kcptun +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/srelay package/lean/srelay +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/microsocks package/lean/microsocks +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/dns2socks package/lean/dns2socks +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/redsocks2 package/lean/redsocks2 +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/proxychains-ng package/lean/proxychains-ng +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ipt2socks package/lean/ipt2socks +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/simple-obfs package/lean/simple-obfs +svn co https://github.com/coolsnowwolf/packages/trunk/net/shadowsocks-libev package/lean/shadowsocks-libev +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/trojan package/lean/trojan +svn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/tcpping package/lean/tcpping +svn co https://github.com/fw876/helloworld/trunk/naiveproxy package/lean/naiveproxy +#PASSWALL +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/luci-app-passwall package/new/luci-app-passwall +sed -i 's,default n,default y,g' package/new/luci-app-passwall/Makefile +sed -i '/V2ray:v2ray/d' package/new/luci-app-passwall/Makefile +sed -i 's,ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305,ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256,g' package/new/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua +sed -i 's,TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256,TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256,g' package/new/luci-app-passwall/luasrc/model/cbi/passwall/server/api/trojan.lua +cp -f ../PATCH/new/script/move_2_services.sh ./package/new/luci-app-passwall/move_2_services.sh +pushd package/new/luci-app-passwall +bash move_2_services.sh +popd +rm -rf ./feeds/packages/net/https-dns-proxy +svn co https://github.com/Lienol/openwrt-packages/trunk/net/https-dns-proxy feeds/packages/net/https-dns-proxy +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/tcping package/new/tcping +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/trojan-go package/new/trojan-go +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/brook package/new/brook +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/trojan-plus package/new/trojan-plus +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/ssocks package/new/ssocks +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/xray package/new/xray +sed -i 's,default n,default y,g' package/new/xray/Makefile +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/v2ray package/new/v2ray +svn co https://github.com/xiaorouji/openwrt-passwall/trunk/v2ray-plugin package/new/v2ray-plugin +#luci-app-cpulimit +cp -rf ../PATCH/duplicate/luci-app-cpulimit ./package/lean/luci-app-cpulimit +svn co https://github.com/project-openwrt/openwrt/branches/master/package/ntlf9t/cpulimit package/lean/cpulimit +#订阅转换 +svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/subconverter package/new/subconverter +svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/jpcre2 package/new/jpcre2 +svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/rapidjson package/new/rapidjson +svn co https://github.com/project-openwrt/openwrt/branches/openwrt-19.07/package/ctcgfw/duktape package/new/duktape +#清理内存 +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-ramfree package/lean/luci-app-ramfree +#打印机 +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-usb-printer package/lean/luci-app-usb-printer +#流量监视 +git clone -b master --depth 1 https://github.com/brvphoenix/wrtbwmon.git package/new/wrtbwmon +git clone -b master --depth 1 https://github.com/brvphoenix/luci-app-wrtbwmon.git package/new/luci-app-wrtbwmon +#流量监管 +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-netdata package/lean/luci-app-netdata +#OpenClash +git clone -b master --depth 1 https://github.com/vernesong/OpenClash.git package/new/luci-app-openclash +#SeverChan +git clone -b master --depth 1 https://github.com/tty228/luci-app-serverchan.git package/new/luci-app-serverchan +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/utils/iputils package/network/utils/iputils +#SmartDNS +cp -rf ../packages-lienol/net/smartdns ./package/new/smartdns +cp -rf ../luci-lienol/applications/luci-app-smartdns ./package/new/luci-app-smartdns +sed -i 's,include ../..,include $(TOPDIR)/feeds/luci,g' ./package/new/luci-app-smartdns/Makefile +#上网APP过滤 +git clone -b master --depth 1 https://github.com/destan19/OpenAppFilter.git package/new/OpenAppFilter +#Docker +svn co https://github.com/lisaac/luci-app-dockerman/trunk/applications/luci-app-dockerman package/luci-app-dockerman +sed -i 's/+docker-ce/+docker \\\n\t+dockerd/g' ./package/luci-app-dockerman/Makefile +svn co https://github.com/lisaac/luci-lib-docker/trunk/collections/luci-lib-docker package/luci-lib-docker +svn co https://github.com/openwrt/packages/trunk/utils/docker-compose feeds/packages/utils/docker-compose +ln -sf ../../../feeds/packages/utils/docker-compose ./package/feeds/packages/docker-compose +svn co https://github.com/openwrt/packages/trunk/utils/docker feeds/packages/utils/docker +ln -sf ../../../feeds/packages/utils/docker ./package/feeds/packages/docker +svn co https://github.com/openwrt/packages/trunk/utils/dockerd feeds/packages/utils/dockerd +sed -i 's,default n,default y,g' feeds/packages/utils/dockerd/Config.in +ln -sf ../../../feeds/packages/utils/dockerd ./package/feeds/packages/dockerd +svn co https://github.com/openwrt/packages/trunk/utils/cgroupfs-mount feeds/packages/utils/cgroupfs-mount +ln -sf ../../../feeds/packages/utils/cgroupfs-mount ./package/feeds/packages/cgroupfs-mount +svn co https://github.com/openwrt/packages/trunk/utils/containerd feeds/packages/utils/containerd +ln -sf ../../../feeds/packages/utils/containerd ./package/feeds/packages/containerd +svn co https://github.com/openwrt/packages/trunk/utils/libnetwork feeds/packages/utils/libnetwork +ln -sf ../../../feeds/packages/utils/libnetwork ./package/feeds/packages/libnetwork +svn co https://github.com/openwrt/packages/trunk/utils/tini feeds/packages/utils/tini +ln -sf ../../../feeds/packages/utils/tini ./package/feeds/packages/tini +svn co https://github.com/openwrt/packages/trunk/utils/runc feeds/packages/utils/runc +ln -sf ../../../feeds/packages/utils/runc ./package/feeds/packages/runc +svn co https://github.com/openwrt/packages/trunk/utils/yq feeds/packages/utils/yq +ln -sf ../../../feeds/packages/utils/yq ./package/feeds/packages/yq +rm -rf ./feeds/packages/utils/lvm2 +svn co https://github.com/openwrt/packages/trunk/utils/lvm2 feeds/packages/utils/lvm2 +#补全部分依赖(实际上并不会用到 +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libnetfilter-log package/libs/libnetfilter-log +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libnetfilter-queue package/libs/libnetfilter-queue +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libnetfilter-cttimeout package/libs/libnetfilter-cttimeout +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libnetfilter-cthelper package/libs/libnetfilter-cthelper +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/utils/fuse package/utils/fuse +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/network/services/samba36 package/network/services/samba36 +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libconfig package/libs/libconfig +svn co https://github.com/openwrt/openwrt/branches/openwrt-19.07/package/libs/libusb-compat package/libs/libusb-compat +svn co https://github.com/openwrt/packages/trunk/libs/nghttp2 feeds/packages/libs/nghttp2 +ln -sf ../../../feeds/packages/libs/nghttp2 ./package/feeds/packages/nghttp2 +svn co https://github.com/openwrt/packages/trunk/libs/libcap-ng feeds/packages/libs/libcap-ng +ln -sf ../../../feeds/packages/libs/libcap-ng ./package/feeds/packages/libcap-ng +rm -rf ./feeds/packages/utils/collectd +svn co https://github.com/openwrt/packages/trunk/utils/collectd feeds/packages/utils/collectd +#ipv6-helper +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/ipv6-helper package/lean/ipv6-helper +#IPSEC +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-ipsec-vpnd package/lean/luci-app-ipsec-vpnd +#Zerotier +svn co https://github.com/project-openwrt/openwrt/branches/master/package/lean/luci-app-zerotier package/lean/luci-app-zerotier +cp -f ../PATCH/new/script/move_2_services.sh ./package/lean/luci-app-zerotier/move_2_services.sh +pushd package/lean/luci-app-zerotier +bash move_2_services.sh +popd +rm -rf ./feeds/packages/net/zerotier/files/etc/init.d/zerotier +#UPNP(回滚以解决某些沙雕设备的沙雕问题 +rm -rf ./feeds/packages/net/miniupnpd +svn co https://github.com/coolsnowwolf/packages/trunk/net/miniupnpd feeds/packages/net/miniupnpd +#KMS +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/luci-app-vlmcsd package/lean/luci-app-vlmcsd +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/vlmcsd package/lean/vlmcsd +#frp +rm -f ./feeds/luci/applications/luci-app-frps +rm -f ./feeds/luci/applications/luci-app-frpc +rm -rf ./feeds/packages/net/frp +rm -f ./package/feeds/packages/frp +git clone --depth 1 https://github.com/lwz322/luci-app-frps.git package/lean/luci-app-frps +git clone --depth 1 https://github.com/kuoruan/luci-app-frpc.git package/lean/luci-app-frpc +svn co https://github.com/coolsnowwolf/lede/trunk/package/lean/frp package/feeds/packages/frp +#花生壳 +svn co https://github.com/teasiu/dragino2/trunk/package/teasiu/luci-app-phtunnel package/new/luci-app-phtunnel +svn co https://github.com/teasiu/dragino2/trunk/package/teasiu/luci-app-oray package/new/luci-app-oray +svn co https://github.com/teasiu/dragino2/trunk/package/teasiu/phtunnel package/new/phtunnel +#腾讯DDNS +#svn co https://github.com/Tencent-Cloud-Plugins/tencentcloud-openwrt-plugin-ddns/trunk/tencentcloud_ddns package/lean/luci-app-tencentddns +svn co https://github.com/1715173329/tencentcloud-openwrt-plugin-ddns/trunk/tencentcloud_ddns package/lean/luci-app-tencentddns +#阿里DDNS +svn co https://github.com/kenzok8/openwrt-packages/trunk/luci-app-aliddns package/new/luci-app-aliddns +#翻译及部分功能优化 +cp -rf ../PATCH/duplicate/addition-trans-zh-master ./package/lean/lean-translate + +##R2S相关 +#crypto +echo ' +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_AES_ARM64=y +CONFIG_CRYPTO_AES_ARM64_BS=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_CRYPTO_CHACHA20=y +CONFIG_CRYPTO_CHACHA20_NEON=y +CONFIG_CRYPTO_CRYPTD=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA256_ARM64=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +# CONFIG_CRYPTO_SHA3_ARM64 is not set +CONFIG_CRYPTO_SHA512_ARM64=y +# CONFIG_CRYPTO_SHA512_ARM64_CE is not set +CONFIG_CRYPTO_SIMD=y +# CONFIG_CRYPTO_SM3_ARM64_CE is not set +# CONFIG_CRYPTO_SM4_ARM64_CE is not set +' >> ./target/linux/rockchip/armv8/config-5.4 + +##最后的收尾工作 +#Lets Fuck +mkdir package/base-files/files/usr/bin +cp -f ../PATCH/new/script/fuck package/base-files/files/usr/bin/fuck +cp -f ../PATCH/new/script/chinadnslist package/base-files/files/usr/bin/chinadnslist +#最大连接 +sed -i 's/16384/65536/g' package/kernel/linux/files/sysctl-nf-conntrack.conf +#删除已有配置 +rm -rf .config +#预配置一些插件 +cp -rf ../PATCH/files ./files +#授予权限 +chmod -R 755 ./ + +exit 0 diff --git a/SCRIPTS/03_convert_translation.sh b/SCRIPTS/03_convert_translation.sh new file mode 100644 index 000000000..c506bc728 --- /dev/null +++ b/SCRIPTS/03_convert_translation.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# [CTCGFW]Project-OpenWrt +# Use it under GPLv3, please. +# -------------------------------------------------------- +# Convert translation files zh-cn to zh_Hans +# The script is still in testing, welcome to report bugs. + +po_file="$({ find |grep -E "[a-z0-9]+\.zh\-cn.+po"; } 2>"/dev/null")" +for a in ${po_file} +do + [ -n "$(grep "Language: zh_CN" "$a")" ] && sed -i "s/Language: zh_CN/Language: zh_Hans/g" "$a" + po_new_file="$(echo -e "$a"|sed "s/zh-cn/zh_Hans/g")" + mv "$a" "${po_new_file}" 2>"/dev/null" +done + +po_file2="$({ find |grep "/zh-cn/" |grep "\.po"; } 2>"/dev/null")" +for b in ${po_file2} +do + [ -n "$(grep "Language: zh_CN" "$b")" ] && sed -i "s/Language: zh_CN/Language: zh_Hans/g" "$b" + po_new_file2="$(echo -e "$b"|sed "s/zh-cn/zh_Hans/g")" + mv "$b" "${po_new_file2}" 2>"/dev/null" +done + +lmo_file="$({ find |grep -E "[a-z0-9]+\.zh_Hans.+lmo"; } 2>"/dev/null")" +for c in ${lmo_file} +do + lmo_new_file="$(echo -e "$c"|sed "s/zh_Hans/zh-cn/g")" + mv "$c" "${lmo_new_file}" 2>"/dev/null" +done + +lmo_file2="$({ find |grep "/zh_Hans/" |grep "\.lmo"; } 2>"/dev/null")" +for d in ${lmo_file2} +do + lmo_new_file2="$(echo -e "$d"|sed "s/zh_Hans/zh-cn/g")" + mv "$d" "${lmo_new_file2}" 2>"/dev/null" +done + +po_dir="$({ find |grep "/zh-cn" |sed "/\.po/d" |sed "/\.lmo/d"; } 2>"/dev/null")" +for e in ${po_dir} +do + po_new_dir="$(echo -e "$e"|sed "s/zh-cn/zh_Hans/g")" + mv "$e" "${po_new_dir}" 2>"/dev/null" +done + +makefile_file="$({ find|grep Makefile |sed "/Makefile./d"; } 2>"/dev/null")" +for f in ${makefile_file} +do + [ -n "$(grep "zh-cn" "$f")" ] && sed -i "s/zh-cn/zh_Hans/g" "$f" + [ -n "$(grep "zh_Hans.lmo" "$f")" ] && sed -i "s/zh_Hans.lmo/zh-cn.lmo/g" "$f" +done +exit 0 diff --git a/SCRIPTS/04_remove_upx.sh b/SCRIPTS/04_remove_upx.sh new file mode 100644 index 000000000..6f7612018 --- /dev/null +++ b/SCRIPTS/04_remove_upx.sh @@ -0,0 +1,12 @@ +#!/bin/bash +# [CTCGFW]Project-OpenWrt +# Use it under GPLv3, please. +# -------------------------------------------------------- +# Remove upx commands + +makefile_file="$({ find package|grep Makefile |sed "/Makefile./d"; } 2>"/dev/null")" +for a in ${makefile_file} +do + [ -n "$(grep "upx" "$a")" ] && sed -i "/upx/d" "$a" +done +exit 0 \ No newline at end of file diff --git a/SCRIPTS/05_create_acl_for_luci.sh b/SCRIPTS/05_create_acl_for_luci.sh new file mode 100644 index 000000000..db466bd0d --- /dev/null +++ b/SCRIPTS/05_create_acl_for_luci.sh @@ -0,0 +1,117 @@ +#!/bin/bash +# [CTCGFW]Project-OpenWrt +# Use it under GPLv3, please. +# -------------------------------------------------------- +# Script for creating ACL file for each LuCI APP + +error_font="\033[31m[Error]$\033[0m " +success_font="\033[32m[Success]\033[0m " +info_font="\033[36m[Info]\033[0m " + +function echo_green_bg(){ + echo -e "\033[42;37m$1\033[0m" +} + +function echo_yellow_bg(){ + echo -e "\033[43;37m$1\033[0m" +} + +function echo_red_bg(){ + echo -e "\033[41;37m$1\033[0m" +} + +function clean_outdated_files(){ + rm -f "create_acl_for_luci.err" "create_acl_for_luci.warn" "create_acl_for_luci.ok" +} + +function check_if_acl_exist(){ + ls "$1"/root/usr/share/rpcd/acl.d/*.json >/dev/null 2>&1 && return 0 || return 1 +} + +function check_config_files(){ + [ "$(ls "$1"/root/etc/config/* 2>/dev/null | wc -l)" -ne "1" ] && return 0 || return 1 +} + +function get_config_name(){ + ls "$1"/root/etc/config/* 2>/dev/null | awk -F '/' '{print $NF}' +} + +function create_acl_file(){ + mkdir -p "$1" + echo -e "{ + \"$2\": { + \"description\": \"Grant UCI access for $2\", + \"read\": { + \"uci\": [ \"$3\" ] + }, + \"write\": { + \"uci\": [ \"$3\" ] + } + } +}" > "$1/$2.json" +} + +function auto_create_acl(){ + luci_app_list="$(find package -maxdepth 2 | grep -Eo "package/.+/luci-app-[a-zA-Z0-9_-]+" | sort -s)" + + [ "$(echo -e "${luci_app_list}" | wc -l)" -gt "0" ] && for i in ${luci_app_list} + do + if check_if_acl_exist "$i"; then + echo_yellow_bg "$i: has ACL file already, skipping..." | tee -a create_acl_for_luci.warn + elif check_config_files "$i"; then + echo_red_bg "$i: has no/multi config file(s), skipping..." | tee -a create_acl_for_luci.err + else + create_acl_file "$i/root/usr/share/rpcd/acl.d" "${i##*/}" "$(get_config_name "$i")" + echo_green_bg "$i: ACL file has been generated." | tee -a create_acl_for_luci.ok + fi + done +} + +while getopts "achml:n:p:" input_arg +do + case $input_arg in + a) + clean_outdated_files + auto_create_acl + exit + ;; + m) + manual_mode=1 + ;; + p) + acl_path="$OPTARG" + ;; + l) + luci_name="$OPTARG" + ;; + n) + conf_name="$OPTARG" + ;; + c) + clean_outdated_files + exit + ;; + h|?|*) + echo -e "${info_font}Usage: $0 [-a|-m (-p ) -l -n |-c]" + exit 2 + ;; + esac +done + +[ "$?" -ne "0" ] && exit + +if [ "*${manual_mode}*" == "*1*" ]; then + acl_path="${acl_path:-root/usr/share/rpcd/acl.d}" + if create_acl_file "${acl_path}" "${luci_name}" "${conf_name}"; then + echo -e "${success_font}Output file: $(ls "${acl_path}/${luci_name}.json")" + echo_green_bg "$(cat "${acl_path}/${luci_name}.json")" + echo_green_bg "${luci_name}: ACL file has been generated." >> "create_acl_for_luci.ok" + [ -e "create_acl_for_luci.err" ] && sed -i "/${luci_name}/d" "create_acl_for_luci.err" + else + echo -e "${error_font}Failed to create file ${acl_path}/${luci_name}.json" + echo_red_bg "${luci_name}: Failed to create ACL file." >> "create_acl_for_luci.err" + fi +else + echo -e "${info_font}Usage: $0 [-a|-m -p -l -n |-c]" + exit 2 +fi diff --git a/SCRIPTS/06_cleaning.sh b/SCRIPTS/06_cleaning.sh new file mode 100644 index 000000000..e7c4b773a --- /dev/null +++ b/SCRIPTS/06_cleaning.sh @@ -0,0 +1,5 @@ +#!/bin/bash +rm -rf `ls | grep -v "squashfs"` +gzip -d *.gz +gzip *.img +exit 0 diff --git a/SEED/config_docker.seed b/SEED/config_docker.seed new file mode 100644 index 000000000..fcb05b986 --- /dev/null +++ b/SEED/config_docker.seed @@ -0,0 +1,187 @@ +CONFIG_TARGET_rockchip=y +CONFIG_TARGET_rockchip_armv8=y +CONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y +CONFIG_TARGET_ROOTFS_PARTSIZE=960 + +CONFIG_DEVEL=y +CONFIG_EXTRA_OPTIMIZATION="-fno-caller-saves -fno-plt -funsafe-math-optimizations -ftree-vectorize" +CONFIG_TARGET_OPTIONS=y +CONFIG_TARGET_OPTIMIZATION="-O2 -pipe -march=armv8-a+crypto+crc" + +CONFIG_LUCI_LANG_zh_Hans=y +CONFIG_LUCI_LANG_zh-cn=y +CONFIG_PACKAGE_kmod-usb-net=y + +CONFIG_PACKAGE_kmod-usb-net-rtl8152-vendor=y + +CONFIG_PACKAGE_kmod-shortcut-fe=y +# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set +CONFIG_PACKAGE_kmod-fast-classifier=y +CONFIG_KERNEL_BUILD_DOMAIN="buildhost" +CONFIG_KERNEL_BUILD_USER="builder" +# CONFIG_LUCI_CSSTIDY is not set +# CONFIG_LUCI_JSMIN is not set + +CONFIG_OPENSSL_ENGINE=y +CONFIG_OPENSSL_OPTIMIZE_SPEED=y +CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=y +CONFIG_OPENSSL_WITH_ASM=y +CONFIG_PACKAGE_libopenssl-devcrypto=y +CONFIG_PACKAGE_libopenssl-conf=y + +CONFIG_PACKAGE_kmod-crypto-des=y +CONFIG_PACKAGE_kmod-crypto-rng=y +CONFIG_PACKAGE_kmod-crypto-sha256=y +CONFIG_PACKAGE_kmod-crypto-sha1=y +CONFIG_PACKAGE_kmod-crypto-md5=y +CONFIG_PACKAGE_kmod-crypto-cbc=y +CONFIG_PACKAGE_kmod-crypto-ctr=y +CONFIG_PACKAGE_kmod-crypto-gcm=y +CONFIG_PACKAGE_kmod-crypto-aes=y + +CONFIG_PACKAGE_rng-tools=y + +CONFIG_PACKAGE_addition-trans-zh=y +CONFIG_PACKAGE_arm-trusted-firmware-rockchip=y +CONFIG_PACKAGE_autocore-arm=y +CONFIG_PACKAGE_cgi-io=y +CONFIG_PACKAGE_chinadns-ng=y +CONFIG_PACKAGE_coremark=y +CONFIG_PACKAGE_ethtool=y +CONFIG_PACKAGE_AdGuardHome=y +CONFIG_PACKAGE_htop=y +CONFIG_PACKAGE_ddns-scripts_aliyun=y +CONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y +CONFIG_PACKAGE_ddns-scripts_dnspod=y +CONFIG_PACKAGE_diffutils=y +# CONFIG_PACKAGE_dnsmasq is not set +CONFIG_PACKAGE_dnsmasq-full=y +CONFIG_PACKAGE_dnsmasq_full_auth=y +CONFIG_PACKAGE_dnsmasq_full_conntrack=y +CONFIG_PACKAGE_dnsmasq_full_dhcp=y +CONFIG_PACKAGE_dnsmasq_full_dhcpv6=y +CONFIG_PACKAGE_dnsmasq_full_dnssec=y +CONFIG_PACKAGE_dnsmasq_full_ipset=y +CONFIG_PACKAGE_dnsmasq_full_noid=y +CONFIG_PACKAGE_dnsmasq_full_tftp=y +CONFIG_PACKAGE_iptables-mod-fullconenat=y +CONFIG_PACKAGE_ip6tables-mod-fullconenat=y +CONFIG_PACKAGE_iptables-mod-nat-extra=y +CONFIG_PACKAGE_kmod-fs-f2fs=y +CONFIG_PACKAGE_kmod-ipt-nat6=y +CONFIG_PACKAGE_kmod-tcp-bbr=y +CONFIG_PACKAGE_kmod-tun=y +CONFIG_PACKAGE_libiwinfo=y +CONFIG_PACKAGE_libiwinfo-lua=y +CONFIG_PACKAGE_liblua=y +CONFIG_PACKAGE_liblucihttp=y +CONFIG_PACKAGE_liblucihttp-lua=y +CONFIG_PACKAGE_libubus-lua=y +CONFIG_PACKAGE_libustream-openssl=y +# CONFIG_PACKAGE_libustream-wolfssl is not set +CONFIG_PACKAGE_lua=y +CONFIG_PACKAGE_luci=y +CONFIG_PACKAGE_luci-app-control-weburl=y +CONFIG_PACKAGE_luci-app-adguardhome=y +CONFIG_PACKAGE_luci-app-argon-config=y +CONFIG_PACKAGE_luci-app-arpbind=y +CONFIG_PACKAGE_luci-app-autoreboot=y +CONFIG_PACKAGE_luci-app-beardropper=y +CONFIG_PACKAGE_luci-app-chinadns-ng=y +CONFIG_PACKAGE_luci-app-cpufreq=y +CONFIG_PACKAGE_luci-app-cpulimit=y +CONFIG_PACKAGE_luci-app-ddns=y +CONFIG_PACKAGE_luci-app-firewall=y +CONFIG_PACKAGE_luci-app-jd-dailybonus=y +#CONFIG_PACKAGE_luci-app-oaf=y +CONFIG_PACKAGE_luci-app-oled=y +CONFIG_PACKAGE_luci-app-openclash=y +CONFIG_PACKAGE_luci-app-opkg=y +CONFIG_PACKAGE_luci-app-ramfree=y +CONFIG_PACKAGE_luci-app-serverchan=y +CONFIG_PACKAGE_luci-app-smartdns=y +CONFIG_PACKAGE_luci-app-sqm=y +CONFIG_PACKAGE_luci-app-vlmcsd=y + +CONFIG_PACKAGE_luci-app-ssr-plus=y +CONFIG_PACKAGE_luci-app-passwall=y + +CONFIG_PACKAGE_luci-app-unblockneteasemusic=y +CONFIG_PACKAGE_luci-app-upnp=y +CONFIG_PACKAGE_luci-app-usb-printer=y +CONFIG_PACKAGE_luci-app-wol=y +CONFIG_PACKAGE_luci-app-wrtbwmon=y +CONFIG_PACKAGE_luci-app-xlnetacc=y +CONFIG_PACKAGE_luci-base=y +CONFIG_PACKAGE_luci-compat=y +CONFIG_PACKAGE_luci-lib-ip=y +CONFIG_PACKAGE_luci-lib-ipkg=y +CONFIG_PACKAGE_luci-lib-jsonc=y +CONFIG_PACKAGE_luci-lib-nixio=y +CONFIG_PACKAGE_luci-mod-admin-full=y +CONFIG_PACKAGE_luci-mod-network=y +CONFIG_PACKAGE_luci-mod-status=y +CONFIG_PACKAGE_luci-mod-system=y +CONFIG_PACKAGE_luci-proto-ipv6=y +CONFIG_PACKAGE_luci-proto-ppp=y +CONFIG_PACKAGE_luci-theme-argon=y +CONFIG_PACKAGE_luci-theme-bootstrap=y +CONFIG_PACKAGE_openssl-util=y +#CONFIG_PACKAGE_pandownload-fake-server=y +CONFIG_PACKAGE_rpcd=y +CONFIG_PACKAGE_rpcd-mod-file=y +CONFIG_PACKAGE_rpcd-mod-iwinfo=y +CONFIG_PACKAGE_rpcd-mod-luci=y +CONFIG_PACKAGE_rpcd-mod-rrdns=y +CONFIG_PACKAGE_subconverter=y +CONFIG_PACKAGE_uhttpd=y +CONFIG_PACKAGE_wget=y +# CONFIG_COLLECT_KERNEL_DEBUG is not set +# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set + +CONFIG_PACKAGE_frps=y +CONFIG_PACKAGE_luci-app-frps=y +CONFIG_PACKAGE_frpc=y +CONFIG_PACKAGE_luci-app-frpc=y + +CONFIG_PACKAGE_zerotier=y +CONFIG_PACKAGE_luci-app-zerotier=y + +CONFIG_PACKAGE_zram-swap=n +CONFIG_PACKAGE_luci-app-compressed-memory=y +CONFIG_PACKAGE_block-mount=y +CONFIG_PACKAGE_swap-utils=y + +CONFIG_PACKAGE_libcurl=y +# CONFIG_LIBCURL_MBEDTLS is not set +# CONFIG_LIBCURL_WOLFSSL is not set +CONFIG_LIBCURL_OPENSSL=y +# CONFIG_LIBCURL_GNUTLS is not set +# CONFIG_LIBCURL_NOSSL is not set + +#docker +CONFIG_PACKAGE_luci-app-dockerman=y +CONFIG_PACKAGE_luci-app-dockerman_INCLUDE_docker_ce=y +CONFIG_PACKAGE_luci-app-dockerman_INCLUDE_ttyd=n + +#Support some USB wireless +CONFIG_PACKAGE_hostapd=y +CONFIG_PACKAGE_hostapd-basic=y +CONFIG_PACKAGE_hostapd-utils=y +CONFIG_PACKAGE_hostapd-common=y +CONFIG_DRIVER_11AC_SUPPORT=y +CONFIG_DRIVER_11N_SUPPORT=y +CONFIG_DRIVER_11W_SUPPORT=y +CONFIG_PACKAGE_kmod-cfg80211=y +#CONFIG_PACKAGE_kmod-usb-net-rndis=y +CONFIG_PACKAGE_kmod-rtlwifi=y +CONFIG_PACKAGE_kmod-rtlwifi-btcoexist=y +CONFIG_PACKAGE_kmod-rtlwifi-usb=y +CONFIG_PACKAGE_iw=y +CONFIG_PACKAGE_iwinfo=y +CONFIG_PACKAGE_usb-modeswitch=y +CONFIG_PACKAGE_wpad=y +CONFIG_PACKAGE_wpad-mini=y +CONFIG_PACKAGE_wpa-supplicant=y +CONFIG_PACKAGE_kmod-rtl8192cu=y +CONFIG_PACKAGE_kmod-mt76x2u=y diff --git a/SEED/config_no_docker.seed b/SEED/config_no_docker.seed new file mode 100644 index 000000000..baa976ec4 --- /dev/null +++ b/SEED/config_no_docker.seed @@ -0,0 +1,159 @@ +CONFIG_TARGET_rockchip=y +CONFIG_TARGET_rockchip_armv8=y +CONFIG_TARGET_rockchip_armv8_DEVICE_friendlyarm_nanopi-r2s=y +CONFIG_TARGET_ROOTFS_PARTSIZE=960 + +CONFIG_DEVEL=y +CONFIG_EXTRA_OPTIMIZATION="-fno-caller-saves -fno-plt -funsafe-math-optimizations -ftree-vectorize" +CONFIG_TARGET_OPTIONS=y +CONFIG_TARGET_OPTIMIZATION="-O2 -pipe -mlittle-endian -mabi=lp64 -march=armv8-a+crypto+crc" + +CONFIG_LUCI_LANG_zh_Hans=y +CONFIG_LUCI_LANG_zh-cn=y +CONFIG_PACKAGE_kmod-usb-net=y + +CONFIG_PACKAGE_kmod-usb-net-rtl8152-vendor=y + +CONFIG_PACKAGE_kmod-shortcut-fe=y +# CONFIG_PACKAGE_kmod-shortcut-fe-cm is not set +CONFIG_PACKAGE_kmod-fast-classifier=y +CONFIG_KERNEL_BUILD_DOMAIN="buildhost" +CONFIG_KERNEL_BUILD_USER="builder" +# CONFIG_LUCI_CSSTIDY is not set +# CONFIG_LUCI_JSMIN is not set + +CONFIG_OPENSSL_ENGINE=y +CONFIG_OPENSSL_OPTIMIZE_SPEED=y +CONFIG_OPENSSL_PREFER_CHACHA_OVER_GCM=y +CONFIG_OPENSSL_WITH_ASM=y +CONFIG_PACKAGE_libopenssl-devcrypto=y +CONFIG_PACKAGE_libopenssl-conf=y + +CONFIG_PACKAGE_kmod-crypto-des=y +CONFIG_PACKAGE_kmod-crypto-rng=y +CONFIG_PACKAGE_kmod-crypto-sha256=y +CONFIG_PACKAGE_kmod-crypto-sha1=y +CONFIG_PACKAGE_kmod-crypto-md5=y +CONFIG_PACKAGE_kmod-crypto-cbc=y +CONFIG_PACKAGE_kmod-crypto-ctr=y +CONFIG_PACKAGE_kmod-crypto-gcm=y +CONFIG_PACKAGE_kmod-crypto-aes=y + +#CONFIG_PACKAGE_rng-tools=y + +CONFIG_PACKAGE_addition-trans-zh=y +CONFIG_PACKAGE_arm-trusted-firmware-rockchip=y +CONFIG_PACKAGE_autocore-arm=y +CONFIG_PACKAGE_ipv6helper=y +CONFIG_PACKAGE_cgi-io=y +CONFIG_PACKAGE_chinadns-ng=y +CONFIG_PACKAGE_coremark=y +CONFIG_PACKAGE_ethtool=y +CONFIG_PACKAGE_AdGuardHome=y +CONFIG_PACKAGE_htop=y +CONFIG_PACKAGE_ddns-scripts_aliyun=y +CONFIG_PACKAGE_ddns-scripts_cloudflare.com-v4=y +CONFIG_PACKAGE_ddns-scripts_dnspod=y +CONFIG_PACKAGE_diffutils=y +# CONFIG_PACKAGE_dnsmasq is not set +CONFIG_PACKAGE_dnsmasq-full=y +CONFIG_PACKAGE_dnsmasq_full_auth=y +CONFIG_PACKAGE_dnsmasq_full_conntrack=y +CONFIG_PACKAGE_dnsmasq_full_dhcp=y +CONFIG_PACKAGE_dnsmasq_full_dhcpv6=y +CONFIG_PACKAGE_dnsmasq_full_dnssec=y +CONFIG_PACKAGE_dnsmasq_full_ipset=y +CONFIG_PACKAGE_dnsmasq_full_noid=y +CONFIG_PACKAGE_dnsmasq_full_tftp=y +CONFIG_PACKAGE_iptables-mod-fullconenat=y +CONFIG_PACKAGE_ip6tables-mod-fullconenat=y +CONFIG_PACKAGE_iptables-mod-nat-extra=y +CONFIG_PACKAGE_kmod-fs-f2fs=y +CONFIG_PACKAGE_kmod-ipt-nat6=y +CONFIG_PACKAGE_kmod-tcp-bbr=y +CONFIG_PACKAGE_kmod-tun=y +CONFIG_PACKAGE_libiwinfo=y +CONFIG_PACKAGE_libiwinfo-lua=y +CONFIG_PACKAGE_liblua=y +CONFIG_PACKAGE_liblucihttp=y +CONFIG_PACKAGE_liblucihttp-lua=y +CONFIG_PACKAGE_libubus-lua=y +CONFIG_PACKAGE_libustream-openssl=y +# CONFIG_PACKAGE_libustream-wolfssl is not set +CONFIG_PACKAGE_lua=y +CONFIG_PACKAGE_luci=y +CONFIG_PACKAGE_luci-app-control-weburl=y +CONFIG_PACKAGE_luci-app-adguardhome=y +CONFIG_PACKAGE_luci-app-argon-config=y +CONFIG_PACKAGE_luci-app-arpbind=y +CONFIG_PACKAGE_luci-app-autoreboot=y +CONFIG_PACKAGE_luci-app-beardropper=y +CONFIG_PACKAGE_luci-app-chinadns-ng=y +CONFIG_PACKAGE_luci-app-cpufreq=y +CONFIG_PACKAGE_luci-app-cpulimit=y +CONFIG_PACKAGE_luci-app-ddns=y +CONFIG_PACKAGE_luci-app-firewall=y +CONFIG_PACKAGE_luci-app-jd-dailybonus=y +#CONFIG_PACKAGE_luci-app-oaf=y +CONFIG_PACKAGE_luci-app-oled=y +CONFIG_PACKAGE_luci-app-openclash=y +CONFIG_PACKAGE_luci-app-opkg=y +CONFIG_PACKAGE_luci-app-ramfree=y +CONFIG_PACKAGE_luci-app-serverchan=y +CONFIG_PACKAGE_luci-app-smartdns=y +CONFIG_PACKAGE_luci-app-sqm=y +CONFIG_PACKAGE_luci-app-vlmcsd=y +CONFIG_PACKAGE_luci-app-ssr-plus=y +CONFIG_PACKAGE_luci-app-passwall=y +CONFIG_PACKAGE_luci-app-unblockneteasemusic=y +CONFIG_PACKAGE_luci-app-upnp=y +CONFIG_PACKAGE_luci-app-usb-printer=y +CONFIG_PACKAGE_luci-app-wol=y +CONFIG_PACKAGE_luci-app-wrtbwmon=y +CONFIG_PACKAGE_luci-app-xlnetacc=y +CONFIG_PACKAGE_luci-base=y +CONFIG_PACKAGE_luci-compat=y +CONFIG_PACKAGE_luci-lib-ip=y +CONFIG_PACKAGE_luci-lib-ipkg=y +CONFIG_PACKAGE_luci-lib-jsonc=y +CONFIG_PACKAGE_luci-lib-nixio=y +CONFIG_PACKAGE_luci-mod-admin-full=y +CONFIG_PACKAGE_luci-mod-network=y +CONFIG_PACKAGE_luci-mod-status=y +CONFIG_PACKAGE_luci-mod-system=y +CONFIG_PACKAGE_luci-proto-ipv6=y +CONFIG_PACKAGE_luci-proto-ppp=y +CONFIG_PACKAGE_luci-theme-argon=y +CONFIG_PACKAGE_luci-theme-bootstrap=y +CONFIG_PACKAGE_openssl-util=y +#CONFIG_PACKAGE_pandownload-fake-server=y +CONFIG_PACKAGE_rpcd=y +CONFIG_PACKAGE_rpcd-mod-file=y +CONFIG_PACKAGE_rpcd-mod-iwinfo=y +CONFIG_PACKAGE_rpcd-mod-luci=y +CONFIG_PACKAGE_rpcd-mod-rrdns=y +CONFIG_PACKAGE_subconverter=y +CONFIG_PACKAGE_uhttpd=y +CONFIG_PACKAGE_wget=y +# CONFIG_COLLECT_KERNEL_DEBUG is not set +# CONFIG_OPENSSL_WITH_ERROR_MESSAGES is not set + +CONFIG_PACKAGE_frps=y +CONFIG_PACKAGE_luci-app-frps=y +CONFIG_PACKAGE_frpc=y +CONFIG_PACKAGE_luci-app-frpc=y + +CONFIG_PACKAGE_zerotier=y +CONFIG_PACKAGE_luci-app-zerotier=y + +CONFIG_PACKAGE_zram-swap=n +CONFIG_PACKAGE_luci-app-compressed-memory=y +CONFIG_PACKAGE_block-mount=y +CONFIG_PACKAGE_swap-utils=y + +CONFIG_PACKAGE_libcurl=y +# CONFIG_LIBCURL_MBEDTLS is not set +# CONFIG_LIBCURL_WOLFSSL is not set +CONFIG_LIBCURL_OPENSSL=y +# CONFIG_LIBCURL_GNUTLS is not set +# CONFIG_LIBCURL_NOSSL is not set diff --git a/SWITCH b/SWITCH new file mode 100644 index 000000000..6b7e489a1 --- /dev/null +++ b/SWITCH @@ -0,0 +1 @@ +2020年8月17日 diff --git a/onekeyr2s.sh b/onekeyr2s.sh new file mode 100644 index 000000000..ce84a6494 --- /dev/null +++ b/onekeyr2s.sh @@ -0,0 +1,18 @@ +#!/bin/bash +cp -r ./SCRIPTS/. ./ +bash 01_get_ready.sh +cd openwrt +cp -r ../SCRIPTS/. ./ +bash 02_prepare_package.sh +bash 03_convert_translation.sh +bash 04_remove_upx.sh +cp ../SEED/config_no_docker.seed .config +make defconfig +make download -j10 +chmod -R 755 ./ +let make_process=$(nproc)+1 +make toolchain/install -j${make_process} V=s +let make_process=$(nproc)+1 +make -j${make_process} V=s || make -j${make_process} V=s +cd bin/targets/rockchip/armv8 +/bin/bash ../../../../../SCRIPTS/05_cleaning.sh