Full Code of tindy2013/subconverter for AI

master 5b8d3af0d7b6 cached
508 files
5.1 MB
1.4M tokens
1572 symbols
1 requests
Download .txt
Showing preview only (5,431K chars total). Download the full file or copy to clipboard to get everything.
Repository: tindy2013/subconverter
Branch: master
Commit: 5b8d3af0d7b6
Files: 508
Total size: 5.1 MB

Directory structure:
gitextract_l4htcc51/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   └── workflows/
│       ├── build.yml
│       └── docker.yml
├── .gitignore
├── .travis.yml
├── CMakeLists.txt
├── LICENSE
├── README-cn.md
├── README-docker.md
├── README.md
├── base/
│   ├── base/
│   │   ├── GeneralClashConfig.yml
│   │   ├── all_base.tpl
│   │   ├── clash_provider_test.yml
│   │   ├── forcerule.yml
│   │   ├── loon.conf
│   │   ├── mellow.conf
│   │   ├── quan.conf
│   │   ├── quanx.conf
│   │   ├── shadowsocks_base.json
│   │   ├── simple_base.yml
│   │   ├── singbox.json
│   │   ├── surfboard.conf
│   │   └── surge.conf
│   ├── config/
│   │   ├── ACL4SSR.ini
│   │   ├── ACL4SSR_AdblockPlus.ini
│   │   ├── ACL4SSR_BackCN.ini
│   │   ├── ACL4SSR_Mini.ini
│   │   ├── ACL4SSR_Mini_Fallback.ini
│   │   ├── ACL4SSR_Mini_MultiMode.ini
│   │   ├── ACL4SSR_Mini_NoAuto.ini
│   │   ├── ACL4SSR_NoApple.ini
│   │   ├── ACL4SSR_NoAuto.ini
│   │   ├── ACL4SSR_NoAuto_NoApple.ini
│   │   ├── ACL4SSR_NoAuto_NoApple_NoMicrosoft.ini
│   │   ├── ACL4SSR_NoMicrosoft.ini
│   │   ├── ACL4SSR_Online.ini
│   │   ├── ACL4SSR_Online_AdblockPlus.ini
│   │   ├── ACL4SSR_Online_Full.ini
│   │   ├── ACL4SSR_Online_Full_AdblockPlus.ini
│   │   ├── ACL4SSR_Online_Full_Google.ini
│   │   ├── ACL4SSR_Online_Full_MultiMode.ini
│   │   ├── ACL4SSR_Online_Full_Netflix.ini
│   │   ├── ACL4SSR_Online_Full_NoAuto.ini
│   │   ├── ACL4SSR_Online_Mini.ini
│   │   ├── ACL4SSR_Online_Mini_AdblockPlus.ini
│   │   ├── ACL4SSR_Online_Mini_Fallback.ini
│   │   ├── ACL4SSR_Online_Mini_MultiCountry.ini
│   │   ├── ACL4SSR_Online_Mini_MultiMode.ini
│   │   ├── ACL4SSR_Online_Mini_NoAuto.ini
│   │   ├── ACL4SSR_Online_MultiCountry.ini
│   │   ├── ACL4SSR_Online_NoAuto.ini
│   │   ├── ACL4SSR_Online_NoReject.ini
│   │   ├── ACL4SSR_WithChinaIp.ini
│   │   ├── ACL4SSR_WithChinaIp_WithGFW.ini
│   │   ├── ACL4SSR_WithGFW.ini
│   │   ├── example_external_config.ini
│   │   ├── example_external_config.toml
│   │   └── example_external_config.yml
│   ├── generate.ini
│   ├── gistconf.ini
│   ├── pref.example.ini
│   ├── pref.example.toml
│   ├── pref.example.yml
│   ├── profiles/
│   │   └── example_profile.ini
│   ├── rules/
│   │   ├── ACL4SSR/
│   │   │   └── Clash/
│   │   │       ├── Apple.list
│   │   │       ├── BanAD.list
│   │   │       ├── BanEasyList.list
│   │   │       ├── BanEasyListChina.list
│   │   │       ├── BanEasyPrivacy.list
│   │   │       ├── BanProgramAD.list
│   │   │       ├── ChinaCompanyIp.list
│   │   │       ├── ChinaDomain.list
│   │   │       ├── ChinaIp.list
│   │   │       ├── ChinaMedia.list
│   │   │       ├── Download.list
│   │   │       ├── GoogleCN.list
│   │   │       ├── LocalAreaNetwork.list
│   │   │       ├── Microsoft.list
│   │   │       ├── Netflix.list
│   │   │       ├── OneDrive.list
│   │   │       ├── ProxyGFWlist.list
│   │   │       ├── ProxyLite.list
│   │   │       ├── ProxyMedia.list
│   │   │       ├── Ruleset/
│   │   │       │   ├── 360.list
│   │   │       │   ├── 4399.list
│   │   │       │   ├── 58.list
│   │   │       │   ├── ABC.list
│   │   │       │   ├── AbemaTV.list
│   │   │       │   ├── AccelerateDirectSites.list
│   │   │       │   ├── Adobe.list
│   │   │       │   ├── Alibaba.list
│   │   │       │   ├── All4.list
│   │   │       │   ├── Amazon.list
│   │   │       │   ├── AmazonIp.list
│   │   │       │   ├── Apple.list
│   │   │       │   ├── AppleNews.list
│   │   │       │   ├── AppleTV.list
│   │   │       │   ├── BBC.list
│   │   │       │   ├── BBCiPlayer.list
│   │   │       │   ├── Bahamut.list
│   │   │       │   ├── Baidu.list
│   │   │       │   ├── Bilibili.list
│   │   │       │   ├── BilibiliHMT.list
│   │   │       │   ├── Blizzard.list
│   │   │       │   ├── ByteDance.list
│   │   │       │   ├── CCTV.list
│   │   │       │   ├── CN.list
│   │   │       │   ├── ChinaNet.list
│   │   │       │   ├── DAZN.list
│   │   │       │   ├── Deezer.list
│   │   │       │   ├── Developer.list
│   │   │       │   ├── DiDi.list
│   │   │       │   ├── Discord.list
│   │   │       │   ├── DisneyPlus.list
│   │   │       │   ├── Dmm.list
│   │   │       │   ├── Douyu.list
│   │   │       │   ├── Download.list
│   │   │       │   ├── Dubox.list
│   │   │       │   ├── EHGallery.list
│   │   │       │   ├── EncoreTVB.list
│   │   │       │   ├── Epic.list
│   │   │       │   ├── Facebook.list
│   │   │       │   ├── FoxNow.list
│   │   │       │   ├── Github.list
│   │   │       │   ├── Google.list
│   │   │       │   ├── GoogleCN.list
│   │   │       │   ├── GoogleCNProxyIP.list
│   │   │       │   ├── GoogleEarth.list
│   │   │       │   ├── GoogleFCM.list
│   │   │       │   ├── HBO.list
│   │   │       │   ├── HBO_GO_HKG.list
│   │   │       │   ├── HWTV.list
│   │   │       │   ├── HuaWei.list
│   │   │       │   ├── Hulu.list
│   │   │       │   ├── HuluJapan.list
│   │   │       │   ├── ITV.list
│   │   │       │   ├── Iflytek.list
│   │   │       │   ├── Instagram.list
│   │   │       │   ├── Iqiyi.list
│   │   │       │   ├── IqiyiHMT.list
│   │   │       │   ├── JD.list
│   │   │       │   ├── JOOX.list
│   │   │       │   ├── Japonx.list
│   │   │       │   ├── KKBOX.list
│   │   │       │   ├── KKTV.list
│   │   │       │   ├── KakaoTalk.list
│   │   │       │   ├── Kingsoft.list
│   │   │       │   ├── Kuaishou.list
│   │   │       │   ├── LeTV.list
│   │   │       │   ├── LiTV.list
│   │   │       │   ├── Line.list
│   │   │       │   ├── LineTV.list
│   │   │       │   ├── MGTVTV.list
│   │   │       │   ├── MI.list
│   │   │       │   ├── MOO.list
│   │   │       │   ├── Marketing.list
│   │   │       │   ├── Meitu.list
│   │   │       │   ├── Microsoft.list
│   │   │       │   ├── My5.list
│   │   │       │   ├── MyTVSuper.list
│   │   │       │   ├── NetEase.list
│   │   │       │   ├── NetEaseMusic.list
│   │   │       │   ├── Netflix.list
│   │   │       │   ├── NetflixIP.list
│   │   │       │   ├── Niconico.list
│   │   │       │   ├── OneDrive.list
│   │   │       │   ├── PBS.list
│   │   │       │   ├── PDD.list
│   │   │       │   ├── PPTVPPLive.list
│   │   │       │   ├── Pandora.list
│   │   │       │   ├── Pixiv.list
│   │   │       │   ├── Porn.list
│   │   │       │   ├── Pornhub.list
│   │   │       │   ├── PrivateTracker.list
│   │   │       │   ├── PublicDirectCDN.list
│   │   │       │   ├── Qobuz.list
│   │   │       │   ├── Reddit.list
│   │   │       │   ├── Scholar.list
│   │   │       │   ├── Sina.list
│   │   │       │   ├── SohuSogo.list
│   │   │       │   ├── Sony.list
│   │   │       │   ├── SoundCloud.list
│   │   │       │   ├── Spark.list
│   │   │       │   ├── Spotify.list
│   │   │       │   ├── Steam.list
│   │   │       │   ├── SteamCN.list
│   │   │       │   ├── TIDAL.list
│   │   │       │   ├── TaiWanGood.list
│   │   │       │   ├── TapTap.list
│   │   │       │   ├── TeamViewer.list
│   │   │       │   ├── Telegram.list
│   │   │       │   ├── Tencent.list
│   │   │       │   ├── TencentLolm.list
│   │   │       │   ├── TencentVideo.list
│   │   │       │   ├── TeraBox.list
│   │   │       │   ├── TikTok.list
│   │   │       │   ├── Topblockedsites.list
│   │   │       │   ├── Twitch.list
│   │   │       │   ├── Twitter.list
│   │   │       │   ├── Vip.list
│   │   │       │   ├── ViuTV.list
│   │   │       │   ├── Whatsapp.list
│   │   │       │   ├── Wikipedia.list
│   │   │       │   ├── Xbox.list
│   │   │       │   ├── Ximalaya.list
│   │   │       │   ├── Xunlei.list
│   │   │       │   ├── YYeTs.list
│   │   │       │   ├── YouTube.list
│   │   │       │   ├── YouTubeMusic.list
│   │   │       │   └── Youku.list
│   │   │       ├── Telegram.list
│   │   │       ├── UnBan.list
│   │   │       └── Xbox.list
│   │   ├── DivineEngine/
│   │   │   └── Surge/
│   │   │       └── Ruleset/
│   │   │           ├── China.list
│   │   │           ├── Extra/
│   │   │           │   ├── Apple/
│   │   │           │   │   ├── AppStore.list
│   │   │           │   │   ├── AppStoreConnect.list
│   │   │           │   │   ├── Apple.list
│   │   │           │   │   ├── BlockiOSUpdate.list
│   │   │           │   │   ├── FindMy.list
│   │   │           │   │   ├── FitnessPlus.list
│   │   │           │   │   ├── Mail.list
│   │   │           │   │   ├── Music.list
│   │   │           │   │   ├── MusicRadio.list
│   │   │           │   │   ├── News.list
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── Siri.list
│   │   │           │   │   ├── SoftwareUpdate.list
│   │   │           │   │   ├── TV.list
│   │   │           │   │   ├── TestFlight.list
│   │   │           │   │   └── iCloud.list
│   │   │           │   ├── ChinaIP.list
│   │   │           │   ├── Clubhouse.list
│   │   │           │   ├── Cryptocurrency.list
│   │   │           │   ├── Game/
│   │   │           │   │   ├── Blizzard/
│   │   │           │   │   │   ├── Battle.list
│   │   │           │   │   │   ├── Classic.list
│   │   │           │   │   │   ├── Diablo-III.list
│   │   │           │   │   │   ├── Hearthstone.list
│   │   │           │   │   │   ├── Heroes-of-the-Storm.list
│   │   │           │   │   │   ├── Overwatch.list
│   │   │           │   │   │   ├── StarCraft-II.list
│   │   │           │   │   │   └── World-of-Warcraft.list
│   │   │           │   │   ├── Blizzard.list
│   │   │           │   │   ├── Discord.list
│   │   │           │   │   ├── Game.list
│   │   │           │   │   ├── Nintendo.list
│   │   │           │   │   ├── Origin.list
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── Steam.list
│   │   │           │   │   ├── Supercell.list
│   │   │           │   │   ├── WildRift.list
│   │   │           │   │   └── Xbox.list
│   │   │           │   ├── Google/
│   │   │           │   │   ├── Chromecast.list
│   │   │           │   │   ├── GoogleDrive.list
│   │   │           │   │   ├── GoogleSearch.list
│   │   │           │   │   └── GoogleVoice.list
│   │   │           │   ├── IP-Blackhole.list
│   │   │           │   ├── Microsoft/
│   │   │           │   │   ├── OneDrive.list
│   │   │           │   │   └── Teams.list
│   │   │           │   ├── PayPal.list
│   │   │           │   ├── Scholar.list
│   │   │           │   ├── Telegram/
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── Telegram.list
│   │   │           │   │   ├── TelegramNL.list
│   │   │           │   │   ├── TelegramSG.list
│   │   │           │   │   └── TelegramUS.list
│   │   │           │   ├── Twitter.list
│   │   │           │   └── WeChat/
│   │   │           │       └── WeChatSG.list
│   │   │           ├── Global.list
│   │   │           ├── Guard/
│   │   │           │   ├── Advertising.list
│   │   │           │   ├── AdvertisingPlus.list
│   │   │           │   ├── Hijacking.list
│   │   │           │   └── Privacy.list
│   │   │           ├── StreamingMedia/
│   │   │           │   ├── Live/
│   │   │           │   │   └── Twitch.list
│   │   │           │   ├── Music/
│   │   │           │   │   ├── Deezer.list
│   │   │           │   │   ├── Instagram.list
│   │   │           │   │   ├── JOOX.list
│   │   │           │   │   ├── KKBOX.list
│   │   │           │   │   ├── Pandora.list
│   │   │           │   │   ├── SoundCloud.list
│   │   │           │   │   ├── Spotify.list
│   │   │           │   │   ├── TIDAL.list
│   │   │           │   │   └── YouTube-Music.list
│   │   │           │   ├── Podcast/
│   │   │           │   │   ├── Himalaya.list
│   │   │           │   │   └── Overcast.list
│   │   │           │   ├── Region/
│   │   │           │   │   ├── HK.list
│   │   │           │   │   ├── JP.list
│   │   │           │   │   ├── KR.list
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── TW.list
│   │   │           │   │   ├── UK.list
│   │   │           │   │   └── US.list
│   │   │           │   ├── Streaming.list
│   │   │           │   ├── StreamingCN.list
│   │   │           │   ├── StreamingSE.list
│   │   │           │   └── Video/
│   │   │           │       ├── AbemaTV.list
│   │   │           │       ├── All-4.list
│   │   │           │       ├── BBC-iPlayer.list
│   │   │           │       ├── Bahamut.list
│   │   │           │       ├── DAZN.list
│   │   │           │       ├── DMM.list
│   │   │           │       ├── DisneyPlus.list
│   │   │           │       ├── FOX-NOW.list
│   │   │           │       ├── FOXPlus.list
│   │   │           │       ├── HBO-Asia.list
│   │   │           │       ├── HBO-GO-HKG.list
│   │   │           │       ├── HBO.list
│   │   │           │       ├── HWTV.list
│   │   │           │       ├── Hulu-JPN.list
│   │   │           │       ├── Hulu.list
│   │   │           │       ├── ITV.list
│   │   │           │       ├── KKTV.list
│   │   │           │       ├── LINE-TV.list
│   │   │           │       ├── LiTV.list
│   │   │           │       ├── My5.list
│   │   │           │       ├── Naver-TV.list
│   │   │           │       ├── Netflix.list
│   │   │           │       ├── Now-E.list
│   │   │           │       ├── PBS.list
│   │   │           │       ├── ParamountPlus.list
│   │   │           │       ├── Peacock.list
│   │   │           │       ├── Pornhub.list
│   │   │           │       ├── Prime-Video.list
│   │   │           │       ├── TVer.list
│   │   │           │       ├── TaiwanGood.list
│   │   │           │       ├── TikTok.list
│   │   │           │       ├── ViuTV.list
│   │   │           │       ├── WeTV.list
│   │   │           │       ├── YouTube.list
│   │   │           │       ├── bilibili-Intl.list
│   │   │           │       ├── encoreTVB.list
│   │   │           │       ├── iQIYI.list
│   │   │           │       ├── myTV-SUPER.list
│   │   │           │       ├── niconico.list
│   │   │           │       └── ‎DiscoveryPlus.list
│   │   │           └── Unbreak.list
│   │   ├── HKMTMedia.list
│   │   ├── LocalAreaNetwork.list
│   │   ├── MSServices.list
│   │   ├── NobyDa/
│   │   │   └── Surge/
│   │   │       ├── AdRule.list
│   │   │       ├── AdRuleTest.list
│   │   │       ├── Apple.list
│   │   │       ├── Download.list
│   │   │       └── WeChat.list
│   │   └── lhie1/
│   │       ├── Netease Music IP.list
│   │       └── Surge/
│   │           └── Surge 3/
│   │               └── Provider/
│   │                   ├── Apple.list
│   │                   ├── Domestic IPs.list
│   │                   ├── Domestic.list
│   │                   ├── Google FCM.list
│   │                   ├── Media/
│   │                   │   ├── ABC.list
│   │                   │   ├── Abema TV.list
│   │                   │   ├── Amazon.list
│   │                   │   ├── Apple News.list
│   │                   │   ├── Apple TV.list
│   │                   │   ├── BBC iPlayer.list
│   │                   │   ├── Bahamut.list
│   │                   │   ├── Bilibili.list
│   │                   │   ├── DAZN.list
│   │                   │   ├── Discovery Plus.list
│   │                   │   ├── Disney Plus.list
│   │                   │   ├── Fox Now.list
│   │                   │   ├── Fox+.list
│   │                   │   ├── HBO Go.list
│   │                   │   ├── HBO Max.list
│   │                   │   ├── Hulu Japan.list
│   │                   │   ├── Hulu.list
│   │                   │   ├── IQ.list
│   │                   │   ├── JOOX.list
│   │                   │   ├── Japonx.list
│   │                   │   ├── KKBOX.list
│   │                   │   ├── KKTV.list
│   │                   │   ├── Letv.list
│   │                   │   ├── Line TV.list
│   │                   │   ├── MOO.list
│   │                   │   ├── Netease Music.list
│   │                   │   ├── Netflix.list
│   │                   │   ├── PBS.list
│   │                   │   ├── Pandora.list
│   │                   │   ├── Pornhub.list
│   │                   │   ├── Soundcloud.list
│   │                   │   ├── Spotify.list
│   │                   │   ├── Tencent Video.list
│   │                   │   ├── ViuTV.list
│   │                   │   ├── WeTV.list
│   │                   │   ├── YouTube Music.list
│   │                   │   ├── YouTube.list
│   │                   │   ├── Youku.list
│   │                   │   ├── encoreTVB.list
│   │                   │   ├── iQiyi.list
│   │                   │   └── myTV SUPER.list
│   │                   ├── Microsoft.list
│   │                   ├── PayPal.list
│   │                   ├── Proxy.list
│   │                   ├── Reject.list
│   │                   ├── Scholar.list
│   │                   ├── Special.list
│   │                   ├── Speedtest.list
│   │                   ├── Steam.list
│   │                   └── Telegram.list
│   └── snippets/
│       ├── emoji.toml
│       ├── emoji.txt
│       ├── groups.toml
│       ├── groups.txt
│       ├── groups_forcerule.toml
│       ├── groups_forcerule.txt
│       ├── rename_node.toml
│       ├── rename_node.txt
│       ├── rulesets.toml
│       ├── rulesets.txt
│       └── rulesets_remote.txt
├── cmake/
│   ├── FindDuktape.cmake
│   ├── FindLibCron.cmake
│   ├── FindMbedTLS.cmake
│   ├── FindPCRE2.cmake
│   ├── FindQuickJS.cmake
│   └── FindRapidjson.cmake
├── include/
│   ├── httplib.h
│   ├── inja.hpp
│   ├── jpcre2.hpp
│   └── nlohmann/
│       └── json.hpp
├── scripts/
│   ├── Dockerfile
│   ├── build.alpine.release.sh
│   ├── build.macos.release.sh
│   ├── build.windows.release.sh
│   ├── config.termux.sh
│   ├── merge_manifest.py
│   ├── patches/
│   │   └── 0001-quickjs-libc-add-realpath-for-Windows.patch
│   ├── rules_config.conf
│   └── update_rules.py
└── src/
    ├── config/
    │   ├── binding.h
    │   ├── crontask.h
    │   ├── def.h
    │   ├── proxygroup.h
    │   ├── regmatch.h
    │   └── ruleset.h
    ├── generator/
    │   ├── config/
    │   │   ├── nodemanip.cpp
    │   │   ├── nodemanip.h
    │   │   ├── ruleconvert.cpp
    │   │   ├── ruleconvert.h
    │   │   ├── subexport.cpp
    │   │   └── subexport.h
    │   └── template/
    │       ├── template_jinja2.cpp
    │       ├── templates.cpp
    │       └── templates.h
    ├── handler/
    │   ├── interfaces.cpp
    │   ├── interfaces.h
    │   ├── multithread.cpp
    │   ├── multithread.h
    │   ├── settings.cpp
    │   ├── settings.h
    │   ├── upload.cpp
    │   ├── upload.h
    │   ├── webget.cpp
    │   └── webget.h
    ├── lib/
    │   └── wrapper.cpp
    ├── main.cpp
    ├── parser/
    │   ├── config/
    │   │   └── proxy.h
    │   ├── infoparser.cpp
    │   ├── infoparser.h
    │   ├── subparser.cpp
    │   └── subparser.h
    ├── script/
    │   ├── cron.cpp
    │   ├── cron.h
    │   ├── script.cpp
    │   ├── script.h
    │   ├── script_duktape.h
    │   ├── script_quickjs.cpp
    │   └── script_quickjs.h
    ├── server/
    │   ├── socket.h
    │   ├── webserver.h
    │   ├── webserver_httplib.cpp
    │   └── webserver_libevent.cpp
    ├── utils/
    │   ├── base64/
    │   │   ├── base64.cpp
    │   │   └── base64.h
    │   ├── bitwise.h
    │   ├── checkpoint.h
    │   ├── codepage.cpp
    │   ├── codepage.h
    │   ├── defer.h
    │   ├── file.cpp
    │   ├── file.h
    │   ├── file_extra.h
    │   ├── ini_reader/
    │   │   └── ini_reader.h
    │   ├── lock.h
    │   ├── logger.cpp
    │   ├── logger.h
    │   ├── map_extra.h
    │   ├── md5/
    │   │   ├── md5.cpp
    │   │   ├── md5.h
    │   │   └── md5_interface.h
    │   ├── network.cpp
    │   ├── network.h
    │   ├── printout.h
    │   ├── rapidjson_extra.h
    │   ├── regexp.cpp
    │   ├── regexp.h
    │   ├── stl_extra.h
    │   ├── string.cpp
    │   ├── string.h
    │   ├── string_hash.h
    │   ├── system.cpp
    │   ├── system.h
    │   ├── tribool.h
    │   ├── urlencode.cpp
    │   ├── urlencode.h
    │   └── yamlcpp_extra.h
    └── version.h

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug 反馈
description: 功能运行不正常 / 失效
title: "[BUG] <title>"
body:
  - type: markdown
    attributes:
      value: |
         遇到问题请先尝试使用[Action](https://github.com/tindy2013/subconverter/actions)中的最新版本
         如果是使用公共转换服务中遇到的问题,请先联系服务的提供者。
  - type: checkboxes
    id: version-check
    attributes:
      label: 确认版本最新
      description: 对于您遇到的BUG,是否尝试在最新Action编译的版本中复现?
      options:
      - label: 我已经确认在最新Action编译的版本中复现
        required: true
  - type: checkboxes
    id: issue-check
    attributes:
      label: 检索issue
      description: 对于您遇到的BUG,是否已经确认之前没有其他issue涉及?
      options:
      - label: 我已经确认之前没有issue涉及此BUG
        required: true
  - type: input
    id: subconverter-version
    attributes:
      label: subconverter版本
      description: subconverter版本
      placeholder: 请输入详细的版本号
    validations:
      required: true
  - type: input
    id: convert
    attributes:
      label: 转换过程
      description: BUG发生在什么配置转换为什么配置的过程中?
      placeholder: 请输入“xxx转换为xxx配置”
    validations:
      required: true
  - type: textarea
    id: config
    attributes:
      label: 转换设置
      description: 转换时使用的subconverter配置文件或外部配置链接
      placeholder: 请输入
    validations:
      required: true
  - type: textarea
    id: description
    attributes:
      label: 复现步骤
      description: BUG的详细复现步骤
      placeholder: 请输入
    validations:
      required: true
  - type: textarea
    id: expected
    attributes:
      label: 期望结果
      description: 您期望的结果是?
      placeholder: 请输入
    validations:
      required: true
  - type: textarea
    id: actual
    attributes:
      label: 实际结果
      description: 实际得到的结果是?
      placeholder: 请输入
    validations:
      required: true
  - type: textarea
    id: logs
    attributes:
      label: 错误信息
      description: subconverter转换时的日志/信息输出
      render: shell
      placeholder: 请输入
    validations:
      required: false

================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: 阅读文档
    url: https://github.com/tindy2013/subconverter/blob/master/README-cn.md
    about: 建议您发布issue前先仔细阅读项目文档

================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: 建议新功能
description: 建议此项目增加的功能
title: "[Feature] <title>"
body:
  - type: checkboxes
    id: ensure
    attributes:
      label: verify
      description: 在提交之前,请确认完成以下选项
      options:
      - label: 我已经仔细阅读[项目文档](https://github.com/tindy2013/subconverter/blob/master/README-cn.md),确认现有功能无法解决我的需求
        required: true
      - label: 我已经检索过现有[issue](https://github.com/tindy2013/subconverter/issues),确认与现有issue的内容并不重复
        required: true
      - label: 我已经尝试自行解决,确认自己没有能力解决
        required: true
  - type: textarea
    id: description
    attributes:
      label: 功能描述
      description: 请详细、清晰地表达你要提出的论述,例如这个问题如何影响到你?你想实现什么功能?目前 subconverter 的行为是什么?
    validations:
      required: true
  - type: textarea
    id: solution
    attributes:
      label: 可能的解决方案
      description: 您期望的解决方案,可能的实现方法或者可供参考的示例
    validations:
      required: false

================================================
FILE: .github/workflows/build.yml
================================================
name: GitHub CI
on: 
  push:
    branches: [ master ]
    tags:
      - '**'
  workflow_dispatch:
  pull_request:

concurrency: 
  group: ${{ github.ref }}-${{ github.workflow }}
  cancel-in-progress: true

jobs:
  linux_build:
    strategy:
      matrix:
        include:
          - arch: x86
            artifact: subconverter_linux32
            os: ubuntu-latest
          - arch: amd64
            artifact: subconverter_linux64
            os: ubuntu-latest
          - arch: armv7
            artifact: subconverter_armv7
            os: ubuntu-24.04-arm
          - arch: aarch64
            artifact: subconverter_aarch64
            os: ubuntu-24.04-arm
    runs-on: ${{ matrix.os }}
    name: Linux ${{ matrix.arch }} Build
    steps:
    - name: Checkout base
      uses: actions/checkout@v4
    - name: Add commit id into version
      if: ${{ !startsWith(github.ref, 'refs/tags/') }}
      run: SHA=$(git rev-parse --short HEAD) && sed -i 's/\(v[0-9]\.[0-9]\.[0-9]\)/\1-'"$SHA"'/' src/version.h
    - name: Build
      run: docker run --rm -v $GITHUB_WORKSPACE:/root/workdir multiarch/alpine:${{ matrix.arch }}-latest-stable /bin/sh -c "apk add bash git nodejs npm && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
    - name: Upload
      uses: actions/upload-artifact@v4
      with:
        name: ${{ matrix.artifact }}
        path: subconverter/
    - name: Package Release
      if: ${{ github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') }}
      run: tar czf ${{ matrix.artifact }}.tar.gz subconverter
    - name: Draft Release
      if: ${{ github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') }}
      uses: softprops/action-gh-release@v2
      with:
        files: ${{ matrix.artifact }}.tar.gz
        draft: true

  macos_build:
    strategy:
      matrix:
        include:
          - arch: x86
            artifact: subconverter_darwin64
            os: macos-26-intel
          - arch: arm
            artifact: subconverter_darwinarm
            os: macos-26
    runs-on: ${{ matrix.os }}
    name: macOS ${{ matrix.arch }} Build
    steps:
    - name: Checkout base
      uses: actions/checkout@v4
    - name: Setup Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Add commit id into version
      if: ${{ !startsWith(github.ref, 'refs/tags/') }}
      run: SHA=$(git rev-parse --short HEAD) && sed -i -e 's/\(v[0-9]\.[0-9]\.[0-9]\)/\1-'"$SHA"'/' src/version.h
    - name: Build
      run: bash scripts/build.macos.release.sh
    - name: Upload
      uses: actions/upload-artifact@v4
      with:
        name: ${{ matrix.artifact }}
        path: subconverter/
    - name: Package Release
      if: ${{ github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') }}
      run: tar czf ${{ matrix.artifact }}.tar.gz subconverter
    - name: Draft Release
      if: ${{ github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') }}
      uses: softprops/action-gh-release@v2
      with:
        files: ${{ matrix.artifact }}.tar.gz
        draft: true
  
  windows_build:
    strategy:
      matrix:
        include:
          - arch: x86
            artifact: subconverter_win32
            env: i686
            msystem: MINGW32
          - arch: amd64
            artifact: subconverter_win64
            env: x86_64
            msystem: MINGW64
    runs-on: windows-latest
    name: Windows ${{ matrix.arch }} Build
    defaults:
      run:
        shell: msys2 {0}
    steps:
    - name: Checkout base
      uses: actions/checkout@v4
    - name: Setup Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Setup Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '16'
    - name: Setup MSYS2
      uses: msys2/setup-msys2@v2
      with:
        update: true
        install: base-devel git mingw-w64-${{ matrix.env }}-gcc mingw-w64-${{ matrix.env }}-cmake mingw-w64-${{ matrix.env }}-pcre2 patch
        msystem: ${{ matrix.msystem }}
        path-type: inherit
    - name: Add commit id into version
      if: ${{ !startsWith(github.ref, 'refs/tags/') }}
      run: SHA=$(git rev-parse --short HEAD) && sed -i 's/\(v[0-9]\.[0-9]\.[0-9]\)/\1-'"$SHA"'/' src/version.h
    - name: Build
      run: bash scripts/build.windows.release.sh
    - name: Upload
      uses: actions/upload-artifact@v4
      with:
        name: ${{ matrix.artifact }}
        path: subconverter/
    - name: Package Release
      if: ${{ github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') }}
      run: 7z a ${{ matrix.artifact }}.7z subconverter/
    - name: Draft Release
      if: ${{ github.event_name != 'pull_request' && startsWith(github.ref, 'refs/tags/') }}
      uses: softprops/action-gh-release@v2
      with:
        files: ${{ matrix.artifact }}.7z
        draft: true


================================================
FILE: .github/workflows/docker.yml
================================================
name: Publish Docker Image
on: 
  push:
    branches: [ master ]
    tags:
      - '**'

concurrency: 
  group: ${{ github.ref }}-${{ github.workflow }}
  cancel-in-progress: true

env:
  REGISTRY_IMAGE: tindy2013/subconverter

jobs:
  build:
    strategy:
      matrix:
        include:
          - platform: linux/amd64
            os: ubuntu-latest
          - platform: linux/386
            os: ubuntu-latest
          - platform: linux/arm/v7
            os: ubuntu-24.04-arm
          - platform: linux/arm64
            os: ubuntu-24.04-arm
    runs-on: ${{ matrix.os }}
    name: Build ${{ matrix.platform }} Image
    steps:
      - name: Prepare
        run: |
          platform=${{ matrix.platform }}
          echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV    
               
      - name: Checkout base
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY_IMAGE }}
          tags: |
            type=semver,pattern={{version}}
            type=raw,value=latest,enable={{is_default_branch}}

      - name: Docker login
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Get commit SHA
        if: github.ref == 'refs/heads/master'
        id: vars
        run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT

      - name: Build and export
        id: build
        uses: docker/build-push-action@v5
        with:
          platforms: ${{ matrix.platform }}
          context: scripts/
          labels: ${{ steps.meta.outputs.labels }}
          build-args: |
            SHA=${{ steps.vars.outputs.sha_short }}
          outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true

      - name: Export digest
        run: |
          rm -rf /tmp/digests
          mkdir -p /tmp/digests
          digest="${{ steps.build.outputs.digest }}"
          touch "/tmp/digests/${digest#sha256:}"

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: digest-${{ env.PLATFORM_PAIR }}
          path: /tmp/digests/*
          if-no-files-found: error
          retention-days: 1

  merge:
    name: Merge
    needs: build
    runs-on: ubuntu-latest
    steps:
      - name: Download digests
        uses: actions/download-artifact@v4
        with:
          path: /tmp/digests
          pattern: digest-*
          merge-multiple: true

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY_IMAGE }}
          tags: |
            type=semver,pattern={{version}}
            type=raw,value=latest,enable={{is_default_branch}}

      - name: Docker login
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - name: Create manifest list and push
        working-directory: /tmp/digests
        run: |
          docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
            $(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)      
    
      - name: Inspect image
        run: |
          docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}


================================================
FILE: .gitignore
================================================
subconverter.exe
.vscode
cmake-build-debug
.idea
base/cache
build

================================================
FILE: .travis.yml
================================================
language: cpp
os: linux
stages:
    - name: deploy
      if: branch = master
    - name: before_script
      if: branch = master
jobs:
    include:
    - name: "macOS Build"
      os: osx
      compiler: clang
      osx_image: xcode11.3
      script:
        - bash scripts/build.macos.release.sh
      before_deploy:
        - tar czf subconverter_darwin64.tar.gz subconverter
      deploy:
        provider: releases
        token: "$GITHUB_OAUTH_TOKEN"
        file: "subconverter_darwin64.tar.gz"
        skip_cleanup: true
        draft: true
        on:
          tags: true
    - name: "Linux x86 Build"
      services: docker
      script:
        - docker run --rm -v $TRAVIS_BUILD_DIR:/root/workdir multiarch/alpine:x86-latest-stable /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
      before_deploy:
        - tar czf subconverter_linux32.tar.gz subconverter/
      deploy:
        provider: releases
        token: "$GITHUB_OAUTH_TOKEN"
        file: "subconverter_linux32.tar.gz"
        skip_cleanup: true
        draft: true
        on:
          tags: true
    - name: "Linux x86_64 Build"
      services: docker
      script:
        - docker run -v $TRAVIS_BUILD_DIR:/root/workdir multiarch/alpine:amd64-latest-stable /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
      before_deploy:
        - tar czf subconverter_linux64.tar.gz subconverter/
      deploy:
        provider: releases
        token: "$GITHUB_OAUTH_TOKEN"
        file: "subconverter_linux64.tar.gz"
        skip_cleanup: true
        draft: true
        on:
          tags: true
    - name: "Linux ARMHF Build"
      services: docker
      arch: arm64
      script:
        - docker run --rm -v $TRAVIS_BUILD_DIR:/root/workdir multiarch/alpine:armhf-latest-stable /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
      before_deploy:
        - tar czf subconverter_armhf.tar.gz subconverter/
      deploy:
        provider: releases
        token: "$GITHUB_OAUTH_TOKEN"
        file: "subconverter_armhf.tar.gz"
        skip_cleanup: true
        draft: true
        on:
          tags: true
    - name: "Linux ARM64 Build"
      services: docker
      arch: arm64
      script:
        - docker run -v $TRAVIS_BUILD_DIR:/root/workdir multiarch/alpine:aarch64-latest-stable /bin/sh -c "apk add bash git && cd /root/workdir && chmod +x scripts/build.alpine.release.sh && bash scripts/build.alpine.release.sh"
      before_deploy:
        - tar czf subconverter_aarch64.tar.gz subconverter/
      deploy:
        provider: releases
        token: "$GITHUB_OAUTH_TOKEN"
        file: "subconverter_aarch64.tar.gz"
        skip_cleanup: true
        draft: true
        on:
          tags: true
    - name: "Windows x86_64 Build"
      os: windows
      before_install:
      - |-
         [[ ! -f C:/tools/msys64/msys2_shell.cmd ]] && rm -rf C:/tools/msys64
         choco uninstall -y mingw
         choco upgrade --no-progress -y msys2 nodejs
         export msys2='cmd //C RefreshEnv.cmd '
         export msys2+='& set MSYS=winsymlinks:nativestrict '
         export msys2+='& C:\\tools\\msys64\\msys2_shell.cmd -defterm -no-start'
         export mingw64="$msys2 -mingw64 -full-path -here -c "\"\$@"\" --"
         export msys2+=" -msys2 -c "\"\$@"\" --"
         $msys2 pacman --sync --noconfirm --needed base-devel git mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake mingw-w64-x86_64-libevent mingw-w64-x86_64-pcre2 patch
         taskkill //IM gpg-agent.exe //F
         export PATH=/C/tools/msys64/mingw64/bin:$PATH
         export MAKE=make
      before_cache:
      - |-
        $msys2 pacman --sync --clean --noconfirm
      cache:
        directories:
        - $HOME/AppData/Local/Temp/chocolatey
      script:
        - $mingw64 bash scripts/build.windows.release.sh
      before_deploy:
        - 7z a subconverter_win64.7z subconverter/
      deploy:
        provider: releases
        token: "$GITHUB_OAUTH_TOKEN"
        file: "subconverter_win64.7z"
        skip_cleanup: true
        draft: true
        on:
          tags: true
    - name: "Windows x86 Build"
      os: windows
      before_install:
      - |-
         [[ ! -f C:/tools/msys64/msys2_shell.cmd ]] && rm -rf C:/tools/msys64
         choco uninstall -y mingw
         choco upgrade --no-progress -y msys2 nodejs
         export msys2='cmd //C RefreshEnv.cmd '
         export msys2+='& set MSYS=winsymlinks:nativestrict '
         export msys2+='& C:\\tools\\msys64\\msys2_shell.cmd -defterm -no-start'
         export mingw32="$msys2 -mingw32 -full-path -here -c "\"\$@"\" --"
         export msys2+=" -msys2 -c "\"\$@"\" --"
         $msys2 pacman --sync --noconfirm --needed base-devel git mingw-w64-i686-gcc mingw-w64-i686-cmake mingw-w64-i686-libevent mingw-w64-i686-pcre2 patch
         taskkill //IM gpg-agent.exe //F
         export PATH=/C/tools/msys64/mingw64/bin:$PATH
         export MAKE=make
      before_cache:
      - |-
        $msys2 pacman --sync --clean --noconfirm
      cache:
        directories:
        - $HOME/AppData/Local/Temp/chocolatey
      script:
        - $mingw32 bash scripts/build.windows.release.sh
      before_deploy:
        - 7z a subconverter_win32.7z subconverter/
      deploy:
        provider: releases
        token: "$GITHUB_OAUTH_TOKEN"
        file: "subconverter_win32.7z"
        skip_cleanup: true
        draft: true
        on:
          tags: true


================================================
FILE: CMakeLists.txt
================================================
PROJECT(subconverter LANGUAGES CXX)
SET(BUILD_TARGET_NAME ${PROJECT_NAME})
CMAKE_MINIMUM_REQUIRED(VERSION 3.5)
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/include/")

IF(NOT CMAKE_BUILD_TYPE)
    SET(CMAKE_BUILD_TYPE Release)
ENDIF()
SET(CMAKE_CXX_STANDARD 20)

IF(NOT MSVC)
    ADD_COMPILE_OPTIONS(-Wall -Wextra -Wno-unused-parameter -Wno-unused-result)
ELSE()
    ADD_COMPILE_OPTIONS(/W4)
ENDIF()

#remove std::regex support since it is not compatible with group modifiers and slow
#OPTION(USING_STD_REGEX "Use std::regex from C++ library instead of PCRE2." OFF)
OPTION(USING_MALLOC_TRIM "Call malloc_trim after processing request to lower memory usage (Your system must support malloc_trim)." OFF)
#now using internal MD5 calculation
#OPTION(USING_MBEDTLS "Use mbedTLS instead of OpenSSL for MD5 calculation." OFF)
OPTION(BUILD_STATIC_LIBRARY "Build a static library containing only the essential part." OFF)

INCLUDE(CheckCXXSourceCompiles)
CHECK_CXX_SOURCE_COMPILES(
"
#include<string>
int main(){std::to_string(0);}
" HAVE_TO_STRING)

IF(NOT BUILD_STATIC_LIBRARY)

ADD_EXECUTABLE(${BUILD_TARGET_NAME} 
    src/generator/config/nodemanip.cpp
    src/generator/config/ruleconvert.cpp
    src/generator/config/subexport.cpp
    src/generator/template/templates.cpp
    src/handler/interfaces.cpp
    src/handler/multithread.cpp
    src/handler/upload.cpp
    src/handler/webget.cpp
    src/handler/settings.cpp
    src/main.cpp
    src/parser/infoparser.cpp
    src/parser/subparser.cpp
    src/script/cron.cpp
    src/script/script_quickjs.cpp
#    src/server/webserver_libevent.cpp
    src/server/webserver_httplib.cpp
    src/utils/base64/base64.cpp
    src/utils/codepage.cpp
    src/utils/file.cpp
    src/utils/logger.cpp
    src/utils/md5/md5.cpp
    src/utils/network.cpp
    src/utils/regexp.cpp
    src/utils/string.cpp
    src/utils/system.cpp
    src/utils/urlencode.cpp)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE src)
TARGET_LINK_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR})

FIND_PACKAGE(PkgConfig REQUIRED)

SET(THREADS_PREFER_PTHREAD_FLAG ON)
FIND_PACKAGE(Threads REQUIRED)
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} ${CMAKE_THREAD_LIBS_INIT})

#PKG_CHECK_MODULES(LIBEVENT libevent>=2.1.10 REQUIRED)
#FIND_PATH(LIBEVENT_INCLUDE_DIR NAMES event.h PATHS ${LIBEVENT_INCLUDE_DIRS})
#FIND_LIBRARY(LIBEVENT_LIBRARY NAMES event PATHS ${LIBEVENT_LIBRARY_DIRS})
#TARGET_LINK_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${LIBEVENT_LIBRARY_DIRS})
#TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${LIBEVENT_INCLUDE_DIR})
#TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} ${LIBEVENT_LIBRARY})

FIND_PACKAGE(CURL 7.54.0 REQUIRED)
TARGET_LINK_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${CURL_LIBRARY_DIRS})
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${CURL_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} CURL::libcurl)
TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DCURL_STATICLIB)

FIND_PACKAGE(Rapidjson REQUIRED)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${RAPIDJSON_INCLUDE_DIRS})

FIND_PACKAGE(toml11 REQUIRED)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${TOML11_INCLUDE_DIRS})

PKG_CHECK_MODULES(YAML_CPP yaml-cpp>=0.6.3 REQUIRED)
FIND_LIBRARY(YAML_CPP_LIBRARY NAMES yaml-cpp yaml-cppd PATHS ${YAML_CPP_LIBRARY_DIRS})
TARGET_LINK_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${YAML_CPP_LIBRARY_DIRS})
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${YAML_CPP_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} ${YAML_CPP_LIBRARY})
TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DYAML_CPP_STATIC_DEFINE)

FIND_PACKAGE(PCRE2 REQUIRED)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${PCRE2_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} ${PCRE2_LIBRARY})
TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DPCRE2_STATIC)

FIND_PACKAGE(QuickJS REQUIRED)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${QUICKJS_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} ${QUICKJS_LIBRARIES})

FIND_PACKAGE(LibCron REQUIRED)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${LIBCRON_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} ${LIBCRON_LIBRARIES})

IF(WIN32)
    TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} wsock32 ws2_32)
ELSE()
    INCLUDE(GNUInstallDirs)
    INSTALL(TARGETS ${BUILD_TARGET_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}/${BUILD_TARGET_NAME})
    INSTALL(DIRECTORY base/ DESTINATION ${CMAKE_INSTALL_BINDIR}/${BUILD_TARGET_NAME} FILES_MATCHING PATTERN "*")
ENDIF()

ELSE() #BUILD_STATIC_LIBRARY

ADD_LIBRARY(${BUILD_TARGET_NAME} STATIC
    src/generator/config/ruleconvert.cpp
    src/generator/config/subexport.cpp
    src/generator/template/templates.cpp
    src/lib/wrapper.cpp
    src/parser/subparser.cpp
    src/utils/base64/base64.cpp
    src/utils/codepage.cpp
    src/utils/logger.cpp
    src/utils/md5/md5.cpp
    src/utils/network.cpp
    src/utils/regexp.cpp
    src/utils/string.cpp
    src/utils/urlencode.cpp)
TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DNO_JS_RUNTIME -DNO_WEBGET)

TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PUBLIC src)

FIND_PACKAGE(Rapidjson REQUIRED)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${RAPIDJSON_INCLUDE_DIRS})

FIND_PACKAGE(PkgConfig REQUIRED)

PKG_CHECK_MODULES(YAML_CPP yaml-cpp>=0.6.3 REQUIRED)
FIND_LIBRARY(YAML_CPP_LIBRARY NAMES yaml-cpp yaml-cppd PATHS ${YAML_CPP_LIBRARY_DIRS})
TARGET_LINK_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${YAML_CPP_LIBRARY_DIRS})
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${YAML_CPP_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} PRIVATE ${YAML_CPP_LIBRARY})
TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DYAML_CPP_STATIC_DEFINE)

FIND_PACKAGE(PCRE2 REQUIRED)
TARGET_INCLUDE_DIRECTORIES(${BUILD_TARGET_NAME} PRIVATE ${PCRE2_INCLUDE_DIRS})
TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} PRIVATE ${PCRE2_LIBRARY})
TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DPCRE2_STATIC)

IF(WIN32)
    TARGET_LINK_LIBRARIES(${BUILD_TARGET_NAME} PRIVATE ws2_32)
ENDIF()

ENDIF() #BUILD_STATIC_LIBRARY

IF(HAVE_TO_STRING)
    TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DHAVE_TO_STRING)
ENDIF()

IF(USING_MALLOC_TRIM)
    TARGET_COMPILE_DEFINITIONS(${BUILD_TARGET_NAME} PRIVATE -DMALLOC_TRIM)
ENDIF()


================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  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
them 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 prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  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.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU 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 that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  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.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     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
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    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 3 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, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program 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, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.

  The GNU 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.  But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.


================================================
FILE: README-cn.md
================================================
# subconverter

在各种订阅格式之间进行转换的实用程序.

[![Build Status](https://github.com/tindy2013/subconverter/actions/workflows/build.yml/badge.svg)](https://github.com/tindy2013/subconverter/actions)
[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/tindy2013/subconverter.svg)](https://github.com/tindy2013/subconverter/tags)
[![GitHub release](https://img.shields.io/github/release/tindy2013/subconverter.svg)](https://github.com/tindy2013/subconverter/releases)
[![GitHub license](https://img.shields.io/github/license/tindy2013/subconverter.svg)](https://github.com/tindy2013/subconverter/blob/master/LICENSE)

* * *

## 新增内容

2021/10/1

-   新增 [配置文件](#配置文件) 中 `[advanced]` 部分的说明
-   修改调整文档中的多处描述
-   更换文档中失效的外部链接

<details>
<summary><b>更新历史</b></summary>
2020/12/9

-   新增 [特别用法](#特别用法) 中 [规则转换](#规则转换) 的说明
-   修改 [配置文件](#配置文件) 中的 `clash_proxy_group` 为 `proxy_group` ,并增加修改描述与示例
-   修改 [配置文件](#配置文件) 中 `[ruleset]` 部分的 `surge_ruleset` 为 `ruleset ` ,并增加修改示例
-   修改 [外部配置](#外部配置) 中 `surge_ruleset` 为 `ruleset ` 
-   新增 [外部配置](#外部配置) 中 `add_emoji` 和 `remove_old_emoji` 
-   修改 [外部配置](#外部配置) 中 `proxy_group` 和  `ruleset ` 的描述与示例
-   调整 [简易用法](#简易用法) 与 [进阶用法](#进阶用法) 中的部分描述
-   更换文档中失效的外部链接

2020/11/20

-   新增 [支持类型](#支持类型) 中 `mixed` & `auto` 参数
-   新增 [进阶链接](#进阶链接) 中多个调用参数的说明
-   新增 [配置文件](#配置文件) 中 `[userinfo]` 部分的描述
-   新增 [配置文件](#配置文件) 中 `[common]`&`[node_pref]`&`[server]` 中多个参数的描述
-   修改 [进阶链接](#进阶链接) 中 `url` 参数的说明

2020/04/29

-   新增 [配置文件](#配置文件) 指定默认外部配置文件
-   新增 [配置文件](#配置文件) 中 `[aliases]` 参数的描述
-   新增 [模板功能](#模板功能) 用于直接渲染的 `/render` 接口的描述
-   修改 [支持类型](#支持类型) 中类 TG 类型节点的描述
-   调整 模板介绍 为 [模板功能](#模板功能)

2020/04/04

-   新增 [模板介绍](#模板介绍) 用于对所引用的 `base` 基础模板进行高度个性化自定义
-   新增 [配置文件](#配置文件) 中 `[template]` 参数的描述
-   新增 [外部配置](#外部配置) 中 `[template]` 参数的描述
-   新增 [本地生成](#本地生成) 用于在本地生成具体的配置文件
-   新增 [支持类型](#支持类型) 中 `mellow` & `trojan` 参数
-   新增 [进阶链接](#进阶链接) 中 `new_name` 参数的描述
-   新增 [配置文件](#配置文件) 中 `append_sub_userinfo` `clash_use_new_field_name` 参数的描述
-   调整 [说明目录](#说明目录) 层次

2020/03/02

-   新增 [进阶链接](#进阶链接) 中关于 `append_type` `append_info` `expand` `dev_id` `interval` `strict` 等参数的描述

</details>

* * *

## 说明目录

-   [subconverter](#subconverter)

    -   [新增内容](#新增内容)

    -   [说明目录](#说明目录)

    -   [支持类型](#支持类型)

    -   [简易用法](#简易用法)

        -   [调用地址](#调用地址)
        -   [调用说明](#调用说明)
        -   [简易转换](#简易转换)

    -   [进阶用法](#进阶用法)

        -   [阅前提示](#阅前提示)

        -   [进阶链接](#进阶链接)

            -   [调用地址 (进阶)](#调用地址-进阶)
            -   [调用说明 (进阶)](#调用说明-进阶)

        -   [配置档案](#配置档案)

            -   [调用地址 (档案)](#调用地址-档案)
            -   [调用说明 (档案)](#调用说明-档案)

        -   [配置文件](#配置文件)

        -   [外部配置](#外部配置)

        -   [模板功能](#模板功能)

            -   [模板调用](#模板调用)
            -   [直接渲染](#直接渲染)

    -   [特别用法](#特别用法)

        -   [本地生成](#本地生成)

        -   [自动上传](#自动上传)

        -   [规则转换](#规则转换)

            -   [调用地址 (规则转换)](#调用地址-规则转换)
            -   [调用说明 (规则转换)](#调用说明-规则转换)

## 支持类型

| 类型                     | 作为源类型 | 作为目标类型 | 参数             |
| ---------------------- | :---: | :----: | -------------- |
| Clash                  |   ✓   |    ✓   | clash          |
| ClashR                 |   ✓   |    ✓   | clashr         |
| Quantumult (完整配置)      |   ✓   |    ✓   | quan           |
| Quantumult X (完整配置)    |   ✓   |    ✓   | quanx          |
| Loon                   |   ✓   |    ✓   | loon           |
| Mellow                 |   ✓   |    ✓   | mellow         |
| SS (SIP002)            |   ✓   |    ✓   | ss             |
| SS (软件订阅/SIP008)       |   ✓   |    ✓   | sssub          |
| SSD                    |   ✓   |    ✓   | ssd            |
| SSR                    |   ✓   |    ✓   | ssr            |
| Surfboard              |   ✓   |    ✓   | surfboard      |
| Surge 2                |   ✓   |    ✓   | surge&ver=2    |
| Surge 3                |   ✓   |    ✓   | surge&ver=3    |
| Surge 4                |   ✓   |    ✓   | surge&ver=4    |
| Trojan                 |   ✓   |    ✓   | trojan         |
| V2Ray                  |   ✓   |    ✓   | v2ray          |
| 类 TG 代理的 HTTP/Socks 链接 |   ✓   |    ×   | 仅支持 `&url=` 调用 |
| Mixed                  |   ×   |    ✓   | mixed          |
| Auto                   |   ×   |    ✓   | auto           |

注意:

1.  Shadowrocket 用户可以使用 `ss`、`ssr` 、 `v2ray` 以及 `mixed` 参数

2.  类 TG 代理的 HTTP/Socks 链接由于没有命名设定,所以可以在后方插入`&remarks=`进行命名,同时也可以插入 `&group=` 设置组别名称,以上两个参数需要经过 [URLEncode](https://www.urlencoder.org/) 处理,例如

    -   tg://http?server=1.2.3.4&port=233&user=user&pass=pass&remarks=Example&group=xxx
    -   <https://t.me/http?server=1.2.3.4&port=233&user=user&pass=pass&remarks=Example&group=xxx>

3.  目标类型为 `mixed` 时,会输出所有支持的节点的单链接组成的普通订阅(Base64编码)

4.  目标类型为 `auto` 时,会根据请求的 `User-Agent` 自动判断输出的目标类型,匹配规则可参见 [此处](https://github.com/tindy2013/subconverter/blob/master/src/handler/interfaces.cpp#L121) (该链接有可能因为代码修改而不能准确指向相应的代码)

* * *

## 简易用法

> 即生成的订阅使用 **默认设置**

### 调用地址

```txt
http://127.0.0.1:25500/sub?target=%TARGET%&url=%URL%&config=%CONFIG%
```

### 调用说明

| 调用参数   | 必要性 | 示例                        | 解释                                                                                                                  |
| ------ | :-: | :------------------------ | ------------------------------------------------------------------------------------------------------------------- |
| target |  必要 | surge&ver=4               | 指想要生成的配置类型,详见上方 [支持类型](#支持类型) 中的参数                                                                                  |
| url    |  必要 | https%3A%2F%2Fwww.xxx.com | 指机场所提供的订阅链接或代理节点的分享链接,需要经过 [URLEncode](https://www.urlencoder.org/) 处理                                              |
| config |  可选 | https%3A%2F%2Fwww.xxx.com | 指 外部配置 的地址 (包含分组和规则部分),需要经过 [URLEncode](https://www.urlencoder.org/) 处理,详见 [外部配置](#外部配置) ,当此参数不存在时使用 程序的主程序目录中的配置文件 |

运行 subconverter 主程序后,按照 [调用说明](#调用说明) 的对应内容替换即可得到一份使用**默认设置**的订阅。

由于此部分篇幅较长,点击下方条目即可展开详解:

<details>
<summary><b>处理单份订阅</b></summary>

如果你需要将一份 Surge 订阅转换成 Clash 的订阅, 可以按以下操作:

```txt
有以下一个订阅,且想转换成 Clash 的订阅:
1. https://dler.cloud/subscribe/ABCDE?surge=ss

首先将订阅通过 URLEncode 后可以得到:
https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fsurge%3Dss

然后将想要的 %TARGET% (即 Clash) 和上一步所得到的 %URL% 填入调用地址中:
http://127.0.0.1:25500/sub?target=clash&url=https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fsurge%3Dss

最后将该链接填写至 Clash 的订阅处就大功告成了。
```

</details>

<details>
<summary><b>处理多份订阅</b></summary>

如果你需要将多个订阅合成一份, 则要在上方所提及的 URLEncode 之前使用 '|' 来分隔链接, 可以按以下操作:

```txt
有以下两个订阅,且想合并转换成 Clash 的订阅:
1. https://dler.cloud/subscribe/ABCDE?clash=vmess
2. https://rich.cloud/subscribe/ABCDE?clash=vmess

首先使用 '|' 将两个订阅分隔开:
https://dler.cloud/subscribe/ABCDE?clash=vmess|https://rich.cloud/subscribe/ABCDE?clash=vmess

接着通过 URLEncode 后可以得到:
https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess%7Chttps%3A%2F%2Frich.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess

然后将想要的 %TARGET% (即 Clash) 和上一步所得到的 %URL% 填入调用地址中:
http://127.0.0.1:25500/sub?target=clash&url=https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess%7Chttps%3A%2F%2Frich.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess

最后将该链接填写至 Clash 的订阅处就大功告成了。
```

</details>

<details>
<summary><b>处理单份链接</b></summary>

如果你需要将自建的一条 SS 的 SIP002 链接转换成 Clash 的订阅, 可以按以下操作:

```txt
有以下自建的一条 SS 的 SIP002 链接,且想转换成 Clash 的订阅:
1. ss://YWVzLTEyOC1nY206dGVzdA==@192.168.100.1:8888#Example1

首先将订阅通过 URLEncode 后可以得到:
ss%3A%2F%2FYWVzLTEyOC1nY206dGVzdA%3D%3D%40192%2E168%2E100%2E1%3A8888%23Example1

然后将想要的 %TARGET% (即 Clash) 和上一步所得到的 %URL% 填入调用地址中:
http://127.0.0.1:25500/sub?target=clash&url=ss%3A%2F%2FYWVzLTEyOC1nY206dGVzdA%3D%3D%40192%2E168%2E100%2E1%3A8888%23Example1

最后将该链接填写至 Clash 的订阅处就大功告成了。
```

</details>

<details>
<summary><b>处理多份链接</b></summary>

如果你需要将多个链接合成一份, 则要在上方所提及的 URLEncode 之前使用 '|' 来分隔链接, 可以按以下操作:

```txt
有以下两个链接,且想合并转换成 Clash 的订阅:
1. ss://YWVzLTEyOC1nY206dGVzdA==@192.168.100.1:8888#Example1
2. vmess://eyJ2IjoiMiIsInBzIjoidm1lc3MtcHJveHkxIiwiYWRkIjoiZXhhbXBsZS5jb20iLCJwb3J0Ijo0NDMsInR5cGUiOiIiLCJpZCI6IjEyMzQ1Njc4LWFiY2QtMTIzNC0xMjM0LTQ3ZmZjYTBjZTIyOSIsImFpZCI6NDQzLCJuZXQiOiJ3cyIsInBhdGgiOiIvdjIiLCJob3N0IjoiZXhhbXBsZS5jb20iLCJ0bHMiOiJ0bHMifQ==

首先使用 '|' 将两个链接分隔开:
ss://YWVzLTEyOC1nY206dGVzdA==@192.168.100.1:8888#Example1|vmess://eyJ2IjoiMiIsInBzIjoidm1lc3MtcHJveHkxIiwiYWRkIjoiZXhhbXBsZS5jb20iLCJwb3J0Ijo0NDMsInR5cGUiOiIiLCJpZCI6IjEyMzQ1Njc4LWFiY2QtMTIzNC0xMjM0LTQ3ZmZjYTBjZTIyOSIsImFpZCI6NDQzLCJuZXQiOiJ3cyIsInBhdGgiOiIvdjIiLCJob3N0IjoiZXhhbXBsZS5jb20iLCJ0bHMiOiJ0bHMifQ==

接着通过 URLEncode 后可以得到:
ss%3A%2F%2FYWVzLTEyOC1nY206dGVzdA%3D%3D%40192%2E168%2E100%2E1%3A8888%23Example1%7Cvmess%3A%2F%2FeyJ2IjoiMiIsInBzIjoidm1lc3MtcHJveHkxIiwiYWRkIjoiZXhhbXBsZS5jb20iLCJwb3J0Ijo0NDMsInR5cGUiOiIiLCJpZCI6IjEyMzQ1Njc4LWFiY2QtMTIzNC0xMjM0LTQ3ZmZjYTBjZTIyOSIsImFpZCI6NDQzLCJuZXQiOiJ3cyIsInBhdGgiOiIvdjIiLCJob3N0IjoiZXhhbXBsZS5jb20iLCJ0bHMiOiJ0bHMifQ%3D%3D

然后将想要的 %TARGET% (即 Clash) 和上一步所得到的 %URL% 填入调用地址中:
http://127.0.0.1:25500/sub?target=clash&url=ss%3A%2F%2FYWVzLTEyOC1nY206dGVzdA%3D%3D%40192%2E168%2E100%2E1%3A8888%23Example1%7Cvmess%3A%2F%2FeyJ2IjoiMiIsInBzIjoidm1lc3MtcHJveHkxIiwiYWRkIjoiZXhhbXBsZS5jb20iLCJwb3J0Ijo0NDMsInR5cGUiOiIiLCJpZCI6IjEyMzQ1Njc4LWFiY2QtMTIzNC0xMjM0LTQ3ZmZjYTBjZTIyOSIsImFpZCI6NDQzLCJuZXQiOiJ3cyIsInBhdGgiOiIvdjIiLCJob3N0IjoiZXhhbXBsZS5jb20iLCJ0bHMiOiJ0bHMifQ%3D%3D

最后将该链接填写至 Clash 的订阅处就大功告成了。
```

</details>

### 简易转换

当机场提供的 Surge 配置足以满足需求,但额外需要使用 Clash 订阅时,此时可以使用以下方式进行转换

```txt
http://127.0.0.1:25500/surge2clash?link=Surge的订阅链接
```

此处 `Surge的订阅链接`**不需要进行URLEncode**,且**无需任何额外配置**。

* * *

## 进阶用法

> 在不满足于本程序所提供的默认规则或者对应的分组时,可以考虑尝试进阶用法
>
> 即 对 `调用地址` 甚至程序目录下的 `配置文件` 进行个性化的编辑以满足不同的需求

### 阅前提示

在进行下一步操作前,十分推荐您阅读以下内容:

1.  与 调用地址 相关的:[什么是URL?](https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/What_is_a_URL)
2.  与 配置文件 相关的:[INI 语法介绍](https://zh.wikipedia.org/wiki/INI%E6%96%87%E4%BB%B6) 、 [YAML 语法介绍](https://zh.wikipedia.org/wiki/YAML#%E8%AA%9E%E6%B3%95) 以及  [TOML 语法介绍](https://toml.io/cn/v1.0.0)
3.  与 `Clash` 配置相关的:[YAML 语法介绍](https://zh.wikipedia.org/wiki/YAML#%E8%AA%9E%E6%B3%95) 以及 [官方文档](https://github.com/Dreamacro/clash/wiki/configuration)
4.  与 `模板` 配置相关的:[INJA 语法介绍](https://github.com/pantor/inja)
5.  会经常涉及到的: [正则表达式入门](https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md)
6.  当遇到问题需要提交 ISSUE 时的:[提问的智慧](https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md)

当您尝试进行进阶操作时,即默认您有相关的操作能力,本程序仅保证在默认配置文件下能够正常运行。

### 进阶链接

#### 调用地址 (进阶)

```txt
http://127.0.0.1:25500/sub?target=%TARGET%&url=%URL%&emoji=%EMOJI%····
```

#### 调用说明 (进阶)

| 调用参数          | 必要性 | 示例                        | 解释                                                                                                                                                                                                          |
| ------------- | :-: | :------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| target        |  必要 | surge&ver=4               | 指想要生成的配置类型,详见上方 [支持类型](#支持类型) 中的参数                                                                                                                                                                          |
| url           |  可选 | https%3A%2F%2Fwww.xxx.com | 指机场所提供的订阅链接或代理节点的分享链接,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,**可选的前提是在 `default_url` 中进行指定**。也可以使用 data URI。可使用 `tag:xxx,https%3A%2F%2Fwww.xxx.com` 指定该订阅的所有节点归属于`xxx`分组,用于配置文件中的`!!GROUP=XXX` 匹配 |
| group         |  可选 | MySS                      | 用于设置该订阅的组名,多用于 SSD/SSR                                                                                                                                                                                      |
| upload_path   |  可选 | MySS.yaml                 | 用于将生成的订阅文件上传至 `Gist` 后的名称,需要经过 [URLEncode](https://www.urlencoder.org/) 处理                                                                                                                                  |
| include       |  可选 | 详见下文中 `include_remarks`   | 指仅保留匹配到的节点,支持正则匹配,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,会覆盖配置文件里的设置                                                                                                                              |
| exclude       |  可选 | 详见下文中 `exclude_remarks`   | 指排除匹配到的节点,支持正则匹配,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,会覆盖配置文件里的设置                                                                                                                               |
| config        |  可选 | https%3A%2F%2Fwww.xxx.com | 指 外部配置 的地址 (包含分组和规则部分),需要经过 [URLEncode](https://www.urlencoder.org/) 处理,详见 [外部配置](#外部配置) ,当此参数不存在时使用 主程序目录中的配置文件                                                                                            |
| dev_id        |  可选 | 92DSAFA                   | 用于设置 QuantumultX 的远程设备 ID, 以在某些版本上开启远程脚本                                                                                                                                                                    |
| filename      |  可选 | MySS                      | 指定所生成订阅的文件名,可以在 Clash For Windows 等支持文件名的软件中显示出来                                                                                                                                                            |
| interval      |  可选 | 43200                     | 用于设置托管配置更新间隔,确定配置将更新多长时间,单位为秒                                                                                                                                                                               |
| rename        |  可选 | 详见下文中 `rename`            | 用于自定义重命名,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,会覆盖配置文件里的设置                                                                                                                                       |
| filter_script |  可选 | 详见下文中 `filter_script`     | 用于自定义筛选节点的js代码,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,会覆盖配置文件里的设置。出于安全考虑,链接需包含正确的 `token` 参数,才会应用该设置                                                                                              |
| strict        |  可选 | true / false              | 如果设置为 true,则 Surge 将在上述间隔后要求强制更新                                                                                                                                                                            |
| upload        |  可选 | true / false              | 用于将生成的订阅文件上传至 `Gist`,需要填写`gistconf.ini`,默认为 false (即不上传) ,详见 [自动上传](#自动上传)                                                                                                                                  |
| emoji         |  可选 | true / false              | 用于设置节点名称是否包含 Emoji,默认为 true                                                                                                                                                                                 |
| add_emoji     |  可选 | true / false              | 用于在节点名称前加入 Emoji,默认为 true                                                                                                                                                                                   |
| remove_emoji  |  可选 | true / false              | 用于设置是否删除节点名称中原有的 Emoji,默认为 true                                                                                                                                                                             |
| append_type   |  可选 | true / false              | 用于在节点名称前插入节点类型,如 `[SS]`,`[SSR]`等                                                                                                                                                                               |
| tfo           |  可选 | true / false              | 用于开启该订阅链接的 TCP Fast Open,默认为 false                                                                                                                                                                          |
| udp           |  可选 | true / false              | 用于开启该订阅链接的 UDP,默认为 false                                                                                                                                                                                    |
| list          |  可选 | true / false              | 用于输出 Surge Node List 或者 Clash Proxy Provider 或者 Quantumult (X) 的节点订阅 或者 解码后的 SIP002                                                                                                                         |
| sort          |  可选 | true / false              | 用于对输出的节点或策略组按节点名进行再次排序,默认为 false                                                                                                                                                                            |
| sort_script   |  可选 | 详见下文 `sort_script`        | 用于自定义排序的js代码,需要经过 [URLEncode](https://www.urlencoder.org/) 处理,会覆盖配置文件里的设置。出于安全考虑,链接需包含正确的 `token` 参数,才会应用该设置                                                                                                |
| script        |  可选 | true / false              | 用于生成Clash Script,默认为 false                                                                                                                                                                                  |
| insert        |  可选 | true / false              | 用于设置是否将配置文件中的 `insert_url` 插入,默认为 true                                                                                                                                                                      |
| scv           |  可选 | true / false              | 用于关闭 TLS 节点的证书检查,默认为 false                                                                                                                                                                                  |
| fdn           |  可选 | true / false              | 用于过滤目标类型不支持的节点,默认为 true                                                                                                                                                                                     |
| expand        |  可选 | true / false              | 用于在 API 端处理或转换 Surge, QuantumultX, Clash 的规则列表,即是否将规则全文置入订阅中,默认为 true,设置为 false 则不会将规则全文写进订阅                                                                                                                |
| append_info   |  可选 | true / false              | 用于输出包含流量或到期信息的节点, 默认为 true,设置为 false 则取消输出                                                                                                                                                                  |
| prepend       |  可选 | true / false              | 用于设置插入 `insert_url` 时是否插入到所有节点前面,默认为 true                                                                                                                                                                   |
| classic       |  可选 | true / false              | 用于设置是否生成 Clash classical rule-provider                                                                                                                                                                      |
| tls13         |  可选 | true / false              | 用于设置是否为节点增加tls1.3开启参数                                                                                                                                                                                       |
| new_name      |  可选 | true / false              | 如果设置为 true,则将启用 Clash 的新组名称 (proxies, proxy-groups, rules)                                                                                                                                                  |

举个例子:

```txt
有订阅 `https://dler.cloud/subscribe/ABCDE?clash=vmess`,想转换成 Surge 4 的订阅,且需要开启 TFO 和 UDP
顺便再给节点名加上 EMOJI 同时排除掉订阅中显示流量和官网的节点(节点名为"剩余流量:1024G","官网地址:dler.cloud")

首先确认需要用到的参数:
target=surge&ver=4 、 tfo=true 、 udp=true 、 emoji=true 、exclude=(流量|官网)
url=https://dler.cloud/subscribe/ABCDE?clash=vmess

然后将需要 URLEncode 的部分进行处理:
exclude=%28%E6%B5%81%E9%87%8F%7C%E5%AE%98%E7%BD%91%29
url=https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess

接着将所有元素进行拼接:
http://127.0.0.1:25500/sub?target=surge&ver=4&tfo=true&udp=true&emoji=true&exclude=%28%E6%B5%81%E9%87%8F%7C%E5%AE%98%E7%BD%91%29&url=https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess

最后将该链接填写至 Surge 的订阅处就大功告成了。
```

### 配置档案

> 当通过上述 [进阶链接](#进阶链接) 配置好订阅链接后,通常会使得链接十分冗长和难以记忆,此时可以考虑使用配置档案。

此功能暂时**仅能读取本地文件**

#### 调用地址 (档案)

```txt
http://127.0.0.1:25500/getprofile?name=%NAME%&token=%TOKEN%
```

#### 调用说明 (档案)

| 调用参数  | 必要性 | 示例                        | 解释                                                                             |
| ----- | :-: | :------------------------ | :----------------------------------------------------------------------------- |
| name  |  必要 | profiles/formyairport.ini | 指配置档案的存储位置(可使用基于**pref 配置文件**的相对位置)                                            |
| token |  必要 | passwd                    | 为了安全考虑**必须设置token**(详见 [配置文件](#配置文件) 中 `[common] 部分` 对 `api_access_token` 的描述) |

应当注意的是,此处文件内的参数**无需进行 URLEncode**,且此处的 `token` 与 `api_mode` 的状态无关。

在程序目录内的任意位置创建一个新的文档文件(推荐保存至 `profiles` 文件夹内,以使整洁目录及便于后续维护),如 `formyairport.ini`,并仿照 [示例文档](https://github.com/tindy2013/subconverter/blob/master/base/profiles/example_profile.ini) 根据配置好的参数填写进去即可。

<details>
<summary>举个例子:</summary>

以上述 [进阶链接](#进阶链接) 的例子而言,`formyairport.ini` 内的内容应当是:

```txt
[Profile]
url=https://dler.cloud/subscribe/ABCDE?clash=vmess
target=surge
surge_ver=4
tfo=true
udp=true
emoji=true
exclude=(流量|官网)
```

在编辑并保存好 `formyairport.ini` 后,即可使用 `http://127.0.0.1:25500/getprofile?name=profiles/formyairport.ini&token=passwd` 进行调用。

</details>

### 配置文件

> 关于 subconverter 主程序目录中 `pref.ini` 文件的解释,其余格式的配置文件不再赘述,与之相仿。

注:本部分内容以本程序中的 [`pref.example.ini`](https://github.com/tindy2013/subconverter/blob/master/base/pref.example.ini) 或 [`pref.example.yml`](https://github.com/tindy2013/subconverter/blob/master/base/pref.example.yml) 或 [`pref.example.toml`](https://github.com/tindy2013/subconverter/blob/master/base/pref.example.toml) 为准,本文档可能由于更新不及时,内容不适用于新版本。

加载配置文件时会按照`pref.toml`、`pref.yml`、`pref.ini`的优先级顺序加载优先级高的配置文件

由于此部分篇幅较长,点击下方条目即可展开详解:

<details>
<summary><b>[common] 部分</b></summary>

> 该部分主要涉及到的内容为 **全局的节点排除或保留** 、**各配置文件的基础**
>
> 其他设置项目可以保持默认或者在知晓作用的前提下进行修改

1.  **api_mode**

    > API 模式,设置为 true 以防止直接加载本地订阅或直接提供本地文件,若访问这些内容则需要接上 `&token=`。(多用于部署公共订阅转换服务时)

    -   当值为 `false` 时, 每次更新配置都会读取 主程序目录中的配置文件 , 为 `true` 时则仅启动时读取。

2.  **api_access_token**

    > 用于访问相对隐私的接口(如 `/getprofile`)

    -   例如:

        ```ini
        api_access_token=passwd
        ```

3.  **default_url**

    > 无 %URL% 参数时,默认加载的订阅链接, **不需要 URLEncode**。
    >
    > 如果有多个链接,仍然需要使用 "|" 分隔,支持`文件`/`url`

    -   例如:

        ```ini
        default_url=https://dler.cloud/subscribe/ABCDE?clash=vmess
        ```

    -   解释:

        ```txt
        此时订阅链接:
        http://127.0.0.1:25500/sub?target=clash
        等同于:
        http://127.0.0.1:25500/sub?target=clash&url=https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess
        ```

4.  **enable_insert**

    > 设置是否为输出的订阅添加 `insert_url` 中所有的节点

    -   当值为 `true` 时, 会在输出的订阅中添加 `insert_url` 中所有的节点, 为 `false` 时不添加。

5.  **insert_url**

    > 当 `enable_insert` 的值为 `true` 时,无论是否具有 %URL% 参数时,都会在添加订阅前加入的节点, **不需要 URLEncode**。
    >
    > 如果有多个节点,仍然需要使用 "|" 分隔,支持 `单个节点`/`订阅链接`
    >
    > 支持 SS/SSR/Vmess 以及类 TG 代理的 HTTP/Socks 链接

    -   例如:

        ```ini
        insert_url=ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpwYXNzd29yZA@www.example.com:1080#Example
        insert_url=ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpwYXNzd29yZA@www.example.com:1080#Example
        ```

6.  **prepend_insert_url**

    > 设置为输出的订阅添加 `insert_url` 中的节点时是否添加至所有节点前方

    -   当值为 `true` 时, 会在输出的订阅中所有节点的前方添加 `insert_url` 中所有的节点, 为 `false` 时在后方添加。

7.  **exclude_remarks**

    > 排除匹配到的节点,支持正则匹配

    -   例如:

        ```ini
        exclude_remarks=(到期|剩余流量|时间|官网|产品|平台)
        ```

8.  **include_remarks**

    > 仅保留匹配到的节点,支持正则匹配

    -   例如:

        ```ini
        include_remarks=(?<=美).*(BGP|GIA|IPLC)
        ```

9.  **enable_filter**

    > 设置为所有节点使用自定义的js代码进行筛选

    -   当值为 `true` 时, 为所有节点使用自定义的js代码进行筛选, 为 `false` 时不使用。

10. **filter_script**

    > 为所有节点使用自定义的js函数进行筛选
    >
    > 可设置为js代码内容,也可为本地js文件的路径
    >
    > js函数包括一个参数,即一个节点,函数返回为true时保留该节点,返回为false时丢弃该节点

    -   例如:

        ```ini
        #仅保留加密方式为chacha20的节点
        filter_script=function filter(node) {\n    if(node.EncryptMethod.includes('chacha20'))\n        return true;\n    return false;\n}
        # 或者使用本地文件
        filter_script="path:/path/to/script.js"
        ```

    -   node对象包含节点的全部信息,具体结构参见[此处](https://github.com/netchx/netch/blob/268bdb7730999daf9f27b4a81cfed5c36366d1ce/GSF.md)

11. **default_external_config**

    > 如果未指定外部配置文件,则将其设置为默认值。支持 `本地文件` 和 `在线URL`

    -   例如:

        ```ini
        default_external_config=config/example_external_config.ini
        ```

12. **base_path**

    > 限制外部配置可以使用的本地配置文件基础路径。

    -   例如:

        ```ini
        base_path=base
        #外部配置只可以使用base文件夹下的本地配置文件基础
        ```

13. **clash_rule_base**

    > 生成的 Clash 配置文件模板。支持 `本地文件` 和 `在线URL`

    -   例如:

        ```ini
        clash_rule_base=base/GeneralClashConfig.yml # 加载本地文件作为模板
        # 或者
        clash_rule_base=https://github.com/ACL4SSR/ACL4SSR/raw/master/Clash/GeneralClashConfig.yml
        # 加载ACL4SSR的 Github 中相关文件作为模板
        ```

14. **surge_rule_base**

    > 生成的 Surge 配置文件模板,用法同上

15. **surfboard_rule_base**

    > 生成的 Surfboard 配置文件模板,用法同上

16. **mellow_rule_base**

    > 生成的 Mellow 配置文件模板,用法同上

17. **loon_rule_base**

    > 生成的 Loon 配置文件模板,用法同上

18. **sssub_rule_base**

    > 生成的 sssub 配置文件模板,用法同上

19. **proxy_config**

    > 更新 外部配置文件 时是否使用代理
    >
    > 填写 `NONE` 或者空白禁用,或者填写 `SYSTEM` 使用系统代理
    >
    > 支持HTTP 或 SOCKS 代理(http&#x3A;// https&#x3A;// socks4a:// socks5://)
    >
    > 支持CORS代理(cors:),详细参见[cors-anywhere](https://github.com/Rob--W/cors-anywhere)、[cloudflare-cors-anywhere](https://github.com/Zibri/cloudflare-cors-anywhere)等

    -   例如:

        ```ini
        proxy_config=SYSTEM # 使用系统代理
        # 或者
        proxy_config=socks5://127.0.0.1:1080 # 使用本地的 1080 端口进行 SOCKS5 代理
        # 或者
        proxy_config=cors:https://cors-anywhere.herokuapp.com/ # 使用CORS代理
        ```

20. **proxy_ruleset**

    > 更新 规则 时是否使用代理,用法同上

21. **proxy_subscription**

    > 更新 原始订阅 时是否使用代理,用法同上

22. **append_proxy_type**

    > 节点名称是否需要加入属性,设置为 true 时在节点名称前加入 \[SS] \[SSR] \[VMess] 以作区别,
    >
    > 默认为 false

    -   例如(设置为 true时):

    ```txt
    [SS] 香港中转
    [VMess] 美国 GIA
    ```

</details>
<details>
<summary><b>[userinfo] 部分</b></summary>

> 该部分主要涉及到的内容为 **从节点名中提取用户信息的规则**
>
> 相关设置项目建议保持默认或者在知晓作用的前提下进行修改

1.  **stream_rule**

    > 从节点名中提取流量信息及显示的规则
    >
    > 使用方式:从节点提取信息的正则表达式|显示信息的正则表达式

    -   例如:

        ```ini
        stream_rule=^剩余流量:(.*?)\|总流量:(.*)$|total=$2&left=$1
        stream_rule=^剩余流量:(.*?) (.*)$|total=$1&left=$2
        stream_rule=^Bandwidth: (.*?)/(.*)$|used=$1&total=$2
        stream_rule=^\[.*?\]剩余(.*?)@(?:.*)$|total=$1
        stream_rule=^.*?流量:(.*?) 剩:(?:.*)$|total=$1
        ```

2.  **time_rule**

    > 从节点名中提取时间信息的规则
    >
    > 使用方式:从节点提取信息的正则表达式|显示信息的正则表达式

    -   例如:

        ```ini
        time_rule=^过期时间:(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)$|$1:$2:$3:$4:$5:$6
        time_rule=^到期时间(:|:)(\d+)-(\d+)-(\d+)$|$1:$2:$3:0:0:0
        time_rule=^Smart Access expire: (\d+)/(\d+)/(\d+)$|$1:$2:$3:0:0:0
        time_rule=^.*?流量:(?:.*?) 剩:(.*)$|left=$1d
        ```

</details>
<details>
<summary><b>[node_pref] 部分</b></summary>

> 该部分主要涉及到的内容为 **开启节点的 UDP 及 TCP Fast Open** 、**节点的重命名** 、**重命名节点后的排序**
>
> 相关设置项目建议保持默认或者在知晓作用的前提下进行修改

1.  **udp_flag**

    > 为节点打开 UDP 模式,设置为 true 时打开,默认为 false

    -   当不清楚机场的设置时**请勿调整此项**。

2.  **tcp_fast_open_flag**

    > 为节点打开 TFO (TCP Fast Open) 模式,设置为 true 时打开,默认为 false

    -   当不清楚机场的设置时**请勿调整此项**。

3.  **skip_cert_verify_flag**

    > 关闭 TLS 节点的证书检查,设置为 true 时打开,默认为 false

    -   **请勿随意将此设置修改为 true**

4.  **tls13_flag**

    > 为节点增加tls1.3开启参数,设置为 true 时打开,默认为 false

    -   **请勿随意将此设置修改为 true**

5.  **sort_flag**

    > 对生成的订阅中的节点按节点名进行 A-Z 的排序,设置为 true 时打开,默认为 false

6.  **sort_script**

    > 对生成的订阅中的节点按自定义js函数进行排序
    >
    > 可设置为js代码内容,也可为本地js文件的路径
    >
    > js函数包括2个参数,即2个节点,函数返回为true时,节点a排在节点b的前方
    >
    > 具体细节参照 `[common]` 部分**filter_script**中的介绍

    -   例如:

        ```ini
        sort_script=function compare(node_a, node_b) {\n    return node_a.Remark > node_b.Remark;\n}
        # 或者
        sort_script="path:/path/to/script.js"
        ```

7.  **filter_deprecated_nodes**

    > 排除当前 **`target=`** 不支持的节点类型,设置为 true 时打开,默认为 false

    -   可以考虑设置为 true,从而在**一定程度上避免出现兼容问题**

8.  **append_sub_userinfo**

    > 在 header 里的加入流量信息 (Quanx, Surge 等读取后可以显示流量信息通知),设置为 true 时打开,默认为 true

9.  **clash_use_new_field_name**

    > 启用 Clash 的新区块名称 (proxies, proxy-groups, rules),设置为 true 时打开,默认为 true

    -   Clash内核在v0.19.0版本时开始启用新区块名称,当前已广泛使用v0.19.0及以上的版本,除非您确定正在使用极为古老的版本,否则请勿关闭。

10. **clash_proxies_style**

    > 在Clash配置文件中proxies的生成风格
    >
    > 可选的值为`block`、 `flow`、 `compact`,默认为`flow`

    -   风格示例:

        ```yaml
        Block:
          - name: name1
            key: value
          - name: name2
            key: value
        Flow:
          - {name: name1, key: value}
          - {name: name2, key: value}
        Compact:
         [{name: name1, key: value},{name: name2, key: value}]
        ```

11. **rename_node**

    > 重命名节点,支持正则匹配
    >
    > 使用方式:原始命名@重命名
    >
    > 可以使用自定义的js函数进行重命名
    >
    > 具体细节参照 `[common]` 部分**filter_script**中的介绍

    -   例如:

        ```ini
        rename_node=中国@中
        rename_node=\(?((x|X)?(\d+)(\.?\d+)?)((\s?倍率?:?)|(x|X))\)?@(倍率:$1)
        rename_node=!!script:function rename(node) {\n  const geoinfo = JSON.parse(geoip(node.Hostname));\n  if(geoinfo.country_code == "CN")\n    return "CN " + node.Remark;\n}
        rename_node=!!script:path:/path/to/script.js
        ```

    -   特殊用法:

        ```ini
        rename_node=!!GROUPID=0!!中国@中
        # 指定此重命名仅在第一个订阅的节点中生效
        ```

</details>
<details>
<summary><b>[managed_config] 部分</b></summary>

> 该部分主要涉及到的内容为 **订阅文件的更新地址**

1.  **write_managed_config**

    > 是否将 '#!MANAGED-CONFIG' 信息附加到 Surge 或 Surfboard 配置,设置为 true 时打开,默认为 true

2.  **managed_config_prefix**

    > 具体的 '#!MANAGED-CONFIG' 信息,地址前缀不用添加 "/"。
    >
    > Surge 或 Surfboard 会向此地址发出更新请求,同时本地 ruleset 转 url 会用此生成/getruleset链接。
    >
    > 局域网用户需要将此处改为本程序运行设备的局域网 IP

    -   例如:

    ```ini
    managed_config_prefix = http://192.168.1.5:25500
    ```

3.  **config_update_interval**

    > 托管配置更新间隔,确定配置将更新多长时间,单位为秒

    -   例如:

    ```ini
    config_update_interval = 86400
    # 每 86400 秒更新一次(即一天)
    ```

4.  **config_update_strict**

    > 如果 config_update_strict 为 true,则 Surge 将在上述间隔后要求强制更新。

5.  **quanx_device_id**

    > 用于重写 Quantumult X 远程 JS 中的设备 ID,该 ID 在 Quantumult X 设置中自行查找

    -   例如:

        ```ini
        quanx_device_id = XXXXXXX
        ```

</details>
<details>
<summary><b>[surge_external_proxy] 部分</b></summary>

> 为 Surge 添加 SSR 的支持路径

</details>
<details>
<summary><b>[emojis] 部分</b></summary>

1.  **add_emoji**

    > 是否在节点名称前加入下面自定义的 Emoji,设置为 true 时打开,默认为 true

2.  **remove_old_emoji**

    > 是否移除原有订阅中存在的 Emoji,设置为 true 时打开,默认为 true

3.  **rule**

    > 在匹配到的节点前添加自定义 emojis,支持正则匹配

    -   例如:

        ```ini
        rule=(流量|时间|应急),⌛time
        rule=(美|美国|United States),🇺🇸
        ```

    -   特殊用法:

        ```ini
        rule=!!GROUPID=0!!(流量|时间|应急),⌛time
        # 指定此 Emoji 规则仅在第一个订阅的节点中生效
        ```

</details>
<details>
<summary><b>[ruleset] 部分</b></summary>

> 如果你对原本订阅自带的规则不满意时,可以使用如下配置

1.  **enabled**

    > 启用自定义规则集的**总开关**,设置为 true 时打开,默认为 true

2.  **overwrite_original_rules**

    > 覆盖原有规则,即 `[common]` 中 xxx_rule_base 中的内容,设置为 true 时打开,默认为 false

3.  **update_ruleset_on_request**

    > 根据请求执行规则集更新,设置为 true 时打开,默认为 false

4.  **ruleset**

    > 从本地或 url 获取规则片段
    >
    > 格式为 `Group name,[type:]URL[,interval]` 或 `Group name,[]Rule `
    >
    > 支持的type(类型)包括:surge, quanx, clash-domain, clash-ipcidr, clash-classic
    >
    > type留空时默认为surge类型的规则
    >
    > \[] 前缀后的文字将被当作规则,而不是链接或路径,主要包含 `[]GEOIP` 和 `[]MATCH`(等同于 `[]FINAL`)。

    -   例如:

    ```ini
    ruleset=🍎 苹果服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list
    # 表示引用 https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list 规则
    # 且将此规则指向 [proxy_group] 所设置 🍎 苹果服务 策略组
    ruleset=Domestic Services,clash-domain:https://ruleset.dev/clash_domestic_services_domains,86400
    # 表示引用clash-domain类型的 https://ruleset.dev/clash_domestic_services_domains 规则
    # 规则更新间隔为86400秒
    # 且将此规则指向 [proxy_group] 所设置 Domestic Services 策略组
    ruleset=🎯 全球直连,rules/NobyDa/Surge/Download.list
    # 表示引用本地 rules/NobyDa/Surge/Download.list 规则
    # 且将此规则指向 [proxy_group] 所设置 🎯 全球直连 策略组
    ruleset=🎯 全球直连,[]GEOIP,CN
    # 表示引用 GEOIP 中关于中国的所有 IP
    # 且将此规则指向 [proxy_group] 所设置 🎯 全球直连 策略组
    ruleset=!!import:snippets/rulesets.txt
    # 表示引用本地的snippets/rulesets.txt规则
    ```

</details>

<details>
<summary><b>[proxy_group] 部分</b></summary>

> 为 Clash 、Mellow 、Surge 以及 Surfboard 等程序创建策略组, 可用正则来筛选节点
>
> \[] 前缀后的文字将被当作引用策略组

```ini
custom_proxy_group=Group_Name`url-test|fallback|load-balance`Rule_1`Rule_2`...`test_url`interval[,timeout][,tolerance]
custom_proxy_group=Group_Name`select`Rule_1`Rule_2`...
# 格式示例
custom_proxy_group=🍎 苹果服务`url-test`(美国|US)`http://www.gstatic.com/generate_204`300,5,100
# 表示创建一个叫 🍎 苹果服务 的 url-test 策略组,并向其中添加名字含'美国','US'的节点,每隔300秒测试一次,测速超时为5s,切换节点的延迟容差为100ms
custom_proxy_group=🇯🇵 日本延迟最低`url-test`(日|JP)`http://www.gstatic.com/generate_204`300,5
# 表示创建一个叫 🇯🇵 日本延迟最低 的 url-test 策略组,并向其中添加名字含'日','JP'的节点,每隔300秒测试一次,测速超时为5s
custom_proxy_group=负载均衡`load-balance`.*`http://www.gstatic.com/generate_204`300,,100
# 表示创建一个叫 负载均衡 的 load-balance 策略组,并向其中添加所有的节点,每隔300秒测试一次,切换节点的延迟容差为100ms
custom_proxy_group=🇯🇵 JP`select`沪日`日本`[]🇯🇵 日本延迟最低
# 表示创建一个叫 🇯🇵 JP 的 select 策略组,并向其中**依次**添加名字含'沪日','日本'的节点,以及引用上述所创建的 🇯🇵 日本延迟最低 策略组
custom_proxy_group=节点选择`select`(^(?!.*(美国|日本)).*)
# 表示创建一个叫 节点选择 的 select 策略组,并向其中**依次**添加名字不包含'美国'或'日本'的节点
```

-   还可使用一些特殊筛选条件:

    `` `!!GROUPID=%n%`` 待转换链接中的第 n+1 条链接中包含的节点

    `` `!!INSERT=%n%`` 配置文件中 `insert_url` 的第 n+1 条链接所包含的节点

    `` `!!PROVIDER=%proxy-provider-name%`` 指定名称的proxy-provider

    GROUPID 和 INSERT 匹配支持range,如 1,!2,3-4,!5-6,7+,8-

    ```ini
    custom_proxy_group=g1`select`!!GROUPID=0`!!INSERT=0
    # 表示创建一个叫 g1 的 select 策略组,并向其中依次添加订阅链接中第一条订阅链接中的所有节点和配置文件中 insert_url 中的**第一个**节点
    custom_proxy_group=g2`select`!!GROUPID=1
    # 表示创建一个叫 g2 的 select 策略组,并向其中依次添加订阅链接中第二条订阅链接中的所有节点
    custom_proxy_group=g3`select`!!GROUPID=!2
    # 表示创建一个叫 g3 的 select 策略组,并向其中依次添加订阅链接中除了第三条订阅链接之外的所有节点
    custom_proxy_group=g4`select`!!GROUPID=3-5
    # 表示创建一个叫 g4 的 select 策略组,并向其中依次添加订阅链接中第四条到第六条订阅链接中的所有节点
    custom_proxy_group=v2ray`select`!!GROUP=V2RayProvider
    # 表示创建一个叫 v2ray 的 select 策略组,并向其中依次添加订阅链接中组名(tag)为 V2RayProvider 的所有节点
    ```

    注意:此处的订阅链接指 `default_url` 和 `&url=` 中的订阅以及单链接节点(区别于配置文件中 insert_url)

-   现在也可以使用2个条件组合来进行筛选,只有同时满足这2个筛选条件的节点才会被加入组内

    ```ini
    custom_proxy_group=g1hk`select`!!GROUPID=0!!(HGC|HKBN|PCCW|HKT|hk|港)
    # 属于订阅链接中的第一条订阅**且**名字含 HGC、HKBN、PCCW、HKT、hk、港 的节点
    ```

-   也可以使用js脚本筛选加入策略组的节点。A "filter" function with one argument which is an array of all available nodes should be defined in the script.

    ```ini
    custom_proxy_group=script`select`script:/path/to/script.js
    # 表示创建一个叫 script 的 select 策略组,其中的节点使用本地的/path/to/script.js脚本中的函数进行筛选
    ```

-   也可以使用本地文件

    ```ini
    custom_proxy_group=!!import:snippets/groups.txt
    # 使用本地的snippets/groups.txt文件
    ```

</details>

<details>
<summary><b>[aliases] 部分</b></summary>

> 设置访问接口的别名,也可以用来缩短URI。
>
> 访问别名时会将传递的所有参数附加到别名目标的参数中。

使用方法如下(但不仅限于此):

-   精简接口步骤(此类别名默认在 pref 中启用)

    ```ini
    当设置 /clash=/sub?target=clash 时:
    访问 127.0.0.1/clash?url=xxx 即跳转至 127.0.0.1/sub?target=clash&url=xxx
    ```

-   精简外部配置路径

    ```ini
    当设置 /mysub=/getprofile?name=aaa&token=bbb 时:
    访问 127.0.0.1/mysub 即跳转至 127.0.0.1/getprofile?name=aaa&token=bbb
    ```

</details>

<details>
<summary><b>[tasks] 部分</b></summary>

> 该部分主要涉及到的内容为 **定时执行js文件中的代码**

1.  **task**

    > 在服务器运行期间定期执行的任务。
    >
    > 使用方式 任务名称\`Cron表达式\`JS文件路径\`超时时间(s)

    -   例如:

        ```ini
        task=tick`0/10 * * * * ?`tick.js`3
        ```

</details>

<details>
<summary><b>[server] 部分</b></summary>

> 此部分通常**保持默认**即可

1.  **listen**

    > 绑定到 Web 服务器的地址,将地址设为 0.0.0.0,则局域网内设备均可使用

2.  **port**

    > 绑定到 Web 服务器地址的端口,默认为 25500

3.  **serve_file_root**

    > Web服务器的根目录,可以为包含静态页面的文件夹,留空则为关闭

</details>

<details>
<summary><b>[template] 部分</b></summary>

> 此部分用于指定 模板 中的部分值

1.  **template_path**

    > 对**子模板**文件的所在位置(即模板文件中使用 `{% include "xxx.tpl" %}` 引入的模板)做出路径限制

2.  **clash.dns 等**

    > 名称可以为任意非本程序默认的参数,用来对模板中的值进行判断或在模板中使用其定义的参数

</details>

<details>

<summary><b>[advanced] 部分</b></summary>

> 此部分通常**保持默认**即可

1.  **log_level**

    > 日志级别,可选值有:fatal error warn info debug verbose

2.  **print_debug_info**

    > 是否打印debug信息

3.  **max_pending_connections**

    > 最大挂起连接数

4.  **max_concurrent_threads**

    > 最大线程数

5.  **max_allowed_rulesets**

    > 规则集数量上限,0表示无限

6.  **max_allowed_rules**

    > 规则数量上限,0表示无限

7.  **max_allowed_download_size**

    > subconverter下载外部文件时的文件大小上限,超过时直接忽略该文件,单位bytes,0表示无限

8.  **enable_cache**

    > 是否启用缓存

9.  **cache_subscription**

    > 当启用缓存时,订阅文件的缓存时间

10. **cache_config**

    > 当启用缓存时,外部配置文件的缓存时间

11. **cache_ruleset**

    > 当启用缓存时,规则集的缓存时间

12. **script_clean_context**

    > script脚本是否使用干净上下文

13. **async_fetch_ruleset**

    > 并行下载规则集

14. **skip_failed_links**

    > 跳过失败的链接,继续转换而不是直接返回错误

</details>

### 外部配置

> 本部分用于 链接参数 **`&config=`**

注:本部分内容以本程序中的 [`/config/example_external_config.ini`](https://github.com/tindy2013/subconverter/blob/master/base/config/example_external_config.ini) 或 [`/config/example_external_config.yml`](https://github.com/tindy2013/subconverter/blob/master/base/config/example_external_config.yml) 或 [`/config/example_external_config.toml`](https://github.com/tindy2013/subconverter/blob/master/base/config/example_external_config.toml) 为准,本文档可能由于更新不及时,内容不适用于新版本。

将文件按照以下格式写好,上传至 Github Gist 或者 其他**可访问**网络位置
经过 [URLEncode](https://www.urlencoder.org/) 处理后,添加至 `&config=` 即可调用
需要注意的是,由外部配置中所定义的值会**覆盖** 主程序目录中配置文件 里的内容

即,如果你在外部配置中定义了

```txt
emoji=(流量|时间|应急),🏳️‍🌈
emoji=阿根廷,🇦🇷
```

那么本程序只会匹配以上两个 Emoji,不再使用 主程序目录中配置文件 中所定义的 国别 Emoji

<details>
<summary><b>点击查看文件内容</b></summary>

```ini
[custom]
;这是一个外部配置文件示例
;所有可能的自定义设置如下所示

;用于自定义组的选项 会覆盖 主程序目录中的配置文件 里的内容
;使用以下模式生成 Clash 代理组,带有 "[]" 前缀将直接添加
;Format: Group_Name`select`Rule_1`Rule_2`...
;        Group_Name`url-test|fallback|load-balance`Rule_1`Rule_2`...`test_url`interval[,timeout][,tolerance]
;Rule with "[]" prefix will be added directly.

custom_proxy_group=Proxy`select`.*`[]AUTO`[]DIRECT`.*
custom_proxy_group=UrlTest`url-test`.*`http://www.gstatic.com/generate_204`300,5,100
custom_proxy_group=FallBack`fallback`.*`http://www.gstatic.com/generate_204`300,5
custom_proxy_group=LoadBalance`load-balance`.*`http://www.gstatic.com/generate_204`300,,100
custom_proxy_group=SSID`ssid`default_group`celluar=group0,ssid1=group1,ssid2=group2

;custom_proxy_group=g1`select`!!GROUPID=0
;custom_proxy_group=g2`select`!!GROUPID=1
;custom_proxy_group=v2ray`select`!!GROUP=V2RayProvider

;custom_proxy_group=g1hk`select`!!GROUPID=0!!(HGC|HKBN|PCCW|HKT|hk|港)
;custom_proxy_group=sstw`select`!!GROUP=V2RayProvider!!(深台|彰化|新北|台|tw)
;custom_proxy_group=provider`select`!!PROVIDER=prov1,prov2,prov3`fallback_nodes


;用于自定义规则的选项 会覆盖 主程序目录中的配置文件 里的内容
;Ruleset addresses, supports local files/URL
;Format: Group name,[type:]URL[,interval]
;        Group name,[]Rule
;where "type" supports the following value: surge, quanx, clash-domain, clash-ipcidr, clash-classic
;type defaults to surge if omitted
enable_rule_generator=false
overwrite_original_rules=false
;ruleset=DIRECT,https://raw.githubusercontent.com/DivineEngine/Profiles/master/Surge/Ruleset/Guard/Unbreak.list,86400
;ruleset=🎯 全球直连,rules/LocalAreaNetwork.list
;ruleset=DIRECT,surge:rules/LocalAreaNetwork.list
;ruleset=Advertising,quanx:https://raw.githubusercontent.com/DivineEngine/Profiles/master/Quantumult/Filter/Guard/Advertising.list,86400
;ruleset=Domestic Services,clash-domain:https://ruleset.dev/clash_domestic_services_domains,86400
;ruleset=Domestic Services,clash-ipcidr:https://ruleset.dev/clash_domestic_services_ips,86400
;ruleset=DIRECT,clash-classic:https://raw.githubusercontent.com/DivineEngine/Profiles/master/Clash/RuleSet/China.yaml,86400
;ruleset=🎯 全球直连,[]GEOIP,CN
;ruleset=🐟 漏网之鱼,[]FINAL

;用于自定义基础配置的选项 会覆盖 主程序目录中的配置文件 里的内容
clash_rule_base=base/forcerule.yml
;surge_rule_base=base/surge.conf
;surfboard_rule_base=base/surfboard.conf
;mellow_rule_base=base/mellow.conf
;quan_rule_base=base/quan.conf
;quanx_rule_base=base/quanx.conf

;用于自定义重命名的选项 会覆盖 主程序目录中的配置文件 里的内容
;rename=Test-(.*?)-(.*?)-(.*?)\((.*?)\)@\1\4x测试线路_自\2到\3
;rename=\(?((x|X)?(\d+)(\.?\d+)?)((\s?倍率?)|(x|X))\)?@$1x

;用于自定义 Emoji 的选项 会覆盖 主程序目录中的配置文件 里的内容
;add_emoji=true
;remove_old_emoji=true
;emoji=(流量|时间|应急),🏳️‍🌈
;emoji=阿根廷,🇦🇷

;用于包含或排除节点关键词的选项 会覆盖 主程序目录中的配置文件 里的内容
;include_remarks=
;exclude_remarks=

;[template]
;;局部作用于模板中的变量
;clash.dns.port=5353
```

</details>

### 模板功能

> `0.5.0` 版本中引进了模板功能,可以通过设置不同的条件参数来获取对应的模板内容
>
> 从而做到将多个模板文件合成为一个,或者在不改动模板内容的前提下修改其中的某个参数等

#### 模板调用

当前模板调用可以用于 [外部配置](#外部配置) 和各类 base 文件中,示例可以参照 [all_base.tpl](./base/base/all_base.tpl)

模板内的常用写法有以下几类:

> 各种判断可以嵌套使用,但需要确保逻辑关系没有问题,即有 `if` 就要有 `endif`
>
> 更多的使用方式可以参照 [INJA 语法](https://github.com/pantor/inja)

1.  取值

    ```inja
    {{ global.clash.http_port }}
    # 获取 配置文件 中 clash.http_port 的值
    ```

2.  单判断

    ```inja
    {% if request.clash.dns == "1" %}
    ···
    {% endif %}
    # 如果 URL 中的 clash.dns=1 时,判断成立
    ```

3.  或判断

    ```inja
    {% if request.target == "clash" or request.target == "clashr" %}
    ···
    {% endif %}
    # 如果 URL 中的 target 为 clash 或者 clashr 时,判断成立
    ```

4.  如果...否则...

    ```inja
    {% if local.clash.new_field_name == "true" %}
    proxies: ~
    proxy-groups: ~
    rules: ~
    {% else %}
    Proxy: ~
    Proxy Group: ~
    Rule: ~
    {% endif %}
    # 如果 外部配置中 clash.new_field_name=true 时,启用 新的 Clash 块名称,否则使用旧的名称
    ```

5.  如果存在...则...(可避免请求中无对应参数时发生的报错)

    ```inja
    {% if exists("request.clash.dns") %}
    dns:
      enabled: true
      listen: 1053
    {% endif %}
    # 如果 URL 中存在对 clash.dns 参数的任意指定时,判断成立 (可以和 如果···否则··· 等判断一起使用)
    ```

6.  单判断,且如果参数不存在时使用默认值进行判断(可避免请求中无对应参数时发生的报错)

    ```inja
    dns:
      enabled: true
      listen: 1053
      nameserver:
       {% if default(request.doh, "false") == "true" %}
       - https://doh.pub/dns-query
       - https://223.5.5.5/dns-query
       {% else %}
       - 119.29.29.29
       - 223.5.5.5
       {% endif %}
    # 如果 URL 中 doh 参数为 true 时,判断成立。
    # 如果 URL 中不存在 doh 参数时,将 clash.doh 参数设为默认值 false 再进行判断。
    ```

模板内的引用有以下几类:

1.  从 配置文件 中获取,判断前缀为 `global`

    ```inja
    socks-port: {{ global.clash.socks_port }}
    # 当配置文件中设定了 `clash.socks_port` 值时,将被引用
    ```

2.  从 外部配置 中获取,判断前缀为 `local`

    ```inja
    {% if local.clash.new_field_name =="true" %}
    ···
    {% endif %}
    # 当外部配置中设定了 `clash.new_field_name=true` 时,该判断生效,其包含的···内容被引用
    ```

3.  从 URL 链接中获取,判断前缀为 `request`,例如 `http://127.0.0.1:25500/sub?target=clash&url=www.xxx.com&clash.dns=1`

    -   从 URL 中所获得**包含**在 [进阶链接](#进阶链接) 内的参数进行判断

        ```inja
        {% if request.target == "clash" %}
        ···
        {% endif %}
        # 当 target=clash 时,该判断生效,其包含的··· 内容被引用
        ```

    -   从 URL 中所获得**不包含**在 [进阶链接](#进阶链接) 内的参数进行判断 (从上述链接可以看出 clash.dns 属于额外参数)

        ```inja
        {% if request.clash.dns == "1" %}
        dns:
          enabled: true
          listen: 1053
        {% endif %}
        # 当 clash.dns=1 时,该判断生效,其包含的 dns 内容被引用
        ```

#### 直接渲染

在对模板功能进行调试或需要直接对模板进行渲染时,此时可以使用以下方式进行调用

```txt
http://127.0.0.1:25500/render?path=xxx&额外的调试或控制参数
```

此处 `path` 需要在 [配置文件](#配置文件) 中 `template_path` 所限定的路径内

## 特别用法

### 本地生成

> 启动程序后,在本地生成对应的配置文件文本

在程序目录内的 [generate.ini](https://github.com/tindy2013/subconverter/blob/master/base/generate.ini) 中设定文件块(`[xxx]`),生成的文件名(path=xxx)以及其所需要包含的参数,例如:

```ini
[test]
path=output.conf
target=surge
ver=4
url=ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpwYXNzd29yZA@www.example.com:1080#Example

[test_profile]
path=output.yml
profile=profiles/example_profile.ini
```

使用 `subconverter -g` 启动本程序时,即可在程序根目录内生成名为 `output.conf` `output.yml` 的配置文件文本。

使用 `subconverter -g --artifact "test"` 启动本程序时,即可在程序根目录内仅生成上述示例中 `[test]` 文件块所指代的 `output.conf` 的配置文件文本。

### 自动上传

> 自动上传 gist ,可以用于 Clash For Android / Surge 等进行远程订阅

在程序目录内的 [gistconf.ini](https://github.com/tindy2013/subconverter/blob/master/base/gistconf.ini) 中添加 `Personal Access Token`([在此创建](https://github.com/settings/tokens/new?scopes=gist&description=Subconverter))例如:

```ini
[common]
;uncomment the following line and enter your token to enable upload function
token = xxxxxxxxxxxxxxxxxxxxxxxx(所生成的 Personal Access Token)
```

在 [调用地址](#调用地址) 或 [调用地址 (进阶)](#调用地址-进阶) 所生成的链接后加上 `&upload=true` 就会在更新好后自动上传 gist
此时,subconverter 程序窗口内会出现如下所示的**提示信息**:

```cmd
No gist id is provided. Creating new gist...
Writing to Gist success!
Generator: surge4
Path: surge4
Raw URL: https://gist.githubusercontent.com/xxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/raw/surge4
Gist owner: xxxx
```

上方所提到的 `Raw URL: https://gist.githubusercontent.com/xxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/raw/surge4`
中的 `https://gist.githubusercontent.com/xxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/raw/surge4` 即是你的在线订阅链接。

注意,本程序默认会将此链接设为**秘密状态**

根据 [`官方手册 - 创建 Gist`](https://help.github.com/cn/github/writing-on-github/creating-gists) 的解释为:

> 秘密 gists 不会显示在 Discover 中,也不可搜索。
>
> 秘密 gists 不是私人的。 如果将秘密 gist 的 URL 发送给朋友,他们可以查看。
>
> 但是,如果您不认识的人发现该 URL,也能看到您的 gist。

所以请务必保管好所生成的 `Raw URL` 链接。

### 规则转换

> 将规则转换为指定的规则类型,用于将不同类型的规则互相转换

#### 调用地址 (规则转换)

```txt
http://127.0.0.1:25500/getruleset?type=%TYPE%&url=%URL%&group=%GROUP%
```

#### 调用说明 (规则转换)

| 调用参数  |    必要性    | 示例      | 解释                                                                                                                                                       |
| ----- | :-------: | :------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
| type  |     必要    | 6       | 指想要生成的规则类型,用数字表示:1为Surge,2 为 Quantumult X,3 为 Clash domain rule-provider,4 为 Clash ipcidr rule-provider,5 为 Surge DOMAIN-SET,6 为 Clash classical ruleset |
| url   |     必要    |         | 指待转换的规则链接,需要经过 [Base64](https://base64.us/) 处理                                                                                                           |
| group | type=2时必选 | mygroup | 规则对应的策略组名,生成Quantumult X类型(type=2)时必须提供                                                                                                                  |

运行 subconverter 主程序后, 按照 [调用地址 (规则转换)](#调用地址-规则转换) 的对应内容替换即可得到指定类型的规则。


================================================
FILE: README-docker.md
================================================
# subconverter-docker

This is a minimized image to run https://github.com/tindy2013/subconverter.

For running this docker, simply use the following commands:
```bash
# run the container detached, forward internal port 25500 to host port 25500
docker run -d --restart=always -p 25500:25500 tindy2013/subconverter:latest
# then check its status
curl http://localhost:25500/version
# if you see `subconverter vx.x.x backend` then the container is up and running
```
Or run in docker-compose:
```yaml
---
version: '3'
services:
  subconverter:
    image: tindy2013/subconverter:latest
    container_name: subconverter
    ports:
      - "15051:25500"
    restart: always
```

If you want to update `pref` configuration inside the docker, you can use the following command:
```bash
# assume your configuration file name is `newpref.ini`
curl -F "data=@newpref.ini" http://localhost:25500/updateconf?type=form\&token=password
# you may want to change this token in your configuration file
```

For those who want to use their own `pref` configuration and/or rules, snippets, profiles:
```txt
# you can save the files you want to replace to a folder, then copy it into to the docker
# using the latest build of the official docker
FROM tindy2013/subconverter:latest
# assume your files are inside replacements/
# subconverter folder is located in /base/, which has the same structure as the base/ folder in the repository
COPY replacements/ /base/
# expose internal port
EXPOSE 25500
# notice that you still need to use '-p 25500:25500' when starting the docker to forward this port
```
Save the content above to a `Dockerfile`, then run:
```bash
# build with this Dockerfile and tag it subconverter-custom
docker build -t subconverter-custom:latest .
# run the docker detached, forward internal port 25500 to host port 25500
docker run -d --restart=always -p 25500:25500 subconverter-custom:latest
# then check its status
curl http://localhost:25500/version
# if you see `subconverter vx.x.x backend` then the container is up and running
```


================================================
FILE: README.md
================================================
# subconverter

Utility to convert between various proxy subscription formats.

[![Build Status](https://github.com/tindy2013/subconverter/actions/workflows/build.yml/badge.svg)](https://github.com/tindy2013/subconverter/actions)
[![GitHub tag (latest SemVer)](https://img.shields.io/github/tag/tindy2013/subconverter.svg)](https://github.com/tindy2013/subconverter/tags)
[![GitHub release](https://img.shields.io/github/release/tindy2013/subconverter.svg)](https://github.com/tindy2013/subconverter/releases)
[![GitHub license](https://img.shields.io/github/license/tindy2013/subconverter.svg)](https://github.com/tindy2013/subconverter/blob/master/LICENSE)

[Docker README](https://github.com/tindy2013/subconverter/blob/master/README-docker.md)

[中文文档](https://github.com/tindy2013/subconverter/blob/master/README-cn.md)

- [subconverter](#subconverter)
  - [Supported Types](#supported-types)
  - [Quick Usage](#quick-usage)
    - [Access Interface](#access-interface)
    - [Description](#description)
  - [Advanced Usage](#advanced-usage)
  - [Auto Upload](#auto-upload)

## Supported Types

| Type         | As Source  | As Target    | Target Name |
| ------------ | :--------: | :----------: | ----------- |
| Clash        |     ✓      |      ✓       | clash       |
| ClashR       |     ✓      |      ✓       | clashr      |
| Quantumult   |     ✓      |      ✓       | quan        |
| Quantumult X |     ✓      |      ✓       | quanx       |
| Loon         |     ✓      |      ✓       | loon        |
| SS (SIP002)  |     ✓      |      ✓       | ss          |
| SS Android   |     ✓      |      ✓       | sssub       |
| SSD          |     ✓      |      ✓       | ssd         |
| SSR          |     ✓      |      ✓       | ssr         |
| Surfboard    |     ✓      |      ✓       | surfboard   |
| Surge 2      |     ✓      |      ✓       | surge&ver=2 |
| Surge 3      |     ✓      |      ✓       | surge&ver=3 |
| Surge 4      |     ✓      |      ✓       | surge&ver=4 |
| V2Ray        |     ✓      |      ✓       | v2ray       |
| Telegram-liked HTTP/Socks 5 links |     ✓      |      ×       | Only as source |

Notice:

1. Shadowrocket users should use `ss`, `ssr` or `v2ray` as target.

2. You can add `&remark=` to Telegram-liked HTTP/Socks 5 links to set a remark for this node. For example:

   - tg://http?server=1.2.3.4&port=233&user=user&pass=pass&remark=Example

   - https://t.me/http?server=1.2.3.4&port=233&user=user&pass=pass&remark=Example


---

## Quick Usage

> Using default groups and rulesets configuration directly, without changing any settings

### Access Interface

```txt
http://127.0.0.1:25500/sub?target=%TARGET%&url=%URL%&config=%CONFIG%
```

### Description

| Argument | Required | Example | Description |
| -------- | :------: | :------ | ----------- |
| target   | Yes      | clash   | Target subscription type. Acquire from Target Name in [Supported Types](#supported-types). |
| url      | Yes      | https%3A%2F%2Fwww.xxx.com | Subscription to convert. Supports URLs and file paths. Process with [URLEncode](https://www.urlencoder.org/) first. |
| config   | No       | https%3A%2F%2Fwww.xxx.com | External configuration file path. Supports URLs and file paths. Process with [URLEncode](https://www.urlencoder.org/) first. More examples can be found in [this](https://github.com/lzdnico/subconverteriniexample) repository. |

If you need to merge two or more subscription, you should join them with '|' before the URLEncode process.

Example:

```txt
You have 2 subscriptions and you want to merge them and generate a Clash subscription:
1. https://dler.cloud/subscribe/ABCDE?clash=vmess
2. https://rich.cloud/subscribe/ABCDE?clash=vmess

First use '|' to separate 2 subscriptions:
https://dler.cloud/subscribe/ABCDE?clash=vmess|https://rich.cloud/subscribe/ABCDE?clash=vmess

Then process it with URLEncode to get %URL%:
https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess%7Chttps%3A%2F%2Frich.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess

Then fill %TARGET% and %URL% in Access Interface with actual values:
http://127.0.0.1:25500/sub?target=clash&url=https%3A%2F%2Fdler.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess%7Chttps%3A%2F%2Frich.cloud%2Fsubscribe%2FABCDE%3Fclash%3Dvmess

Finally subscribe this link in Clash and you are done!
```

---

## Advanced Usage

Please refer to [中文文档](https://github.com/tindy2013/subconverter/blob/master/README-cn.md#%E8%BF%9B%E9%98%B6%E7%94%A8%E6%B3%95).

## Auto Upload

> Upload Gist automatically

Add a [Personal Access Token](https://github.com/settings/tokens/new) into [gistconf.ini](./gistconf.ini) in the root directory, then add `&upload=true` to the local subscription link, then when you access this link, the program will automatically update the content to Gist repository.

Example:

```ini
[common]
;uncomment the following line and enter your token to enable upload function
token = xxxxxxxxxxxxxxxxxxxxxxxx(Your Personal Access Token)
```


================================================
FILE: base/base/GeneralClashConfig.yml
================================================
#---------------------------------------------------#
## 配置文件需要放置在 $HOME/.config/clash/config.yml
## 或者运行目录下的config.yml
#---------------------------------------------------#

# HTTP 代理端口
port: 7890

# SOCKS5 代理端口
socks-port: 7891

# Linux 和 macOS 的 redir 代理端口 (如需使用此功能,请取消注释)
# redir-port: 7892

# 允许局域网的连接(可用来共享代理)
allow-lan: true

# 仅在将allow-lan设置为true时适用
# #"*": 绑定所有IP地址
# #192.168.122.11: 绑定单个IPv4地址
# #"[aaaa::a8aa:ff:fe09:57d8]": 绑定单个IPv6地址
# bind-address: "*"

# 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
mode: Rule

# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
# 5 个级别:silent / error / warning / info / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
log-level: info

# Clash 的 RESTful API
external-controller: '127.0.0.1:9090'

# 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `RESTful API/ui`
# 参数应填写配置目录的相对路径或绝对路径。
# http://127.0.0.1:9090/ui/#/
# external-ui: folder
# yacd面板:  https://github.com/haishanh/yacd
# Razord面板:http://clash.razord.top/#/proxies
# external-ui: dashboard

# RESTful API 的口令 (可选)
# secret: ""

# 实验性功能
experimental:
  ignore-resolve-fail: true # 忽略 DNS 解析失败,默认值为 true
  # interface-name: en0 # outbound interface name

# 本地 SOCKS5 / HTTP(S) 服务认证
# authentication:
#  - "user1:pass1"
#  - "user2:pass2"

# 实验性功能 hosts, 支持通配符 (例如 *.clash.dev 甚至 *.foo.*.example.com)
# 静态的域名 比 通配域名 具有更高的优先级 (foo.example.com 优先于 *.example.com)
# 注意: hosts 在 fake-ip 模式下不生效
#hosts:
#   '*.clash.dev': 127.0.0.1
#   'alpha.clash.dev': '::1'

#dns:
  #enable: true # 是否启用dns false
  #ipv6: false
  #listen: 0.0.0.0:53
  #enhanced-mode: redir-host # 模式:redir-host或fake-ip
  #fake-ip-range: 198.18.0.1/16 #
  #fake-ip-filter: # fake ip 白名单列表,如果你不知道这个参数的作用,请勿修改
     #- '*.lan'
     #- localhost.ptlogin2.qq.com
  #nameserver:
     #- 223.5.5.5 # 阿里DNS
     #- 180.76.76.76 # 百度DNS
     #- 119.29.29.29 # 腾讯DNS
     #- 117.50.11.11 # ONE DNS拦截版 恶意网站拦截、广告过滤
     #- 117.50.10.10 # ONE DNS纯净版 直接返回其真实的响应结果
     #- 114.114.114.114 # 114DNS
  #fallback:
     #- 8.8.8.8 # 谷歌DNS
     #- 1.1.1.1 # Cloudflare DNS
     #- tls://dns.rubyfish.cn:853
     #- tls://1.0.0.1:853
     #- tls://dns.google:853
     #- https://dns.rubyfish.cn/dns-query
     #- https://cloudflare-dns.com/dns-query
     #- https://dns.google/dns-query
  #fallback-filter:
     #geoip: true # 默认
     #ipcidr: # 在这个网段内的 IP 地址会被考虑为被污染的 IP
       #- 240.0.0.0/4

# 1. clash DNS 请求逻辑:
#   (1) 当访问一个域名时, nameserver 与 fallback 列表内的所有服务器并发请求,得到域名对应的 IP 地址。
#   (2) clash 将选取 nameserver 列表内,解析最快的结果。
#   (3) 若解析结果中,IP 地址属于 国外,那么 clash 将选择 fallback 列表内,解析最快的结果。
#
#   因此,我在 nameserver 和 fallback 内都放置了无污染、解析速度较快的国内 DNS 服务器,以达到最快的解析速度。
#   但是 fallback 列表内服务器会用在解析境外网站,为了结果绝对无污染,我仅保留了支持 DoT/DoH 的两个服务器。
#
# 2. clash DNS 配置注意事项:
#   (1) 如果您为了确保 DNS 解析结果无污染,请仅保留列表内以 tls:// 或 https:// 开头的 DNS 服务器,但是通常对于国内域名没有必要。
#   (2) 如果您不在乎可能解析到污染的结果,更加追求速度。请将 nameserver 列表的服务器插入至 fallback 列表内,并移除重复项。
#
# 3. 关于 DNS over HTTPS (DoH) 和 DNS over TLS (DoT) 的选择:
#   对于两项技术双方各执一词,而且会无休止的争论,各有利弊。各位请根据具体需求自行选择,但是配置文件内默认启用 DoT,因为目前国内没有封锁或管制。
#   DoH: 以 https:// 开头的 DNS 服务器。拥有更好的伪装性,且几乎不可能被运营商或网络管理封锁,但查询效率和安全性可能略低。
#   DoT: 以 tls:// 开头的 DNS 服务器。拥有更高的安全性和查询效率,但端口有可能被管制或封锁。
#   若要了解更多关于 DoH/DoT 相关技术,请自行查阅规范文档。

# 代理组
# 下面这3个不要引到订阅里去 要不会出错
# Will be ignored after profile selection
Proxy:
  - name: Shadowsocks
    type: socks5
    server: 127.0.0.1
    port: 1080
Proxy Group:
  - name: Proxy
    type: select
    proxies:
      - Shadowsocks
Rule:
  - 'MATCH,DIRECT'

# Clash for Windows
# Proxies module latency test settings
cfw-latency-timeout: 3000
cfw-latency-url: http://www.gstatic.com/generate_204

# 打断连接
# Identify strategy of breaking connections after switching to a new proxy/profile/mode
# Options for proxy: none, chain(proxy group in connection chains), all
# Options for profile: true, false
# Options for mode: true, false
cfw-conn-break-strategy:
  proxy: none # none/chain/all
  profile: true # true/false
  mode: false # true/false

# 定义状态栏图标
#cfw-tray-icon:
#default: .\resources\static\imgs\logo_64.png        # 默认图标
#system-proxy-on: .\resources\static\imgs\custom.ico   # 开启系统代理后图标

# 子进程
# Run child process after CFW started
# Refer: https://docs.cfw.lbyczf.com/contents/childprocess.html
#cfw-child-process:
  # 启动订阅转换程序,端口号7893
  #- command: "subconverter.exe" # run.cmd 程序名称 subconverter.exe -cfw >>logs/run.log 2>&1
    #args:
      #- "-cfw" # 运行参数1
      #- "-f" # 运行参数2
      #- "pref-acl4ssr.yml" # 运行参数3
    #options:
      #cwd: subconverter # 子进程工作目录
      #detached: true # 子进程独立于其父进程运行
      #shell: true # 则在 shell 中运行 command
      #windowsHide: true # 隐藏子进程的控制台窗口
  # 启动网易云,端口号3333
  #- command: "unblockneteasemusic.exe" # 启动网易云
    #args:
      #- "-p" # 运行参数1
      #- "3333" # 运行参数2
    #options:
      #cwd: unblockNeteaseMusic # 子进程工作目录
      #detached: true # 子进程独立于其父进程运行
      #shell: true # 则在 shell 中运行 command
      #windowsHide: true # 隐藏子进程的控制台窗口

# 系统代理跳过列表 cfw-bypass
# System proxy will ignore these domains(or ipnet)
# 系统代理跳过列表-备份的,不起作用,
# 使用时可以将cfw-bypass-bak与cfw-bypass内容互换
cfw-bypass-bak:
  # 原有字段不用删除
  - qq.com
  - 'music.163.com' # 网易云域名1
  - '*.music.126.net' # 网易云域名2
  - localhost
  - 127.*
  - 10.*
  - 172.16.*
  - 172.17.*
  - 172.18.*
  - 172.19.*
  - 172.20.*
  - 172.21.*
  - 172.22.*
  - 172.23.*
  - 172.24.*
  - 172.25.*
  - 172.26.*
  - 172.27.*
  - 172.28.*
  - 172.29.*
  - 172.30.*
  - 172.31.*
  - 192.168.*
  - <local>
# 系统代理跳过列表 起作用的
cfw-bypass:
  # 直连列表
  # MyList
  - "*.423down.com"
  - "*.bitwarden.com"
  - "*.chaipip.com"
  - "*.hrtsea.com"
  - "*.laomo.me"
  - "*.mpyit.com"
  # CN域名直连
  - "*.cn"
  - "*.中国"
  - "*.公司"
  - "*.网络"
  # 中国国内常见域名关键词直连
  - "*-cn*"
  - "*360buy*"
  - "*alicdn*"
  - "*alimama*"
  - "*alipay*"
  - "*appzapp*"
  - "*baidupcs*"
  - "*bilibili*"
  - "*ccgslb*"
  - "*chinacache*"
  - "*duobao*"
  - "*duolingo*"
  - "*jdpay*"
  - "*moke*"
  - "*qhimg*"
  - "*vpimg*"
  - "*xiami*"
  - "*xiaomi*"
  # 360
  - "*.360.com"
  - "*.360kuai.com"
  - "*.360safe.com"
  - "*.dhrest.com"
  - "*.qhres.com"
  - "*.qhstatic.com"
  - "*.qhupdate.com"
  - "*.so.com"
  # 4399
  - "*.4399.com"
  - "*.4399pk.com"
  - "*.5054399.com"
  - "*.img4399.com"
  # 58
  - "*.58.com"
  # Alibaba
  - "*.1688.com"
  - "*.aliapp.org"
  - "*.alibaba.com"
  - "*.alibabacloud.com"
  - "*.alibabausercontent.com"
  - "*.alicdn.com"
  - "*.aliexpress.com"
  - "*.aliimg.com"
  - "*.alikunlun.com"
  - "*.alipay.com"
  - "*.alipayobjects.com"
  - "*.alisoft.com"
  - "*.aliyun.com"
  - "*.aliyuncdn.com"
  - "*.aliyuncs.com"
  - "*.amap.com"
  - "*.autonavi.com"
  - "*.dingtalk.com"
  - "*.ele.me"
  - "*.hichina.com"
  - "*.mmstat.com"
  - "*.mxhichina.com"
  - "*.soku.com"
  - "*.taobao.com"
  - "*.taobaocdn.com"
  - "*.tbcache.com"
  - "*.tbcdn.com"
  - "*.tmall.com"
  - "*.tmall.hk"
  - "*.ucweb.com"
  - "*.xiami.com"
  - "*.xiami.net"
  - "*.ykimg.com"
  - "*.youku.com"
  # Baidu
  - "*.baidu.com"
  - "*.baidubcr.com"
  - "*.baidupcs.com"
  - "*.baidustatic.com"
  - "*.bcebos.com"
  - "*.bdimg.com"
  - "*.bdstatic.com"
  - "*.bdurl.net"
  - "*.hao123.com"
  - "*.hao123img.com"
  - "*.jomodns.com"
  - "*.yunjiasu-cdn.net"
  # Bilibili
  - "*.acg.tv"
  - "*.acgvideo.com"
  - "*.b23.tv"
  - "*.biliapi.com"
  - "*.biliapi.net"
  - "*.biligame.com"
  - "*.biligame.net"
  - "*.bilivideo.com"
  - "*.hdslb.com"
  - "*.im9.com"
  # Blizzard
  - "*.battle.net"
  - "*.battlenet.com"
  - "*.blizzard.com"
  # ByteDance
  - "*.bytedance.com"
  - "*.byteimg.com"
  - "*.feiliao.com"
  - "*.gifshow.com"
  - "*.huoshan.com"
  - "*.iesdouyin.com"
  - "*.ixigua.com"
  - "*.kaishou.com"
  - "*.kspkg.com"
  - "*.pstatp.com"
  - "*.snssdk.com"
  - "*.toutiao.com"
  - "*.yximgs.com"
  # CCTV
  - "*.cctv.com"
  - "*.cctvpic.com"
  - "*.livechina.com"
  # ChinaNet
  - "*.21cn.com"
  # DiDi
  - "*.didialift.com"
  - "*.didiglobal.com"
  - "*.udache.com"
  # Douyu 斗鱼
  - "*.douyu.com"
  - "*.douyu.tv"
  - "*.douyutv.com"
  # Epic
  - "*.epicgames.com"
  - "*.helpshift.com"
  - "*.paragon.com"
  - "*.unrealengine.com"
  # HuaWei
  - "*.dbankcdn.com"
  - "*.hc-cdn.com"
  - "*.hicloud.com"
  - "*.huawei.com"
  - "*.huaweicloud.com"
  - "*.huaweishop.net"
  - "*.hwccpc.com"
  - "*.vmall.com"
  - "*.vmallres.com"
  # Iflytek 科大讯飞
  - "*.iflyink.com"
  - "*.iflyrec.com"
  - "*.iflytek.com"
  # Iqiyi
  - "*.71.am"
  - "*.71edge.com"
  - "*.iqiyi.com"
  - "*.iqiyipic.com"
  - "*.ppsimg.com"
  - "*.qiyi.com"
  - "*.qiyipic.com"
  - "*.qy.net"
  # JD
  - "*.360buy.com"
  - "*.360buyimg.com"
  - "*.jcloudcs.com"
  - "*.jd.com"
  - "*.jd.hk"
  - "*.jdcloud.com"
  - "*.jdpay.com"
  - "*.paipai.com"
  # Kingsoft
  - "*.iciba.com"
  - "*.ksosoft.com"
  - "*.ksyun.com"
  # Meitu
  - "*.meitu.com"
  - "*.meitudata.com"
  - "*.meitustat.com"
  - "*.meipai.com"
  # LeTV 乐视
  - "*.le.com"
  - "*.lecloud.com"
  - "*.letv.com"
  - "*.letvcloud.com"
  - "*.letvimg.com"
  - "*.letvlive.com"
  - "*.letvstore.com"
  # MGTV 芒果TV
  - "*.hitv.com"
  - "*.hunantv.com"
  - "*.mgtv.com"
  # MI
  - "*.duokan.com"
  - "*.mi-img.com"
  - "*.mi.com"
  - "*.miui.com"
  - "*.miwifi.com"
  - "*.xiaomi.com"
  - "*.xiaomi.net"
  - "*.xiaomicp.com"
  # NetEase
  - "*.126.com"
  - "*.126.net"
  - "*.127.net"
  - "*.163.com"
  - "*.163yun.com"
  - "*.lofter.com"
  - "*.netease.com"
  - "*.ydstatic.com"
  - "*.youdao.com"
  # PPTV、PPLive
  - "*.pplive.com"
  - "*.pptv.com"
  # PDD 拼多多
  - "*.pinduoduo.com"
  - "*.yangkeduo.com"
  # Sina
  - "*.leju.com"
  - "*.miaopai.com"
  - "*.sina.com"
  - "*.sinaapp.com"
  - "*.sinaimg.com"
  - "*.weibo.com"
  - "*.weibocdn.com"
  - "*.xiaoka.tv"
  # Sohu Sogo
  - "*.go2map.com"
  - "*.sogo.com"
  - "*.sogou.com"
  - "*.sogoucdn.com"
  - "*.sohu-inc.com"
  - "*.sohu.com"
  - "*.sohucs.com"
  - "*.sohuno.com"
  - "*.sohurdc.com"
  - "*.v-56.com"
  # Sony
  - "*.playstation.com"
  - "*.playstation.net"
  - "*.playstationnetwork.com"
  - "*.sony.com"
  - "*.sonyentertainmentnetwork.com"
  # Spark
  - "*.amplitude.com"
  - "*.firebaseio.com"
  - "*.hockeyapp.net"
  - "*.smartmailcloud.com"
  # Steam
  - "*.steampowered.com"
  - "*.steam-chat.com"
  - "*.steamgames.com"
  - "*.steamusercontent.com"
  - "*.steamcontent.com"
  - "*.steamstatic.com"
  - "*.steamcdn-a.akamaihd.net"
  - "*.steamstat.us"
  # Tencent
  - "*.foxmail.com"
  - "*.gtimg.com"
  - "*.idqqimg.com"
  - "*.igamecj.com"
  - "*.myapp.com"
  - "*.myqcloud.com"
  - "*.qq.com"
  - "*.qqmail.com"
  - "*.qqurl.com"
  - "*.smtcdns.com"
  - "*.smtcdns.net"
  - "*.soso.com"
  - "*.tencent-cloud.net"
  - "*.tencent.com"
  - "*.tencentmind.com"
  - "*.tenpay.com"
  - "*.weixin.com"
  - "*.weiyun.com"
  # Vip 唯品会
  - "*.appsimg.com"
  - "*.appvipshop.com"
  - "*.vip.com"
  - "*.vipstatic.com"
  # Ximalaya 喜马拉雅
  - "*.ximalaya.com"
  - "*.xmcdn.com"
  # YYeTs 人人影视
  - "*.got001.com"
  - "*.jstucdn.com"
  - "*.zimuzu.io"
  - "*.zimuzu.tv"
  - "*.zmz001.com"
  - "*.zmz002.com"
  - "*.zmz003.com"
  - "*.zmz004.com"
  - "*.zmz2019.com"
  - "*.zmzapi.com"
  - "*.zmzapi.net"
  - "*.zmzfile.com"
  # Private Tracker
  - "*.awesome-hd.me"
  - "*.beitai.pt"
  - "*.bittorrent.com"
  - "*.broadcasthe.net"
  - "*.chdbits.co"
  - "*.classix-unlimited.co.uk"
  - "*.empornium.me"
  - "*.gazellegames.net"
  - "*.hdchina.org"
  - "*.hdsky.me"
  - "*.hdtime.org"
  - "*.icetorrent.org"
  - "*.jpopsuki.eu"
  - "*.keepfrds.com"
  - "*.leaguehd.com"
  - "*.m-team.cc"
  - "*.madsrevolution.net"
  - "*.msg.vg"
  - "*.nanyangpt.com"
  - "*.ncore.cc"
  - "*.open.cd"
  - "*.ourbits.club"
  - "*.passthepopcorn.me"
  - "*.privatehd.to"
  - "*.pthome.net"
  - "*.redacted.ch"
  - "*.springsunday.net"
  - "*.tjupt.org"
  - "*.totheglory.im"
  # TeamViewer
  - "*.teamviewer.com"
  # Public Direct CDN 公共直连cdn
  - "*.baomitu.com"
  - "*.bootcss.com"
  - "*.jiasule.com"
  - "*.jsdelivr.net"
  - "*.staticfile.org"
  - "*.upaiyun.com"
  # Acceleratedirectsites
  - "*.12306.com"
  - "*.17173.com"
  - "*.17k.com"
  - "*.360doc.com"
  - "*.36kr.com"
  - "*.3dmgame.com"
  - "*.51cto.com"
  - "*.51job.com"
  - "*.51jobcdn.com"
  - "*.56.com"
  - "*.8686c.com"
  - "*.abchina.com"
  - "*.abercrombie.com"
  - "*.acfun.tv"
  - "*.air-matters.com"
  - "*.air-matters.io"
  - "*.aixifan.com"
  - "*.algocasts.io"
  - "*.babytree.com"
  - "*.babytreeimg.com"
  - "*.baicizhan.com"
  - "*.baidupan.com"
  - "*.baike.com"
  - "*.biqudu.com"
  - "*.biquge.com"
  - "*.bitauto.com"
  - "*.c-ctrip.com"
  - "*.camera360.com"
  - "*.cdnmama.com"
  - "*.che168.com"
  - "*.chinacache.net"
  - "*.chinaso.com"
  - "*.chinaz.com"
  - "*.chinaz.net"
  - "*.chuimg.com"
  - "*.cibntv.net"
  - "*.clouddn.com"
  - "*.cloudxns.net"
  - "*.cn163.net"
  - "*.cnbeta.com"
  - "*.cnbetacdn.com"
  - "*.cnblogs.com"
  - "*.cnki.net"
  - "*.cnmstl.net"
  - "*.coolapk.com"
  - "*.coolapkmarket.com"
  - "*.csdn.net"
  - "*.ctrip.com"
  - "*.dangdang.com"
  - "*.dfcfw.com"
  - "*.dianping.com"
  - "*.dilidili.wang"
  - "*.douban.com"
  - "*.doubanio.com"
  - "*.dpfile.com"
  - "*.duowan.com"
  - "*.dxycdn.com"
  - "*.dytt8.net"
  - "*.easou.com"
  - "*.eastday.com"
  - "*.eastmoney.com"
  - "*.ecitic.com"
  - "*.ewqcxz.com"
  - "*.fang.com"
  - "*.fantasy.tv"
  - "*.feng.com"
  - "*.fengkongcloud.com"
  - "*.fir.im"
  - "*.frdic.com"
  - "*.fresh-ideas.cc"
  - "*.ganji.com"
  - "*.ganjistatic1.com"
  - "*.geetest.com"
  - "*.geilicdn.com"
  - "*.godic.net"
  - "*.gravatar.com"
  - "*.guazi.com"
  - "*.gwdang.com"
  - "*.gzlzfm.com"
  - "*.haibian.com"
  - "*.haosou.com"
  - "*.hollisterco.com"
  - "*.hongxiu.com"
  - "*.huajiao.com"
  - "*.hupu.com"
  - "*.huxiucdn.com"
  - "*.huya.com"
  - "*.ifeng.com"
  - "*.ifengimg.com"
  - "*.images-amazon.com"
  - "*.infzm.com"
  - "*.ipip.net"
  - "*.it168.com"
  - "*.ithome.com"
  - "*.ixdzs.com"
  - "*.jianguoyun.com"
  - "*.jianshu.com"
  - "*.jianshu.io"
  - "*.jianshuapi.com"
  - "*.jiathis.com"
  - "*.jmstatic.com"
  - "*.jumei.com"
  - "*.kanimg.com"
  - "*.kankan.com"
  - "*.kaola.com"
  - "*.knewone.com"
  - "*.koowo.com"
  - "*.ksyungslb.com"
  - "*.kuaidi100.com"
  - "*.kugou.com"
  - "*.lancdns.com"
  - "*.landiannews.com"
  - "*.lanzou.com"
  - "*.lemicp.com"
  - "*.letitfly.me"
  - "*.linkedin.com"
  - "*.lizhi.fm"
  - "*.lizhi.io"
  - "*.lizhifm.com"
  - "*.loli.net"
  - "*.luoo.net"
  - "*.lvmama.com"
  - "*.lxdns.com"
  - "*.maoyan.com"
  - "*.meilishuo.com"
  - "*.meituan.com"
  - "*.meituan.net"
  - "*.meizu.com"
  - "*.miguvideo.com"
  - "*.mobike.com"
  - "*.mogu.com"
  - "*.mogucdn.com"
  - "*.mogujie.com"
  - "*.moji.com"
  - "*.moke.com"
  - "*.mubu.com"
  - "*.myunlu.com"
  - "*.nruan.com"
  - "*.nuomi.com"
  - "*.onlinedown.net"
  - "*.oracle.com"
  - "*.oschina.net"
  - "*.ourdvs.com"
  - "*.overcast.fm"
  - "*.paypal.com"
  - "*.polyv.net"
  - "*.qbox.me"
  - "*.qcloud.com"
  - "*.qcloudcdn.com"
  - "*.qdaily.com"
  - "*.qdmm.com"
  - "*.qhimg.com"
  - "*.qianqian.com"
  - "*.qidian.com"
  - "*.qihucdn.com"
  - "*.qin.io"
  - "*.qiniu.com"
  - "*.qiniucdn.com"
  - "*.qiniudn.com"
  - "*.qiushibaike.com"
  - "*.quanmin.tv"
  - "*.qunar.com"
  - "*.qunarzz.com"
  - "*.rarbg.to"
  - "*.repaik.com"
  - "*.rrmj.tv"
  - "*.ruguoapp.com"
  - "*.runoob.com"
  - "*.sandai.net"
  - "*.sankuai.com"
  - "*.segmentfault.com"
  - "*.sf-express.com"
  - "*.shumilou.net"
  - "*.simplecd.me"
  - "*.sm.ms"
  - "*.smzdm.com"
  - "*.snwx.com"
  - "*.soufunimg.com"
  - "*.ssl-images-amazon.com"
  - "*.sspai.com"
  - "*.startssl.com"
  - "*.suning.com"
  - "*.taihe.com"
  - "*.th-sjy.com"
  - "*.tianqi.com"
  - "*.tianqistatic.com"
  - "*.tianyancha.com"
  - "*.tianyaui.com"
  - "*.tietuku.com"
  - "*.tiexue.net"
  - "*.tmiaoo.com"
  - "*.trip.com"
  - "*.ttmeiju.com"
  - "*.tudou.com"
  - "*.tuniu.com"
  - "*.tuniucdn.com"
  - "*.umengcloud.com"
  - "*.upyun.com"
  - "*.uxengine.net"
  - "*.videocc.net"
  - "*.vmware.com"
  - "*.wandoujia.com"
  - "*.weather.com"
  - "*.weico.cc"
  - "*.weidian.com"
  - "*.weiphone.com"
  - "*.weiphone.net"
  - "*.womai.com"
  - "*.wscdns.com"
  - "*.xdrig.com"
  - "*.xhscdn.com"
  - "*.xiachufang.com"
  - "*.xiaohongshu.com"
  - "*.xiaojukeji.com"
  - "*.xinhuanet.com"
  - "*.xitek.com"
  - "*.xiumi.us"
  - "*.xslb.net"
  - "*.xueqiu.com"
  - "*.xunlei.com"
  - "*.yach.me"
  - "*.yeepay.com"
  - "*.yhd.com"
  - "*.yihaodianimg.com"
  - "*.yinxiang.com"
  - "*.yinyuetai.com"
  - "*.yixia.com"
  - "*.ys168.com"
  - "*.yuewen.com"
  - "*.yy.com"
  - "*.yystatic.com"
  - "*.zealer.com"
  - "*.zhangzishi.cc"
  - "*.zhanqi.tv"
  - "*.zhaopin.com"
  - "*.zhihu.com"
  - "*.zhimg.com"
  - "*.zhongsou.com"
  - "*.zhuihd.com"
  - "localhost"
  - 127.*
  - 10.*
  - 172.16.*
  - 172.17.*
  - 172.18.*
  - 172.19.*
  - 172.20.*
  - 172.21.*
  - 172.22.*
  - 172.23.*
  - 172.24.*
  - 172.25.*
  - 172.26.*
  - 172.27.*
  - 172.28.*
  - 172.29.*
  - 172.30.*
  - 172.31.*
  - 192.168.*
  - <local>

================================================
FILE: base/base/all_base.tpl
================================================
{% if request.target == "clash" or request.target == "clashr" %}

port: {{ default(global.clash.http_port, "7890") }}
socks-port: {{ default(global.clash.socks_port, "7891") }}
allow-lan: {{ default(global.clash.allow_lan, "true") }}
mode: Rule
log-level: {{ default(global.clash.log_level, "info") }}
external-controller: {{ default(global.clash.external_controller, "127.0.0.1:9090") }}
{% if default(request.clash.dns, "") == "1" %}
dns:
  enable: true
  listen: :1053
{% endif %}
{% if local.clash.new_field_name == "true" %}
proxies: ~
proxy-groups: ~
rules: ~
{% else %}
Proxy: ~
Proxy Group: ~
Rule: ~
{% endif %}

{% endif %}
{% if request.target == "surge" %}

[General]
loglevel = notify
bypass-system = true
skip-proxy = 127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,100.64.0.0/10,localhost,*.local,e.crashlytics.com,captive.apple.com,::ffff:0:0:0:0/1,::ffff:128:0:0:0/1
#DNS设置或根据自己网络情况进行相应设置
bypass-tun = 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12
dns-server = 119.29.29.29,223.5.5.5

[Script]
http-request https?:\/\/.*\.iqiyi\.com\/.*authcookie= script-path=https://raw.githubusercontent.com/NobyDa/Script/master/iQIYI-DailyBonus/iQIYI.js

{% endif %}
{% if request.target == "loon" %}

[General]
# IPV6 启动与否
ipv6 = false
# udp 类的 dns 服务器,用,隔开多个服务器,system 表示系统 dns
dns-server = 119.29.29.29, 223.5.5.5
# DNS over HTTPS服务器,用,隔开多个服务器
doh-server = https://223.5.5.5/resolve, https://sm2.doh.pub/dns-query
# 是否开启局域网代理访问
allow-wifi-access = false
# 开启局域网访问后的 http 代理端口
wifi-access-http-port = 7222
# 开启局域网访问后的 socks5 代理端口
wifi-access-socks5-port = 7221
# 测速所用的测试链接,如果策略组没有自定义测试链接就会使用这里配置的
proxy-test-url = http://connectivitycheck.gstatic.com
# 节点测速时的超时秒数
test-timeout = 2
# 指定流量使用哪个网络接口进行转发
interface-mode = auto
sni-sniffing = true
# 禁用 stun 是否禁用 stun 协议的 udp 数据,禁用后可以有效解决 webrtc 的 ip 泄露
disable-stun = true
# 策略改变时候打断连接
disconnect-on-policy-change = true
# 一个节点连接失败几次后会进行节点切换,默认 3 次
switch-node-after-failure-times = 3
# 订阅资源解析器链接
resource-parser = https://gitlab.com/lodepuly/vpn_tool/-/raw/main/Resource/Script/Sub-Store/sub-store-parser_for_loon.js
# 自定义 geoip 数据库的 url
geoip-url = https://gitlab.com/Masaiki/GeoIP2-CN/-/raw/release/Country.mmdb
# 配置了该参数,那么所配置的这些IP段、域名将不会转发到Loon,而是由系统处理
skip-proxy = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, localhost, *.local, captive.apple.com, e.crashlynatics.com
# 配置了该参数,那么所配置的这些IP段、域名就会不交给Loon来处理,系统直接处理
bypass-tun = 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8, 169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24, 192.0.2.0/24, 192.88.99.0/24, 192.168.0.0/16, 198.51.100.0/24, 203.0.113.0/24, 224.0.0.0/4, 239.255.255.250/32, 255.255.255.255/32
# 当切换到某一特定的WiFi下时改变Loon的流量模式,如"loon-wifi5g":DIRECT,表示在loon-wifi5g这个wifi网络下使用直连模式,"cellular":PROXY,表示在蜂窝网络下使用代理模式,"default":RULE,默认使用分流模式
ssid-trigger = "Ccccccc":DIRECT,"cellular":RULE,"default":RULE

[Proxy]

[Remote Proxy]

[Remote Filter]

[Proxy Group]
♻️ 自动选择=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Auto.png
🔰 节点选择=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Proxy.png
🌍 国外媒体=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/GlobalMedia.png
🌏 国内媒体=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/DomesticMedia.png
Ⓜ️ 微软服务=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Microsoft.png
📲 电报信息=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Telegram.png
🍎 苹果服务=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Apple.png
🎯 全球直连=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Direct.png
🛑 全球拦截=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Advertising.png
🐟 漏网之鱼=select, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Final.png

[Rule]

[Remote Rule]

[Rewrite]

[Host]

[Script]
# 多看阅读  (By @chavyleung)
# 我的 > 签到任务 等到提示获取 Cookie 成功即可
http-request ^https:\/\/www\.duokan\.com\/checkin\/v0\/status script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/duokan/duokan.cookie.js, requires-body=true, tag=多看_cookie
cron "16 9 * * *" script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/duokan/duokan.js, tag=多看阅读

# 飞客茶馆  (By @chavyleung)
# 打开 APP, 访问下个人中心
http-request ^https:\/\/www\.flyertea\.com\/source\/plugin\/mobile\/mobile\.php\?module=getdata&.* script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/flyertea/flyertea.cookie.js, tag=飞客茶馆_cookie
cron "17 9 * * * *" script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/flyertea/flyertea.js,tag=飞客茶馆

# 10010  (By @chavyleung)
# 打开 APP , 进入签到页面, 系统提示: 获取刷新链接: 成功
# 然后手动签到 1 次, 系统提示: 获取Cookie: 成功 (每日签到)
# 首页>天天抽奖, 系统提示 2 次: 获取Cookie: 成功 (登录抽奖) 和 获取Cookie: 成功 (抽奖次数)
http-request ^https?:\/\/act.10010.com\/SigninApp\/signin\/querySigninActivity.htm script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/10010/10010.cookie.js, tag=中国联通_cookie1
http-request ^https?:\/\/act.10010.com\/SigninApp(.*?)\/signin\/daySign script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/10010/10010.cookie.js, tag=中国联通_cookie2
http-request ^https?:\/\/m.client.10010.com\/dailylottery\/static\/(textdl\/userLogin|active\/findActivityInfo) script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/10010/10010.cookie.js, tag=中国联通_cookie3
cron "18 9 * * *" script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/10010/10010.js, tag=中国联通

# 万达电影  (By @chavyleung)
# 进入签到页面获取,网页端:https://act-m.wandacinemas.com/2005/17621a8caacc4d190dadd/
http-request ^https:\/\/user-api-prd-mx\.wandafilm\.com script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/wanda/wanda.cookie.js, tag=万达电影_cookie
cron "19 9 * * *" script-path=https://raw.githubusercontent.com/chavyleung/scripts/master/wanda/wanda.js, tag=万达电影

[MITM]
hostname = m.client.10010.com, act.10010.com, www.flyertea.com, www.duokan.com, tieba.baidu.com
ca-p12 = MIIKGQIBAzCCCeMGCSqGSIb3DQEHAaCCCdQEggnQMIIJzDCCBBcGCSqGSIb3DQEHBqCCBAgwggQEAgEAMIID/QYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQImj1O53xwYioCAggAgIID0HZE8LBl4XFV6NulqdzN58vwAkhwiiES++WDPqsE+NHCIa8VCBlfd6/MV21vO2zw8X90mSaO2/PEW7hyH6890zrF11J3rxDzkVtUnV7e8rq5vOdivjWl4s5Nx5zgyJ0AOHJU7Xe2f8OMb4VzsAqeqF/D6FwNGZBJhBn0nPCRFIIgEpOFUrcwvErPbySY6w8mmHm0DVbKvBFGqOth3fco6gIBpZBILgaQ8t9eLep3IiBFcyH1ezILwgOJ0G0qOJwRxOIXRYT3SaTD65rL90w2nW3xcD8jU5raF3PBDEpWf2+xis69nRU8QiWLjJEJkedE+GpZ/CEKR2BL02E9uB+IFF1/Y4bXk17Ty7D8D0WbIgKeLvRcKxFZoQEZfr/vEpdzedt704NBjDRPe3TPDApQgBtvXFvKZ9RB7uo17AJkLZbTGicFVP+a33+e0B1594zNy30eZ3zwwgpsdZ7S23JX/90FQwsTJWxpO4f9qaDqUHVcsSVlG21U4ujIPWkpIi51XE9gM+JmL6nWaU8cRY2CI0ETLnsSWIOJfQG4s6sy0P5liJfqVUtIpZqrSxdzmGlLe2HsOQYo+M6SVpwx8Liopqu5vrvZhuUlUAwmjDodianY57AObCYP5/fM/3yKeZW7v9JH0pQY9eQ5qT6+oWIWoxnERYbXqpEGUDWN6vUG/JkJ6paHIyJ07mCLs4hXXWCin3dAXzmwyMNyGPH3SH03EKK2o/aMWTQNSfSyzFSDS+xXrj3wAZLdzTlyLA4l0iZhzvWLcgfzqHaj922hFhuO3zxQr2cVQihMwXd0gCPsNA4b0Uqaor2GF3qHxctscIGyKafNpmsVM7pSvYmqi0lMijjVfYsx3zV4FgYfQBOQAEaD6VXIHHeg/JBDbfatoQOp6j+GW/Mz5djaeHarA6QdZVeKiGLkKOXT3JYLtxL8QUx2SINlLgWpR3XvMY7f8cIyPMsTrJdLix5wXVRtUVx2A83GyAOt3QxP/rtM+b+86YtAhBdSTRhJfuDL4sjW4//wtnU0B0CzpOlB1CXRprcnUSUeGyOD4eiOaBYnPpY5wUYyQ+eJYQvYdXWDiFx2sBSxyZMAiXMLtBxBoGoyirzFZKK3cw6DdjXrOGepcqFlesEzraz8yfXerOcPwgI4JD13oDKSiw3iUhjTnfrXpoAX+3rEhNfJeqFf7nooGd30z//v4u09KM3l2gEA9WJt60leoDkp3PjL8LPsgBjO5f+odey9O/YqHmxt3dpRD02HvL5VhnJG/kBeZpGd81yX0ceM8x5f2HKzMy38osE6Q/Ru+L0wggWtBgkqhkiG9w0BBwGgggWeBIIFmjCCBZYwggWSBgsqhkiG9w0BDAoBAqCCBO4wggTqMBwGCiqGSIb3DQEMAQMwDgQIJsPUIRvXx3ACAggABIIEyJxMbTjKmMs37xEKKy5d8HBJzPs30yLXeSbO0taa3o6XGEGt6rbBIF3MIGSKAOLuLOwhddVqkFxdUkYiAUTMptSrN8YyR9yhn06mkZPViPHrKNMXIKlAomg87rD54e8AnQPxKvOVPUYne7WBu4QWrUnbuBTOnoWLQAY6dRRE4EDAdQbMRx34sWpjVBvNrgO1h36T11wnCIGDC+FNchV/zs0Xfpt+JB2HGe1KXxH2lO9QKo0ONQlx/GtKBto1HRyN0pzEbdifUBqy1hgVjb5KnK7z3ah3lcZITYQqprn85Mrc8sMfDJRWZlXJM4t4Tz27XbHIlGxnvSmSHGFl74yKbIGCgz/mr9LCwQt8HAeG5QR4+KpImehYGEZeqysAh1ywPTmWnojmdHrrjuUowPZPdihzKgONsiDgCHTRYzmAlDcPGNlipjIOacSC/hgf6lIZL/QelH8eC3lefpAbyE1paruw2a39yLRX4rb4DWcWk0n3dsy23PElhLBTwGQQsaHTbz7EIabEOb8/tPsOM9P/LaHrD3A3nODPvmgMyAdGsXJ+sHPTjFXOGn2vuB5edJvVARZnQZIpPskcDvcL/Ho+SEITaSYREm2iNkRya0jTBoQ7mtrR+DmE7plvWdjcDceOafDTs81rtrsJ5zdcxOHOmw4QTUtOiebnulbu6kChC5pddgVY9ahTSjQsnxJ5xkAn2AJeS/2GdmIV0edXdK0ojHxYgLWfDjv6WNZ3mag9+ntZw+m7dIwqLTQHPC+Q+YWJMHU8l8Mfu4vSAfG0k15GMjy40Pavi+6UdadTgKajm3N8ieCTyDoSsdf8HGUZkCNB2nAU2UhTwrCB/2APoKy7Mwg+DHIb6G5o9OCeA9ZmSov2dDsWrxTD6rlkjveGGfhIqvlotcpqKBMf752pj/qtCMJq1+SqcIWZEW20jL7AF5ZkEBNcDWkAaBAl1rvTqH8d6vjYQtQm3v9RD3z0cF/xu+og84O3OrKXp8vb3uTn7lOX42RsObEWKW7rBfvkiseSZH8QMzPcmy1oBt6R0mZlmqD/gOGN0V/ipkEY1+YGFmIkgvECziZjHOIvdeTKG09duCsbmm9lHIFcnRSNjVJC/z+ITpjzhh1LNPiKRGSu+pzMkO+nv6mKSXZRrZBI1suhidVSeISK5OqbH+EGYe5nQbG+8LEnWNyKPsMTZlG3v3RRKIi1Qe0blmqqISzfID+KmHjK1/aJIZP7QKhlfyGDfqlbl/hT3Pbxl85AI1iU4DeMrTbKfZgAHNExukebLZbZjumZ1PRKGruc5gIGFF9pc0QBt1O1DSNBoWCNiqsZWm1MlJ1o6sDKRZArHU2dvonkOfkk6h4wfHV2Pn2hBZnIubYvuOZ1vCfM9ghPeVGzilxhh2arerkC9E60VUJx1iMpPTfjU1uw94gA30GSrx2dWRo6HcP3gW9s/va/2NxrsjswVO9qEmOLLZS9BF+e2PQecncoDUsbbunZ8+sdtm/OXQOazWGS5W/Pl315yzH0o0bYcolAUWDYt1hPCFvwOAfxWNZFoTFYEw4dJUAYMGvaRdg3ywQ/jK2k1MOMv+gbHc8p/jpbHNVQQtbBIuwAsvICQNX6PCSDbCMS/K/AiKivnffQ8kSDMFX9ijGBkDAjBgkqhkiG9w0BCRUxFgQUlgCJh1d8WORIThv+Ju2NkD9fS0gwaQYJKoZIhvcNAQkUMVweWgBRAHUAYQBuAHQAdQBtAHUAbAB0ACAAQwBlAHIAdABpAGYAaQBjAGEAdABlACAARgBBADEAQQA5ADgANAA5ACAAKAAxADEAIABPAGMAdAAgADIAMAAxADkAKTAtMCEwCQYFKw4DAhoFAAQU8gunnEf1jIaelyXFamHM4uv0avgECFTS7nopsZ+Z
ca-passphrase = FA1A9849
skip-server-cert-verify = false

{% endif %}
{% if request.target == "quan" %}

[SERVER]

[SOURCE]

[BACKUP-SERVER]

[SUSPEND-SSID]

[POLICY]

[DNS]
1.1.1.1

[REWRITE]

[URL-REJECTION]

[TCP]

[GLOBAL]

[HOST]

[STATE]
STATE,AUTO

[MITM]

{% endif %}
{% if request.target == "quanx" %}

[general]
excluded_routes=192.168.0.0/16, 172.16.0.0/12, 100.64.0.0/10, 10.0.0.0/8
geo_location_checker=http://ip-api.com/json/?lang=zh-CN, https://github.com/KOP-XIAO/QuantumultX/raw/master/Scripts/IP_API.js
network_check_url=http://www.baidu.com/
server_check_url=http://www.gstatic.com/generate_204

[dns]
server=119.29.29.29
server=223.5.5.5
server=1.0.0.1
server=8.8.8.8

[policy]
static=♻️ 自动选择, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Auto.png
static=🔰 节点选择, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Proxy.png
static=🌍 国外媒体, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/GlobalMedia.png
static=🌏 国内媒体, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/DomesticMedia.png
static=Ⓜ️ 微软服务, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Microsoft.png
static=📲 电报信息, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Telegram.png
static=🍎 苹果服务, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Apple.png
static=🎯 全球直连, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Direct.png
static=🛑 全球拦截, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Advertising.png
static=🐟 漏网之鱼, direct, img-url=https://raw.githubusercontent.com/Koolson/Qure/master/IconSet/Final.png

[server_remote]

[filter_remote]

[rewrite_remote]

[server_local]

[filter_local]

[rewrite_local]

[mitm]

{% endif %}
{% if request.target == "mellow" %}

[Endpoint]
DIRECT, builtin, freedom, domainStrategy=UseIP
REJECT, builtin, blackhole
Dns-Out, builtin, dns

[Routing]
domainStrategy = IPIfNonMatch

[Dns]
hijack = Dns-Out
clientIp = 114.114.114.114

[DnsServer]
localhost
223.5.5.5
8.8.8.8, 53, Remote
8.8.4.4

[DnsRule]
DOMAIN-KEYWORD, geosite:geolocation-!cn, Remote
DOMAIN-SUFFIX, google.com, Remote

[DnsHost]
doubleclick.net = 127.0.0.1

[Log]
loglevel = warning

{% endif %}
{% if request.target == "surfboard" %}

[General]
loglevel = notify
interface = 127.0.0.1
skip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100.64.0.0/10, localhost, *.local
ipv6 = false
dns-server = system, 223.5.5.5
exclude-simple-hostnames = true
enhanced-mode-by-rule = true
{% endif %}
{% if request.target == "sssub" %}
{
  "route": "bypass-lan-china",
  "remote_dns": "dns.google",
  "ipv6": false,
  "metered": false,
  "proxy_apps": {
    "enabled": false,
    "bypass": true,
    "android_list": [
      "com.eg.android.AlipayGphone",
      "com.wudaokou.hippo",
      "com.zhihu.android"
    ]
  },
  "udpdns": false
}

{% endif %}
{% if request.target == "singbox" %}

{
    "log": {
        "disabled": false,
        "level": "info",
        "timestamp": true
    },
    "dns": {
        "servers": [
            {
                "tag": "dns_proxy",
                "address": "tls://1.1.1.1",
                "address_resolver": "dns_resolver"
            },
            {
                "tag": "dns_direct",
                "address": "h3://dns.alidns.com/dns-query",
                "address_resolver": "dns_resolver",
                "detour": "DIRECT"
            },
            {
                "tag": "dns_fakeip",
                "address": "fakeip"
            },
            {
                "tag": "dns_resolver",
                "address": "223.5.5.5",
                "detour": "DIRECT"
            },
            {
                "tag": "block",
                "address": "rcode://success"
            }
        ],
        "rules": [
            {
                "outbound": [
                    "any"
                ],
                "server": "dns_resolver"
            },
            {
                "geosite": [
                    "category-ads-all"
                ],
                "server": "dns_block",
                "disable_cache": true
            },
            {
                "geosite": [
                    "geolocation-!cn"
                ],
                "query_type": [
                    "A",
                    "AAAA"
                ],
                "server": "dns_fakeip"
            },
            {
                "geosite": [
                    "geolocation-!cn"
                ],
                "server": "dns_proxy"
            }
        ],
        "final": "dns_direct",
        "independent_cache": true,
        "fakeip": {
            "enabled": true,
            {% if default(request.singbox.ipv6, "") == "1" %}
            "inet6_range": "fc00::\/18",
            {% endif %}
            "inet4_range": "198.18.0.0\/15"
        }
    },
    "ntp": {
        "enabled": true,
        "server": "time.apple.com",
        "server_port": 123,
        "interval": "30m",
        "detour": "DIRECT"
    },
    "inbounds": [
        {
            "type": "mixed",
            "tag": "mixed-in",
            {% if bool(default(global.singbox.allow_lan, "")) %}
            "listen": "0.0.0.0",
            {% else %}
            "listen": "127.0.0.1",
            {% endif %}
            "listen_port": {{ default(global.singbox.mixed_port, "2080") }}
        },
        {
            "type": "tun",
            "tag": "tun-in",
            "inet4_address": "172.19.0.1/30",
            {% if default(request.singbox.ipv6, "") == "1" %}
            "inet6_address": "fdfe:dcba:9876::1/126",
            {% endif %}
            "auto_route": true,
            "strict_route": true,
            "stack": "mixed",
            "sniff": true
        }
    ],
    "outbounds": [],
    "route": {
        "rules": [],
        "auto_detect_interface": true
    },
    "experimental": {
        "cache_file": {
            "enabled": true,
            "store_fakeip": true
        },
        "clash_api": {
            "external_controller": "{{ default(global.clash.external_controller, "127.0.0.1:9090") }}",
            "external_ui": "dashboard"
        }
    }
}

{% endif %}


================================================
FILE: base/base/clash_provider_test.yml
================================================
mixed-port: 7890
allow-lan: true
mode: Rule
log-level: info
external-controller: 127.0.0.1:9090
proxy-providers:
  HK:
    type: http
    path: proxy-providers/HK.yaml
    url: {{ getLink("/sub?target=clash&list=true&include=HK&url=https%3A%2F%2Fexample.com%2Fsubscription") }}
    interval: 86400
    health-check:
      enable: true
      url: http://www.gstatic.com/generate_204
      interval: 300
rule-providers: ~
rules: ~


================================================
FILE: base/base/forcerule.yml
================================================
# HTTP 代理端口
port: 7890

# SOCKS5 代理端口
socks-port: 7891

# Linux 和 macOS 的 redir 代理端口 (如需使用此功能,请取消注释)
# redir-port: 7892

# 允许局域网的连接(可用来共享代理)
allow-lan: true

# 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
mode: Rule

# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
# 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
log-level: info

# clash 的 RESTful API
external-controller: 127.0.0.1:9090

# 您可以将静态网页资源(如 clash-dashboard)放置在一个目录中,clash 将会服务于 `${API}/ui`
# 参数应填写配置目录的相对路径或绝对路径。
# external-ui: folder

# RESTful API 的口令 (可选)
# secret: ""

# DNS 设置
dns:
  enable: false
  listen: 0.0.0.0:53
  ipv6: false
  enhanced-mode: fake-ip
  nameserver:
   - 119.29.29.29
   - 114.114.114.114
   - 223.5.5.5



# 代理节点
Proxy:
# Shadowsocks
- name: "1"
  type: ss
  server: 1.2.4.8
  port: 443
  cipher: chacha20-ietf-poly1305
  password: "password"
  # udp: true

# Shadowsocks + simple-obfs
- name: "2"
  type: ss
  server: 1.2.4.8
  port: 443
  cipher: chacha20-ietf-poly1305
  password: "password"
  plugin: obfs
  plugin-opts:
    mode: tls # or http
    # host: bing.com

# Shadowsocks + v2ray-plugin
- name: "3"
  type: ss
  server: 1.2.4.8
  port: 443
  cipher: chacha20-ietf-poly1305
  password: "password"
  plugin: v2ray-plugin
  plugin-opts:
    mode: websocket # no QUIC now
    # tls: true # wss
    # skip-cert-verify: true
    # host: bing.com
    # path: "/"
    # mux: true
    # headers:
    #   custom: value

# VMess
- name: "4"
  type: vmess
  server: v2ray.cool
  port: 443
  uuid: a3482e88-686a-4a58-8126-99c9df64b7bf
  alterId: 64
  cipher: auto
  # udp: true
  # tls: true
  # skip-cert-verify: true
  # network: ws
  # ws-path: /path
  # ws-headers:
  #   Host: v2ray.com


# 代理组策略
Proxy Group:
# 代理节点选择
- { name: "Proxy", type: select, proxies: ["1", "2", "3","4"] }
# 油管
- { name: "google", type: select, proxies: ["Proxy","1", "2", "3","4"] }
# netflix
- { name: "netflix", type: select, proxies: ["Proxy","1", "2", "3","4"] }
# 动画疯
- { name: "动画疯", type: select, proxies: ["Proxy","1", "2", "3","4"] }
# 美区影视
- { name: "美区影视", type: select, proxies: ["Proxy","1", "2", "3","4"] }
# fox+
- { name: "fox+", type: select, proxies: ["Proxy","1", "2", "3","4"] }
# 白名单模式 PROXY,黑名单模式 DIRECT
- { name: "Final", type: select, proxies: ["Proxy","网易解锁", "DIRECT"] }
# Apple 服务代理
- { name: "Apple", type: select, proxies: ["DIRECT", "Proxy"] }
# 国际媒体服务
- { name: "Global_media", type: select, proxies: ["Proxy","网易解锁","1", "2", "3","4"] }
# 国内媒体服务
- { name: "Domestic", type: select, proxies: ["DIRECT","网易解锁", "1", "2", "3","4"] }
#去广告
- { name: "屏蔽广告", type: select, proxies: ["REJECT","网易解锁", "DIRECT"] }
#网易解锁
- { name: "UnblockNeteaseMusic", type: select, proxies: ["网易解锁"] }
#Telegram
- { name: "Telegram", type: select, proxies: ["Proxy"] }

#规则
Rule:

- DOMAIN-KEYWORD,netease,UnblockNeteaseMusic
# USER-AGENT,NeteaseMusic*,UnblockNeteaseMusic
# USER-AGENT,%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*,UnblockNeteaseMusic
# USER-AGENT, %E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*,UnblockNeteaseMusic
# USER-AGENT, %E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90**,UnblockNeteaseMusic
# USER-AGENT, NeteaseMusic**, UnblockNeteaseMusic
# USER-AGENT, 网易云音乐*, UnblockNeteaseMusic
# USER-AGENT, 网易云音乐**, UnblockNeteaseMusic
- DOMAIN-SUFFIX,music.126.net,UnblockNeteaseMusic
- DOMAIN-SUFFIX,163.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,music.163.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,interface.music.163.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,interface3.music.163.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,apm.music.163.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,apm3.music.163.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,man.netease.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,api.iplay.163.com,UnblockNeteaseMusic
- IP-CIDR,59.111.181.60/32,UnblockNeteaseMusic
- IP-CIDR,223.252.199.66/32,UnblockNeteaseMusic
- IP-CIDR,223.252.199.67/32,UnblockNeteaseMusic
- IP-CIDR,59.111.160.195/32,UnblockNeteaseMusic
- IP-CIDR,59.111.160.197/32,UnblockNeteaseMusic
- IP-CIDR,59.111.181.35/32,UnblockNeteaseMusic
- IP-CIDR,59.111.181.38/32,UnblockNeteaseMusic
- IP-CIDR,39.105.63.80/32,UnblockNeteaseMusic
- IP-CIDR,47.100.127.239/32,UnblockNeteaseMusic
- IP-CIDR,118.24.63.156/32,UnblockNeteaseMusic
- IP-CIDR,193.112.159.225/32,UnblockNeteaseMusic
- IP-CIDR,59.111.181.155/32,UnblockNeteaseMusic
- IP-CIDR,115.236.118.33/32,UnblockNeteaseMusic
- IP-CIDR, 59.111.128.0/17, UnblockNeteaseMusic
- IP-CIDR, 115.236.112.0/20,UnblockNeteaseMusic
- IP-CIDR, 223.252.192.0/19,UnblockNeteaseMusic
- DOMAIN-SUFFIX,ac.dun.163yun.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,mr.da.netease.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,crash.163.com,UnblockNeteaseMusic
- IP-CIDR,101.71.154.241/32,UnblockNeteaseMusic
- DOMAIN-SUFFIX,imap.163.com,UnblockNeteaseMusic
- DOMAIN-SUFFIX,isure.stream.qqmusic.qq.com,UnblockNeteaseMusic
- IP-CIDR,101.71.154.241/32,UnblockNeteaseMusic
- IP-CIDR,115.236.118.33/32,UnblockNeteaseMusic
- DOMAIN,music.163.com,UnblockNeteaseMusic
- DOMAIN,interface.music.163.com,UnblockNeteaseMusic
- DOMAIN,interface3.music.163.com,UnblockNeteaseMusic
- DOMAIN,apm.music.163.com,UnblockNeteaseMusic
- DOMAIN,apm3.music.163.com,UnblockNeteaseMusic
- DOMAIN,man.netease.com,UnblockNeteaseMusic
- DOMAIN,api.iplay.163.com,UnblockNeteaseMusic
- IP-CIDR,59.111.181.60/32,UnblockNeteaseMusic
- IP-CIDR,223.252.199.66/32,UnblockNeteaseMusic
- IP-CIDR,223.252.199.67/32,UnblockNeteaseMusic
- IP-CIDR,59.111.160.195/32,UnblockNeteaseMusic
- IP-CIDR,59.111.160.197/32,UnblockNeteaseMusic
- IP-CIDR,59.111.181.35/32,UnblockNeteaseMusic
- IP-CIDR,59.111.181.38/32,UnblockNeteaseMusic
- IP-CIDR,39.105.63.80/32,UnblockNeteaseMusic
- IP-CIDR,47.100.127.239/32,UnblockNeteaseMusic
- IP-CIDR,118.24.63.156/32,UnblockNeteaseMusic
- IP-CIDR,193.112.159.225/32,UnblockNeteaseMusic
- IP-CIDR,59.111.181.155/32,UnblockNeteaseMusic
- IP-CIDR,101.71.154.241/32,UnblockNeteaseMusic
- IP-CIDR,115.236.118.33/32,UnblockNeteaseMusic
# Internet Service Provider Hijacking 运营商劫持
- DOMAIN-SUFFIX,17gouwuba.com,屏蔽广告
- DOMAIN-SUFFIX,186078.com,屏蔽广告
- DOMAIN-SUFFIX,189zj.cn,屏蔽广告
- DOMAIN-SUFFIX,285680.com,屏蔽广告
- DOMAIN-SUFFIX,3721zh.com,屏蔽广告
- DOMAIN-SUFFIX,4336wang.cn,屏蔽广告
- DOMAIN-SUFFIX,51chumoping.com,屏蔽广告
- DOMAIN-SUFFIX,51mld.cn,屏蔽广告
- DOMAIN-SUFFIX,51mypc.cn,屏蔽广告
- DOMAIN-SUFFIX,58mingri.cn,屏蔽广告
- DOMAIN-SUFFIX,58mingtian.cn,屏蔽广告
- DOMAIN-SUFFIX,5vl58stm.com,屏蔽广告
- DOMAIN-SUFFIX,6d63d3.com,屏蔽广告
- DOMAIN-SUFFIX,7gg.cc,屏蔽广告
- DOMAIN-SUFFIX,91veg.com,屏蔽广告
- DOMAIN-SUFFIX,9s6q.cn,屏蔽广告
- DOMAIN-SUFFIX,adsame.com,屏蔽广告
- DOMAIN-SUFFIX,aiclk.com,屏蔽广告
- DOMAIN-SUFFIX,akuai.top,屏蔽广告
- DOMAIN-SUFFIX,atplay.cn,屏蔽广告
- DOMAIN-SUFFIX,baiwanchuangyi.com,屏蔽广告
- DOMAIN-SUFFIX,beerto.cn,屏蔽广告
- DOMAIN-SUFFIX,beilamusi.com,屏蔽广告
- DOMAIN-SUFFIX,benshiw.net,屏蔽广告
- DOMAIN-SUFFIX,bianxianmao.com,屏蔽广告
- DOMAIN-SUFFIX,bryonypie.com,屏蔽广告
- DOMAIN-SUFFIX,cishantao.com,屏蔽广告
- DOMAIN-SUFFIX,cszlks.com,屏蔽广告
- DOMAIN-SUFFIX,cudaojia.com,屏蔽广告
- DOMAIN-SUFFIX,dafapromo.com,屏蔽广告
- DOMAIN-SUFFIX,daitdai.com,屏蔽广告
- DOMAIN-SUFFIX,dsaeerf.com,屏蔽广告
- DOMAIN-SUFFIX,dugesheying.com,屏蔽广告
- DOMAIN-SUFFIX,dv8c1t.cn,屏蔽广告
- DOMAIN-SUFFIX,echatu.com,屏蔽广告
- DOMAIN-SUFFIX,erdoscs.com,屏蔽广告
- DOMAIN-SUFFIX,fan-yong.com,屏蔽广告
- DOMAIN-SUFFIX,feih.com.cn,屏蔽广告
- DOMAIN-SUFFIX,fjlqqc.com,屏蔽广告
- DOMAIN-SUFFIX,fkku194.com,屏蔽广告
- DOMAIN-SUFFIX,freedrive.cn,屏蔽广告
- DOMAIN-SUFFIX,gclick.cn,屏蔽广告
- DOMAIN-SUFFIX,goufanli100.com,屏蔽广告
- DOMAIN-SUFFIX,goupaoerdai.com,屏蔽广告
- DOMAIN-SUFFIX,gouwubang.com,屏蔽广告
- DOMAIN-SUFFIX,gzxnlk.com,屏蔽广告
- DOMAIN-SUFFIX,haoshengtoys.com,屏蔽广告
- DOMAIN-SUFFIX,hyunke.com,屏蔽广告
- DOMAIN-SUFFIX,ichaosheng.com,屏蔽广告
- DOMAIN-SUFFIX,ishop789.com,屏蔽广告
- DOMAIN-SUFFIX,jdkic.com,屏蔽广告
- DOMAIN-SUFFIX,jiubuhua.com,屏蔽广告
- DOMAIN-SUFFIX,jwg365.cn,屏蔽广告
- DOMAIN-SUFFIX,kawo77.com,屏蔽广告
- DOMAIN-SUFFIX,kualianyingxiao.cn,屏蔽广告
- DOMAIN-SUFFIX,kumihua.com,屏蔽广告
- DOMAIN-SUFFIX,ltheanine.cn,屏蔽广告
- DOMAIN-SUFFIX,maipinshangmao.com,屏蔽广告
- DOMAIN-SUFFIX,minisplat.cn,屏蔽广告
- DOMAIN-SUFFIX,mkitgfs.com,屏蔽广告
- DOMAIN-SUFFIX,mlnbike.com,屏蔽广告
- DOMAIN-SUFFIX,mobjump.com,屏蔽广告
- DOMAIN-SUFFIX,nbkbgd.cn,屏蔽广告
- DOMAIN-SUFFIX,newapi.com,屏蔽广告
- DOMAIN-SUFFIX,pinzhitmall.com,屏蔽广告
- DOMAIN-SUFFIX,poppyta.com,屏蔽广告
- DOMAIN-SUFFIX,qianchuanghr.com,屏蔽广告
- DOMAIN-SUFFIX,qichexin.com,屏蔽广告
- DOMAIN-SUFFIX,qinchugudao.com,屏蔽广告
- DOMAIN-SUFFIX,quanliyouxi.cn,屏蔽广告
- DOMAIN-SUFFIX,qutaobi.com,屏蔽广告
- DOMAIN-SUFFIX,ry51w.cn,屏蔽广告
- DOMAIN-SUFFIX,sg536.cn,屏蔽广告
- DOMAIN-SUFFIX,sifubo.cn,屏蔽广告
- DOMAIN-SUFFIX,sifuce.cn,屏蔽广告
- DOMAIN-SUFFIX,sifuda.cn,屏蔽广告
- DOMAIN-SUFFIX,sifufu.cn,屏蔽广告
- DOMAIN-SUFFIX,sifuge.cn,屏蔽广告
- DOMAIN-SUFFIX,sifugu.cn,屏蔽广告
- DOMAIN-SUFFIX,sifuhe.cn,屏蔽广告
- DOMAIN-SUFFIX,sifuhu.cn,屏蔽广告
- DOMAIN-SUFFIX,sifuji.cn,屏蔽广告
- DOMAIN-SUFFIX,sifuka.cn,屏蔽广告
- DOMAIN-SUFFIX,smgru.net,屏蔽广告
- DOMAIN-SUFFIX,taoggou.com,屏蔽广告
- DOMAIN-SUFFIX,tcxshop.com,屏蔽广告
- DOMAIN-SUFFIX,tjqonline.cn,屏蔽广告
- DOMAIN-SUFFIX,topitme.com,屏蔽广告
- DOMAIN-SUFFIX,tt3sm4.cn,屏蔽广告
- DOMAIN-SUFFIX,tuia.cn,屏蔽广告
- DOMAIN-SUFFIX,tuipenguin.com,屏蔽广告
- DOMAIN-SUFFIX,tuitiger.com,屏蔽广告
- DOMAIN-SUFFIX,websd8.com,屏蔽广告
- DOMAIN-SUFFIX,wx16999.com,屏蔽广告
- DOMAIN-SUFFIX,xiaohuau.xyz,屏蔽广告
- DOMAIN-SUFFIX,yinmong.com,屏蔽广告
- DOMAIN-SUFFIX,yiqifa.com,屏蔽广告
- DOMAIN-SUFFIX,yitaopt.com,屏蔽广告
- DOMAIN-SUFFIX,yjqiqi.com,屏蔽广告
- DOMAIN-SUFFIX,yukhj.com,屏蔽广告
- DOMAIN-SUFFIX,zhaozecheng.cn,屏蔽广告
- DOMAIN-SUFFIX,zhenxinet.com,屏蔽广告
- DOMAIN-SUFFIX,zlne800.com,屏蔽广告
- DOMAIN-SUFFIX,zunmi.cn,屏蔽广告
- DOMAIN-SUFFIX,zzd6.com,屏蔽广告

# Infamous 声名狼藉
- DOMAIN-SUFFIX,kuaizip.com,屏蔽广告
- DOMAIN-SUFFIX,mackeeper.com,屏蔽广告
# > Adobe 奥多比
- DOMAIN-SUFFIX,flash.cn,屏蔽广告
- DOMAIN,geo2.adobe.com,屏蔽广告
# > CJ Marketing 思杰马克丁软件
- DOMAIN-SUFFIX,4009997658.com,屏蔽广告
- DOMAIN-SUFFIX,abbyychina.com,屏蔽广告
- DOMAIN-SUFFIX,bartender.cc,屏蔽广告
- DOMAIN-SUFFIX,betterzip.net,屏蔽广告
- DOMAIN-SUFFIX,beyondcompare.cc,屏蔽广告
- DOMAIN-SUFFIX,bingdianhuanyuan.cn,屏蔽广告
- DOMAIN-SUFFIX,chemdraw.com.cn,屏蔽广告
- DOMAIN-SUFFIX,cjmakeding.com,屏蔽广告
- DOMAIN-SUFFIX,cjmkt.com,屏蔽广告
- DOMAIN-SUFFIX,codesoftchina.com,屏蔽广告
- DOMAIN-SUFFIX,coreldrawchina.com,屏蔽广告
- DOMAIN-SUFFIX,crossoverchina.com,屏蔽广告
- DOMAIN-SUFFIX,dongmansoft.com,屏蔽广告
- DOMAIN-SUFFIX,earmasterchina.cn,屏蔽广告
- DOMAIN-SUFFIX,easyrecoverychina.com,屏蔽广告
- DOMAIN-SUFFIX,ediuschina.com,屏蔽广告
- DOMAIN-SUFFIX,flstudiochina.com,屏蔽广告
- DOMAIN-SUFFIX,formysql.com,屏蔽广告
- DOMAIN-SUFFIX,guitarpro.cc,屏蔽广告
- DOMAIN-SUFFIX,huishenghuiying.com.cn,屏蔽广告
- DOMAIN-SUFFIX,hypersnap.net,屏蔽广告
- DOMAIN-SUFFIX,iconworkshop.cn,屏蔽广告
- DOMAIN-SUFFIX,imindmap.cc,屏蔽广告
- DOMAIN-SUFFIX,jihehuaban.com.cn,屏蔽广告
- DOMAIN-SUFFIX,keyshot.cc,屏蔽广告
- DOMAIN-SUFFIX,kingdeecn.cn,屏蔽广告
- DOMAIN-SUFFIX,logoshejishi.com,屏蔽广告
- DOMAIN-SUFFIX,luping.net.cn,屏蔽广告
- DOMAIN-SUFFIX,mairuan.cn,屏蔽广告
- DOMAIN-SUFFIX,mairuan.com,屏蔽广告
- DOMAIN-SUFFIX,mairuan.com.cn,屏蔽广告
- DOMAIN-SUFFIX,mairuan.net,屏蔽广告
- DOMAIN-SUFFIX,mairuanwang.com,屏蔽广告
- DOMAIN-SUFFIX,makeding.com,屏蔽广告
- DOMAIN-SUFFIX,mathtype.cn,屏蔽广告
- DOMAIN-SUFFIX,mindmanager.cc,屏蔽广告
- DOMAIN-SUFFIX,mindmanager.cn,屏蔽广告
- DOMAIN-SUFFIX,mindmapper.cc,屏蔽广告
- DOMAIN-SUFFIX,mycleanmymac.com,屏蔽广告
- DOMAIN-SUFFIX,nicelabel.cc,屏蔽广告
- DOMAIN-SUFFIX,ntfsformac.cc,屏蔽广告
- DOMAIN-SUFFIX,ntfsformac.cn,屏蔽广告
- DOMAIN-SUFFIX,overturechina.com,屏蔽广告
- DOMAIN-SUFFIX,passwordrecovery.cn,屏蔽广告
- DOMAIN-SUFFIX,pdfexpert.cc,屏蔽广告
- DOMAIN-SUFFIX,photozoomchina.com,屏蔽广告
- DOMAIN-SUFFIX,shankejingling.com,屏蔽广告
- DOMAIN-SUFFIX,ultraiso.net,屏蔽广告
- DOMAIN-SUFFIX,vegaschina.cn,屏蔽广告
- DOMAIN-SUFFIX,xmindchina.net,屏蔽广告
- DOMAIN-SUFFIX,xshellcn.com,屏蔽广告
- DOMAIN-SUFFIX,yihuifu.cn,屏蔽广告
- DOMAIN-SUFFIX,yuanchengxiezuo.com,屏蔽广告
- DOMAIN-SUFFIX,zbrushcn.com,屏蔽广告
- DOMAIN-SUFFIX,zhzzx.com,屏蔽广告

- DOMAIN-KEYWORD,adservice,屏蔽广告
- DOMAIN-KEYWORD,analytics,屏蔽广告
- DOMAIN-KEYWORD,analysis,屏蔽广告

- DOMAIN,42trck.com,屏蔽广告
- DOMAIN,51.la,屏蔽广告
- DOMAIN,adcolony.com,屏蔽广告
- DOMAIN,adinfuse.com,屏蔽广告
- DOMAIN,adjust.com,屏蔽广告
- DOMAIN,adjust.io,屏蔽广告
- DOMAIN,admaster.com.cn,屏蔽广告
- DOMAIN,admob.com,屏蔽广告
- DOMAIN,adnyg.com,屏蔽广告
- DOMAIN,adsensor.org,屏蔽广告
- DOMAIN,adtarget.tech,屏蔽广告
- DOMAIN,adthor.com,屏蔽广告
- DOMAIN,adwhirl.com,屏蔽广告
- DOMAIN,amazon-adsystem.com,屏蔽广告
- DOMAIN,analysys.cn,屏蔽广告
- DOMAIN,app-adforce.jp,屏蔽广告
- DOMAIN,appadhoc.com,屏蔽广告
- DOMAIN,appads.com,屏蔽广告
- DOMAIN,appier.net,屏蔽广告
- DOMAIN,applift.com,屏蔽广告
- DOMAIN,appsflyer.com,屏蔽广告
- DOMAIN,apsalar.com,屏蔽广告
- DOMAIN,apxadtracking.net,屏蔽广告
- DOMAIN,axonix.com,屏蔽广告
- DOMAIN,cloudmobi.net,屏蔽广告
- DOMAIN,cnzz.com,屏蔽广告
- DOMAIN,ctrmi.com,屏蔽广告
- DOMAIN,flurry.com,屏蔽广告
- DOMAIN,go2cloud.org,屏蔽广告
- DOMAIN,growingio.com,屏蔽广告
- DOMAIN,haloapps.com,屏蔽广告
- DOMAIN,inmobi.cn,屏蔽广告
- DOMAIN,inmobi.com,屏蔽广告
- DOMAIN,inmobi.net,屏蔽广告
- DOMAIN,inmobicdn.cn,屏蔽广告
- DOMAIN,irs01.com,屏蔽广告
- DOMAIN,iskyworker.com,屏蔽广告
- DOMAIN,kochava.com,屏蔽广告
- DOMAIN,leadboltmobile.net,屏蔽广告
- DOMAIN,lenzmx.com,屏蔽广告
- DOMAIN,liveadvert.com,屏蔽广告
- DOMAIN,lnk0.com,屏蔽广告
- DOMAIN,lnk8.cn,屏蔽广告
- DOMAIN,localytics.com,屏蔽广告
- DOMAIN,measurementapi.com,屏蔽广告
- DOMAIN,medialytics.com,屏蔽广告
- DOMAIN,miaozhen.com,屏蔽广告
- DOMAIN,mobclix.com,屏蔽广告
- DOMAIN,mopub.com,屏蔽广告
- DOMAIN,onelink.me,屏蔽广告
- DOMAIN,qchannel01.cn,屏蔽广告
- DOMAIN,rayjump.com,屏蔽广告
- DOMAIN,rubiconproject.com,屏蔽广告
- DOMAIN,scorecardresearch.com,屏蔽广告
- DOMAIN,sdkclick.com,屏蔽广告
- DOMAIN,shuzilm.cn,屏蔽广告
- DOMAIN,smaato.net,屏蔽广告
- DOMAIN,smartadserver.com,屏蔽广告
- DOMAIN,smartnews-ads.com,屏蔽广告
- DOMAIN,tagtic.cn,屏蔽广告
- DOMAIN,tanv.com,屏蔽广告
- DOMAIN,tanx.com,屏蔽广告
- DOMAIN,trafficjunky.net,屏蔽广告
- DOMAIN,uri6.com,屏蔽广告
- DOMAIN,voicefive.com,屏蔽广告
- DOMAIN,vungle.com,屏蔽广告
- DOMAIN,wedolook.com,屏蔽广告
- DOMAIN,xdrig.com,屏蔽广告

- DOMAIN,ad.daum.net,屏蔽广告
- DOMAIN,track.xiachufang.com,屏蔽广告
- DOMAIN,abema-adx.ameba.jp,屏蔽广告
- DOMAIN,ad.12306.cn,屏蔽广告
- DOMAIN,ad.51wnl-cq.com,屏蔽广告
- DOMAIN,ad.caiyunapp.com,屏蔽广告
- DOMAIN,ad.huajiao.com,屏蔽广告
- DOMAIN,ad.hzyoka.com,屏蔽广告
- DOMAIN,ad.jiemian.com,屏蔽广告
- DOMAIN,ad.qingting.fm,屏蔽广告
- DOMAIN,ad.wappalyzer.com,屏蔽广告
- DOMAIN,ad-cn.jovcloud.com,屏蔽广告
- DOMAIN,adextra.51wnl-cq.com,屏蔽广告
- DOMAIN,ads.adadapted.com,屏蔽广告
- DOMAIN,ads.daydaycook.com.cn,屏蔽广告
- DOMAIN,ads.weilitoutiao.net,屏蔽广告
- DOMAIN,adsapi.manhuaren.com,屏蔽广告
- DOMAIN,adsdk.dmzj.com,屏蔽广告
- DOMAIN,adserver.pandora.com,屏蔽广告
- DOMAIN,adui.tg.meitu.com,屏蔽广告
- DOMAIN,adv.bandi.so,屏蔽广告
- DOMAIN,adx.hupu.com,屏蔽广告
- DOMAIN,adx-api.hupu.com,屏蔽广告
- DOMAIN,adxserver.ad.cmvideo.cn,屏蔽广告
- DOMAIN,app-ad.variflight.com,屏蔽广告
- DOMAIN,applog.mobike.com,屏蔽广告
- DOMAIN,appnext.hs.llnwd.net,屏蔽广告
- DOMAIN,appnext-a.akamaihd.net,屏蔽广告
- DOMAIN,ggs.myzaker.com,屏蔽广告
- DOMAIN,itad.linetv.tw,屏蔽广告
- DOMAIN,ja.chushou.tv,屏蔽广告
- DOMAIN,mads.suning.com,屏蔽广告
- DOMAIN,mobileads.msn.com,屏蔽广告
- DOMAIN,mopnativeadv.037201.com,屏蔽广告
- DOMAIN,nativeadv.dftoutiao.com,屏蔽广告
- DOMAIN,optimus-ads.amap.com,屏蔽广告
- DOMAIN,sugar.zhihu.com,屏蔽广告
- DOMAIN,track.tiara.daum.net,屏蔽广告
- DOMAIN,track.tiara.kakao.com,屏蔽广告
- DOMAIN,trackapp.guahao.cn,屏蔽广告
- DOMAIN,traffic.mogujie.com,屏蔽广告
- DOMAIN,wmlog.meituan.com,屏蔽广告

- DOMAIN,adshow.58.com,屏蔽广告
- DOMAIN,track.58.com,屏蔽广告
- DOMAIN,tracklog.58.com,屏蔽广告
- DOMAIN,iadsdk.apple.com,屏蔽广告
- DOMAIN,ads.internal.unity3d.com,屏蔽广告
- DOMAIN,ads.prd.ie.internal.unity3d.com,屏蔽广告
- DOMAIN,unityads.unity3d.com,屏蔽广告
- DOMAIN,acs4baichuan.m.taobao.com,屏蔽广告
- DOMAIN,adash.m.taobao.com,屏蔽广告
- DOMAIN,adash.man.aliyuncs.com,屏蔽广告
- DOMAIN,adashbc.ut.taobao.com,屏蔽广告
- DOMAIN,adash-c.ut.taobao.com,屏蔽广告
- DOMAIN,adashxgc.ut.taobao.com,屏蔽广告
- DOMAIN,adashx4yt.m.taobao.com,屏蔽广告
- DOMAIN,nbsdk-baichuan.alicdn.com,屏蔽广告
- DOMAIN,tunion-api.m.taobao.com,屏蔽广告

- DOMAIN,adproxy.autohome.com.cn,屏蔽广告
- DOMAIN,rd.autohome.com.cn,屏蔽广告
- DOMAIN,al.autohome.com.cn,屏蔽广告
- DOMAIN,applogapi.autohome.com.cn,屏蔽广告


- DOMAIN,baidustatic.com,屏蔽广告
- DOMAIN,cpro.baidu.com,屏蔽广告
- DOMAIN,pos.baidu.com,屏蔽广告
- DOMAIN,afd.baidu.com,屏蔽广告
- DOMAIN,als.baidu.com,屏蔽广告
- DOMAIN,duclick.baidu.com,屏蔽广告
- DOMAIN,hm.baidu.com,屏蔽广告
- DOMAIN,hmma.baidu.com,屏蔽广告
- DOMAIN,mobads.baidu.com,屏蔽广告
- DOMAIN,mobads-logs.baidu.com,屏蔽广告
- DOMAIN,nsclick.baidu.com,屏蔽广告

- DOMAIN,applog.musical.ly,屏蔽广告
- DOMAIN,track.toutiao.com,屏蔽广告
- DOMAIN,xlog.snssdk.com,屏蔽广告
- DOMAIN,xlog-va.byteoversea.com,屏蔽广告

- DOMAIN,adx.yiche.com,屏蔽广告
- DOMAIN,log.ycapp.yiche.com,屏蔽广告
- DOMAIN,advertise.baicizhan.org,屏蔽广告
- DOMAIN,advertise.baicizhan.com,屏蔽广告


- DOMAIN,galaxy.bjcathay.com,屏蔽广告
- DOMAIN,mdrecv.app.cntvwb.cn,屏蔽广告
- DOMAIN,sdapprecv.app.cntvwb.cn,屏蔽广告
- DOMAIN,vdapprecv.app.cntvwb.cn,屏蔽广告

- DOMAIN,admarket.21cn.com,屏蔽广告
- DOMAIN,adshows.21cn.com,屏蔽广告

- DOMAIN,atrace.chelaile.net.cn,屏蔽广告
- DOMAIN,logs.chelaile.net.cn,屏蔽广告
- DOMAIN,doubleclick.net,屏蔽广告
- DOMAIN,googleadservices.com,屏蔽广告
- DOMAIN,googleadsserving.cn,屏蔽广告
- DOMAIN,googlesyndication.com,屏蔽广告
- DOMAIN,googletagmanager.com,屏蔽广告
- DOMAIN,googletagservices.com,屏蔽广告
- DOMAIN,da.mgtv.com,屏蔽广告
- DOMAIN,da.hunantv.com,屏蔽广告
- DOMAIN,log.hunantv.com,屏蔽广告
- DOMAIN,log.v2.hunantv.com,屏蔽广告
- DOMAIN,v2.log.hunantv.com,屏蔽广告
- DOMAIN,ifacelog.iqiyi.com,屏蔽广告
- DOMAIN,msg.71.am,屏蔽广告
- DOMAIN,msg.qy.net,屏蔽广告
- DOMAIN,t7z.cupid.iqiyi.com,屏蔽广告
# > Ifeng
- DOMAIN,deliver.ifeng.com,屏蔽广告
- DOMAIN,api.newad.ifeng.com,屏蔽广告
- DOMAIN,ifengad.3g.ifeng.com,屏蔽广告
# (K)
# > KuGou and Kuwo
- DOMAIN,adserviceretry.kugou.com,屏蔽广告
- DOMAIN,ads.service.kugou.com,屏蔽广告
- DOMAIN,adsfile.bssdlbig.kugou.com,屏蔽广告
- DOMAIN,g.koowo.com,屏蔽广告
- DOMAIN,log.stat.kugou.com,屏蔽广告
- DOMAIN,log.web.kugou.com,屏蔽广告
- DOMAIN,log.kuwo.cn,屏蔽广告
- DOMAIN,kgmobilestat.kugou.com,屏蔽广告
- DOMAIN,kgmobilestatbak.kugou.com,屏蔽广告
- DOMAIN,mobilelog.kugou.com,屏蔽广告
- DOMAIN,mobilead.kuwo.cn,屏蔽广告
- DOMAIN,rich.kuwo.cn,屏蔽广告
# > Kingsoft
- DOMAIN,ad-stat.ksosoft.com,屏蔽广告
- DOMAIN,img.auction-ads.wpscdn.cn,屏蔽广告
- DOMAIN,counter.kingsoft.com,屏蔽广告
- DOMAIN,counter.ksosoft.com,屏蔽广告
- DOMAIN,minfo.wps.cn,屏蔽广告
- DOMAIN,mobad.ijinshan.com,屏蔽广告
- DOMAIN,ups.ksmobile.net,屏蔽广告
- DOMAIN,ws.ksmobile.net,屏蔽广告
- DOMAIN,webp2p.letv.com,屏蔽广告
- DOMAIN,ark.letv.com,屏蔽广告
- DOMAIN,emma-414870e223.huodonghezi.com,屏蔽广告
- DOMAIN,g3.letv.com,屏蔽广告
- DOMAIN,n.mark.letv.com,屏蔽广告
- DOMAIN,ad.intl.xiaomi.com,屏蔽广告
- DOMAIN,ad.xiaomi.com,屏蔽广告
- DOMAIN,admob.xiaomi.com,屏蔽广告
- DOMAIN,tracking.miui.com,屏蔽广告
- DOMAIN,adv.sec.intl.miui.com,屏蔽广告
- DOMAIN,adv.sec.miui.com,屏蔽广告
- DOMAIN,data.mistat.xiaomi.com,屏蔽广告
- DOMAIN,tracking.intl.miui.com,屏蔽广告
- DOMAIN,ad.api.moji.com,屏蔽广告
- DOMAIN,adlaunch.moji.com,屏蔽广告
- DOMAIN,ads.mojicdn.com,屏蔽广告
- DOMAIN,v1.log.moji.com,屏蔽广告
- DOMAIN,ad.bn.netease.com,屏蔽广告
- DOMAIN,ad.yixin.im,屏蔽广告
- DOMAIN,admusicpic.music.126.net,屏蔽广告
- DOMAIN,iadmat.nosdn.127.net,屏蔽广告
- DOMAIN,iadmusicmat.music.126.net,屏蔽广告
- DOMAIN,iadmusicmatvideo.music.126.net,屏蔽广告
- DOMAIN,impservice.dictapp.youdao.com,屏蔽广告
- DOMAIN,impservice.youdao.com,屏蔽广告
- DOMAIN,log.yex.youdao.com,屏蔽广告
- DOMAIN,log-yex.youdao.com,屏蔽广告
- DOMAIN,n.3g.163.com,屏蔽广告
- DOMAIN,nex.163.com,屏蔽广告
- DOMAIN,yt-adp.nosdn.127.net,屏蔽广告
- DOMAIN,ads.aplus.pptv.com,屏蔽广告
- DOMAIN,ads.aplusapi.pptv.com,屏蔽广告
- DOMAIN,asimgs.pplive.cn,屏蔽广告
- DOMAIN,de.as.pptv.com,屏蔽广告
- DOMAIN,regist.fotoable.com,屏蔽广告
- DOMAIN,cdn.adapi.fotoable.com,屏蔽广告
- DOMAIN,adnew.wifi8.com,屏蔽广告
- DOMAIN,adfile.wifi8.com,屏蔽广告
- DOMAIN,adimg.vue.weibo.com,屏蔽广告
- DOMAIN,u1.img.mobile.sina.cn,屏蔽广告
- DOMAIN,sax.sina.com.cn,屏蔽广告
- DOMAIN,saxs.sina.com.cn,屏蔽广告
- DOMAIN,saxn.sina.com.cn,屏蔽广告
- DOMAIN,ads.sohu.com,屏蔽广告
- DOMAIN,aty.sohu.com,屏蔽广告
- DOMAIN,imp.optaim.com,屏蔽广告
- DOMAIN,v2.reachmax.cn,屏蔽广告
- DOMAIN,track.sohu.com,屏蔽广告
- DOMAIN,hui.sohu.com,屏蔽广告
- DOMAIN,bugly.qq.com,屏蔽广告
- DOMAIN,e.qq.com,屏蔽广告
- DOMAIN,gdt.qq.com,屏蔽广告
- DOMAIN,l.qq.com,屏蔽广告
- DOMAIN,rqd.qq.com,屏蔽广告
- DOMAIN,adsmind.tc.qq.com,屏蔽广告
- DOMAIN,btrace.qq.com,屏蔽广告
- DOMAIN,mtrace.qq.com,屏蔽广告
- DOMAIN,oth.eve.mdt.qq.com,屏蔽广告
- DOMAIN,pgdt.gtimg.cn,屏蔽广告
- DOMAIN,pingma.qq.com,屏蔽广告
- DOMAIN,pingtcss.qq.com,屏蔽广告
- DOMAIN,splashqqlive.gtimg.com,屏蔽广告
- DOMAIN,tajs.qq.com,屏蔽广告
- DOMAIN,wxsnsdy.wxs.qq.com,屏蔽广告
- DOMAIN,wxsnsdythumb.wxs.qq.com,屏蔽广告
- DOMAIN,imgadpai.thepaper.cn,屏蔽广告
- DOMAIN,admonitor.thepaper.cn,屏蔽广告
- DOMAIN,adsp.xunlei.com,屏蔽广告
- DOMAIN,etl.xlmc.sandai.net,屏蔽广告
- DOMAIN,adm.10jqka.com.cn,屏蔽广告
- DOMAIN,stat.10jqka.com.cn,屏蔽广告
- DOMAIN,ad-analysis.pconline.com.cn,屏蔽广告
- DOMAIN,iad0ssl.pcauto.com.cn,屏蔽广告
- DOMAIN,iad0ssl.pconline.com.cn,屏蔽广告
- DOMAIN,imgad0.pcauto.com.cn,屏蔽广告
- DOMAIN,imgad0.pconline.com.cn,屏蔽广告
- DOMAIN,ivy.pchouse.com.cn,屏蔽广告
- DOMAIN,adtrack.ucweb.com,屏蔽广告
- DOMAIN,applogios.uc.cn,屏蔽广告
- DOMAIN,track.uc.cn,屏蔽广告
- DOMAIN,alog.umeng.com,屏蔽广告
- DOMAIN,alog.umengcloud.com,屏蔽广告
- DOMAIN,ar.umeng.com,屏蔽广告
- DOMAIN,plbslog.umeng.com,屏蔽广告
- DOMAIN,ulogs.umeng.com,屏蔽广告
- DOMAIN,ulogs.umengcloud.com,屏蔽广告
- DOMAIN,a.wkanx.com,屏蔽广告
- DOMAIN,cwx.lianwangtech.com,屏蔽广告
- DOMAIN,c1wx.lianwangtech.com,屏蔽广告
- DOMAIN,ad.ximalaya.com,屏蔽广告
- DOMAIN,adse.ximalaya.com,屏蔽广告
- DOMAIN,adse.wsa.ximalaya.com,屏蔽广告
- DOMAIN,adbehavior.wsa.ximalaya.com,屏蔽广告
- DOMAIN,apm-track.xiaohongshu.com,屏蔽广告
- DOMAIN,t-ads.xiaohongshu.com,屏蔽广告
- DOMAIN,atm.youku.com,屏蔽广告
- DOMAIN,ad.mobile.youku.com,屏蔽广告
- DOMAIN,iyes.youku.com,屏蔽广告
- DOMAIN,apppv.zol.com.cn,屏蔽广告
- DOMAIN,pvnapp.zol.com.cn,屏蔽广告
- DOMAIN-KEYWORD,epochtimes,屏蔽广告
- DOMAIN,881903.com,屏蔽广告
- DOMAIN,aboluowang.com,屏蔽广告
- DOMAIN,bannedbook.org,屏蔽广告
- DOMAIN,bldaily.com,屏蔽广告
- DOMAIN,china21.org,屏蔽广告
- DOMAIN,chinaaffairs.org,屏蔽广告
- DOMAIN,dajiyuan.com,屏蔽广告
- DOMAIN,dalianmeng.org,屏蔽广告
- DOMAIN,dkn.tv,屏蔽广告
- DOMAIN,dongtaiwang.com,屏蔽广告
- DOMAIN,edoors.com,屏蔽广告
- DOMAIN,epochweekly.com,屏蔽广告
- DOMAIN,falundafa.org,屏蔽广告
- DOMAIN,fgmtv.org,屏蔽广告
- DOMAIN,gardennetworks.com,屏蔽广告
- DOMAIN,gongyiluntan.org,屏蔽广告
- DOMAIN,gpass1.com,屏蔽广告
- DOMAIN,hrichina.org,屏蔽广告
- DOMAIN,huanghuagang.org,屏蔽广告
- DOMAIN,internetfreedom.org,屏蔽广告
- DOMAIN,kanzhongguo.com,屏蔽广告
- DOMAIN,lagranepoca.com,屏蔽广告
- DOMAIN,mh4u.org,屏蔽广告
- DOMAIN,mhradio.org,屏蔽广告
- DOMAIN,minghui.org,屏蔽广告
- DOMAIN,newrealmstudios.ca,屏蔽广告
- DOMAIN,ntdtv.com,屏蔽广告
- DOMAIN,ogate.org,屏蔽广告
- DOMAIN,open.com.hk,屏蔽广告
- DOMAIN,organcare.org.tw,屏蔽广告
- DOMAIN,qxbbs.org,屏蔽广告
- DOMAIN,renminbao.com,屏蔽广告
- DOMAIN,secretchina.com,屏蔽广告
- DOMAIN,shenyun.com,屏蔽广告
- DOMAIN,shenyunperformingarts.org,屏蔽广告
- DOMAIN,shenzhoufilm.com,屏蔽广告
- DOMAIN,soundofhope.org,屏蔽广告
- DOMAIN,theepochtimes.com,屏蔽广告
- DOMAIN,tiandixing.org,屏蔽广告
- DOMAIN,tuidang.org,屏蔽广告
- DOMAIN,velkaepocha.sk,屏蔽广告
- DOMAIN,watchinese.com,屏蔽广告
- DOMAIN,wixsite.com,屏蔽广告
- DOMAIN,wujie.net,屏蔽广告
- DOMAIN,wujieliulan.com,屏蔽广告
- DOMAIN,xinsheng.net,屏蔽广告
- DOMAIN,zhengjian.org,屏蔽广告
- DOMAIN,zhuichaguoji.org,屏蔽广告
# › AD Block KEYWORD
- DOMAIN-KEYWORD,admarvel,屏蔽广告
- DOMAIN-KEYWORD,admaster,屏蔽广告
- DOMAIN-KEYWORD,adsage,屏蔽广告
- DOMAIN-KEYWORD,adsmogo,屏蔽广告
- DOMAIN-KEYWORD,adsrvmedia,屏蔽广告
- DOMAIN-KEYWORD,adwords,屏蔽广告
- DOMAIN-KEYWORD,domob,屏蔽广告
- DOMAIN-KEYWORD,duomeng,屏蔽广告
- DOMAIN-KEYWORD,dwtrack,屏蔽广告
- DOMAIN-KEYWORD,guanggao,屏蔽广告
- DOMAIN-KEYWORD,lianmeng,屏蔽广告
- DOMAIN-KEYWORD,omgmta,屏蔽广告
- DOMAIN-KEYWORD,openx,屏蔽广告
- DOMAIN-KEYWORD,partnerad,屏蔽广告
- DOMAIN-KEYWORD,pingfore,屏蔽广告
- DOMAIN-KEYWORD,supersonicads,屏蔽广告
- DOMAIN-KEYWORD,tracking,屏蔽广告
- DOMAIN-KEYWORD,uedas,屏蔽广告
- DOMAIN-KEYWORD,umeng,屏蔽广告
- DOMAIN-KEYWORD,usage,屏蔽广告
- DOMAIN-KEYWORD,wlmonitor,屏蔽广告
- DOMAIN-KEYWORD,zjtoolbar,屏蔽广告
# › Baidu
- DOMAIN,a.baidu.com,屏蔽广告
- DOMAIN,adm.baidu.com,屏蔽广告
- DOMAIN,als.baidu.com,屏蔽广告
- DOMAIN,api.youqian.baidu.com,屏蔽广告
- DOMAIN,as.baidu.com,屏蔽广告
- DOMAIN,ashifen.com,屏蔽广告
- DOMAIN,baidustatic.com,屏蔽广告
- DOMAIN,baidutv.baidu.com,屏蔽广告
- DOMAIN,baikebcs.bdimg.com,屏蔽广告
- DOMAIN,bar.baidu.com,屏蔽广告
- DOMAIN,bdimg.share.baidu.com,屏蔽广告
- DOMAIN,boscdn.bpc.baidu.com,屏蔽广告
- DOMAIN,c.baidu.com,屏蔽广告
- DOMAIN,cbjs.baidu.com,屏蔽广告
- DOMAIN,cjhq.baidu.com,屏蔽广告
- DOMAIN,cpro.baidu.com,屏蔽广告
- DOMAIN,cpro.tieba.baidu.com,屏蔽广告
- DOMAIN,cpro.zhidao.baidu.com,屏蔽广告
- DOMAIN,dcps.nuomi.com,屏蔽广告
- DOMAIN,drmcmm.baidu.com,屏蔽广告
- DOMAIN,e.baidu.com,屏蔽广告
- DOMAIN,eiv.baidu.com,屏蔽广告
- DOMAIN,feed.baidu.com,屏蔽广告
- DOMAIN,focusbaiduafp.allyes.com,屏蔽广告
- DOMAIN,hc.baidu.com,屏蔽广告
- DOMAIN,hm.baidu.com,屏蔽广告
- DOMAIN,hmma.baidu.com,屏蔽广告
- DOMAIN,hpd.baidu.com,屏蔽广告
- DOMAIN,idm-su.baidu.com,屏蔽广告
- DOMAIN,imageplus.baidu.com,屏蔽广告
- DOMAIN,itsdata.map.baidu.com,屏蔽广告
- DOMAIN,libs.baidu.com,屏蔽广告
- DOMAIN,log.nuomi.com,屏蔽广告
- DOMAIN,log.waimai.baidu.com,屏蔽广告
- DOMAIN,ma.baidu.com,屏蔽广告
- DOMAIN,mobads-logs.baidu.com,屏蔽广告
- DOMAIN,mobads.baidu.com,屏蔽广告
- DOMAIN,nsclick.baidu.com,屏蔽广告
- DOMAIN,qchannel01.cn,屏蔽广告
- DOMAIN,rj.baidu.com,屏蔽广告
- DOMAIN,shifen.com,屏蔽广告
- DOMAIN,spcode.baidu.com,屏蔽广告
- DOMAIN,static.map.bdimg.com,屏蔽广告
- DOMAIN,static.su.baidu.com,屏蔽广告
- DOMAIN,tk.baidu.com,屏蔽广告
- DOMAIN,tuisong.baidu.com,屏蔽广告
- DOMAIN,ucstat.baidu.com,屏蔽广告
- DOMAIN,ufosdk.baidu.com,屏蔽广告
- DOMAIN,ulog.imap.baidu.com,屏蔽广告
- DOMAIN,union.baidu.com,屏蔽广告
- DOMAIN,utility.baidu.com,屏蔽广告
- DOMAIN,utk.baidu.com,屏蔽广告
- DOMAIN,wangmeng.baidu.com,屏蔽广告
- DOMAIN,wm.baidu.com,屏蔽广告
- DOMAIN,wn.pos.baidu.com,屏蔽广告
- DOMAIN,zhanzhang.baidu.com,屏蔽广告
- DOMAIN,znsv.baidu.com,屏蔽广告
- DOMAIN,zz.bdstatic.com,屏蔽广告
# › Ali
- DOMAIN,acjs.aliyun.com,屏蔽广告
- DOMAIN,adash-c.ut.taobao.com,屏蔽广告
- DOMAIN,adash.m.taobao.com,屏蔽广告
- DOMAIN,adashbc.m.taobao.com,屏蔽广告
- DOMAIN,adashx.m.taobao.com,屏蔽广告
- DOMAIN,afp.alicdn.com,屏蔽广告
- DOMAIN,alipaylog.com,屏蔽广告
- DOMAIN,amdc.alipay.com,屏蔽广告
- DOMAIN,amdc.m.taobao.com,屏蔽广告
- DOMAIN,apoll.m.taobao.com,屏蔽广告
- DOMAIN,appdownload.alicdn.com,屏蔽广告
- DOMAIN,atanx.alicdn.com,屏蔽广告
- DOMAIN,dorangesource.alicdn.com,屏蔽广告
- DOMAIN,hydra.alibaba.com,屏蔽广告
- DOMAIN,ifs.tanx.com,屏蔽广告
- DOMAIN,m-adash.m.taobao.com,屏蔽广告
- DOMAIN,m.simaba.taobao.com,屏蔽广告
- DOMAIN,nbsdk-baichuan.alicdn.com,屏蔽广告
- DOMAIN,nbsdk-baichuan.taobao.com,屏蔽广告
- DOMAIN,pics.taobaocdn.com,屏蔽广告
- DOMAIN,show.re.taobao.com,屏蔽广告
- DOMAIN,strip.taobaocdn.com,屏蔽广告
- DOMAIN,tns.simba.taobao.com,屏蔽广告
- DOMAIN,userimg.qunar.com,屏蔽广告
- DOMAIN,yiliao.hupan.com,屏蔽广告
# › sina
- DOMAIN,ad.sina.com.cn,屏蔽广告
- DOMAIN,adm.leju.sina.com.cn,屏蔽广告
- DOMAIN,atm.sina.com,屏蔽广告
- DOMAIN,beacon.sina.com.cn,屏蔽广告
- DOMAIN,dcads.sina.com.cn,屏蔽广告
- DOMAIN,dp.im.weibo.cn,屏蔽广告
- DOMAIN,imrworldwide.com,屏蔽广告
- DOMAIN,log.weico.cc,屏蔽广告
- DOMAIN,miaozhen.com,屏蔽广告
- DOMAIN,sax.sina.cn,屏蔽广告
- DOMAIN,sax.sina.com.cn,屏蔽广告
- DOMAIN,tjs.sjs.sinajs.cn,屏蔽广告
- DOMAIN,wax.weibo.com,屏蔽广告
# › QQ
- DOMAIN,act.qq.com,屏蔽广告
- DOMAIN,adsfile.qq.com,屏蔽广告
- DOMAIN,beacon.qq.com,屏蔽广告
- DOMAIN,btrace.qq.com,屏蔽广告
- DOMAIN,bugly.qq.com,屏蔽广告
- DOMAIN,e.qq.com,屏蔽广告
- DOMAIN,gdt.qq.com,屏蔽广告
- DOMAIN,ltsdl.qq.com,屏蔽广告
- DOMAIN,monitor.uu.qq.com,屏蔽广告
- DOMAIN,mtrace.qq.com,屏蔽广告
- DOMAIN,pgdt.gtimg.cn,屏蔽广告
- DOMAIN,pingjs.qq.com,屏蔽广告
- DOMAIN,pingma.qq.com,屏蔽广告
- DOMAIN,pingtcss.qq.com,屏蔽广告
- DOMAIN,report.qq.com,屏蔽广告
- DOMAIN,routertips.video.qq.com,屏蔽广告
- DOMAIN,tajs.qq.com,屏蔽广告
- DOMAIN,tcss.qq.com,屏蔽广告
- DOMAIN,up-hl.3g.qq.com,屏蔽广告
# › 360
- DOMAIN,3600.com,屏蔽广告
- DOMAIN,adapi.shouji.360.cn,屏蔽广告
- DOMAIN,dev.tg.wan.360.cn,屏蔽广告
- DOMAIN,huodong.ios.shouji.360.cn,屏蔽广告
- DOMAIN,kuaikan.netmon.360safe.com,屏蔽广告
- DOMAIN,leak.360.cn,屏蔽广告
- DOMAIN,openbox.mobilem.360.cn,屏蔽广告
- DOMAIN,pub.se.360.cn,屏蔽广告
- DOMAIN,soft.data.weather.360.cn,屏蔽广告
- DOMAIN,stat.360safe.com,屏蔽广告
- DOMAIN,stat.m.360.cn,屏蔽广告
- DOMAIN,update.360safe.com,屏蔽广告
# › 163
- DOMAIN,adgeo.163.com,屏蔽广告
- DOMAIN,bobo.163.com,屏蔽广告
- DOMAIN,fa.163.com,屏蔽广告
- DOMAIN,g.163.com,屏蔽广告
- DOMAIN,g1.163.com,屏蔽广告
- DOMAIN,gb.corp.163.com,屏蔽广告
- DOMAIN,haitaoad.nosdn.127.net,屏蔽广告
- DOMAIN,img1.126.net,屏蔽广告
- DOMAIN,oadz.com,屏蔽广告
- DOMAIN,oimagea2.ydstatic.com,屏蔽广告
- DOMAIN,pagechoice.net,屏蔽广告
- DOMAIN,prom.gome.com.cn,屏蔽广告
- DOMAIN,rlogs.youdao.com,屏蔽广告
- DOMAIN,static.flv.uuzuonline.com,屏蔽广告
- DOMAIN,wanproxy.127.net,屏蔽广告

# ›AD Block
- DOMAIN,10up.com,屏蔽广告
- DOMAIN,111cn.net,屏蔽广告
- DOMAIN,114la.com,屏蔽广告
- DOMAIN,123.sogou.com,屏蔽广告
- DOMAIN,37wan.cn,屏蔽广告
- DOMAIN,51.la,屏蔽广告
- DOMAIN,513hch.com,屏蔽广告
- DOMAIN,51yes.com,屏蔽广告
- DOMAIN,70e.com,屏蔽广告
- DOMAIN,818mov.com,屏蔽广告
- DOMAIN,86.cc,屏蔽广告
- DOMAIN,9377.cn,屏蔽广告
- DOMAIN,9377s.com,屏蔽广告
- DOMAIN,99click.com,屏蔽广告
- DOMAIN,a.applovin.com,屏蔽广告
- DOMAIN,a.visualrevenue.com,屏蔽广告
- DOMAIN,a1.itc.cn,屏蔽广告
- DOMAIN,acs86.com,屏蔽广告
- DOMAIN,ad.12306.cn,屏蔽广告
- DOMAIN,ad.3.cn,屏蔽广告
- DOMAIN,ad.360yield.com,屏蔽广告
- DOMAIN,ad.95306.cn,屏蔽广告
- DOMAIN,ad.cctv.com,屏蔽广告
- DOMAIN,ad.flipboard.com,屏蔽广告
- DOMAIN,ad.mi.com,屏蔽广告
- DOMAIN,ad.thepaper.cn,屏蔽广告
- DOMAIN,ad.unimhk.com,屏蔽广告
- DOMAIN,ad.xiaomi.com,屏蔽广告
- DOMAIN,ad.yieldlab.net,屏蔽广告
- DOMAIN,ad.zanox.com,屏蔽广告
- DOMAIN,ad1.xiaomi.com,屏蔽广告
- DOMAIN,ad8.adfarm1.adition.com,屏蔽广告
- DOMAIN,adadvisor.net,屏蔽广告
- DOMAIN,adap.tv,屏蔽广告
- DOMAIN,adbxb.com,屏蔽广告
- DOMAIN,adchina.com,屏蔽广告
- DOMAIN,adcolony.com,屏蔽广告
- DOMAIN,adcome.cn,屏蔽广告
- DOMAIN,ader.mobi,屏蔽广告
- DOMAIN,adform.net,屏蔽广告
- DOMAIN,adfuture.cn,屏蔽广告
- DOMAIN,adinfuse.com,屏蔽广告
- DOMAIN,adjust.com,屏蔽广告
- DOMAIN,adjust.io,屏蔽广告
- DOMAIN,adlive.cn,屏蔽广告
- DOMAIN,adm.easou.com,屏蔽广告
- DOMAIN,admin5.com,屏蔽广告
- DOMAIN,admob.com,屏蔽广告
- DOMAIN,admon.cn,屏蔽广告
- DOMAIN,adnxs.com,屏蔽广告
- DOMAIN,adpolestar.net,屏蔽广告
- DOMAIN,adquan.com,屏蔽广告
- DOMAIN,ads.feedly.com,屏蔽广告
- DOMAIN,ads.genieessp.com,屏蔽广告
- DOMAIN,ads.mobclix.com,屏蔽广告
- DOMAIN,ads.newtentionassets.net,屏蔽广告
- DOMAIN,ads.nexage.com,屏蔽广告
- DOMAIN,ads.stickyadstv.com,屏蔽广告
- DOMAIN,ads.yahoo.com,屏蔽广告
- DOMAIN,adsame.com,屏蔽广告
- DOMAIN,adse.ximalaya.com,屏蔽广告
- DOMAIN,adserver.snapads.com,屏蔽广告
- DOMAIN,adsp.xunlei.com,屏蔽广告
- DOMAIN,adsunflower.com,屏蔽广告
- DOMAIN,adsunion.com,屏蔽广告
- DOMAIN,adtrk.me,屏蔽广告
- DOMAIN,adups.com,屏蔽广告
- DOMAIN,aduu.cn,屏蔽广告
- DOMAIN,advertising.com,屏蔽广告
- DOMAIN,adview.cn,屏蔽广告
- DOMAIN,advmob.cn,屏蔽广告
- DOMAIN,adwhirl.com,屏蔽广告
- DOMAIN,adwo.com,屏蔽广告
- DOMAIN,adx.tanx.com,屏蔽广告
- DOMAIN,adxmi.com,屏蔽广告
- DOMAIN,adzerk.net,屏蔽广告
- DOMAIN,ajapk.com,屏蔽广告
- DOMAIN,ak.sascdn.com,屏蔽广告
- DOMAIN,allyes.cn,屏蔽广告
- DOMAIN,allyes.com,屏蔽广告
- DOMAIN,amazon-adsystem.com,屏蔽广告
- DOMAIN,analytics.query.yahoo.com,屏蔽广告
- DOMAIN,angsrvr.com,屏蔽广告
- DOMAIN,anquan.org,屏蔽广告
- DOMAIN,anysdk.com,屏蔽广告
- DOMAIN,aoodoo.feng.com,屏蔽广告
- DOMAIN,api.branch.io,屏蔽广告
- DOMAIN,api.mobula.sdk.duapps.com,屏蔽广告
- DOMAIN,api.similarweb.com,屏蔽广告
- DOMAIN,api.talkingdata.com,屏蔽广告
- DOMAIN,api.userstyles.org,屏蔽广告
- DOMAIN,app-measurement.com,屏蔽广告
- DOMAIN,appadhoc.com,屏蔽广告
- DOMAIN,appads.com,屏蔽广告
- DOMAIN,appboy.com,屏蔽广告
- DOMAIN,applifier.com,屏蔽广告
- DOMAIN,applovin.com,屏蔽广告
- DOMAIN,appsflyer.com,屏蔽广告
- DOMAIN,atdmt.com,屏蔽广告
- DOMAIN,audience.network,屏蔽广告
- DOMAIN,baifendian.com,屏蔽广告
- DOMAIN,bam.nr-data.net,屏蔽广告
- DOMAIN,bat.bing.com,屏蔽广告
- DOMAIN,baycode.cn,屏蔽广告
- DOMAIN,beacon.krxd.net,屏蔽广告
- DOMAIN,beacon.tingyun.com,屏蔽广告
- DOMAIN,behe.com,屏蔽广告
- DOMAIN,biddingx.com,屏蔽广告
- DOMAIN,bsdev.cn,屏蔽广告
- DOMAIN,btyou.com,屏蔽广告
- DOMAIN,buysellads.com,屏蔽广告
- DOMAIN,c.metrigo.com,屏蔽广告
- DOMAIN,c0563.com,屏蔽广告
- DOMAIN,cchfjz.com,屏蔽广告
- DOMAIN,cdn.jiuzhilan.com,屏蔽广告
- DOMAIN,chance-ad.com,屏蔽广告
- DOMAIN,chartbeat.com,屏蔽广告
- DOMAIN,chartboost.com,屏蔽广告
- DOMAIN,chmae.com,屏蔽广告
- DOMAIN,clicktracks.com,屏蔽广告
- DOMAIN,clickzs.com,屏蔽广告
- DOMAIN,cloudmobi.net,屏蔽广告
- DOMAIN,cmcore.com,屏蔽广告
- DOMAIN,cnzz.com,屏蔽广告
- DOMAIN,cnzzlink.com,屏蔽广告
- DOMAIN,collector.githubapp.com,屏蔽广告
- DOMAIN,combine.urbanairship.com,屏蔽广告
- DOMAIN,config.ioam.de,屏蔽广告
- DOMAIN,config2.mparticle.com,屏蔽广告
- DOMAIN,coremetrics.com,屏蔽广告
- DOMAIN,cps.360buy.com,屏蔽广告
- DOMAIN,crunchyroll.com,屏蔽广告
- DOMAIN,csi.gstatic.com,屏蔽广告
- DOMAIN,customer-security.online,屏蔽广告
- DOMAIN,cxaerp.com,屏蔽广告
- DOMAIN,czxiangyue.com,屏蔽广告
- DOMAIN,d.applovin.com,屏蔽广告
- DOMAIN,d.ligatus.com,屏蔽广告
- DOMAIN,ddapp.cn,屏蔽广告
- DOMAIN,de.ioam.de,屏蔽广告
- DOMAIN,dianru.com,屏蔽广告
- DOMAIN,dis.crieto.com,屏蔽广告
- DOMAIN,disqusads.com,屏蔽广告
- DOMAIN,doubleclick.net,屏蔽广告
- DOMAIN,doubleverify.com,屏蔽广告
- DOMAIN,drdwy.com,屏蔽广告
- DOMAIN,dsp.youdao.com,屏蔽广告
- DOMAIN,duanat.com,屏蔽广告
- DOMAIN,duapp.com,屏蔽广告
- DOMAIN,e.nexac.com,屏蔽广告
- DOMAIN,e701.net,屏蔽广告
- DOMAIN,edigitalsurvey.com,屏蔽广告
- DOMAIN,emarbox.com,屏蔽广告
- DOMAIN,exp.17wo.cn,屏蔽广告
- DOMAIN,fancyapi.com,屏蔽广告
- DOMAIN,farm.plista.com,屏蔽广告
- DOMAIN,fastapi.net,屏蔽广告
- DOMAIN,fastclick.net,屏蔽广告
- DOMAIN,fastly.bench.cedexis.com,屏蔽广告
- DOMAIN,fd7c.com,屏蔽广告
- DOMAIN,fengbuy.com,屏蔽广告
- DOMAIN,ffychb.com,屏蔽广告
- DOMAIN,fjzdmy.com,屏蔽广告
- DOMAIN,flashtalking.com,屏蔽广告
- DOMAIN,flurry.com,屏蔽广告
- DOMAIN,fqtra.com,屏蔽广告
- DOMAIN,fzxrjx.com,屏蔽广告
- DOMAIN,gdsc168.com,屏蔽广告
- DOMAIN,gg1028.com,屏蔽广告
- DOMAIN,glispa.com,屏蔽广告
- DOMAIN,go-mpulse,屏蔽广告
- DOMAIN,growingio.com,屏蔽广告
- DOMAIN,guohead.com,屏蔽广告
- DOMAIN,guomob.com,屏蔽广告
- DOMAIN,haoghost.com,屏蔽广告
- DOMAIN,haohaowan8.com,屏蔽广告
- DOMAIN,he2d.com,屏蔽广告
- DOMAIN,hnxxjn.com,屏蔽广告
- DOMAIN,hosting.miarroba.info,屏蔽广告
- DOMAIN,hxspc.com,屏蔽广告
- DOMAIN,iadsdk.apple.com,屏蔽广告
- DOMAIN,ih.adscale.de,屏蔽广告
- DOMAIN,image.gentags.com,屏蔽广告
- DOMAIN,immob.cn,屏蔽广告
- DOMAIN,inmobi.com,屏蔽广告
- DOMAIN,inmobicdn.net,屏蔽广告
- DOMAIN,instabug.com,屏蔽广告
- DOMAIN,intely.cn,屏蔽广告
- DOMAIN,iperceptions.com,屏蔽广告
- DOMAIN,ipinyou.com,屏蔽广告
- DOMAIN,irs01.com,屏蔽广告
- DOMAIN,irs01.net,屏蔽广告
- DOMAIN,irs09.com,屏蔽广告
- DOMAIN,istreamsche.com,屏蔽广告
- DOMAIN,jbcbuy.com,屏蔽广告
- DOMAIN,jdcbuy.com,屏蔽广告
- DOMAIN,jisucn.com,屏蔽广告
- DOMAIN,jmgehn.cn,屏蔽广告
- DOMAIN,js-agent.newrelic.com,屏蔽广告
- DOMAIN,jusha.com,屏蔽广告
- DOMAIN,jzm81.com,屏蔽广告
- DOMAIN,kaquansc.com,屏蔽广告
- DOMAIN,kejet.net,屏蔽广告
- DOMAIN,kmd365.com,屏蔽广告
- DOMAIN,krux.net,屏蔽广告
- DOMAIN,linkeye.ximalaya.com,屏蔽广告
- DOMAIN,lnk8z.com,屏蔽广告
- DOMAIN,localytics.com,屏蔽广告
- DOMAIN,location.ximalaya.com,屏蔽广告
- DOMAIN,log.outbrain.com,屏蔽广告
- DOMAIN,log.umsns.com,屏蔽广告
- DOMAIN,logs.dashlane.com,屏蔽广告
- DOMAIN,lotuseed.com,屏蔽广告
- DOMAIN,lufax.com,屏蔽广告
- DOMAIN,madmini.com,屏蔽广告
- DOMAIN,mads.amazon.com,屏蔽广告
- DOMAIN,mathtag.com,屏蔽广告
- DOMAIN,mediav.com,屏蔽广告
- DOMAIN,megajoy.com,屏蔽广告
- DOMAIN,miidi.net,屏蔽广告
- DOMAIN,mixpanel.com,屏蔽广告
- DOMAIN,mng-ads.com,屏蔽广告
- DOMAIN,mnxtu.com,屏蔽广告
- DOMAIN,moatads.com,屏蔽广告
- DOMAIN,mob.com,屏蔽广告
- DOMAIN,mobclix.com,屏蔽广告
- DOMAIN,mobfox.com,屏蔽广告
- DOMAIN,mobileads.msn.com,屏蔽广告
- DOMAIN,mobileapptracking.com,屏蔽广告
- DOMAIN,mobisage.cn,屏蔽广告
- DOMAIN,mobtop1.com,屏蔽广告
- DOMAIN,mopub.com,屏蔽广告
- DOMAIN,mxpnl.com,屏蔽广告
- DOMAIN,myhug.cn,屏蔽广告
- DOMAIN,n.cosbot.cn,屏蔽广告
- DOMAIN,nchte.com,屏蔽广告
- DOMAIN,networkbench.com,屏蔽广告
- DOMAIN,newrelic.com,屏蔽广告
- DOMAIN,ntalker.com,屏蔽广告
- DOMAIN,ntjacb.com,屏蔽广告
- DOMAIN,ntpddq.com,屏蔽广告
- DOMAIN,nylalobghyhirgh.com,屏蔽广告
- DOMAIN,o2omobi.com,屏蔽广告
- DOMAIN,oneapm.com,屏蔽广告
- DOMAIN,optaim.com,屏蔽广告
- DOMAIN,optimix.asia,屏蔽广告
- DOMAIN,optimizely.com,屏蔽广告
- DOMAIN,overture.com,屏蔽广告
- DOMAIN,page.amap.com,屏蔽广告
- DOMAIN,pb.sogou.com,屏蔽广告
- DOMAIN,picture.duokan.com,屏蔽广告
- DOMAIN,pingdom.net,屏蔽广告
- DOMAIN,pingshetrip.com,屏蔽广告
- DOMAIN,pixel.rubiconproject.com,屏蔽广告
- DOMAIN,pixel.wp.com,屏蔽广告
- DOMAIN,ppjia55.com,屏蔽广告
- DOMAIN,probes.cedexis.com,屏蔽广告
- DOMAIN,prophet.heise.de,屏蔽广告
- DOMAIN,publicidad.net,屏蔽广告
- DOMAIN,publicidad.tv,屏蔽广告
- DOMAIN,pubnub.com,屏蔽广告
- DOMAIN,push.wandoujia.com,屏蔽广告
- DOMAIN,qcl777.com,屏蔽广告
- DOMAIN,qhuade.com,屏蔽广告
- DOMAIN,qiyou.com,屏蔽广告
- DOMAIN,qtmojo.com,屏蔽广告
- DOMAIN,quantcount.com,屏蔽广告
- DOMAIN,quantserve.com,屏蔽广告
- DOMAIN,qxxys.com,屏蔽广告
- DOMAIN,radar.cedexis.com,屏蔽广告
- DOMAIN,reachmax.cn,屏蔽广告
- DOMAIN,realtime.monitor.ppweb.com.cn,屏蔽广告
- DOMAIN,resetgey.com,屏蔽广告
- DOMAIN,responsys.net,屏蔽广告
- DOMAIN,revsci.net,屏蔽广告
- DOMAIN,rlcdn.com,屏蔽广告
- DOMAIN,router.bittorrent.com,屏蔽广告
- DOMAIN,rt.applovin.com,屏蔽广告
- DOMAIN,rtb.eanalyzer.de,屏蔽广告
- DOMAIN,rtb.metrigo.com,屏蔽广告
- DOMAIN,rts.mobula.sdk.duapps.com,屏蔽广告
- DOMAIN,sanya1.com,屏蔽广告
- DOMAIN,scorecardresearch.com,屏蔽广告
- DOMAIN,serving-sys.com,屏蔽广告
- DOMAIN,shentus.com,屏蔽广告
- DOMAIN,shuiguo.com,屏蔽广告
- DOMAIN,simaba.taobao.com,屏蔽广告
- DOMAIN,sitemeter.com,屏蔽广告
- DOMAIN,sitescout.com,屏蔽广告
- DOMAIN,smartadserver.com,屏蔽广告
- DOMAIN,smartmad.com,屏蔽广告
- DOMAIN,somecoding.com,屏蔽广告
- DOMAIN,spade.twitch.tv,屏蔽广告
- DOMAIN,sponsorpay.com,屏蔽广告
- DOMAIN,ssp.kssws.ks-cdn.com,屏蔽广告
- DOMAIN,stat.m.jd.com,屏蔽广告
- DOMAIN,static-xl9-ssl.xunlei.com,屏蔽广告
- DOMAIN,static.plista.com,屏蔽广告
- DOMAIN,stats.chinaz.com,屏蔽广告
- DOMAIN,stats.developingperspective.com,屏蔽广告
- DOMAIN,stats.jpush.cn,屏蔽广告
- DOMAIN,stats.magicwindow.cn,屏蔽广告
- DOMAIN,sugar.zhihu.com,屏蔽广告
- DOMAIN,switchadhub.com,屏蔽广告
- DOMAIN,sycbbs.com,屏蔽广告
- DOMAIN,synacast.com,屏蔽广告
- DOMAIN,sysdig.com,屏蔽广告
- DOMAIN,szddst.com,屏蔽广告
- DOMAIN,t.appsflyer.com,屏蔽广告
- DOMAIN,t1.visualrevenue.com,屏蔽广告
- DOMAIN,tag.yoc-adserver.com,屏蔽广告
- DOMAIN,tapjoyads.com,屏蔽广告
- DOMAIN,tedagz.com,屏蔽广告
- DOMAIN,th7.cn,屏蔽广告
- DOMAIN,tiangoutai.com,屏蔽广告
- DOMAIN,tiqcdn.com,屏蔽广告
- DOMAIN,tjlog.easou.com,屏蔽广告
- DOMAIN,tjlog.ps.easou.com,屏蔽广告
- DOMAIN,tongbu.com,屏蔽广告
- DOMAIN,tracker.yhd.com,屏蔽广告
- DOMAIN,trafficmp.com,屏蔽广告
- DOMAIN,twcczhu.com,屏蔽广告
- DOMAIN,uerzyr.cn,屏蔽广告
- DOMAIN,ugvip.com,屏蔽广告
- DOMAIN,ukeiae.com,屏蔽广告
- DOMAIN,umtrack.com,屏蔽广告
- DOMAIN,unimhk.com,屏蔽广告
- DOMAIN,union.youdao.com,屏蔽广告
- DOMAIN,unlitui.com,屏蔽广告
- DOMAIN,uri6.com,屏蔽广告
- DOMAIN,ushaqi.com,屏蔽广告
- DOMAIN,uyunad.com,屏蔽广告
- DOMAIN,vamaker.com,屏蔽广告
- DOMAIN,video.plista.com,屏蔽广告
- DOMAIN,vpon.com,屏蔽广告
- DOMAIN,wanfeng1.com,屏蔽广告
- DOMAIN,waps.cn,屏蔽广告
- DOMAIN,whpxy.com,屏蔽广告
- DOMAIN,whzhi.com,屏蔽广告
- DOMAIN,wiyun.com,屏蔽广告
- DOMAIN,wooboo.com.cn,屏蔽广告
- DOMAIN,wqmobile.com,屏蔽广告
- DOMAIN,wrating.com,屏蔽广告
- DOMAIN,x.jd.com,屏蔽广告
- DOMAIN,x.ligatus.com,屏蔽广告
- DOMAIN,xdbwc.com,屏蔽广告
- DOMAIN,xdcs-collector.ximalaya.com,屏蔽广告
- DOMAIN,xiaozhen.com,屏蔽广告
- DOMAIN,xibao100.com,屏蔽广告
- DOMAIN,xmpush.xiaomi.com,屏蔽广告
- DOMAIN,xmrts.com,屏蔽广告
- DOMAIN,xy.com,屏蔽广告
- DOMAIN,xyrkl.com,屏蔽广告
- DOMAIN,yandui.com,屏蔽广告
- DOMAIN,yes1.feng.com,屏蔽广告
- DOMAIN,yigao.com,屏蔽广告
- DOMAIN,yigyx.com,屏蔽广告
- DOMAIN,yiqifa.com,屏蔽广告
- DOMAIN,yooli.com,屏蔽广告
- DOMAIN,youle55.com,屏蔽广告
- DOMAIN,youmi.net,屏蔽广告
- DOMAIN,yrxgny.com,屏蔽广告
- DOMAIN,yrxmr.com,屏蔽广告
- DOMAIN,ysjwj.com,屏蔽广告
- DOMAIN,yunjiasu.com,屏蔽广告
- DOMAIN,zantainet.com,屏蔽广告
- DOMAIN,zhihu-web-analytics.zhihu.com,屏蔽广告
- DOMAIN,zhiziyun.com,屏蔽广告
- DOMAIN,zhstatic.zhihu.com,屏蔽广告
- DOMAIN,zhuanfakong.com,屏蔽广告
- DOMAIN,zjuwjdc.com,屏蔽广告
- DOMAIN,zzsx8.com,屏蔽广告
- DOMAIN,szkdst.com,屏蔽广告
- DOMAIN,cwpush.com,屏蔽广告
- DOMAIN,wvver.com,屏蔽广告
- DOMAIN,vq6nsu.cn,屏蔽广告
- DOMAIN,ourlj.com,屏蔽广告
- DOMAIN,zgjkv.com,屏蔽广告
- DOMAIN,v02u9.cn,屏蔽广告
- DOMAIN,xiongdong.com,屏蔽广告
- DOMAIN,519397.com,屏蔽广告
- DOMAIN,twh5.com,屏蔽广告


# ›iqiyi
- DOMAIN,a.ckm.iqiyi.com,屏蔽广告
- DOMAIN,ad.m.iqiyi.com,屏蔽广告
- DOMAIN,afp.iqiyi.com,屏蔽广告
- DOMAIN,c.uaa.iqiyi.com,屏蔽广告
- DOMAIN,cloudpush.iqiyi.com,屏蔽广告
- DOMAIN,cm.passport.iqiyi.com,屏蔽广告
- DOMAIN,cupid.iqiyi.com,屏蔽广告
- DOMAIN,emoticon.sns.iqiyi.com,屏蔽广告
- DOMAIN,gamecenter.iqiyi.com,屏蔽广告
- DOMAIN,hotchat-im.iqiyi.com,屏蔽广告
- DOMAIN,ifacelog.iqiyi.com,屏蔽广告
- DOMAIN,mbdlog.iqiyi.com,屏蔽广告
- DOMAIN,msg.71.am,屏蔽广告
- DOMAIN,msg.video.qiyi.com,屏蔽广告
- DOMAIN,msg2.video.qiyi.com,屏蔽广告
- DOMAIN,policy.video.iqiyi.com,屏蔽广告
- DOMAIN,yuedu.iqiyi.com,屏蔽广告
- IP-CIDR,101.227.200.0/24,屏蔽广告 
- IP-CIDR,101.227.200.11/32,屏蔽广告 
- IP-CIDR,101.227.200.28/32,屏蔽广告 
- IP-CIDR,101.227.97.240/32,屏蔽广告 
- IP-CIDR,124.192.153.42/32,屏蔽广告 

# ›Hunan TV
- DOMAIN,click.hunantv.com,屏蔽广告
- DOMAIN,da.hunantv.com,屏蔽广告
- DOMAIN,da.mgtv.com,屏蔽广告
- DOMAIN,log.hunantv.com,屏蔽广告
- DOMAIN,log.v2.hunantv.com,屏蔽广告
- DOMAIN,res.hunantv.com,屏蔽广告
- DOMAIN,v2.log.hunantv.com,屏蔽广告

# ›Youku
- DOMAIN,actives.youku.com,屏蔽广告
- DOMAIN,ad.api.3g.youku.com,屏蔽广告
- DOMAIN,ad.api.mobile.youku.com,屏蔽广告
- DOMAIN,ad.mobile.youku.com,屏蔽广告
- DOMAIN,a-dxk.play.api.3g.youku.com,屏蔽广告
- DOMAIN,b.smartvideo.youku.com,屏蔽广告
- DOMAIN,c.yes.youku.com,屏蔽广告
- DOMAIN,das.api.youku.com,屏蔽广告
- DOMAIN,das.mobile.youku.com,屏蔽广告
- DOMAIN,dev-push.m.youku.com,屏蔽广告
- DOMAIN,dl.g.youku.com,屏蔽广告
- DOMAIN,dmapp.youku.com,屏蔽广告
- DOMAIN,e.stat.ykimg.com,屏蔽广告
- DOMAIN,gamex.mobile.youku.com,屏蔽广告
- DOMAIN,hudong.pl.youku.com,屏蔽广告
- DOMAIN,huodong.pl.youku.com,屏蔽广告
- DOMAIN,huodong.vip.youku.com,屏蔽广告
- DOMAIN,hz.youku.com,屏蔽广告
- DOMAIN,iyes.youku.com,屏蔽广告
- DOMAIN,l.ykimg.com,屏蔽广告
- DOMAIN,lstat.youku.com,屏蔽广告
- DOMAIN,mobilemsg.youku.com,屏蔽广告
- DOMAIN,msg.youku.com,屏蔽广告
- DOMAIN,myes.youku.com,屏蔽广告
- DOMAIN,p.l.youku.com,屏蔽广告
- DOMAIN,passport-log.youku.com,屏蔽广告
- DOMAIN,p-log.ykimg.com,屏蔽广告
- DOMAIN,push.m.youku.com,屏蔽广告
- DOMAIN,r.l.youku.com,屏蔽广告
- DOMAIN,s.p.youku.com,屏蔽广告
- DOMAIN,sdk.m.youku.com,屏蔽广告
- DOMAIN,stat.youku.com,屏蔽广告
- DOMAIN,store.tv.api.3g.youku.com,屏蔽广告
- DOMAIN,store.xl.api.3g.youku.com,屏蔽广告
- DOMAIN,tdrec.youku.com,屏蔽广告
- DOMAIN,test.ott.youku.com,屏蔽广告
- DOMAIN,v.l.youku.com,屏蔽广告
- DOMAIN,val.api.youku.com,屏蔽广告
- DOMAIN,wan.youku.com,屏蔽广告
- DOMAIN,ykatr.youku.com,屏蔽广告
- DOMAIN,ykrec.youku.com,屏蔽广告
- IP-CIDR,117.177.248.17/32,屏蔽广告 
- IP-CIDR,117.177.248.41/32,屏蔽广告 
- IP-CIDR,223.87.176.139/32,屏蔽广告 
- IP-CIDR,223.87.176.176/32,屏蔽广告 
- IP-CIDR,223.87.177.180/32,屏蔽广告 
- IP-CIDR,223.87.177.182/32,屏蔽广告 
- IP-CIDR,223.87.177.184/32,屏蔽广告 
- IP-CIDR,223.87.177.43/32,屏蔽广告 
- IP-CIDR,223.87.177.47/32,屏蔽广告 
- IP-CIDR,223.87.177.80/32,屏蔽广告 
- IP-CIDR,223.87.182.101/32,屏蔽广告 
- IP-CIDR,223.87.182.102/32,屏蔽广告 
- IP-CIDR,223.87.182.11/32,屏蔽广告 
- IP-CIDR,223.87.182.52/32,屏蔽广告 

# ›Letv
- DOMAIN,api.game.letvstore.com,屏蔽广告
- DOMAIN,ark.letv.com,屏蔽广告
- DOMAIN,dc.letv.com,屏蔽广告
- DOMAIN,fz.letv.com,屏蔽广告
- DOMAIN,g3.letv.com,屏蔽广告
- DOMAIN,minisite.letv.com,屏蔽广告
- DOMAIN,msg.m.letv.com,屏蔽广告
- DOMAIN,n.mark.letv.com,屏蔽广告
- DOMAIN,pro.hoye.letv.com,屏蔽广告
- DOMAIN,pro.letv.com,屏蔽广告
- DOMAIN,stat.letv.com,屏蔽广告
- DOMAIN,static.app.m.letv.com,屏蔽广告
- DOMAIN,webp2p.letv.com,屏蔽广告


# ›Sohu
- DOMAIN,adnet.sohu.com,屏蔽广告
- DOMAIN,ads.sohu.com,屏蔽广告
- DOMAIN,aty.sohu.com,屏蔽广告
- DOMAIN,data.vod.itc.cn,屏蔽广告
- DOMAIN,epro.sogou.com,屏蔽广告
- DOMAIN,go.sohu.com,屏蔽广告
- DOMAIN,golden1.sogou.com,屏蔽广告
- DOMAIN,imp.optaim.com,屏蔽广告
- DOMAIN,inte.sogou.com,屏蔽广告
- DOMAIN,inte.sogoucdn.com,屏蔽广告
- DOMAIN,lu.sogoucdn.com,屏蔽广告
- DOMAIN,theta.sogoucdn.com,屏蔽广告
- DOMAIN,uranus.sogou.com,屏蔽广告
- DOMAIN,v2.reachmax.cn,屏蔽广告

# ›PPTV
- DOMAIN,ads.aplus.pptv.com,屏蔽广告
- DOMAIN,afp.pplive.com,屏蔽广告
- DOMAIN,asimgs.pplive.cn,屏蔽广告
- DOMAIN,de.as.pptv.com,屏蔽广告
- DOMAIN,jp.as.pptv.com,屏蔽广告
- DOMAIN,pp2.pptv.com,屏蔽广告
- DOMAIN,stat.pptv.com,屏蔽广告

# ›Site
- DOMAIN,deliver.ifeng.com,屏蔽广告
- DOMAIN,hxjs.tool.hexun.com,屏蔽广告
- DOMAIN,hxsame.hexun.com,屏蔽广告
- DOMAIN,itv.hexun.com,屏蔽广告

# ›Vod
- DOMAIN,ad.cmvideo.cn,屏蔽广告
- DOMAIN,atm.cp31.ott.cibntv.net,屏蔽广告
- DOMAIN,aty.cp45.ott.cibntv.net,屏蔽广告
- DOMAIN,aty.sohu.com,屏蔽广告
- DOMAIN,cpm.cm.kankan.com,屏蔽广告
- DOMAIN,float.kankan.com,屏蔽广告
- DOMAIN,houyi.baofeng.net,屏蔽广告
- DOMAIN,iadctest.qwapi.com,屏蔽广告
- DOMAIN,log.moviebox.baofeng.com,屏蔽广告
- DOMAIN,logger.baofeng.com,屏蔽广告

# ›Other
- DOMAIN,ad.video.51togic.com,屏蔽广告
- DOMAIN,ads.cdn.tvb.com,屏蔽广告
- DOMAIN,biz5.kankan.com,屏蔽广告
- DOMAIN,c.algovid.com,屏蔽广告
- DOMAIN,cms.laifeng.com,屏蔽广告
- DOMAIN,da.mmarket.com,屏蔽广告
- DOMAIN,data.vod.itc.cn,屏蔽广告
- DOMAIN,dotcounter.douyutv.com,屏蔽广告
- DOMAIN,g.uusee.com,屏蔽广告
- DOMAIN,game.pps.tv,屏蔽广告
- DOMAIN,gcdn.2mdn.net,屏蔽广告
- DOMAIN,gentags.net,屏蔽广告
- DOMAIN,gg.jtertp.com,屏蔽广告
- DOMAIN,gug.ku6cdn.com,屏蔽广告
- DOMAIN,hp.smiler-ad.com,屏蔽广告
- DOMAIN,kooyum.com,屏蔽广告
- DOMAIN,ld.kuaigames.com,屏蔽广告
- DOMAIN,logstat.t.sfht.com,屏蔽广告
- DOMAIN,match.rtbidder.net,屏蔽广告
- DOMAIN,mixer.cupid.ptqy.gitv.tv,屏蔽广告
- DOMAIN,msg.c002.ottcn.com,屏蔽广告
- DOMAIN,msga.ptqy.gitv.tv,屏蔽广告
- DOMAIN,njwxh.com,屏蔽广告
- DOMAIN,nl.rcd.ptqy.gitv.tv,屏蔽广告
- DOMAIN,n-st.vip.com,屏蔽广告
- DOMAIN,pb.bi.gitv.tv,屏蔽广告
- DOMAIN,pop.uusee.com,屏蔽广告
- DOMAIN,pq.stat.ku6.com,屏蔽广告
- DOMAIN,rd.kuaigames.com,屏蔽广告
- DOMAIN,shizen-no-megumi.com,屏蔽广告
- DOMAIN,shrek.6.cn,屏蔽广告
- DOMAIN,simba.6.cn,屏蔽广告
- DOMAIN,st.vq.ku6.cn,屏蔽广告
- DOMAIN,statcounter.com,屏蔽广告
- DOMAIN,static.duoshuo.com,屏蔽广告
- DOMAIN,static.g.ppstream.com,屏蔽广告
- DOMAIN,static.ku6.com,屏蔽广告
- DOMAIN,static8.pmadx.com,屏蔽广告
- DOMAIN,store.ptqy.gitv.tv,屏蔽广告
- DOMAIN,t7z.cupid.ptqy.gitv.tv,屏蔽广告
- DOMAIN,traffic.uusee.com,屏蔽广告
- DOMAIN,union.6.cn,屏蔽广告
- DOMAIN,wa.gtimg.com,屏蔽广告
- DOMAIN,bfshan.cn,屏蔽广告
# (Domestic)
# > 愛奇藝台灣站
- DOMAIN-SUFFIX,iqiyi.com,Domestic
- DOMAIN-SUFFIX,71.am,Domestic
# > bilibili
- DOMAIN-KEYWORD,bilibili,Domestic
- DOMAIN-SUFFIX,bilibili.com,Domestic
- DOMAIN,upos-hz-mirrorakam.akamaized.net,Domestic
- DOMAIN-SUFFIX,acgvideo.com,Domestic
- DOMAIN-SUFFIX,biliapi.com,Domestic
- DOMAIN-SUFFIX,biliapi.net,Domestic
- DOMAIN-SUFFIX,bilibili.com,Domestic
- DOMAIN-SUFFIX,bilibili.tv,Domestic
- DOMAIN-SUFFIX,hdslb.com,Domestic
# USER-AGENT,All4*,Global_media
- DOMAIN-SUFFIX,c4assets.com,Global_media
- DOMAIN-SUFFIX,channel4.com,Global_media
# > AbemaTV
# USER-AGENT,AbemaTV*,Global_media
- DOMAIN-SUFFIX,abema.io,Global_media
- DOMAIN-SUFFIX,ameba.jp,Global_media
- DOMAIN-SUFFIX,hayabusa.io,Global_media
- DOMAIN,abematv.akamaized.net,Global_media
- DOMAIN,ds-linear-abematv.akamaized.net,Global_media
- DOMAIN,ds-vod-abematv.akamaized.net,Global_media
- DOMAIN,linear-abematv.akamaized.net,Global_media
# > Amazon Prime Video
# USER-AGENT,InstantVideo.US*,美区影视
# USER-AGENT,Prime%20Video*,美区影视
- DOMAIN-SUFFIX,primevideo.com,美区影视
# > Bahamut
# USER-AGENT,Anime*,动画疯
- DOMAIN-SUFFIX,bahamut.com.tw,动画疯
- DOMAIN-SUFFIX,gamer.com.tw,动画疯
- DOMAIN,gamer-cds.cdn.hinet.net,动画疯
- DOMAIN,gamer2-cds.cdn.hinet.net,动画疯
# > BBC iPlayer
# USER-AGENT,BBCiPlayer*,Global_media
- DOMAIN-SUFFIX,bbc.co.uk,Global_media
- DOMAIN-SUFFIX,bbci.co.uk,Global_media
- DOMAIN-KEYWORD,bbcfmt,Global_media
- DOMAIN-KEYWORD,uk-live,Global_media
# > DAZN
- DOMAIN-SUFFIX,dazn.com,Global_media
# > encoreTVB
# USER-AGENT,encoreTVB*,Global_media
- DOMAIN-SUFFIX,encoretvb.com,Global_media
- DOMAIN,content.jwplatform.com,Global_media
- DOMAIN,videos-f.jwpsrv.com,Global_media
# > Fox+ & Fox Now
# USER-AGENT,FOX%20NOW*,fox+
# USER-AGENT,FOXPlus*,fox+
- DOMAIN-SUFFIX,dashasiafox.akamaized.net,fox+
- DOMAIN-SUFFIX,fox.com,fox+
- DOMAIN-SUFFIX,foxdcg.com,fox+
- DOMAIN-SUFFIX,foxplus.com,fox+
- DOMAIN-SUFFIX,staticasiafox.akamaized.net,fox+
- DOMAIN-SUFFIX,theplatform.com,fox+
- DOMAIN-SUFFIX,uplynk.com,fox+
# > HBO Now & HBO GO
# USER-AGENT,HBO%20NOW*,美区影视
# USER-AGENT,HBO%20GO*,美区影视
# USER-AGENT,HBOAsia*,美区影视
- DOMAIN-SUFFIX,hbo.com,美区影视
- DOMAIN-SUFFIX,hbogo.com,美区影视
- DOMAIN-SUFFIX,hboasia.com,美区影视
- DOMAIN-SUFFIX,hbogo.com,美区影视
- DOMAIN-SUFFIX,hbogoasia.hk,美区影视
- DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com,美区影视
- DOMAIN,bcbolthboa-a.akamaihd.net,美区影视
- DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net,美区影视
- DOMAIN,manifest.prod.boltdns.net,美区影视
- DOMAIN,s3-ap-southeast-1.amazonaws.com,美区影视
# > Hulu
- DOMAIN-SUFFIX,hulu.com,美区影视
- DOMAIN-SUFFIX,huluim.com,美区影视
- DOMAIN-SUFFIX,hulustream.com,美区影视
# > KKTV
# USER-AGENT,KKTV*,Global_media
# USER-AGENT,com.kktv.ios.kktv*,Global_media
- DOMAIN-SUFFIX,kktv.com.tw,Global_media
- DOMAIN-SUFFIX,kktv.me,Global_media
- DOMAIN,kktv-theater.kk.stream,Global_media
# > Line TV
# USER-AGENT,LINE%20TV*,Global_media
- DOMAIN-SUFFIX,linetv.tw,Global_media
- DOMAIN,d3c7rimkq79yfu.cloudfront.net,Global_media
# > Hulu(フールー)
- DOMAIN-SUFFIX,happyon.jp,Global_media
- DOMAIN-SUFFIX,hulu.jp,Global_media
# > LiTV
- DOMAIN-SUFFIX,litv.tv,Global_media
- DOMAIN,litvfreemobile-hichannel.cdn.hinet.net,Global_media
# > My5
# USER-AGENT,My5*,GlobalMedia
- DOMAIN-SUFFIX,channel5.com,Global_media
- DOMAIN-SUFFIX,my5.tv,Global_media
- DOMAIN,d349g9zuie06uo.cloudfront.net,Global_media
# > myTV_SUPER
# USER-AGENT,mytv*,Global_media
- DOMAIN-SUFFIX,mytvsuper.com,Global_media
- DOMAIN-SUFFIX,tvb.com,Global_media
# > Netflix
# USER-AGENT,Argo*,netflix
- DOMAIN-SUFFIX,netflix.com,netflix
- DOMAIN-SUFFIX,netflix.net,netflix
- DOMAIN-SUFFIX,nflxext.com,netflix
- DOMAIN-SUFFIX,nflximg.com,netflix
- DOMAIN-SUFFIX,nflximg.net,netflix
- DOMAIN-SUFFIX,nflxso.net,netflix
- DOMAIN-SUFFIX,nflxvideo.net,netflix
- IP-CIDR,23.246.0.0/18,netflix
- IP-CIDR,37.77.184.0/21,netflix
- IP-CIDR,45.57.0.0/17,netflix
- IP-CIDR,64.120.128.0/17,netflix
- IP-CIDR,66.197.128.0/17,netflix
- IP-CIDR,108.175.32.0/20,netflix
- IP-CIDR,192.173.64.0/18,netflix
- IP-CIDR,198.38.96.0/19,netflix
- IP-CIDR,198.45.48.0/20,netflix
# > niconico
- DOMAIN-SUFFIX,dmc.nico,Global_media
- DOMAIN-SUFFIX,nicovideo.jp,Global_media
- DOMAIN-SUFFIX,nimg.jp,Global_media
- DOMAIN-SUFFIX,socdm.com,Global_media
# > PBS
# USER-AGENT,PBS*,Global_media
- DOMAIN-SUFFIX,pbs.org,Global_media
# > Pornhub
- DOMAIN-SUFFIX,phncdn.com,Global_media
- DOMAIN-SUFFIX,pornhub.com,Global_media
# > Twitch
- DOMAIN-SUFFIX,twitch.tv,Global_media
- DOMAIN-SUFFIX,twitchcdn.net,Global_media
- DOMAIN-SUFFIX,ttvnw.net,Global_media
# > Viu(TV)
# USER-AGENT,Viu*,Global_media
# USER-AGENT,ViuTV*,Global_media
- DOMAIN-SUFFIX,viu.com,Global_media
- DOMAIN-SUFFIX,viu.tv,Global_media
- DOMAIN,api.viu.now.com,Global_media
- DOMAIN,d1k2us671qcoau.cloudfront.net,Global_media
- DOMAIN,d2anahhhmp1ffz.cloudfront.net,Global_media
- DOMAIN,dfp6rglgjqszk.cloudfront.net,Global_media
# > Youtube
# USER-AGENT,com.google.ios.youtube*,google
# USER-AGENT,YouTube*,google
- DOMAIN-SUFFIX,googlevideo.com,google
- DOMAIN-SUFFIX,youtube.com,google
- DOMAIN,youtubei.googleapis.com,google

# (Music)
# > Deezer
# USER-AGENT,Deezer*,Global_media
- DOMAIN-SUFFIX,deezer.com,Global_media
- DOMAIN-SUFFIX,dzcdn.net,Global_media
# > KKBOX
- DOMAIN-SUFFIX,kkbox.com,Global_media
- DOMAIN-SUFFIX,kkbox.com.tw,Global_media
- DOMAIN-SUFFIX,kfs.io,Global_media
# > JOOX
# USER-AGENT,WeMusic*,Global_media
# USER-AGENT,JOOX*,Global_media
- DOMAIN-SUFFIX,joox.com,Global_media
# > Pandora
# USER-AGENT,Pandora*,Global_media
- DOMAIN-SUFFIX,pandora.com,Global_media
# > Spotify
# USER-AGENT,Spotify*,Global_media
- DOMAIN-SUFFIX,pscdn.co,Global_media
- DOMAIN-SUFFIX,scdn.co,Global_media
- DOMAIN-SUFFIX,spotify.com,Global_media
- DOMAIN-SUFFIX,spoti.fi,Global_media
- IP-CIDR,35.186.224.47/32,Global_media
# > TIDAL
# USER-AGENT,TIDAL*,Global_media
- DOMAIN-SUFFIX,tidal.com,Global_media


# (DNS Cache Pollution Protection)
# > Google
- DOMAIN-SUFFIX,appspot.com,google
- DOMAIN-SUFFIX,blogger.com,google
- DOMAIN-SUFFIX,getoutline.org,google
- DOMAIN-SUFFIX,gvt0.com,google
- DOMAIN-SUFFIX,gvt1.com,google
- DOMAIN-SUFFIX,gvt3.com,google
- DOMAIN-SUFFIX,xn--ngstr-lra8j.com,google
- DOMAIN-KEYWORD,google,google
- DOMAIN-KEYWORD,blogspot,google
# > Microsoft
- DOMAIN-SUFFIX,onedrive.live.com,Proxy
- DOMAIN-SUFFIX,xboxlive.com,Proxy
# > Facebook
- DOMAIN-SUFFIX,cdninstagram.com,Proxy
- DOMAIN-SUFFIX,fb.com,Proxy
- DOMAIN-SUFFIX,fb.me,Proxy
- DOMAIN-SUFFIX,fbaddins.com,Proxy
- DOMAIN-SUFFIX,fbcdn.net,Proxy
- DOMAIN-SUFFIX,fbsbx.com,Proxy
- DOMAIN-SUFFIX,fbworkmail.com,Proxy
- DOMAIN-SUFFIX,instagram.com,Proxy
- DOMAIN-SUFFIX,m.me,Proxy
- DOMAIN-SUFFIX,messenger.com,Proxy
- DOMAIN-SUFFIX,oculus.com,Proxy
- DOMAIN-SUFFIX,oculuscdn.com,Proxy
- DOMAIN-SUFFIX,rocksdb.org,Proxy
- DOMAIN-SUFFIX,whatsapp.com,Proxy
- DOMAIN-SUFFIX,whatsapp.net,Proxy
- DOMAIN-KEYWORD,facebook,Proxy
# > Twitter
- DOMAIN-SUFFIX,pscp.tv,Proxy
- DOMAIN-SUFFIX,periscope.tv,Proxy
- DOMAIN-SUFFIX,t.co,Proxy
- DOMAIN-SUFFIX,twimg.co,Proxy
- DOMAIN-SUFFIX,twimg.com,Proxy
- DOMAIN-SUFFIX,twitpic.com,Proxy
- DOMAIN-SUFFIX,vine.co,Proxy
- DOMAIN-KEYWORD,twitter,Proxy
# > Telegram
- DOMAIN-SUFFIX,t.me,Telegram
- DOMAIN-SUFFIX,tdesktop.com,Telegram
- DOMAIN-SUFFIX,telegra.ph,Telegram
- DOMAIN-SUFFIX,telegram.me,Telegram
- DOMAIN-SUFFIX,telegram.org,Telegram
- IP-CIDR,67.198.55.0/24,Telegram
- IP-CIDR,91.108.4.0/22,Telegram
- IP-CIDR,91.108.8.0/22,Telegram
- IP-CIDR,91.108.12.0/22,Telegram
- IP-CIDR,91.108.16.0/22,Telegram
- IP-CIDR,91.108.56.0/22,Telegram
- IP-CIDR,109.239.140.0/24,Telegram
- IP-CIDR,149.154.160.0/20,Telegram
- IP-CIDR,205.172.60.0/22,Telegram
- DOMAIN-SUFFIX,t.me,Telegram
- DOMAIN-SUFFIX,tdesktop.com,Telegram
- DOMAIN-SUFFIX,telegra.ph,Telegram
- DOMAIN-SUFFIX,telegram.me,Telegram
- DOMAIN-SUFFIX,telegram.org,Telegram
- DOMAIN-SUFFIX,t.me,Telegram
- IP-CIDR,67.198.55.0/24,Telegram
- IP-CIDR,91.108.4.0/22,Telegram
- IP-CIDR,91.108.8.0/22,Telegram
- IP-CIDR,91.108.12.0/22,Telegram
- IP-CIDR,91.108.16.0/22,Telegram
- IP-CIDR,91.108.56.150/32,Telegram
- IP-CIDR,91.108.56.141/32,Telegram
- IP-CIDR,109.239.140.0/24,Telegram
- IP-CIDR,149.154.160.0/20,Telegram
- IP-CIDR,149.154.164.250/32,Telegram
- IP-CIDR,149.154.175.51/32,Telegram
- IP-CIDR,149.154.175.53/32,Telegram
- IP-CIDR,149.154.167.50/32,Telegram
- IP-CIDR,149.154.167.51/32,Telegram
- IP-CIDR,172.217.160.74/32,Telegram
- IP-CIDR,205.172.60.0/22,Telegram
# > Line
- DOMAIN-SUFFIX,line.me,Proxy
- DOMAIN-SUFFIX,line-apps.com,Proxy
- DOMAIN-SUFFIX,line-scdn.net,Proxy
- DOMAIN-SUFFIX,naver.jp,Proxy
- IP-CIDR,103.2.30.0/23,Proxy
- IP-CIDR,125.209.208.0/20,Proxy
- IP-CIDR,147.92.128.0/17,Proxy
- IP-CID
Download .txt
gitextract_l4htcc51/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   └── workflows/
│       ├── build.yml
│       └── docker.yml
├── .gitignore
├── .travis.yml
├── CMakeLists.txt
├── LICENSE
├── README-cn.md
├── README-docker.md
├── README.md
├── base/
│   ├── base/
│   │   ├── GeneralClashConfig.yml
│   │   ├── all_base.tpl
│   │   ├── clash_provider_test.yml
│   │   ├── forcerule.yml
│   │   ├── loon.conf
│   │   ├── mellow.conf
│   │   ├── quan.conf
│   │   ├── quanx.conf
│   │   ├── shadowsocks_base.json
│   │   ├── simple_base.yml
│   │   ├── singbox.json
│   │   ├── surfboard.conf
│   │   └── surge.conf
│   ├── config/
│   │   ├── ACL4SSR.ini
│   │   ├── ACL4SSR_AdblockPlus.ini
│   │   ├── ACL4SSR_BackCN.ini
│   │   ├── ACL4SSR_Mini.ini
│   │   ├── ACL4SSR_Mini_Fallback.ini
│   │   ├── ACL4SSR_Mini_MultiMode.ini
│   │   ├── ACL4SSR_Mini_NoAuto.ini
│   │   ├── ACL4SSR_NoApple.ini
│   │   ├── ACL4SSR_NoAuto.ini
│   │   ├── ACL4SSR_NoAuto_NoApple.ini
│   │   ├── ACL4SSR_NoAuto_NoApple_NoMicrosoft.ini
│   │   ├── ACL4SSR_NoMicrosoft.ini
│   │   ├── ACL4SSR_Online.ini
│   │   ├── ACL4SSR_Online_AdblockPlus.ini
│   │   ├── ACL4SSR_Online_Full.ini
│   │   ├── ACL4SSR_Online_Full_AdblockPlus.ini
│   │   ├── ACL4SSR_Online_Full_Google.ini
│   │   ├── ACL4SSR_Online_Full_MultiMode.ini
│   │   ├── ACL4SSR_Online_Full_Netflix.ini
│   │   ├── ACL4SSR_Online_Full_NoAuto.ini
│   │   ├── ACL4SSR_Online_Mini.ini
│   │   ├── ACL4SSR_Online_Mini_AdblockPlus.ini
│   │   ├── ACL4SSR_Online_Mini_Fallback.ini
│   │   ├── ACL4SSR_Online_Mini_MultiCountry.ini
│   │   ├── ACL4SSR_Online_Mini_MultiMode.ini
│   │   ├── ACL4SSR_Online_Mini_NoAuto.ini
│   │   ├── ACL4SSR_Online_MultiCountry.ini
│   │   ├── ACL4SSR_Online_NoAuto.ini
│   │   ├── ACL4SSR_Online_NoReject.ini
│   │   ├── ACL4SSR_WithChinaIp.ini
│   │   ├── ACL4SSR_WithChinaIp_WithGFW.ini
│   │   ├── ACL4SSR_WithGFW.ini
│   │   ├── example_external_config.ini
│   │   ├── example_external_config.toml
│   │   └── example_external_config.yml
│   ├── generate.ini
│   ├── gistconf.ini
│   ├── pref.example.ini
│   ├── pref.example.toml
│   ├── pref.example.yml
│   ├── profiles/
│   │   └── example_profile.ini
│   ├── rules/
│   │   ├── ACL4SSR/
│   │   │   └── Clash/
│   │   │       ├── Apple.list
│   │   │       ├── BanAD.list
│   │   │       ├── BanEasyList.list
│   │   │       ├── BanEasyListChina.list
│   │   │       ├── BanEasyPrivacy.list
│   │   │       ├── BanProgramAD.list
│   │   │       ├── ChinaCompanyIp.list
│   │   │       ├── ChinaDomain.list
│   │   │       ├── ChinaIp.list
│   │   │       ├── ChinaMedia.list
│   │   │       ├── Download.list
│   │   │       ├── GoogleCN.list
│   │   │       ├── LocalAreaNetwork.list
│   │   │       ├── Microsoft.list
│   │   │       ├── Netflix.list
│   │   │       ├── OneDrive.list
│   │   │       ├── ProxyGFWlist.list
│   │   │       ├── ProxyLite.list
│   │   │       ├── ProxyMedia.list
│   │   │       ├── Ruleset/
│   │   │       │   ├── 360.list
│   │   │       │   ├── 4399.list
│   │   │       │   ├── 58.list
│   │   │       │   ├── ABC.list
│   │   │       │   ├── AbemaTV.list
│   │   │       │   ├── AccelerateDirectSites.list
│   │   │       │   ├── Adobe.list
│   │   │       │   ├── Alibaba.list
│   │   │       │   ├── All4.list
│   │   │       │   ├── Amazon.list
│   │   │       │   ├── AmazonIp.list
│   │   │       │   ├── Apple.list
│   │   │       │   ├── AppleNews.list
│   │   │       │   ├── AppleTV.list
│   │   │       │   ├── BBC.list
│   │   │       │   ├── BBCiPlayer.list
│   │   │       │   ├── Bahamut.list
│   │   │       │   ├── Baidu.list
│   │   │       │   ├── Bilibili.list
│   │   │       │   ├── BilibiliHMT.list
│   │   │       │   ├── Blizzard.list
│   │   │       │   ├── ByteDance.list
│   │   │       │   ├── CCTV.list
│   │   │       │   ├── CN.list
│   │   │       │   ├── ChinaNet.list
│   │   │       │   ├── DAZN.list
│   │   │       │   ├── Deezer.list
│   │   │       │   ├── Developer.list
│   │   │       │   ├── DiDi.list
│   │   │       │   ├── Discord.list
│   │   │       │   ├── DisneyPlus.list
│   │   │       │   ├── Dmm.list
│   │   │       │   ├── Douyu.list
│   │   │       │   ├── Download.list
│   │   │       │   ├── Dubox.list
│   │   │       │   ├── EHGallery.list
│   │   │       │   ├── EncoreTVB.list
│   │   │       │   ├── Epic.list
│   │   │       │   ├── Facebook.list
│   │   │       │   ├── FoxNow.list
│   │   │       │   ├── Github.list
│   │   │       │   ├── Google.list
│   │   │       │   ├── GoogleCN.list
│   │   │       │   ├── GoogleCNProxyIP.list
│   │   │       │   ├── GoogleEarth.list
│   │   │       │   ├── GoogleFCM.list
│   │   │       │   ├── HBO.list
│   │   │       │   ├── HBO_GO_HKG.list
│   │   │       │   ├── HWTV.list
│   │   │       │   ├── HuaWei.list
│   │   │       │   ├── Hulu.list
│   │   │       │   ├── HuluJapan.list
│   │   │       │   ├── ITV.list
│   │   │       │   ├── Iflytek.list
│   │   │       │   ├── Instagram.list
│   │   │       │   ├── Iqiyi.list
│   │   │       │   ├── IqiyiHMT.list
│   │   │       │   ├── JD.list
│   │   │       │   ├── JOOX.list
│   │   │       │   ├── Japonx.list
│   │   │       │   ├── KKBOX.list
│   │   │       │   ├── KKTV.list
│   │   │       │   ├── KakaoTalk.list
│   │   │       │   ├── Kingsoft.list
│   │   │       │   ├── Kuaishou.list
│   │   │       │   ├── LeTV.list
│   │   │       │   ├── LiTV.list
│   │   │       │   ├── Line.list
│   │   │       │   ├── LineTV.list
│   │   │       │   ├── MGTVTV.list
│   │   │       │   ├── MI.list
│   │   │       │   ├── MOO.list
│   │   │       │   ├── Marketing.list
│   │   │       │   ├── Meitu.list
│   │   │       │   ├── Microsoft.list
│   │   │       │   ├── My5.list
│   │   │       │   ├── MyTVSuper.list
│   │   │       │   ├── NetEase.list
│   │   │       │   ├── NetEaseMusic.list
│   │   │       │   ├── Netflix.list
│   │   │       │   ├── NetflixIP.list
│   │   │       │   ├── Niconico.list
│   │   │       │   ├── OneDrive.list
│   │   │       │   ├── PBS.list
│   │   │       │   ├── PDD.list
│   │   │       │   ├── PPTVPPLive.list
│   │   │       │   ├── Pandora.list
│   │   │       │   ├── Pixiv.list
│   │   │       │   ├── Porn.list
│   │   │       │   ├── Pornhub.list
│   │   │       │   ├── PrivateTracker.list
│   │   │       │   ├── PublicDirectCDN.list
│   │   │       │   ├── Qobuz.list
│   │   │       │   ├── Reddit.list
│   │   │       │   ├── Scholar.list
│   │   │       │   ├── Sina.list
│   │   │       │   ├── SohuSogo.list
│   │   │       │   ├── Sony.list
│   │   │       │   ├── SoundCloud.list
│   │   │       │   ├── Spark.list
│   │   │       │   ├── Spotify.list
│   │   │       │   ├── Steam.list
│   │   │       │   ├── SteamCN.list
│   │   │       │   ├── TIDAL.list
│   │   │       │   ├── TaiWanGood.list
│   │   │       │   ├── TapTap.list
│   │   │       │   ├── TeamViewer.list
│   │   │       │   ├── Telegram.list
│   │   │       │   ├── Tencent.list
│   │   │       │   ├── TencentLolm.list
│   │   │       │   ├── TencentVideo.list
│   │   │       │   ├── TeraBox.list
│   │   │       │   ├── TikTok.list
│   │   │       │   ├── Topblockedsites.list
│   │   │       │   ├── Twitch.list
│   │   │       │   ├── Twitter.list
│   │   │       │   ├── Vip.list
│   │   │       │   ├── ViuTV.list
│   │   │       │   ├── Whatsapp.list
│   │   │       │   ├── Wikipedia.list
│   │   │       │   ├── Xbox.list
│   │   │       │   ├── Ximalaya.list
│   │   │       │   ├── Xunlei.list
│   │   │       │   ├── YYeTs.list
│   │   │       │   ├── YouTube.list
│   │   │       │   ├── YouTubeMusic.list
│   │   │       │   └── Youku.list
│   │   │       ├── Telegram.list
│   │   │       ├── UnBan.list
│   │   │       └── Xbox.list
│   │   ├── DivineEngine/
│   │   │   └── Surge/
│   │   │       └── Ruleset/
│   │   │           ├── China.list
│   │   │           ├── Extra/
│   │   │           │   ├── Apple/
│   │   │           │   │   ├── AppStore.list
│   │   │           │   │   ├── AppStoreConnect.list
│   │   │           │   │   ├── Apple.list
│   │   │           │   │   ├── BlockiOSUpdate.list
│   │   │           │   │   ├── FindMy.list
│   │   │           │   │   ├── FitnessPlus.list
│   │   │           │   │   ├── Mail.list
│   │   │           │   │   ├── Music.list
│   │   │           │   │   ├── MusicRadio.list
│   │   │           │   │   ├── News.list
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── Siri.list
│   │   │           │   │   ├── SoftwareUpdate.list
│   │   │           │   │   ├── TV.list
│   │   │           │   │   ├── TestFlight.list
│   │   │           │   │   └── iCloud.list
│   │   │           │   ├── ChinaIP.list
│   │   │           │   ├── Clubhouse.list
│   │   │           │   ├── Cryptocurrency.list
│   │   │           │   ├── Game/
│   │   │           │   │   ├── Blizzard/
│   │   │           │   │   │   ├── Battle.list
│   │   │           │   │   │   ├── Classic.list
│   │   │           │   │   │   ├── Diablo-III.list
│   │   │           │   │   │   ├── Hearthstone.list
│   │   │           │   │   │   ├── Heroes-of-the-Storm.list
│   │   │           │   │   │   ├── Overwatch.list
│   │   │           │   │   │   ├── StarCraft-II.list
│   │   │           │   │   │   └── World-of-Warcraft.list
│   │   │           │   │   ├── Blizzard.list
│   │   │           │   │   ├── Discord.list
│   │   │           │   │   ├── Game.list
│   │   │           │   │   ├── Nintendo.list
│   │   │           │   │   ├── Origin.list
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── Steam.list
│   │   │           │   │   ├── Supercell.list
│   │   │           │   │   ├── WildRift.list
│   │   │           │   │   └── Xbox.list
│   │   │           │   ├── Google/
│   │   │           │   │   ├── Chromecast.list
│   │   │           │   │   ├── GoogleDrive.list
│   │   │           │   │   ├── GoogleSearch.list
│   │   │           │   │   └── GoogleVoice.list
│   │   │           │   ├── IP-Blackhole.list
│   │   │           │   ├── Microsoft/
│   │   │           │   │   ├── OneDrive.list
│   │   │           │   │   └── Teams.list
│   │   │           │   ├── PayPal.list
│   │   │           │   ├── Scholar.list
│   │   │           │   ├── Telegram/
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── Telegram.list
│   │   │           │   │   ├── TelegramNL.list
│   │   │           │   │   ├── TelegramSG.list
│   │   │           │   │   └── TelegramUS.list
│   │   │           │   ├── Twitter.list
│   │   │           │   └── WeChat/
│   │   │           │       └── WeChatSG.list
│   │   │           ├── Global.list
│   │   │           ├── Guard/
│   │   │           │   ├── Advertising.list
│   │   │           │   ├── AdvertisingPlus.list
│   │   │           │   ├── Hijacking.list
│   │   │           │   └── Privacy.list
│   │   │           ├── StreamingMedia/
│   │   │           │   ├── Live/
│   │   │           │   │   └── Twitch.list
│   │   │           │   ├── Music/
│   │   │           │   │   ├── Deezer.list
│   │   │           │   │   ├── Instagram.list
│   │   │           │   │   ├── JOOX.list
│   │   │           │   │   ├── KKBOX.list
│   │   │           │   │   ├── Pandora.list
│   │   │           │   │   ├── SoundCloud.list
│   │   │           │   │   ├── Spotify.list
│   │   │           │   │   ├── TIDAL.list
│   │   │           │   │   └── YouTube-Music.list
│   │   │           │   ├── Podcast/
│   │   │           │   │   ├── Himalaya.list
│   │   │           │   │   └── Overcast.list
│   │   │           │   ├── Region/
│   │   │           │   │   ├── HK.list
│   │   │           │   │   ├── JP.list
│   │   │           │   │   ├── KR.list
│   │   │           │   │   ├── README.md
│   │   │           │   │   ├── TW.list
│   │   │           │   │   ├── UK.list
│   │   │           │   │   └── US.list
│   │   │           │   ├── Streaming.list
│   │   │           │   ├── StreamingCN.list
│   │   │           │   ├── StreamingSE.list
│   │   │           │   └── Video/
│   │   │           │       ├── AbemaTV.list
│   │   │           │       ├── All-4.list
│   │   │           │       ├── BBC-iPlayer.list
│   │   │           │       ├── Bahamut.list
│   │   │           │       ├── DAZN.list
│   │   │           │       ├── DMM.list
│   │   │           │       ├── DisneyPlus.list
│   │   │           │       ├── FOX-NOW.list
│   │   │           │       ├── FOXPlus.list
│   │   │           │       ├── HBO-Asia.list
│   │   │           │       ├── HBO-GO-HKG.list
│   │   │           │       ├── HBO.list
│   │   │           │       ├── HWTV.list
│   │   │           │       ├── Hulu-JPN.list
│   │   │           │       ├── Hulu.list
│   │   │           │       ├── ITV.list
│   │   │           │       ├── KKTV.list
│   │   │           │       ├── LINE-TV.list
│   │   │           │       ├── LiTV.list
│   │   │           │       ├── My5.list
│   │   │           │       ├── Naver-TV.list
│   │   │           │       ├── Netflix.list
│   │   │           │       ├── Now-E.list
│   │   │           │       ├── PBS.list
│   │   │           │       ├── ParamountPlus.list
│   │   │           │       ├── Peacock.list
│   │   │           │       ├── Pornhub.list
│   │   │           │       ├── Prime-Video.list
│   │   │           │       ├── TVer.list
│   │   │           │       ├── TaiwanGood.list
│   │   │           │       ├── TikTok.list
│   │   │           │       ├── ViuTV.list
│   │   │           │       ├── WeTV.list
│   │   │           │       ├── YouTube.list
│   │   │           │       ├── bilibili-Intl.list
│   │   │           │       ├── encoreTVB.list
│   │   │           │       ├── iQIYI.list
│   │   │           │       ├── myTV-SUPER.list
│   │   │           │       ├── niconico.list
│   │   │           │       └── ‎DiscoveryPlus.list
│   │   │           └── Unbreak.list
│   │   ├── HKMTMedia.list
│   │   ├── LocalAreaNetwork.list
│   │   ├── MSServices.list
│   │   ├── NobyDa/
│   │   │   └── Surge/
│   │   │       ├── AdRule.list
│   │   │       ├── AdRuleTest.list
│   │   │       ├── Apple.list
│   │   │       ├── Download.list
│   │   │       └── WeChat.list
│   │   └── lhie1/
│   │       ├── Netease Music IP.list
│   │       └── Surge/
│   │           └── Surge 3/
│   │               └── Provider/
│   │                   ├── Apple.list
│   │                   ├── Domestic IPs.list
│   │                   ├── Domestic.list
│   │                   ├── Google FCM.list
│   │                   ├── Media/
│   │                   │   ├── ABC.list
│   │                   │   ├── Abema TV.list
│   │                   │   ├── Amazon.list
│   │                   │   ├── Apple News.list
│   │                   │   ├── Apple TV.list
│   │                   │   ├── BBC iPlayer.list
│   │                   │   ├── Bahamut.list
│   │                   │   ├── Bilibili.list
│   │                   │   ├── DAZN.list
│   │                   │   ├── Discovery Plus.list
│   │                   │   ├── Disney Plus.list
│   │                   │   ├── Fox Now.list
│   │                   │   ├── Fox+.list
│   │                   │   ├── HBO Go.list
│   │                   │   ├── HBO Max.list
│   │                   │   ├── Hulu Japan.list
│   │                   │   ├── Hulu.list
│   │                   │   ├── IQ.list
│   │                   │   ├── JOOX.list
│   │                   │   ├── Japonx.list
│   │                   │   ├── KKBOX.list
│   │                   │   ├── KKTV.list
│   │                   │   ├── Letv.list
│   │                   │   ├── Line TV.list
│   │                   │   ├── MOO.list
│   │                   │   ├── Netease Music.list
│   │                   │   ├── Netflix.list
│   │                   │   ├── PBS.list
│   │                   │   ├── Pandora.list
│   │                   │   ├── Pornhub.list
│   │                   │   ├── Soundcloud.list
│   │                   │   ├── Spotify.list
│   │                   │   ├── Tencent Video.list
│   │                   │   ├── ViuTV.list
│   │                   │   ├── WeTV.list
│   │                   │   ├── YouTube Music.list
│   │                   │   ├── YouTube.list
│   │                   │   ├── Youku.list
│   │                   │   ├── encoreTVB.list
│   │                   │   ├── iQiyi.list
│   │                   │   └── myTV SUPER.list
│   │                   ├── Microsoft.list
│   │                   ├── PayPal.list
│   │                   ├── Proxy.list
│   │                   ├── Reject.list
│   │                   ├── Scholar.list
│   │                   ├── Special.list
│   │                   ├── Speedtest.list
│   │                   ├── Steam.list
│   │                   └── Telegram.list
│   └── snippets/
│       ├── emoji.toml
│       ├── emoji.txt
│       ├── groups.toml
│       ├── groups.txt
│       ├── groups_forcerule.toml
│       ├── groups_forcerule.txt
│       ├── rename_node.toml
│       ├── rename_node.txt
│       ├── rulesets.toml
│       ├── rulesets.txt
│       └── rulesets_remote.txt
├── cmake/
│   ├── FindDuktape.cmake
│   ├── FindLibCron.cmake
│   ├── FindMbedTLS.cmake
│   ├── FindPCRE2.cmake
│   ├── FindQuickJS.cmake
│   └── FindRapidjson.cmake
├── include/
│   ├── httplib.h
│   ├── inja.hpp
│   ├── jpcre2.hpp
│   └── nlohmann/
│       └── json.hpp
├── scripts/
│   ├── Dockerfile
│   ├── build.alpine.release.sh
│   ├── build.macos.release.sh
│   ├── build.windows.release.sh
│   ├── config.termux.sh
│   ├── merge_manifest.py
│   ├── patches/
│   │   └── 0001-quickjs-libc-add-realpath-for-Windows.patch
│   ├── rules_config.conf
│   └── update_rules.py
└── src/
    ├── config/
    │   ├── binding.h
    │   ├── crontask.h
    │   ├── def.h
    │   ├── proxygroup.h
    │   ├── regmatch.h
    │   └── ruleset.h
    ├── generator/
    │   ├── config/
    │   │   ├── nodemanip.cpp
    │   │   ├── nodemanip.h
    │   │   ├── ruleconvert.cpp
    │   │   ├── ruleconvert.h
    │   │   ├── subexport.cpp
    │   │   └── subexport.h
    │   └── template/
    │       ├── template_jinja2.cpp
    │       ├── templates.cpp
    │       └── templates.h
    ├── handler/
    │   ├── interfaces.cpp
    │   ├── interfaces.h
    │   ├── multithread.cpp
    │   ├── multithread.h
    │   ├── settings.cpp
    │   ├── settings.h
    │   ├── upload.cpp
    │   ├── upload.h
    │   ├── webget.cpp
    │   └── webget.h
    ├── lib/
    │   └── wrapper.cpp
    ├── main.cpp
    ├── parser/
    │   ├── config/
    │   │   └── proxy.h
    │   ├── infoparser.cpp
    │   ├── infoparser.h
    │   ├── subparser.cpp
    │   └── subparser.h
    ├── script/
    │   ├── cron.cpp
    │   ├── cron.h
    │   ├── script.cpp
    │   ├── script.h
    │   ├── script_duktape.h
    │   ├── script_quickjs.cpp
    │   └── script_quickjs.h
    ├── server/
    │   ├── socket.h
    │   ├── webserver.h
    │   ├── webserver_httplib.cpp
    │   └── webserver_libevent.cpp
    ├── utils/
    │   ├── base64/
    │   │   ├── base64.cpp
    │   │   └── base64.h
    │   ├── bitwise.h
    │   ├── checkpoint.h
    │   ├── codepage.cpp
    │   ├── codepage.h
    │   ├── defer.h
    │   ├── file.cpp
    │   ├── file.h
    │   ├── file_extra.h
    │   ├── ini_reader/
    │   │   └── ini_reader.h
    │   ├── lock.h
    │   ├── logger.cpp
    │   ├── logger.h
    │   ├── map_extra.h
    │   ├── md5/
    │   │   ├── md5.cpp
    │   │   ├── md5.h
    │   │   └── md5_interface.h
    │   ├── network.cpp
    │   ├── network.h
    │   ├── printout.h
    │   ├── rapidjson_extra.h
    │   ├── regexp.cpp
    │   ├── regexp.h
    │   ├── stl_extra.h
    │   ├── string.cpp
    │   ├── string.h
    │   ├── string_hash.h
    │   ├── system.cpp
    │   ├── system.h
    │   ├── tribool.h
    │   ├── urlencode.cpp
    │   ├── urlencode.h
    │   └── yamlcpp_extra.h
    └── version.h
Download .txt
Showing preview only (424K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (1572 symbols across 67 files)

FILE: include/httplib.h
  function namespace (line 292) | namespace httplib {
  function scope_exit (line 330) | struct scope_exit {
  function release (line 344) | void release() { this->execute_on_destruction = false; }
  type Response (line 364) | struct Response
  type MultipartFormData (line 367) | struct MultipartFormData {
  function class (line 376) | class DataSink {
  type MultipartFormDataProvider (line 416) | struct MultipartFormDataProvider {
  function class (line 434) | class ContentReader {
  function const (line 449) | bool operator()(ContentReceiver receiver) const {
  type Request (line 460) | struct Request {
  type Response (line 512) | struct Response {
  function class (line 561) | class Stream {
  function ContentProviderWithoutLength (line 7336) | inline ContentProviderWithoutLength ClientImpl::get_multipart_content_pr...
  function process_socket (line 7378) | inline bool
  function Result (line 7388) | inline Result ClientImpl::Get(const std::string &path) {
  function Result (line 7392) | inline Result ClientImpl::Get(const std::string &path, Progress progress) {
  function Result (line 7396) | inline Result ClientImpl::Get(const std::string &path, const Headers &he...
  function Result (line 7400) | inline Result ClientImpl::Get(const std::string &path, const Headers &he...
  function Result (line 7411) | inline Result ClientImpl::Get(const std::string &path,
  function Result (line 7416) | inline Result ClientImpl::Get(const std::string &path,
  function Result (line 7423) | inline Result ClientImpl::Get(const std::string &path, const Headers &he...
  function Result (line 7428) | inline Result ClientImpl::Get(const std::string &path, const Headers &he...
  function Result (line 7435) | inline Result ClientImpl::Get(const std::string &path,
  function Result (line 7442) | inline Result ClientImpl::Get(const std::string &path, const Headers &he...
  function Result (line 7449) | inline Result ClientImpl::Get(const std::string &path,
  function Result (line 7457) | inline Result ClientImpl::Get(const std::string &path, const Headers &he...
  function Result (line 7476) | inline Result ClientImpl::Get(const std::string &path, const Params &par...
  function Result (line 7484) | inline Result ClientImpl::Get(const std::string &path, const Params &par...
  function Result (line 7491) | inline Result ClientImpl::Get(const std::string &path, const Params &par...
  function Result (line 7505) | inline Result ClientImpl::Head(const std::string &path) {
  function Result (line 7509) | inline Result ClientImpl::Head(const std::string &path,
  function Result (line 7519) | inline Result ClientImpl::Post(const std::string &path) {
  function Result (line 7523) | inline Result ClientImpl::Post(const std::string &path,
  function Result (line 7528) | inline Result ClientImpl::Post(const std::string &path, const char *body,
  function Result (line 7534) | inline Result ClientImpl::Post(const std::string &path, const Headers &h...
  function Result (line 7541) | inline Result ClientImpl::Post(const std::string &path, const std::strin...
  function Result (line 7546) | inline Result ClientImpl::Post(const std::string &path, const Headers &h...
  function Result (line 7554) | inline Result ClientImpl::Post(const std::string &path, const Params &pa...
  function Result (line 7558) | inline Result ClientImpl::Post(const std::string &path, size_t content_l...
  function Result (line 7565) | inline Result ClientImpl::Post(const std::string &path,
  function Result (line 7571) | inline Result ClientImpl::Post(const std::string &path, const Headers &h...
  function Result (line 7580) | inline Result ClientImpl::Post(const std::string &path, const Headers &h...
  function Result (line 7587) | inline Result ClientImpl::Post(const std::string &path, const Headers &h...
  function Result (line 7593) | inline Result ClientImpl::Post(const std::string &path,
  function Result (line 7598) | inline Result ClientImpl::Post(const std::string &path, const Headers &h...
  function Result (line 7607) | inline Result ClientImpl::Post(const std::string &path, const Headers &h...
  function Result (line 7620) | inline Result
  function Result (line 7633) | inline Result ClientImpl::Put(const std::string &path) {
  function Result (line 7637) | inline Result ClientImpl::Put(const std::string &path, const char *body,
  function Result (line 7643) | inline Result ClientImpl::Put(const std::string &path, const Headers &he...
  function Result (line 7650) | inline Result ClientImpl::Put(const std::string &path, const std::string...
  function Result (line 7655) | inline Result ClientImpl::Put(const std::string &path, const Headers &he...
  function Result (line 7663) | inline Result ClientImpl::Put(const std::string &path, size_t content_le...
  function Result (line 7670) | inline Result ClientImpl::Put(const std::string &path,
  function Result (line 7676) | inline Result ClientImpl::Put(const std::string &path, const Headers &he...
  function Result (line 7685) | inline Result ClientImpl::Put(const std::string &path, const Headers &he...
  function Result (line 7692) | inline Result ClientImpl::Put(const std::string &path, const Params &par...
  function Result (line 7696) | inline Result ClientImpl::Put(const std::string &path, const Headers &he...
  function Result (line 7702) | inline Result ClientImpl::Put(const std::string &path,
  function Result (line 7707) | inline Result ClientImpl::Put(const std::string &path, const Headers &he...
  function Result (line 7716) | inline Result ClientImpl::Put(const std::string &path, const Headers &he...
  function Result (line 7729) | inline Result
  function Result (line 7741) | inline Result ClientImpl::Patch(const std::string &path) {
  function Result (line 7745) | inline Result ClientImpl::Patch(const std::string &path, const char *body,
  function Result (line 7751) | inline Result ClientImpl::Patch(const std::string &path, const Headers &...
  function Result (line 7759) | inline Result ClientImpl::Patch(const std::string &path,
  function Result (line 7765) | inline Result ClientImpl::Patch(const std::string &path, const Headers &...
  function Result (line 7773) | inline Result ClientImpl::Patch(const std::string &path, size_t content_...
  function Result (line 7780) | inline Result ClientImpl::Patch(const std::string &path,
  function Result (line 7786) | inline Result ClientImpl::Patch(const std::string &path, const Headers &...
  function Result (line 7795) | inline Result ClientImpl::Patch(const std::string &path, const Headers &...
  function Result (line 7802) | inline Result ClientImpl::Delete(const std::string &path) {
  function Result (line 7806) | inline Result ClientImpl::Delete(const std::string &path,
  function Result (line 7811) | inline Result ClientImpl::Delete(const std::string &path, const char *body,
  function Result (line 7817) | inline Result ClientImpl::Delete(const std::string &path,
  function Result (line 7832) | inline Result ClientImpl::Delete(const std::string &path,
  function Result (line 7838) | inline Result ClientImpl::Delete(const std::string &path,
  function Result (line 7845) | inline Result ClientImpl::Options(const std::string &path) {
  function Result (line 7849) | inline Result ClientImpl::Options(const std::string &path,
  function stop (line 7859) | inline void ClientImpl::stop() {
  function set_connection_timeout (line 7893) | inline void ClientImpl::set_connection_timeout(time_t sec, time_t usec) {
  function set_read_timeout (line 7898) | inline void ClientImpl::set_read_timeout(time_t sec, time_t usec) {
  function set_write_timeout (line 7903) | inline void ClientImpl::set_write_timeout(time_t sec, time_t usec) {
  function set_basic_auth (line 7908) | inline void ClientImpl::set_basic_auth(const std::string &username,
  function set_bearer_token_auth (line 7914) | inline void ClientImpl::set_bearer_token_auth(const std::string &token) {
  function set_digest_auth (line 7919) | inline void ClientImpl::set_digest_auth(const std::string &username,
  function set_keep_alive (line 7926) | inline void ClientImpl::set_keep_alive(bool on) { keep_alive_ = on; }
  function set_follow_location (line 7928) | inline void ClientImpl::set_follow_location(bool on) { follow_location_ ...
  function set_url_encode (line 7930) | inline void ClientImpl::set_url_encode(bool on) { url_encode_ = on; }
  function set_hostname_addr_map (line 7932) | inline void
  function set_default_headers (line 7937) | inline void ClientImpl::set_default_headers(Headers headers) {
  function set_header_writer (line 7941) | inline void ClientImpl::set_header_writer(
  function set_address_family (line 7946) | inline void ClientImpl::set_address_family(int family) {
  function set_tcp_nodelay (line 7950) | inline void ClientImpl::set_tcp_nodelay(bool on) { tcp_nodelay_ = on; }
  function set_socket_options (line 7952) | inline void ClientImpl::set_socket_options(SocketOptions socket_options) {
  function set_compress (line 7956) | inline void ClientImpl::set_compress(bool on) { compress_ = on; }
  function set_decompress (line 7958) | inline void ClientImpl::set_decompress(bool on) { decompress_ = on; }
  function set_interface (line 7960) | inline void ClientImpl::set_interface(const std::string &intf) {
  function set_proxy (line 7964) | inline void ClientImpl::set_proxy(const std::string &host, int port) {
  function set_proxy_basic_auth (line 7969) | inline void ClientImpl::set_proxy_basic_auth(const std::string &username,
  function set_proxy_bearer_token_auth (line 7975) | inline void ClientImpl::set_proxy_bearer_token_auth(const std::string &t...
  function set_proxy_digest_auth (line 7980) | inline void ClientImpl::set_proxy_digest_auth(const std::string &username,
  function set_ca_cert_path (line 7986) | inline void ClientImpl::set_ca_cert_path(const std::string &ca_cert_file...
  function set_ca_cert_store (line 7992) | inline void ClientImpl::set_ca_cert_store(X509_STORE *ca_cert_store) {
  function X509_STORE (line 7998) | inline X509_STORE *ClientImpl::create_ca_cert_store(const char *ca_cert,
  function enable_server_certificate_verification (line 8025) | inline void ClientImpl::enable_server_certificate_verification(bool enab...
  function set_logger (line 8030) | inline void ClientImpl::set_logger(Logger logger) {
  function namespace (line 8038) | namespace detail {
  function SSLSocketStream (line 8151) | inline SSLSocketStream::~SSLSocketStream() {}
  function is_readable (line 8153) | inline bool SSLSocketStream::is_readable() const {
  function write (line 8194) | inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) {
  function SSLServer (line 8242) | inline SSLServer::SSLServer(const char *cert_path, const char *private_k...
  function SSLServer (line 8277) | inline SSLServer::SSLServer(X509 *cert, EVP_PKEY *private_key,
  function SSLServer (line 8301) | inline SSLServer::SSLServer(
  function SSLServer (line 8312) | inline SSLServer::~SSLServer() {
  function SSL_CTX (line 8318) | inline SSL_CTX *SSLServer::ssl_context() const { return ctx_; }
  function process_and_close_socket (line 8320) | inline bool SSLServer::process_and_close_socket(socket_t sock) {
  function SSLClient (line 8353) | inline SSLClient::SSLClient(const std::string &host)
  function SSLClient (line 8356) | inline SSLClient::SSLClient(const std::string &host, int port)
  function SSLClient (line 8359) | inline SSLClient::SSLClient(const std::string &host, int port,
  function SSLClient (line 8381) | inline SSLClient::SSLClient(const std::string &host, int port,
  function SSLClient (line 8400) | inline SSLClient::~SSLClient() {
  function set_ca_cert_store (line 8410) | inline void SSLClient::set_ca_cert_store(X509_STORE *ca_cert_store) {
  function load_ca_cert_store (line 8423) | inline void SSLClient::load_ca_cert_store(const char *ca_cert,
  function SSL_CTX (line 8432) | inline SSL_CTX *SSLClient::ssl_context() const { return ctx_; }
  function create_and_connect_socket (line 8434) | inline bool SSLClient::create_and_connect_socket(Socket &socket, Error &...
  function connect_with_proxy (line 8439) | inline bool SSLClient::connect_with_proxy(Socket &socket, Response &res,
  function load_certs (line 8507) | inline bool SSLClient::load_certs() {
  function initialize_ssl (line 8539) | inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) {
  function shutdown_ssl (line 8602) | inline void SSLClient::shutdown_ssl(Socket &socket, bool shutdown_gracef...
  function shutdown_ssl_impl (line 8606) | inline void SSLClient::shutdown_ssl_impl(Socket &socket,
  function process_socket (line 8619) | inline bool
  function verify_host (line 8630) | inline bool SSLClient::verify_host(X509 *server_cert) const {
  function verify_host_with_subject_alt_name (line 8656) | inline bool
  function verify_host_with_common_name (line 8713) | inline bool SSLClient::verify_host_with_common_name(X509 *server_cert) c...
  function check_host_name (line 8729) | inline bool SSLClient::check_host_name(const char *pattern,

FILE: include/inja.hpp
  type inja (line 30) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 96) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 245) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 288) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 349) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 719) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 789) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 817) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 672) | class ExtendsStatementNode : public StatementNode {
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 683) | class BlockStatementNode : public StatementNode {
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 696) | class SetStatementNode : public StatementNode {
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class StatisticsVisitor (line 724) | class StatisticsVisitor : public NodeVisitor {
      method visit (line 725) | void visit(const BlockNode& node) {
      method visit (line 731) | void visit(const TextNode&) {}
      method visit (line 732) | void visit(const ExpressionNode&) {}
      method visit (line 733) | void visit(const LiteralNode&) {}
      method visit (line 735) | void visit(const DataNode&) {
      method visit (line 739) | void visit(const FunctionNode& node) {
      method visit (line 745) | void visit(const ExpressionListNode& node) {
      method visit (line 749) | void visit(const StatementNode&) {}
      method visit (line 750) | void visit(const ForStatementNode&) {}
      method visit (line 752) | void visit(const ForArrayStatementNode& node) {
      method visit (line 757) | void visit(const ForObjectStatementNode& node) {
      method visit (line 762) | void visit(const IfStatementNode& node) {
      method visit (line 768) | void visit(const IncludeStatementNode&) {}
      method visit (line 770) | void visit(const ExtendsStatementNode&) {}
      method visit (line 772) | void visit(const BlockStatementNode& node) {
      method visit (line 776) | void visit(const SetStatementNode&) {}
      method StatisticsVisitor (line 781) | explicit StatisticsVisitor(): variable_counter(0) {}
    type Template (line 794) | struct Template {
      method Template (line 799) | explicit Template() {}
      method Template (line 800) | explicit Template(const std::string& content): content(content) {}
      method count_variables (line 803) | int count_variables() {
    type LexerConfig (line 822) | struct LexerConfig {
      method update_open_chars (line 842) | void update_open_chars() {
    type ParserConfig (line 874) | struct ParserConfig {
    type RenderConfig (line 883) | struct RenderConfig {
    type Token (line 930) | struct Token {
      type Kind (line 931) | enum class Kind {
      method Token (line 972) | explicit constexpr Token() = default;
      method Token (line 973) | explicit constexpr Token(Kind kind, std::string_view text): kind(kin...
      method describe (line 975) | std::string describe() const {
    class Lexer (line 1001) | class Lexer {
      type State (line 1002) | enum class State {
      type MinusState (line 1018) | enum class MinusState {
      method Token (line 1031) | Token scan_body(std::string_view close, Token::Kind closeKind, std::...
      method Token (line 1164) | Token scan_id() {
      method Token (line 1178) | Token scan_number() {
      method Token (line 1193) | Token scan_string() {
      method Token (line 1211) | Token make_token(Token::Kind kind) const {
      method skip_whitespaces_and_newlines (line 1215) | void skip_whitespaces_and_newlines() {
      method skip_whitespaces_and_first_newline (line 1223) | void skip_whitespaces_and_first_newline() {
      method clear_final_line_if_whitespace (line 1243) | static std::string_view clear_final_line_if_whitespace(std::string_v...
      method Lexer (line 1259) | explicit Lexer(const LexerConfig& config): config(config), state(Sta...
      method SourceLocation (line 1261) | SourceLocation current_position() const {
      method start (line 1265) | void start(std::string_view input) {
      method Token (line 1278) | Token scan() {
      method LexerConfig (line 1413) | const LexerConfig& get_config() const {
    class Parser (line 1436) | class Parser {
      method throw_parser_error (line 1458) | inline void throw_parser_error(const std::string& message) const {
      method get_next_token (line 1462) | inline void get_next_token() {
      method get_peek_token (line 1471) | inline void get_peek_token() {
      method add_literal (line 1478) | inline void add_literal(Arguments &arguments, const char* content_pt...
      method add_operator (line 1483) | inline void add_operator(Arguments &arguments, OperatorStack &operat...
      method add_to_template_storage (line 1498) | void add_to_template_storage(std::string_view path, std::string& tem...
      method parse_filename (line 1537) | std::string parse_filename() const {
      method parse_expression (line 1550) | bool parse_expression(Template& tmpl, Token::Kind closing) {
      method parse_expression (line 1555) | std::shared_ptr<ExpressionNode> parse_expression(Template& tmpl) {
      method parse_statement (line 1783) | bool parse_statement(Template& tmpl, Token::Kind closing, std::strin...
      method parse_into (line 1969) | void parse_into(Template& tmpl, std::string_view path) {
      method Parser (line 2031) | explicit Parser(const ParserConfig& parser_config, const LexerConfig...
      method Template (line 2035) | Template parse(std::string_view input, std::string_view path) {
      method parse_into_template (line 2041) | void parse_into_template(Template& tmpl, std::string_view filename) {
      method load_file (line 2049) | static std::string load_file(const std::string& filename) {
    class Renderer (line 2090) | class Renderer : public NodeVisitor {
      method truthy (line 2114) | static bool truthy(const json* data) {
      method print_data (line 2125) | void print_data(const std::shared_ptr<json> value) {
      method eval_expression_list (line 2138) | const std::shared_ptr<json> eval_expression_list(const ExpressionLis...
      method throw_renderer_error (line 2167) | void throw_renderer_error(const std::string& message, const AstNode&...
      method make_result (line 2172) | void make_result(const json&& result) {
      method get_arguments (line 2178) | std::array<const json*, N> get_arguments(const FunctionNode& node) {
      method Arguments (line 2208) | Arguments get_argument_vector(const FunctionNode& node) {
      method visit (line 2235) | void visit(const BlockNode& node) {
      method visit (line 2245) | void visit(const TextNode& node) {
      method visit (line 2249) | void visit(const ExpressionNode&) {}
      method visit (line 2251) | void visit(const LiteralNode& node) {
      method visit (line 2255) | void visit(const DataNode& node) {
      method visit (line 2275) | void visit(const FunctionNode& node) {
      method visit (line 2543) | void visit(const ExpressionListNode& node) {
      method visit (line 2547) | void visit(const StatementNode&) {}
      method visit (line 2549) | void visit(const ForStatementNode&) {}
      method visit (line 2551) | void visit(const ForArrayStatementNode& node) {
      method visit (line 2590) | void visit(const ForObjectStatementNode& node) {
      method visit (line 2629) | void visit(const IfStatementNode& node) {
      method visit (line 2638) | void visit(const IncludeStatementNode& node) {
      method visit (line 2648) | void visit(const ExtendsStatementNode& node) {
      method visit (line 2659) | void visit(const BlockStatementNode& node) {
      method visit (line 2673) | void visit(const SetStatementNode& node) {
      method Renderer (line 2681) | Renderer(const RenderConfig& config, const TemplateStorage& template...
      method render_to (line 2684) | void render_to(std::ostream& os, const Template& tmpl, const json& d...
    class Environment (line 2714) | class Environment {
      method Environment (line 2727) | Environment(): Environment("") {}
      method Environment (line 2729) | explicit Environment(const std::string& global_path): input_path(glo...
      method Environment (line 2731) | Environment(const std::string& input_path, const std::string& output...
      method set_statement (line 2734) | void set_statement(const std::string& open, const std::string& close) {
      method set_line_statement (line 2744) | void set_line_statement(const std::string& open) {
      method set_expression (line 2750) | void set_expression(const std::string& open, const std::string& clos...
      method set_comment (line 2759) | void set_comment(const std::string& open, const std::string& close) {
      method set_trim_blocks (line 2768) | void set_trim_blocks(bool trim_blocks) {
      method set_lstrip_blocks (line 2773) | void set_lstrip_blocks(bool lstrip_blocks) {
      method set_search_included_templates_in_files (line 2778) | void set_search_included_templates_in_files(bool search_in_files) {
      method set_throw_at_missing_includes (line 2783) | void set_throw_at_missing_includes(bool will_throw) {
      method Template (line 2787) | Template parse(std::string_view input) {
      method Template (line 2792) | Template parse_template(const std::string& filename) {
      method Template (line 2799) | Template parse_file(const std::string& filename) {
      method render (line 2803) | std::string render(std::string_view input, const json& data) {
      method render (line 2807) | std::string render(const Template& tmpl, const json& data) {
      method render_file (line 2813) | std::string render_file(const std::string& filename, const json& dat...
      method render_file_with_json_file (line 2817) | std::string render_file_with_json_file(const std::string& filename, ...
      method write (line 2822) | void write(const std::string& filename, const json& data, const std:...
      method write (line 2828) | void write(const Template& temp, const json& data, const std::string...
      method write_with_json_file (line 2834) | void write_with_json_file(const std::string& filename, const std::st...
      method write_with_json_file (line 2839) | void write_with_json_file(const Template& temp, const std::string& f...
      method load_file (line 2849) | std::string load_file(const std::string& filename) {
      method json (line 2854) | json load_json(const std::string& filename) {
      method add_callback (line 2867) | void add_callback(const std::string& name, const CallbackFunction& c...
      method add_void_callback (line 2874) | void add_void_callback(const std::string& name, const VoidCallbackFu...
      method add_callback (line 2881) | void add_callback(const std::string& name, int num_args, const Callb...
      method add_void_callback (line 2888) | void add_void_callback(const std::string& name, int num_args, const ...
      method include_template (line 2899) | void include_template(const std::string& name, const Template& tmpl) {
      method set_include_callback (line 2906) | void set_include_callback(const std::function<Template(const std::st...
    function render (line 2914) | inline std::string render(std::string_view input, const json& data) {
    function render_to (line 2921) | inline void render_to(std::ostream& os, std::string_view input, const ...
  type inja (line 925) | namespace inja {
    class FunctionStorage (line 105) | class FunctionStorage {
      type Operation (line 107) | enum class Operation {
      type FunctionData (line 157) | struct FunctionData {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
      method add_builtin (line 199) | void add_builtin(std::string_view name, int num_args, Operation op) {
      method add_callback (line 203) | void add_callback(std::string_view name, int num_args, const Callbac...
      method FunctionData (line 207) | FunctionData find_function(std::string_view name, int num_args) const {
        method FunctionData (line 158) | explicit FunctionData(const Operation& op, const CallbackFunction&...
    type SourceLocation (line 247) | struct SourceLocation {
    type InjaError (line 252) | struct InjaError : public std::runtime_error {
      method InjaError (line 258) | explicit InjaError(const std::string& type, const std::string& message)
      method InjaError (line 261) | explicit InjaError(const std::string& type, const std::string& messa...
    type ParserError (line 266) | struct ParserError : public InjaError {
      method ParserError (line 267) | explicit ParserError(const std::string& message, SourceLocation loca...
    type RenderError (line 270) | struct RenderError : public InjaError {
      method RenderError (line 271) | explicit RenderError(const std::string& message, SourceLocation loca...
    type FileError (line 274) | struct FileError : public InjaError {
      method FileError (line 275) | explicit FileError(const std::string& message): InjaError("file_erro...
      method FileError (line 276) | explicit FileError(const std::string& message, SourceLocation locati...
    type DataError (line 279) | struct DataError : public InjaError {
      method DataError (line 280) | explicit DataError(const std::string& message, SourceLocation locati...
    type string_view (line 290) | namespace string_view {
      function slice (line 291) | inline std::string_view slice(std::string_view view, size_t start, s...
      function split (line 297) | inline std::pair<std::string_view, std::string_view> split(std::stri...
      function starts_with (line 305) | inline bool starts_with(std::string_view view, std::string_view pref...
    function SourceLocation (line 310) | inline SourceLocation get_source_location(std::string_view content, si...
    function replace_substring (line 333) | inline void replace_substring(std::string& s, const std::string& f, co...
    class NodeVisitor (line 351) | class NodeVisitor
    class BlockNode (line 352) | class BlockNode
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 353) | class TextNode
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 354) | class ExpressionNode
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 355) | class LiteralNode
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 356) | class DataNode
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 357) | class FunctionNode
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 358) | class ExpressionListNode
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 359) | class StatementNode
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 360) | class ForStatementNode
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 361) | class ForArrayStatementNode
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 362) | class ForObjectStatementNode
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 363) | class IfStatementNode
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 364) | class IncludeStatementNode
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (line 365) | class ExtendsStatementNode
      method ExtendsStatementNode (line 676) | explicit ExtendsStatementNode(const std::string& file, size_t pos): ...
      method accept (line 678) | void accept(NodeVisitor& v) const {
    class BlockStatementNode (line 366) | class BlockStatementNode
      method BlockStatementNode (line 689) | explicit BlockStatementNode(BlockNode* const parent, const std::stri...
      method accept (line 691) | void accept(NodeVisitor& v) const {
    class SetStatementNode (line 367) | class SetStatementNode
      method SetStatementNode (line 701) | explicit SetStatementNode(const std::string& key, size_t pos): State...
      method accept (line 703) | void accept(NodeVisitor& v) const {
    class NodeVisitor (line 369) | class NodeVisitor {
    class AstNode (line 394) | class AstNode {
      method AstNode (line 400) | AstNode(size_t pos): pos(pos) {}
    class BlockNode (line 404) | class BlockNode : public AstNode {
      method BlockNode (line 408) | explicit BlockNode(): AstNode(0) {}
      method accept (line 410) | void accept(NodeVisitor& v) const {
    class TextNode (line 415) | class TextNode : public AstNode {
      method TextNode (line 419) | explicit TextNode(size_t pos, size_t length): AstNode(pos), length(l...
      method accept (line 421) | void accept(NodeVisitor& v) const {
    class ExpressionNode (line 426) | class ExpressionNode : public AstNode {
      method ExpressionNode (line 428) | explicit ExpressionNode(size_t pos): AstNode(pos) {}
      method accept (line 430) | void accept(NodeVisitor& v) const {
    class LiteralNode (line 435) | class LiteralNode : public ExpressionNode {
      method LiteralNode (line 439) | explicit LiteralNode(std::string_view data_text, size_t pos): Expres...
      method accept (line 441) | void accept(NodeVisitor& v) const {
    class DataNode (line 446) | class DataNode : public ExpressionNode {
      method convert_dot_to_ptr (line 451) | static std::string convert_dot_to_ptr(std::string_view ptr_name) {
      method DataNode (line 462) | explicit DataNode(std::string_view ptr_name, size_t pos): Expression...
      method accept (line 464) | void accept(NodeVisitor& v) const {
    class FunctionNode (line 469) | class FunctionNode : public ExpressionNode {
      type Associativity (line 473) | enum class Associativity {
      method FunctionNode (line 488) | explicit FunctionNode(std::string_view name, size_t pos)
      method FunctionNode (line 490) | explicit FunctionNode(Op operation, size_t pos): ExpressionNode(pos)...
      method accept (line 584) | void accept(NodeVisitor& v) const {
    class ExpressionListNode (line 589) | class ExpressionListNode : public AstNode {
      method ExpressionListNode (line 593) | explicit ExpressionListNode(): AstNode(0) {}
      method ExpressionListNode (line 594) | explicit ExpressionListNode(size_t pos): AstNode(pos) {}
      method accept (line 596) | void accept(NodeVisitor& v) const {
    class StatementNode (line 601) | class StatementNode : public AstNode {
      method StatementNode (line 603) | StatementNode(size_t pos): AstNode(pos) {}
    class ForStatementNode (line 608) | class ForStatementNode : public StatementNode {
      method ForStatementNode (line 614) | ForStatementNode(BlockNode* const parent, size_t pos): StatementNode...
    class ForArrayStatementNode (line 619) | class ForArrayStatementNode : public ForStatementNode {
      method ForArrayStatementNode (line 623) | explicit ForArrayStatementNode(const std::string& value, BlockNode* ...
      method accept (line 625) | void accept(NodeVisitor& v) const {
    class ForObjectStatementNode (line 630) | class ForObjectStatementNode : public ForStatementNode {
      method ForObjectStatementNode (line 635) | explicit ForObjectStatementNode(const std::string& key, const std::s...
      method accept (line 638) | void accept(NodeVisitor& v) const {
    class IfStatementNode (line 643) | class IfStatementNode : public StatementNode {
      method IfStatementNode (line 653) | explicit IfStatementNode(BlockNode* const parent, size_t pos): State...
      method IfStatementNode (line 654) | explicit IfStatementNode(bool is_nested, BlockNode* const parent, si...
      method accept (line 656) | void accept(NodeVisitor& v) const {
    class IncludeStatementNode (line 661) | class IncludeStatementNode : public StatementNode {
      method IncludeStatementNode (line 665) | explicit IncludeStatementNode(const std::string& file, size_t pos): ...
      method accept (line 667) | void accept(NodeVisitor& v) const {
    class ExtendsStatementNode (
Condensed preview — 508 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (5,555K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1872,
    "preview": "name: Bug 反馈\ndescription: 功能运行不正常 / 失效\ntitle: \"[BUG] <title>\"\nbody:\n  - type: markdown\n    attributes:\n      value: |\n  "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 165,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: 阅读文档\n    url: https://github.com/tindy2013/subconverter/blob/master"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 856,
    "preview": "name: 建议新功能\ndescription: 建议此项目增加的功能\ntitle: \"[Feature] <title>\"\nbody:\n  - type: checkboxes\n    id: ensure\n    attributes:"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 4969,
    "preview": "name: GitHub CI\non: \n  push:\n    branches: [ master ]\n    tags:\n      - '**'\n  workflow_dispatch:\n  pull_request:\n\nconcu"
  },
  {
    "path": ".github/workflows/docker.yml",
    "chars": 3681,
    "preview": "name: Publish Docker Image\non: \n  push:\n    branches: [ master ]\n    tags:\n      - '**'\n\nconcurrency: \n  group: ${{ gith"
  },
  {
    "path": ".gitignore",
    "chars": 65,
    "preview": "subconverter.exe\n.vscode\ncmake-build-debug\n.idea\nbase/cache\nbuild"
  },
  {
    "path": ".travis.yml",
    "chars": 5631,
    "preview": "language: cpp\nos: linux\nstages:\n    - name: deploy\n      if: branch = master\n    - name: before_script\n      if: branch "
  },
  {
    "path": "CMakeLists.txt",
    "chars": 6412,
    "preview": "PROJECT(subconverter LANGUAGES CXX)\nSET(BUILD_TARGET_NAME ${PROJECT_NAME})\nCMAKE_MINIMUM_REQUIRED(VERSION 3.5)\nSET(CMAKE"
  },
  {
    "path": "LICENSE",
    "chars": 35149,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
  },
  {
    "path": "README-cn.md",
    "chars": 46912,
    "preview": "# subconverter\n\n在各种订阅格式之间进行转换的实用程序.\n\n[![Build Status](https://github.com/tindy2013/subconverter/actions/workflows/build."
  },
  {
    "path": "README-docker.md",
    "chars": 2038,
    "preview": "# subconverter-docker\n\nThis is a minimized image to run https://github.com/tindy2013/subconverter.\n\nFor running this doc"
  },
  {
    "path": "README.md",
    "chars": 4949,
    "preview": "# subconverter\n\nUtility to convert between various proxy subscription formats.\n\n[![Build Status](https://github.com/tind"
  },
  {
    "path": "base/base/GeneralClashConfig.yml",
    "chars": 16737,
    "preview": "#---------------------------------------------------#\n## 配置文件需要放置在 $HOME/.config/clash/config.yml\n## 或者运行目录下的config.yml\n"
  },
  {
    "path": "base/base/all_base.tpl",
    "chars": 15859,
    "preview": "{% if request.target == \"clash\" or request.target == \"clashr\" %}\n\nport: {{ default(global.clash.http_port, \"7890\") }}\nso"
  },
  {
    "path": "base/base/clash_provider_test.yml",
    "chars": 429,
    "preview": "mixed-port: 7890\nallow-lan: true\nmode: Rule\nlog-level: info\nexternal-controller: 127.0.0.1:9090\nproxy-providers:\n  HK:\n "
  },
  {
    "path": "base/base/forcerule.yml",
    "chars": 89604,
    "preview": "# HTTP 代理端口\nport: 7890\n\n# SOCKS5 代理端口\nsocks-port: 7891\n\n# Linux 和 macOS 的 redir 代理端口 (如需使用此功能,请取消注释)\n# redir-port: 7892\n"
  },
  {
    "path": "base/base/loon.conf",
    "chars": 791,
    "preview": "[General]\nskip-proxy = 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,localhost,*.local,e.crashlynatics.com\nbypass-tun = 10.0.0"
  },
  {
    "path": "base/base/mellow.conf",
    "chars": 417,
    "preview": "[Endpoint]\nDIRECT, builtin, freedom, domainStrategy=UseIP\nREJECT, builtin, blackhole\nDns-Out, builtin, dns\n\n[Routing]\ndo"
  },
  {
    "path": "base/base/quan.conf",
    "chars": 158,
    "preview": "[SERVER]\n\n[SOURCE]\n\n[BACKUP-SERVER]\n\n[SUSPEND-SSID]\n\n[POLICY]\n\n[DNS]\n1.1.1.1\n\n[REWRITE]\n\n[URL-REJECTION]\n\n[TCP]\n\n[GLOBAL"
  },
  {
    "path": "base/base/quanx.conf",
    "chars": 1554,
    "preview": "[general]\nexcluded_routes=192.168.0.0/16, 172.16.0.0/12, 100.64.0.0/10, 10.0.0.0/8\ngeo_location_checker=http://ip-api.co"
  },
  {
    "path": "base/base/shadowsocks_base.json",
    "chars": 303,
    "preview": "{\n  \"route\": \"bypass-lan-china\",\n  \"remote_dns\": \"dns.google\",\n  \"ipv6\": false,\n  \"metered\": false,\n  \"proxy_apps\": {\n  "
  },
  {
    "path": "base/base/simple_base.yml",
    "chars": 139,
    "preview": "port: 7890\nsocks-port: 7891\nallow-lan: true\nmode: Rule\nlog-level: info\nexternal-controller: 127.0.0.1:9090\nProxy: ~\nProx"
  },
  {
    "path": "base/base/singbox.json",
    "chars": 2848,
    "preview": "{\n    \"log\": {\n        \"disabled\": false,\n        \"level\": \"info\",\n        \"timestamp\": true\n    },\n    \"dns\": {\n       "
  },
  {
    "path": "base/base/surfboard.conf",
    "chars": 256,
    "preview": "[General]\nloglevel = notify\ninterface = 127.0.0.1\nskip-proxy = 127.0.0.1, 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, 100"
  },
  {
    "path": "base/base/surge.conf",
    "chars": 326,
    "preview": "[General]\nloglevel = notify\nbypass-system = true\nskip-proxy = 127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,100.64.0"
  },
  {
    "path": "base/config/ACL4SSR.ini",
    "chars": 1361,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,rul"
  },
  {
    "path": "base/config/ACL4SSR_AdblockPlus.ini",
    "chars": 1588,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,rul"
  },
  {
    "path": "base/config/ACL4SSR_BackCN.ini",
    "chars": 934,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则 (流量回国)\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\nruleset=🎯 "
  },
  {
    "path": "base/config/ACL4SSR_Mini.ini",
    "chars": 988,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,r"
  },
  {
    "path": "base/config/ACL4SSR_Mini_Fallback.ini",
    "chars": 1084,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,r"
  },
  {
    "path": "base/config/ACL4SSR_Mini_MultiMode.ini",
    "chars": 1184,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,r"
  },
  {
    "path": "base/config/ACL4SSR_Mini_NoAuto.ini",
    "chars": 876,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,"
  },
  {
    "path": "base/config/ACL4SSR_NoApple.ini",
    "chars": 1309,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则 \n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,r"
  },
  {
    "path": "base/config/ACL4SSR_NoAuto.ini",
    "chars": 1239,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,ru"
  },
  {
    "path": "base/config/ACL4SSR_NoAuto_NoApple.ini",
    "chars": 1186,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,r"
  },
  {
    "path": "base/config/ACL4SSR_NoAuto_NoApple_NoMicrosoft.ini",
    "chars": 1081,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,"
  },
  {
    "path": "base/config/ACL4SSR_NoMicrosoft.ini",
    "chars": 1256,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直连,ru"
  },
  {
    "path": "base/config/ACL4SSR_Online.ini",
    "chars": 2097,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线更新版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_Online_AdblockPlus.ini",
    "chars": 2453,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线更新版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_Online_Full.ini",
    "chars": 5561,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\n;设置规则标志位\nruleset=🎯 全"
  },
  {
    "path": "base/config/ACL4SSR_Online_Full_AdblockPlus.ini",
    "chars": 6153,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\n;设置规则标志位\nruleset=🎯 全"
  },
  {
    "path": "base/config/ACL4SSR_Online_Full_Google.ini",
    "chars": 6415,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\n;设置规则标志位\nruleset=🎯 全"
  },
  {
    "path": "base/config/ACL4SSR_Online_Full_MultiMode.ini",
    "chars": 5747,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\n;设置规则标志位\nruleset=🎯 全"
  },
  {
    "path": "base/config/ACL4SSR_Online_Full_Netflix.ini",
    "chars": 5847,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\n;设置规则标志位\nruleset=🎯 全"
  },
  {
    "path": "base/config/ACL4SSR_Online_Full_NoAuto.ini",
    "chars": 5122,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\n;设置规则标志位\nruleset=🎯 "
  },
  {
    "path": "base/config/ACL4SSR_Online_Mini.ini",
    "chars": 1468,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_Online_Mini_AdblockPlus.ini",
    "chars": 1568,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_Online_Mini_Fallback.ini",
    "chars": 1564,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_Online_Mini_MultiCountry.ini",
    "chars": 1910,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_Online_Mini_MultiMode.ini",
    "chars": 1664,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_Online_Mini_NoAuto.ini",
    "chars": 1356,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线版\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:不支持\n;苹果分流:不支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全"
  },
  {
    "path": "base/config/ACL4SSR_Online_MultiCountry.ini",
    "chars": 2553,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线更新版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n;多国家分组:支持港/日/"
  },
  {
    "path": "base/config/ACL4SSR_Online_NoAuto.ini",
    "chars": 1962,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线版\n\n;去广告:支持\n;自动测速:不支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球直"
  },
  {
    "path": "base/config/ACL4SSR_Online_NoReject.ini",
    "chars": 1721,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则-在线更新版\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:不支持\n\nruleset=🎯 全球"
  },
  {
    "path": "base/config/ACL4SSR_WithChinaIp.ini",
    "chars": 1391,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:不支持\n\n;设置规则标志位\nruleset=🎯 "
  },
  {
    "path": "base/config/ACL4SSR_WithChinaIp_WithGFW.ini",
    "chars": 1410,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:支持\n;增强国外GFW:支持\n\nruleset=🎯 全球直连,rules"
  },
  {
    "path": "base/config/ACL4SSR_WithGFW.ini",
    "chars": 1363,
    "preview": "[custom]\n;不要随意改变关键字,否则会导致出错\n;acl4SSR规则\n\n;去广告:支持\n;自动测速:支持\n;微软分流:支持\n;苹果分流:支持\n;增强中国IP段:不支持\n;增强国外GFW:支持\n\nruleset=🎯 全球直连,rule"
  },
  {
    "path": "base/config/example_external_config.ini",
    "chars": 3127,
    "preview": "[custom]\n;This is an example external configuration file\n;All possible customization settings are shown below\n\n;Options "
  },
  {
    "path": "base/config/example_external_config.toml",
    "chars": 778,
    "preview": "version = 1\n[custom]\nenable_rule_generator = false\noverwrite_original_rules = false\n\n# Options for custom base configura"
  },
  {
    "path": "base/config/example_external_config.yml",
    "chars": 786,
    "preview": "custom:\n  enable_rule_generator: false\n  overwrite_original_rules: false\n\n  proxy_groups:\n  - {import: snippets/groups_f"
  },
  {
    "path": "base/generate.ini",
    "chars": 193,
    "preview": "[test]\npath=output.conf\ntarget=surge\nver=4\nurl=ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpwYXNzd29yZA@www.example.com:1080#Exam"
  },
  {
    "path": "base/gistconf.ini",
    "chars": 120,
    "preview": "[common]\n;uncomment the following line and enter your token to enable upload function\n;token = your_personal_token_here\n"
  },
  {
    "path": "base/pref.example.ini",
    "chars": 11540,
    "preview": "[common]\n;API mode, set to true to prevent loading local subscriptions or serving local files directly\napi_mode=false\n\n;"
  },
  {
    "path": "base/pref.example.toml",
    "chars": 9165,
    "preview": "version = 1\n[common]\n# API mode, set to true to prevent loading local subscriptions or serving local files directly\napi_"
  },
  {
    "path": "base/pref.example.yml",
    "chars": 5560,
    "preview": "common:\n  api_mode: false\n  api_access_token: password\n  default_url: []\n  enable_insert: true\n  insert_url: []\n  prepen"
  },
  {
    "path": "base/profiles/example_profile.ini",
    "chars": 423,
    "preview": "[Profile]\n;This is an example profile for the /getprofile interface\n;The options works the same as the arguments in the "
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Apple.list",
    "chars": 834,
    "preview": "# Apple\n# 一般国内Apple肯定正常,不需要开代理\nDOMAIN,apple.comscoreresearch.com\nDOMAIN-SUFFIX,aaplimg.com\nDOMAIN-SUFFIX,akadns.net\nDOMA"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/BanAD.list",
    "chars": 16273,
    "preview": "# 本碎片只包含常见广告关键字、广告联盟。无副作用,放心使用\n\n# 广告关键词\nDOMAIN-KEYWORD,admarvel\nDOMAIN-KEYWORD,admaster\nDOMAIN-KEYWORD,adsage\nDOMAIN-KEY"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/BanEasyList.list",
    "chars": 491007,
    "preview": "# 广告列表 adblock rules\n# 内容:EasyList列表,只包含ABP中的 EasyList 内容\n# 来源:https://easylist-downloads.adblockplus.org/easylist.txt\n#"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/BanEasyListChina.list",
    "chars": 174160,
    "preview": "# 广告列表 adblock rules\n# 内容:EasyListChina列表,只包含ABP中的 EasyListChina 内容\n# 来源:https://easylist-downloads.adblockplus.org/easy"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/BanEasyPrivacy.list",
    "chars": 441517,
    "preview": "# 广告列表 adblock rules\n# 内容:EasyPrivacy列表,隐私保护,屏蔽隐私追踪\n# 来源:https://easylist-downloads.adblockplus.org/easyprivacy.txt\n# 更新"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/BanProgramAD.list",
    "chars": 33072,
    "preview": "# 包含常用应用的各种去广告规则。\n# 可能有轻微副作用,可放心使用。(如果网站功能和广告冲突,会删掉去广告规则)\n\n# 163\nDOMAIN-SUFFIX,a.youdao.com\nDOMAIN-SUFFIX,adgeo.corp.163"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/ChinaCompanyIp.list",
    "chars": 7657,
    "preview": "# 中国云服务商ip端\n# 阿里\nIP-CIDR,8.128.0.0/10,no-resolve\nIP-CIDR,8.208.0.0/12,no-resolve\nIP-CIDR,14.1.112.0/22,no-resolve\nIP-CID"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/ChinaDomain.list",
    "chars": 16208,
    "preview": "# 直连列表\n\n# MyList\nDOMAIN-SUFFIX,13th.tech\nDOMAIN-SUFFIX,423down.com\nDOMAIN-SUFFIX,bokecc.com\nDOMAIN-SUFFIX,chaipip.com\nDO"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/ChinaIp.list",
    "chars": 211736,
    "preview": "# 内容:中国IP地址段\n# 来源:https://github.com/17mon/china_ip_list/\n# 更新:2021-12-26 21:01:18\n# 数量:6125条\n\nIP-CIDR,1.0.1.0/24,no-res"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/ChinaMedia.list",
    "chars": 1392,
    "preview": "# 内容:中国媒体列表\n# 更新:2021-12-26 21:01:13\n# 数量:45条\n\n# Bilibili 哔哩哔哩\nUSER-AGENT,Bilibili*\nUSER-AGENT,bili*\nUSER-AGENT,bili-int"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Download.list",
    "chars": 852,
    "preview": "# Mac Download\nPROCESS-NAME,aria2c.exe\nPROCESS-NAME,fdm.exe\nPROCESS-NAME,Folx.exe\nPROCESS-NAME,NetTransport.exe\nPROCESS-"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/GoogleCN.list",
    "chars": 1383,
    "preview": "# Google China\n#DOMAIN-SUFFIX,translate.googleapis.com\nDOMAIN-SUFFIX,265.com\nDOMAIN-SUFFIX,2mdn.net\nDOMAIN-SUFFIX,alt1-m"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/LocalAreaNetwork.list",
    "chars": 841,
    "preview": "# 本地/局域网地址\n# 参考:https://en.wikipedia.org/wiki/Reserved_IP_addresses\n\n# ACL4SSR标志 如没有,代表不是用ACL4SSR规则\nDOMAIN-SUFFIX,acl4.s"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Microsoft.list",
    "chars": 2247,
    "preview": "# Microsoft Services\n# optimized from https://gist.github.com/TTTPOB/ce93fb3b04ba2f21880b09427442d831\n# source: https://"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Netflix.list",
    "chars": 1080,
    "preview": "# Netflix\nUSER-AGENT,Argo*\nDOMAIN-SUFFIX,fast.com\nDOMAIN-SUFFIX,netflix.com\nDOMAIN-SUFFIX,netflix.net\nDOMAIN-SUFFIX,netf"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/OneDrive.list",
    "chars": 564,
    "preview": "# OneDrive\nPROCESS-NAME,OneDrive\nPROCESS-NAME,OneDriveUpdater\nUSER-AGENT,OneDrive*\nUSER-AGENT,OneDriveiOSApp*\nDOMAIN-KEY"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/ProxyGFWlist.list",
    "chars": 158305,
    "preview": "# 代理列表\n\n# MyList && Other\nDOMAIN-SUFFIX,1password.com\nDOMAIN-SUFFIX,adguard.org\nDOMAIN-SUFFIX,bit.no.com\nDOMAIN-SUFFIX,b"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/ProxyLite.list",
    "chars": 11426,
    "preview": "# 代理列表\n\n# MyList && Other\nDOMAIN-SUFFIX,1password.com\nDOMAIN-SUFFIX,adguard.org\nDOMAIN-SUFFIX,bit.no.com\nDOMAIN-SUFFIX,b"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/ProxyMedia.list",
    "chars": 9464,
    "preview": "# 内容:国外媒体列表\n# 更新:2021-12-26 22:03:43\n# 数量:314条\n\n# ABC\nDOMAIN-SUFFIX,edgedatg.com\nDOMAIN-SUFFIX,go.com\n\n# AbemaTV\nUSER-AG"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/360.list",
    "chars": 214,
    "preview": "# 内容:360\n# 数量:8条\nDOMAIN-SUFFIX,360.com\nDOMAIN-SUFFIX,360kuai.com\nDOMAIN-SUFFIX,360safe.com\nDOMAIN-SUFFIX,dhrest.com\nDOMA"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/4399.list",
    "chars": 117,
    "preview": "# 内容:4399\n# 数量:4条\nDOMAIN-SUFFIX,4399.com\nDOMAIN-SUFFIX,4399pk.com\nDOMAIN-SUFFIX,5054399.com\nDOMAIN-SUFFIX,img4399.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/58.list",
    "chars": 36,
    "preview": "# 内容:58\n# 数量:1条\nDOMAIN-SUFFIX,58.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/ABC.list",
    "chars": 64,
    "preview": "# 内容:ABC\n# 数量:2条\nDOMAIN-SUFFIX,edgedatg.com\nDOMAIN-SUFFIX,go.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/AbemaTV.list",
    "chars": 172,
    "preview": "# 内容:AbemaTV\n# 数量:6条\nUSER-AGENT,AbemaTV*\nDOMAIN-KEYWORD,abematv.akamaized.net\nDOMAIN-SUFFIX,abema.io\nDOMAIN-SUFFIX,abema"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/AccelerateDirectSites.list",
    "chars": 6212,
    "preview": "# 内容:AccelerateDirectSites\n# 数量:242条\nDOMAIN-SUFFIX,10010.com\nDOMAIN-SUFFIX,115.com\nDOMAIN-SUFFIX,12306.com\nDOMAIN-SUFFIX"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Adobe.list",
    "chars": 990,
    "preview": "# 内容:Adobe\n# 数量:34条\nDOMAIN-KEYWORD,adobe\nDOMAIN,adbemdigitalmediarebootprod2.112.2o7.net\nDOMAIN,cc-ext-prod-pkgs.s3.amaz"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Alibaba.list",
    "chars": 963,
    "preview": "# 内容:Alibaba\n# 数量:36条\nDOMAIN-SUFFIX,1688.com\nDOMAIN-SUFFIX,aliapp.org\nDOMAIN-SUFFIX,alibaba.com\nDOMAIN-SUFFIX,alibabaclo"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/All4.list",
    "chars": 88,
    "preview": "# 内容:All4\n# 数量:3条\nUSER-AGENT,All4*\nDOMAIN-SUFFIX,c4assets.com\nDOMAIN-SUFFIX,channel4.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Amazon.list",
    "chars": 1165,
    "preview": "# 内容:Amazon\n# 数量:35条\nDOMAIN-KEYWORD,avoddashs\nDOMAIN,atv-ps.amazon.com\nDOMAIN,avodmp4s3ww-a.akamaihd.net\nDOMAIN,d1v5ir2l"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/AmazonIp.list",
    "chars": 45045,
    "preview": "# 内容:AmazonIp\n# 数量:1295条\nIP-CIDR,3.0.0.0/15,no-resolve\nIP-CIDR,3.2.0.0/24,no-resolve\nIP-CIDR,3.2.2.0/23,no-resolve\nIP-CI"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Apple.list",
    "chars": 823,
    "preview": "# 内容:Apple\n# 数量:27条\nDOMAIN,apple.comscoreresearch.com\nDOMAIN-SUFFIX,aaplimg.com\nDOMAIN-SUFFIX,akadns.net\nDOMAIN-SUFFIX,a"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/AppleNews.list",
    "chars": 101,
    "preview": "# 内容:AppleNews\n# 数量:3条\nUSER-AGENT,AppleNews*\nUSER-AGENT,com.apple.news*\nDOMAIN,gspe1-ssl.ls.apple.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/AppleTV.list",
    "chars": 113,
    "preview": "# 内容:AppleTV\n# 数量:3条\nDOMAIN,np-edge.itunes.apple.com\nDOMAIN,play-edge.itunes.apple.com\nDOMAIN-SUFFIX,tv.apple.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/BBC.list",
    "chars": 82,
    "preview": "# 内容:BBC\n# 数量:3条\nDOMAIN-KEYWORD,uk-live\nDOMAIN-SUFFIX,bbc.co\nDOMAIN-SUFFIX,bbc.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/BBCiPlayer.list",
    "chars": 443,
    "preview": "# 内容:BBCiPlayer\n# 数量:15条\nUSER-AGENT,BBCiPlayer*\nDOMAIN-KEYWORD,bbcfmt\nDOMAIN-KEYWORD,uk-live\nDOMAIN,aod-dash-uk-live.aka"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Bahamut.list",
    "chars": 157,
    "preview": "# 内容:Bahamut\n# 数量:5条\nUSER-AGENT,Anime*\nDOMAIN,gamer-cds.cdn.hinet.net\nDOMAIN,gamer2-cds.cdn.hinet.net\nDOMAIN-SUFFIX,baha"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Baidu.list",
    "chars": 337,
    "preview": "# 内容:Baidu\n# 数量:12条\nDOMAIN-SUFFIX,baidu.com\nDOMAIN-SUFFIX,baidubcr.com\nDOMAIN-SUFFIX,baidupcs.com\nDOMAIN-SUFFIX,baidusta"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Bilibili.list",
    "chars": 561,
    "preview": "# 内容:Bilibili 哔哩哔哩\n# 数量:21条\nUSER-AGENT,Bilibili*\nUSER-AGENT,bili*\nUSER-AGENT,bili-inter*\nDOMAIN,apiintl.biliapi.net\nDOMA"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/BilibiliHMT.list",
    "chars": 545,
    "preview": "# 内容:BilibiliHMT 哔哩哔哩 港澳台番剧\n# 数量:18条\nDOMAIN,p-bstarstatic.akamaized.net\nDOMAIN,p.bstarstatic.com\nDOMAIN,upos-bstar-mirro"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Blizzard.list",
    "chars": 101,
    "preview": "# 内容:Blizzard\n# 数量:3条\nDOMAIN-SUFFIX,battle.net\nDOMAIN-SUFFIX,battlenet.com\nDOMAIN-SUFFIX,blizzard.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/ByteDance.list",
    "chars": 697,
    "preview": "# 内容:ByteDance\n# 数量:25条\nDOMAIN-SUFFIX,bytedance.com\nDOMAIN-SUFFIX,bytedance.net\nDOMAIN-SUFFIX,bytedns.net\nDOMAIN-SUFFIX,"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/CCTV.list",
    "chars": 94,
    "preview": "# 内容:CCTV\n# 数量:3条\nDOMAIN-SUFFIX,cctv.com\nDOMAIN-SUFFIX,cctvpic.com\nDOMAIN-SUFFIX,livechina.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/CN.list",
    "chars": 88,
    "preview": "# 内容: CN域名直连\n# 数量:4条\nDOMAIN-SUFFIX,cn\nDOMAIN-SUFFIX,中国\nDOMAIN-SUFFIX,公司\nDOMAIN-SUFFIX,网络"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/ChinaNet.list",
    "chars": 44,
    "preview": "# 内容:ChinaNet\n# 数量:1条\nDOMAIN-SUFFIX,21cn.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/DAZN.list",
    "chars": 375,
    "preview": "# 内容:DAZN\n# 数量:12条\nUSER-AGENT,DAZN*\nDOMAIN-KEYWORD,voddazn\nDOMAIN,d151l6v8er5bdm.cloudfront.net\nDOMAIN-SUFFIX,d151l6v8er"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Deezer.list",
    "chars": 87,
    "preview": "# 内容:Deezer\n# 数量:3条\nUSER-AGENT,Deezer*\nDOMAIN-SUFFIX,deezer.com\nDOMAIN-SUFFIX,dzcdn.net"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Developer.list",
    "chars": 526,
    "preview": "# 内容:Developer 开发者常用国外网站、镜像和论坛\n# 数量:19条\nDOMAIN-SUFFIX,apache.org\nDOMAIN-SUFFIX,docker.com\nDOMAIN-SUFFIX,elastic.co\nDOMAI"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/DiDi.list",
    "chars": 99,
    "preview": "# 内容:DiDi\n# 数量:3条\nDOMAIN-SUFFIX,didialift.com\nDOMAIN-SUFFIX,didiglobal.com\nDOMAIN-SUFFIX,udache.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Discord.list",
    "chars": 182,
    "preview": "# 内容:Discord\n# 数量:6条\nDOMAIN-SUFFIX,discord.co\nDOMAIN-SUFFIX,discord.com\nDOMAIN-SUFFIX,discord.gg\nDOMAIN-SUFFIX,discord.m"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/DisneyPlus.list",
    "chars": 735,
    "preview": "# 内容:DisneyPlus\n# 数量:22条\nUSER-AGENT,Disney*\nUSER-AGENT,Disney+*\nDOMAIN,cdn.registerdisney.go.com\nDOMAIN-SUFFIX,adobedtm."
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Dmm.list",
    "chars": 392,
    "preview": "# 内容:Dmm\n# 数量:14条\nDOMAIN-SUFFIX,akabeesoft2.com\nDOMAIN-SUFFIX,akabeesoft3.com\nDOMAIN-SUFFIX,akatsukiworks.com\nDOMAIN-SUF"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Douyu.list",
    "chars": 122,
    "preview": "# 内容:Douyu 斗鱼\n# 数量:4条\nDOMAIN-SUFFIX,douyu.com\nDOMAIN-SUFFIX,douyu.tv\nDOMAIN-SUFFIX,douyuscdn.com\nDOMAIN-SUFFIX,douyutv.c"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Download.list",
    "chars": 810,
    "preview": "# 内容:Download\n# 数量:20条\nDOMAIN-KEYWORD,aria2\nDOMAIN-SUFFIX,smtp\nPROCESS-NAME,DownloadService.exe\nPROCESS-NAME,Folx.exe\nPR"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Dubox.list",
    "chars": 69,
    "preview": "# 内容:Dubox\n# 数量:2条\nDOMAIN-SUFFIX,dubox.com\nDOMAIN-SUFFIX,duboxcdn.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/EHGallery.list",
    "chars": 191,
    "preview": "# 内容:E-Hentai Galleries\n# 数量:6条\nDOMAIN-SUFFIX,e-hentai.org\nDOMAIN-SUFFIX,ehwiki.org\nDOMAIN-SUFFIX,ehgt.org\nDOMAIN-SUFFIX"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/EncoreTVB.list",
    "chars": 197,
    "preview": "# 内容:EncoreTVB\n# 数量:6条\nUSER-AGENT,encoreTVB*\nDOMAIN,bcbolt446c5271-a.akamaihd.net\nDOMAIN,content.jwplatform.com\nDOMAIN,e"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Epic.list",
    "chars": 130,
    "preview": "# 内容:Epic\n# 数量:4条\nDOMAIN-SUFFIX,epicgames.com\nDOMAIN-SUFFIX,helpshift.com\nDOMAIN-SUFFIX,paragon.com\nDOMAIN-SUFFIX,unreal"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Facebook.list",
    "chars": 660,
    "preview": "# 内容:Facebook\n# 数量:21条\nDOMAIN-KEYWORD,facebook\nDOMAIN-KEYWORD,fbcdn\nDOMAIN-SUFFIX,facebook.com\nDOMAIN-SUFFIX,fb.com\nDOMA"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/FoxNow.list",
    "chars": 113,
    "preview": "# 内容:FoxNow\n# 数量:4条\nUSER-AGENT,FOX%20NOW*\nDOMAIN-SUFFIX,fox.com\nDOMAIN-SUFFIX,foxdcg.com\nDOMAIN-SUFFIX,uplynk.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Github.list",
    "chars": 185,
    "preview": "# 内容:Github\n# 数量:6条\nDOMAIN-KEYWORD,github\nDOMAIN-SUFFIX,github.com\nDOMAIN-SUFFIX,github.io\nDOMAIN-SUFFIX,githubapp.com\nD"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Google.list",
    "chars": 637,
    "preview": "# 内容:Google\n# 数量:24条\nDOMAIN-KEYWORD,gmail\nDOMAIN-KEYWORD,google\nDOMAIN-SUFFIX,1e100.net\nDOMAIN-SUFFIX,2mdn.net\nDOMAIN-SU"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/GoogleCN.list",
    "chars": 1351,
    "preview": "# 内容:GoogleCN\n# 数量:38条\nDOMAIN-SUFFIX,265.com\nDOMAIN-SUFFIX,2mdn.net\nDOMAIN-SUFFIX,alt1-mtalk.google.com\nDOMAIN-SUFFIX,al"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/GoogleCNProxyIP.list",
    "chars": 723,
    "preview": "# 内容:GoogleCNProxyIP 谷歌中国服务 services.googleapis.cn\n# 数量:18条\nIP-CIDR,120.232.181.162/32,no-resolve\nIP-CIDR,120.241.147.22"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/GoogleEarth.list",
    "chars": 545,
    "preview": "# 内容:GoogleEarth 谷歌地球\n# 数量:16条\nDOMAIN-SUFFIX,earth-pa.clients6.google.com\nDOMAIN-SUFFIX,earth.google.com\nDOMAIN-SUFFIX,k"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/GoogleFCM.list",
    "chars": 1251,
    "preview": "# 内容:GoogleFCM 谷歌推送服务\n# 数量:35条\nDOMAIN,alt1-mtalk.google.com\nDOMAIN,alt2-mtalk.google.com\nDOMAIN,alt3-mtalk.google.com\nDO"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/HBO.list",
    "chars": 181,
    "preview": "# 内容:HBO\n# 数量:7条\nUSER-AGENT,HBO%20NOW*\nUSER-AGENT,HBOMAX*\nDOMAIN-SUFFIX,hbo.com\nDOMAIN-SUFFIX,hbogo.com\nDOMAIN-SUFFIX,hb"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/HBO_GO_HKG.list",
    "chars": 715,
    "preview": "# 内容:HBO_GO_HKG\n# 数量:21条\nUSER-AGENT,HBO%20GO%20PROD*\nDOMAIN-KEYWORD,.hbogoasia.\nDOMAIN-KEYWORD,hbogoasia\nDOMAIN,44wilhpl"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/HWTV.list",
    "chars": 87,
    "preview": "# 内容:HWTV\n# 数量:3条\nUSER-AGENT,HWTVMobile*\nDOMAIN-SUFFIX,5itv.tv\nDOMAIN-SUFFIX,ocnttv.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/HuaWei.list",
    "chars": 257,
    "preview": "# 内容:HuaWei\n# 数量:9条\nDOMAIN-SUFFIX,dbankcdn.com\nDOMAIN-SUFFIX,hc-cdn.com\nDOMAIN-SUFFIX,hicloud.com\nDOMAIN-SUFFIX,huawei.c"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Hulu.list",
    "chars": 220,
    "preview": "# 内容:Hulu\n# 数量:7条\nDOMAIN-SUFFIX,cws-hulu.conviva.com\nDOMAIN-SUFFIX,hulu.com\nDOMAIN-SUFFIX,hulu.hb.omtrdc.net\nDOMAIN-SUFF"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/HuluJapan.list",
    "chars": 180,
    "preview": "# 内容:HuluJapan\n# 数量:6条\nDOMAIN-SUFFIX,happyon.jp\nDOMAIN-SUFFIX,hjholdings.jp\nDOMAIN-SUFFIX,hulu.jp\nDOMAIN-SUFFIX,prod.hjh"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/ITV.list",
    "chars": 124,
    "preview": "# 内容:ITV\n# 数量:4条\nUSER-AGENT,ITV_Player*\nDOMAIN,itvpnpmobile-a.akamaihd.net\nDOMAIN-SUFFIX,itv.com\nDOMAIN-SUFFIX,itvstatic"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Iflytek.list",
    "chars": 103,
    "preview": "# 内容:Iflytek 科大讯飞\n# 数量:3条\nDOMAIN-SUFFIX,iflyink.com\nDOMAIN-SUFFIX,iflyrec.com\nDOMAIN-SUFFIX,iflytek.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Instagram.list",
    "chars": 131,
    "preview": "# 内容:Instagram\n# 数量:4条\nDOMAIN-KEYWORD,instagram\nDOMAIN-SUFFIX,cdninstagram.com\nDOMAIN-SUFFIX,instagr.am\nDOMAIN-SUFFIX,in"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Iqiyi.list",
    "chars": 748,
    "preview": "# 内容:Iqiyi 爱奇艺\n# 数量:25条\nUSER-AGENT,QYPlayer*\nUSER-AGENT,iQIYI*\nDOMAIN,intel-cache.m.iqiyi.com\nDOMAIN,intel-cache.video.i"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/IqiyiHMT.list",
    "chars": 84,
    "preview": "# 内容:IqiyiHMT 爱奇艺 港澳台和国外站点\n# 数量:2条\nDOMAIN,cache.video.iqiyi.com\nDOMAIN-SUFFIX,iq.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/JD.list",
    "chars": 211,
    "preview": "# 内容:JD\n# 数量:8条\nDOMAIN-SUFFIX,360buy.com\nDOMAIN-SUFFIX,360buyimg.com\nDOMAIN-SUFFIX,jcloudcs.com\nDOMAIN-SUFFIX,jd.com\nDOM"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/JOOX.list",
    "chars": 104,
    "preview": "# 内容:JOOX\n# 数量:4条\nUSER-AGENT,JOOX*\nUSER-AGENT,WeMusic*\nDOMAIN-KEYWORD,jooxweb-api\nDOMAIN-SUFFIX,joox.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Japonx.list",
    "chars": 267,
    "preview": "# 内容:Japonx\n# 数量:10条\nDOMAIN-KEYWORD,japonx\nDOMAIN-KEYWORD,japronx\nDOMAIN-SUFFIX,japonx.com\nDOMAIN-SUFFIX,japonx.net\nDOMA"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/KKBOX.list",
    "chars": 90,
    "preview": "# 内容:KKBOX\n# 数量:3条\nDOMAIN-SUFFIX,kfs.io\nDOMAIN-SUFFIX,kkbox.com\nDOMAIN-SUFFIX,kkbox.com.tw"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/KKTV.list",
    "chars": 142,
    "preview": "# 内容:KKTV\n# 数量:5条\nUSER-AGENT,KKTV*\nUSER-AGENT,com.kktv.ios.kktv*\nDOMAIN,kktv-theater.kk.stream\nDOMAIN-SUFFIX,kktv.com.tw"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/KakaoTalk.list",
    "chars": 305,
    "preview": "# 内容:Kakao Talk\n# 数量:9条\nDOMAIN-SUFFIX,kakao.co.kr\nDOMAIN-SUFFIX,kakao.com\nDOMAIN-SUFFIX,kakaocdn.net\nIP-CIDR,1.201.0.0/2"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Kingsoft.list",
    "chars": 95,
    "preview": "# 内容:Kingsoft\n# 数量:3条\nDOMAIN-SUFFIX,iciba.com\nDOMAIN-SUFFIX,ksosoft.com\nDOMAIN-SUFFIX,ksyun.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Kuaishou.list",
    "chars": 76,
    "preview": "# 内容:Kuaishou 快手\n# 数量:2条\nDOMAIN-SUFFIX,kuaishou.com\nDOMAIN-SUFFIX,yximgs.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/LeTV.list",
    "chars": 55,
    "preview": "# 内容:Letv 乐视\n# 数量:1条\nDOMAIN-SUFFIX,api.mob.app.letv.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/LiTV.list",
    "chars": 85,
    "preview": "# 内容:LiTV\n# 数量:2条\nDOMAIN,litvfreemobile-hichannel.cdn.hinet.net\nDOMAIN-SUFFIX,litv.tv"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Line.list",
    "chars": 478,
    "preview": "# 内容:Line\n# 数量:15条\nDOMAIN-SUFFIX,lin.ee\nDOMAIN-SUFFIX,line-apps.com\nDOMAIN-SUFFIX,line-cdn.net\nDOMAIN-SUFFIX,line-scdn.n"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/LineTV.list",
    "chars": 199,
    "preview": "# 内容:LineTV\n# 数量:6条\nUSER-AGENT,LINE%20TV*\nUSER-AGENT,LINE*\nDOMAIN,d3c7rimkq79yfu.cloudfront.net\nDOMAIN-SUFFIX,d3c7rimkq7"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/MGTVTV.list",
    "chars": 94,
    "preview": "# 内容:MGTV 芒果TV\n# 数量:3条\nDOMAIN-SUFFIX,hitv.com\nDOMAIN-SUFFIX,hunantv.com\nDOMAIN-SUFFIX,mgtv.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/MI.list",
    "chars": 186,
    "preview": "# 内容:MI\n# 数量:7条\nDOMAIN-SUFFIX,duokan.com\nDOMAIN-SUFFIX,mi-img.com\nDOMAIN-SUFFIX,mi.com\nDOMAIN-SUFFIX,miui.com\nDOMAIN-SUF"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/MOO.list",
    "chars": 64,
    "preview": "# 内容:MOO\n# 数量:2条\nUSER-AGENT,MOO*\nUSER-AGENT,TencentMidasConnect*"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Marketing.list",
    "chars": 1666,
    "preview": "# 内容:Marketing 思杰马克丁软件\n# 数量:56条\nDOMAIN-SUFFIX,4009997658.com\nDOMAIN-SUFFIX,abbyychina.com\nDOMAIN-SUFFIX,bartender.cc\nDOM"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Meitu.list",
    "chars": 123,
    "preview": "# 内容:Meitu\n# 数量:4条\nDOMAIN-SUFFIX,meipai.com\nDOMAIN-SUFFIX,meitu.com\nDOMAIN-SUFFIX,meitudata.com\nDOMAIN-SUFFIX,meitustat."
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Microsoft.list",
    "chars": 2078,
    "preview": "# 内容:Microsoft\n# 数量:76条\nDOMAIN-KEYWORD,1drv\nDOMAIN-KEYWORD,microsoft\nDOMAIN-SUFFIX,aadrm.com\nDOMAIN-SUFFIX,acompli.com\nD"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/My5.list",
    "chars": 117,
    "preview": "# 内容:My5\n# 数量:4条\nUSER-AGENT,My5*\nDOMAIN,d349g9zuie06uo.cloudfront.net\nDOMAIN-SUFFIX,channel5.com\nDOMAIN-SUFFIX,my5.tv"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/MyTVSuper.list",
    "chars": 213,
    "preview": "# 内容:MyTVSuper\n# 数量:7条\nUSER-AGENT,mytv*\nDOMAIN-KEYWORD,nowtv100\nDOMAIN-KEYWORD,rthklive\nDOMAIN,mytvsuperlimited.hb.omtrd"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/NetEase.list",
    "chars": 236,
    "preview": "# 内容:NetEase\n# 数量:9条\nDOMAIN-SUFFIX,126.com\nDOMAIN-SUFFIX,126.net\nDOMAIN-SUFFIX,127.net\nDOMAIN-SUFFIX,163.com\nDOMAIN-SUFF"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/NetEaseMusic.list",
    "chars": 1235,
    "preview": "# 内容:NetEaseMusic 网易云音乐\n# 数量:34条\nDOMAIN-SUFFIX,163yun.com\nDOMAIN-SUFFIX,api.iplay.163.com\nDOMAIN-SUFFIX,hz.netease.com\nD"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Netflix.list",
    "chars": 1373,
    "preview": "# 内容:Netflix\n# 数量:42条\nUSER-AGENT,Argo*\nDOMAIN-KEYWORD,dualstack.apiproxy-\nDOMAIN-KEYWORD,dualstack.ichnaea-web-\nDOMAIN,n"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/NetflixIP.list",
    "chars": 30219,
    "preview": "# 内容:NetflixIP\n# 数量:863条\nIP-CIDR,3.0.5.32/29,no-resolve\nIP-CIDR,3.0.5.224/27,no-resolve\nIP-CIDR,3.6.70.76/30,no-resolve\n"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Niconico.list",
    "chars": 114,
    "preview": "# 内容:Niconico\n# 数量:4条\nUSER-AGENT,Niconico*\nDOMAIN-SUFFIX,dmc.nico\nDOMAIN-SUFFIX,nicovideo.jp\nDOMAIN-SUFFIX,nimg.jp"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/OneDrive.list",
    "chars": 542,
    "preview": "# 内容:OneDrive\n# 数量:18条\nUSER-AGENT,OneDrive*\nUSER-AGENT,OneDriveiOSApp*\nPROCESS-NAME,OneDrive\nPROCESS-NAME,OneDriveUpdate"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/PBS.list",
    "chars": 54,
    "preview": "# 内容:PBS\n# 数量:2条\nUSER-AGENT,PBS*\nDOMAIN-SUFFIX,pbs.org"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/PDD.list",
    "chars": 76,
    "preview": "# 内容:PDD 拼多多\n# 数量:2条\nDOMAIN-SUFFIX,pinduoduo.com\nDOMAIN-SUFFIX,yangkeduo.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/PPTVPPLive.list",
    "chars": 72,
    "preview": "# 内容:PPTV、PPLive\n# 数量:2条\nDOMAIN-SUFFIX,pplive.com\nDOMAIN-SUFFIX,pptv.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Pandora.list",
    "chars": 66,
    "preview": "# 内容:Pandora\n# 数量:2条\nUSER-AGENT,Pandora*\nDOMAIN-SUFFIX,pandora.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Pixiv.list",
    "chars": 66,
    "preview": "# 内容:Pixiv\n# 数量:2条\nDOMAIN-SUFFIX,pixiv.net\nDOMAIN-SUFFIX,pximg.net"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Porn.list",
    "chars": 621,
    "preview": "# 内容:Porn\n# 数量:23条\nDOMAIN-KEYWORD,porn\nDOMAIN-SUFFIX,8teenxxx.com\nDOMAIN-SUFFIX,ahcdn.com\nDOMAIN-SUFFIX,bcvcdn.com\nDOMAI"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Pornhub.list",
    "chars": 130,
    "preview": "# 内容:Pornhub\n# 数量:4条\nDOMAIN-SUFFIX,phncdn.com\nDOMAIN-SUFFIX,phprcdn.com\nDOMAIN-SUFFIX,pornhub.com\nDOMAIN-SUFFIX,pornhubp"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/PrivateTracker.list",
    "chars": 3020,
    "preview": "# 内容:Private Tracker\n# 数量:112条\nDOMAIN-KEYWORD,announce\nDOMAIN-KEYWORD,torrent\nDOMAIN-KEYWORD,tracker\nDOMAIN-SUFFIX,52pt."
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/PublicDirectCDN.list",
    "chars": 195,
    "preview": "# 内容:Public Direct CDN 公共直连\n# 数量:6条\nDOMAIN-SUFFIX,baomitu.com\nDOMAIN-SUFFIX,bootcss.com\nDOMAIN-SUFFIX,jiasule.com\nDOMAIN"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Qobuz.list",
    "chars": 42,
    "preview": "# 内容:Qobuz\n# 数量:1条\nDOMAIN-SUFFIX,qobuz.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Reddit.list",
    "chars": 106,
    "preview": "# 内容:Reddit Services\n# 数量:3条\n\nDOMAIN-SUFFIX,redditmedia.com\nDOMAIN-SUFFIX,redd.it\nDOMAIN-SUFFIX,reddit.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Scholar.list",
    "chars": 2083,
    "preview": "# 内容:Scholar 国内外学术网站\n# 数量:76条\nDOMAIN-SUFFIX,acm.org\nDOMAIN-SUFFIX,acs.org\nDOMAIN-SUFFIX,aip.org\nDOMAIN-SUFFIX,ams.org\nDO"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Sina.list",
    "chars": 216,
    "preview": "# 内容:Sina\n# 数量:8条\nDOMAIN-SUFFIX,leju.com\nDOMAIN-SUFFIX,miaopai.com\nDOMAIN-SUFFIX,sina.com\nDOMAIN-SUFFIX,sinaapp.com\nDOMA"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/SohuSogo.list",
    "chars": 271,
    "preview": "# 内容:Sohu Sogo\n# 数量:10条\nDOMAIN-SUFFIX,go2map.com\nDOMAIN-SUFFIX,sogo.com\nDOMAIN-SUFFIX,sogou.com\nDOMAIN-SUFFIX,sogoucdn.c"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Sony.list",
    "chars": 180,
    "preview": "# 内容:Sony\n# 数量:5条\nDOMAIN-SUFFIX,playstation.com\nDOMAIN-SUFFIX,playstation.net\nDOMAIN-SUFFIX,playstationnetwork.com\nDOMAI"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/SoundCloud.list",
    "chars": 123,
    "preview": "# 内容:SoundCloud\n# 数量:4条\nUSER-AGENT,SoundCloud*\nDOMAIN-SUFFIX,p-cdn.us\nDOMAIN-SUFFIX,sndcdn.com\nDOMAIN-SUFFIX,soundcloud."
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Spark.list",
    "chars": 162,
    "preview": "# 内容:Spark\n# 数量:5条\nDOMAIN-SUFFIX,amplitude.com\nDOMAIN-SUFFIX,firebaseio.com\nDOMAIN-SUFFIX,hockeyapp.net\nDOMAIN-SUFFIX,re"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Spotify.list",
    "chars": 247,
    "preview": "# 内容:Spotify\n# 数量:9条\nUSER-AGENT,Spotify*\nDOMAIN-KEYWORD,-spotify-com\nDOMAIN-KEYWORD,spotify.com\nDOMAIN-SUFFIX,pscdn.co\nD"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Steam.list",
    "chars": 110,
    "preview": "# 内容:Steam\n# 数量:3条\nDOMAIN-SUFFIX,fanatical.com\nDOMAIN-SUFFIX,humblebundle.com\nDOMAIN-SUFFIX,steamcommunity.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/SteamCN.list",
    "chars": 493,
    "preview": "# 内容:SteamCN\n# 数量:14条\nDOMAIN-SUFFIX,csgo.wmsj.cn\nDOMAIN-SUFFIX,dl.steam.ksyna.com\nDOMAIN-SUFFIX,dota2.wmsj.cn\nDOMAIN-SUF"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TIDAL.list",
    "chars": 129,
    "preview": "# 内容:TIDAL\n# 数量:4条\nUSER-AGENT,TIDAL*\nDOMAIN-SUFFIX,tidal-cms.s3.amazonaws.com\nDOMAIN-SUFFIX,tidal.com\nDOMAIN-SUFFIX,tida"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TaiWanGood.list",
    "chars": 105,
    "preview": "# 内容:TaiWanGood 台湾好\n# 数量:3条\nUSER-AGENT,TaiwanGood*\nDOMAIN,hamifans.emome.net\nDOMAIN-SUFFIX,skyking.com.tw"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TapTap.list",
    "chars": 64,
    "preview": "# 内容:TapTap\n# 数量:2条\nDOMAIN-SUFFIX,tap.io\nDOMAIN-SUFFIX,taptap.tw"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TeamViewer.list",
    "chars": 375,
    "preview": "# 内容:TeamViewer\n# 数量:10条\nDOMAIN-SUFFIX,teamviewer.com\nIP-CIDR,109.239.140.0/24,no-resolve\nIP-CIDR,139.220.243.27/32,no-r"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Telegram.list",
    "chars": 416,
    "preview": "# 内容:Telegram\n# 数量:13条\nDOMAIN-KEYWORD,telegram\nDOMAIN-SUFFIX,t.me\nDOMAIN-SUFFIX,tdesktop.com\nDOMAIN-SUFFIX,telegra.ph\nDO"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Tencent.list",
    "chars": 507,
    "preview": "# 内容:Tencent\n# 数量:19条\nDOMAIN-SUFFIX,foxmail.com\nDOMAIN-SUFFIX,gtimg.com\nDOMAIN-SUFFIX,idqqimg.com\nDOMAIN-SUFFIX,igamecj."
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TencentLolm.list",
    "chars": 99,
    "preview": "# 内容:腾讯Lol手游\n# 数量:3条\nDOMAIN-SUFFIX,riotcdn.net\nDOMAIN-SUFFIX,wr.pvp.net\nDOMAIN-SUFFIX,riotgames.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TencentVideo.list",
    "chars": 88,
    "preview": "# 内容:TencentVideo 腾讯视频\n# 数量:2条\nDOMAIN-SUFFIX,v.smtcdns.com\nDOMAIN-SUFFIX,vv.video.qq.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TeraBox.list",
    "chars": 75,
    "preview": "# 内容:TeraBox\n# 数量:2条\nDOMAIN-SUFFIX,terabox.com\nDOMAIN-SUFFIX,teraboxcdn.com"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/TikTok.list",
    "chars": 311,
    "preview": "# 内容:TikTok\n# 数量:11条\nUSER-AGENT,TikTok*\nDOMAIN-KEYWORD,-tiktokcdn-com\nDOMAIN-SUFFIX,byteoversea.com\nDOMAIN-SUFFIX,ibyted"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Topblockedsites.list",
    "chars": 2952,
    "preview": "# 内容:Top Blocked Sites\n# 数量:110条\nDOMAIN-SUFFIX,4sqi.net\nDOMAIN-SUFFIX,a248.e.akamai.net\nDOMAIN-SUFFIX,adobedtm.com\nDOMAI"
  },
  {
    "path": "base/rules/ACL4SSR/Clash/Ruleset/Twitch.list",
    "chars": 140,
    "preview": "# 内容:Twitch\n# 数量:5条\nDOMAIN-KEYWORD,ttvnw\nDOMAIN-SUFFIX,jtvnw.net\nDOMAIN-SUFFIX,ttvnw.net\nDOMAIN-SUFFIX,twitch.tv\nDOMAIN-"
  }
]

// ... and 308 more files (download for full content)

About this extraction

This page contains the full source code of the tindy2013/subconverter GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 508 files (5.1 MB), approximately 1.4M tokens, and a symbol index with 1572 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!