├── .gitignore ├── LICENSE ├── README.md ├── data └── .gitkeep └── images ├── ida_0.png ├── ida_1.png ├── ida_2.png ├── ida_3.png ├── ida_4.png ├── ida_5.png ├── ida_6.png ├── ida_7.png ├── ida_8.png ├── ida_9.png ├── ida_a.png ├── ida_b.png ├── ida_c.png ├── sql_0.png ├── sql_1.png ├── sql_2.png ├── sql_3.png └── sql_4.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/python,jetbrains,visualstudiocode 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=python,jetbrains,visualstudiocode 3 | 4 | ### JetBrains ### 5 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 6 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 7 | 8 | # User-specific stuff 9 | .idea/**/workspace.xml 10 | .idea/**/tasks.xml 11 | .idea/**/usage.statistics.xml 12 | .idea/**/dictionaries 13 | .idea/**/shelf 14 | 15 | # AWS User-specific 16 | .idea/**/aws.xml 17 | 18 | # Generated files 19 | .idea/**/contentModel.xml 20 | 21 | # Sensitive or high-churn files 22 | .idea/**/dataSources/ 23 | .idea/**/dataSources.ids 24 | .idea/**/dataSources.local.xml 25 | .idea/**/sqlDataSources.xml 26 | .idea/**/dynamic.xml 27 | .idea/**/uiDesigner.xml 28 | .idea/**/dbnavigator.xml 29 | 30 | # Gradle 31 | .idea/**/gradle.xml 32 | .idea/**/libraries 33 | 34 | # Gradle and Maven with auto-import 35 | # When using Gradle or Maven with auto-import, you should exclude module files, 36 | # since they will be recreated, and may cause churn. Uncomment if using 37 | # auto-import. 38 | # .idea/artifacts 39 | # .idea/compiler.xml 40 | # .idea/jarRepositories.xml 41 | # .idea/modules.xml 42 | # .idea/*.iml 43 | # .idea/modules 44 | # *.iml 45 | # *.ipr 46 | 47 | # CMake 48 | cmake-build-*/ 49 | 50 | # Mongo Explorer plugin 51 | .idea/**/mongoSettings.xml 52 | 53 | # File-based project format 54 | *.iws 55 | 56 | # IntelliJ 57 | out/ 58 | 59 | # mpeltonen/sbt-idea plugin 60 | .idea_modules/ 61 | 62 | # JIRA plugin 63 | atlassian-ide-plugin.xml 64 | 65 | # Cursive Clojure plugin 66 | .idea/replstate.xml 67 | 68 | # SonarLint plugin 69 | .idea/sonarlint/ 70 | 71 | # Crashlytics plugin (for Android Studio and IntelliJ) 72 | com_crashlytics_export_strings.xml 73 | crashlytics.properties 74 | crashlytics-build.properties 75 | fabric.properties 76 | 77 | # Editor-based Rest Client 78 | .idea/httpRequests 79 | 80 | # Android studio 3.1+ serialized cache file 81 | .idea/caches/build_file_checksums.ser 82 | 83 | ### JetBrains Patch ### 84 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 85 | 86 | # *.iml 87 | # modules.xml 88 | # .idea/misc.xml 89 | # *.ipr 90 | 91 | # Sonarlint plugin 92 | # https://plugins.jetbrains.com/plugin/7973-sonarlint 93 | .idea/**/sonarlint/ 94 | 95 | # SonarQube Plugin 96 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin 97 | .idea/**/sonarIssues.xml 98 | 99 | # Markdown Navigator plugin 100 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced 101 | .idea/**/markdown-navigator.xml 102 | .idea/**/markdown-navigator-enh.xml 103 | .idea/**/markdown-navigator/ 104 | 105 | # Cache file creation bug 106 | # See https://youtrack.jetbrains.com/issue/JBR-2257 107 | .idea/$CACHE_FILE$ 108 | 109 | # CodeStream plugin 110 | # https://plugins.jetbrains.com/plugin/12206-codestream 111 | .idea/codestream.xml 112 | 113 | # Azure Toolkit for IntelliJ plugin 114 | # https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij 115 | .idea/**/azureSettings.xml 116 | 117 | ### Python ### 118 | # Byte-compiled / optimized / DLL files 119 | __pycache__/ 120 | *.py[cod] 121 | *$py.class 122 | 123 | # C extensions 124 | *.so 125 | 126 | # Distribution / packaging 127 | .Python 128 | build/ 129 | develop-eggs/ 130 | dist/ 131 | downloads/ 132 | eggs/ 133 | .eggs/ 134 | lib/ 135 | lib64/ 136 | parts/ 137 | sdist/ 138 | var/ 139 | wheels/ 140 | share/python-wheels/ 141 | *.egg-info/ 142 | .installed.cfg 143 | *.egg 144 | MANIFEST 145 | 146 | # PyInstaller 147 | # Usually these files are written by a python script from a template 148 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 149 | *.manifest 150 | *.spec 151 | 152 | # Installer logs 153 | pip-log.txt 154 | pip-delete-this-directory.txt 155 | 156 | # Unit test / coverage reports 157 | htmlcov/ 158 | .tox/ 159 | .nox/ 160 | .coverage 161 | .coverage.* 162 | .cache 163 | nosetests.xml 164 | coverage.xml 165 | *.cover 166 | *.py,cover 167 | .hypothesis/ 168 | .pytest_cache/ 169 | cover/ 170 | 171 | # Translations 172 | *.mo 173 | *.pot 174 | 175 | # Django stuff: 176 | *.log 177 | local_settings.py 178 | db.sqlite3 179 | db.sqlite3-journal 180 | 181 | # Flask stuff: 182 | instance/ 183 | .webassets-cache 184 | 185 | # Scrapy stuff: 186 | .scrapy 187 | 188 | # Sphinx documentation 189 | docs/_build/ 190 | 191 | # PyBuilder 192 | .pybuilder/ 193 | target/ 194 | 195 | # Jupyter Notebook 196 | .ipynb_checkpoints 197 | 198 | # IPython 199 | profile_default/ 200 | ipython_config.py 201 | 202 | # pyenv 203 | # For a library or package, you might want to ignore these files since the code is 204 | # intended to run in multiple environments; otherwise, check them in: 205 | # .python-version 206 | 207 | # pipenv 208 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 209 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 210 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 211 | # install all needed dependencies. 212 | #Pipfile.lock 213 | 214 | # poetry 215 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 216 | # This is especially recommended for binary packages to ensure reproducibility, and is more 217 | # commonly ignored for libraries. 218 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 219 | #poetry.lock 220 | 221 | # pdm 222 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 223 | #pdm.lock 224 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 225 | # in version control. 226 | # https://pdm.fming.dev/#use-with-ide 227 | .pdm.toml 228 | 229 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 230 | __pypackages__/ 231 | 232 | # Celery stuff 233 | celerybeat-schedule 234 | celerybeat.pid 235 | 236 | # SageMath parsed files 237 | *.sage.py 238 | 239 | # Environments 240 | .env 241 | .venv 242 | env/ 243 | venv/ 244 | ENV/ 245 | env.bak/ 246 | venv.bak/ 247 | 248 | # Spyder project settings 249 | .spyderproject 250 | .spyproject 251 | 252 | # Rope project settings 253 | .ropeproject 254 | 255 | # mkdocs documentation 256 | /site 257 | 258 | # mypy 259 | .mypy_cache/ 260 | .dmypy.json 261 | dmypy.json 262 | 263 | # Pyre type checker 264 | .pyre/ 265 | 266 | # pytype static type analyzer 267 | .pytype/ 268 | 269 | # Cython debug symbols 270 | cython_debug/ 271 | 272 | # PyCharm 273 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 274 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 275 | # and can be added to the global gitignore or merged into this file. For a more nuclear 276 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 277 | #.idea/ 278 | 279 | ### Python Patch ### 280 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 281 | poetry.toml 282 | 283 | # ruff 284 | .ruff_cache/ 285 | 286 | # LSP config files 287 | pyrightconfig.json 288 | 289 | ### VisualStudioCode ### 290 | .vscode/* 291 | !.vscode/settings.json 292 | !.vscode/tasks.json 293 | !.vscode/launch.json 294 | !.vscode/extensions.json 295 | !.vscode/*.code-snippets 296 | 297 | # Local History for Visual Studio Code 298 | .history/ 299 | 300 | # Built Visual Studio Code Extensions 301 | *.vsix 302 | 303 | ### VisualStudioCode Patch ### 304 | # Ignore all local history of files 305 | .history 306 | .ionide 307 | 308 | # End of https://www.toptal.com/developers/gitignore/api/python,jetbrains,visualstudiocode 309 | 310 | # Database files 311 | *.db 312 | 313 | # Exported files 314 | *.json 315 | 316 | # Output folder 317 | /output 318 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 mobyw 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # QQ 群聊年度报告! 4 | 5 | 使用 QQNT Windows 客户端导出群聊聊天记录并制作年度报告。 6 | 7 | ## 准备工作 8 | 9 | 1. QQNT Windows 客户端 10 | 11 | 请在官方网站下载 QQNT Windows 客户端。 12 | 13 | 本文所述的方法在 9.9.6.20201, 9.9.6-19689, 9.9.6-19189 版本中测试通过。根据参考资料的描述,在 9.9.3-17749, 9.9.3-17412 版本也测试通过。 14 | 15 | 2. IDA Pro 16 | 17 | 下载地址:,解压后根目录的 `ida64.exe` 为本文需要使用的可执行文件。 18 | 19 | 3. DB Browser for SQLite 20 | 21 | 下载地址:,解压后根目录的 `DB Browser for SQLCipher.exe` 为本文需要使用的可执行文件。 22 | 23 | 4. Python 3 24 | 25 | 推荐使用 >=3.8 的版本,并添加到 PATH 环境变量中。 26 | 27 | ## 聊天记录导出 28 | 29 | 由于聊天记录数据库文件是加密的,需要先获取数据库密码。 30 | 31 | ### 获取数据库密码 32 | 33 | 方法来源: 34 | 35 | 1. 打开 `ida64.exe`,选择新建项目。 36 | 37 | 2. 在弹出的资源管理器界面中定位到 QQNT 安装目录下的 `./resources/app/versions/{version}` 文件夹,其中 `{version}` 为 QQNT 的版本号。在右下角过滤器中选择全部文件,单击 `wrapper.node` 文件,并点击右下角的 "Open" 按钮。 38 | 39 | ![](./images/ida_0.png) 40 | 41 | 3. 保持默认导入选项,点击 "OK" 按钮。如果有弹出 symbol 文件相关提示框点击 "No"。等待文件加载完成。 42 | 43 | 4. 按快捷键 Shift + F12 打开 Strings 标签,等待页面加载完成。切换到 Strings 标签使用鼠标单击内部区域,按快捷键 Ctrl + F 打开搜索框,输入 `nt_sqlite3_key_v2`。 44 | 45 | ![](./images/ida_1.png) 46 | 47 | 5. 双击 `nt_sqlite3_key_v2: db=%p zDb=%s` 一行,跳转到 IDA View-A 标签的对应行。 48 | 49 | 6. 点击顶部导航栏 "Options" 中的 "General..." 菜单项,打开 IDA Options 窗口。在 Disassembly 标签页中,将 Display assembly lines 中的 Source line numbers 勾选上,点击 "OK" 按钮。 50 | 51 | ![](./images/ida_2.png) 52 | 53 | ![](./images/ida_3.png) 54 | 55 | 7. 在 IDA View-A 标签中,单击 `nt_sqlite3_key_v2` 的名称 `aNtSqlite3KeyV2`,按快捷键 X 打开交叉引用窗口。 56 | 57 | ![](./images/ida_4.png) 58 | 59 | 8. 双击第一条结果,转到引用位置。 60 | 61 | ![](./images/ida_5.png) 62 | 63 | 9. 按快捷键 F5 进行反编译,如果有弹出窗口点击 "Yes"。等待反编译完成。 64 | 65 | ![](./images/ida_6.png) 66 | 67 | 10. 单击引用语句的左侧蓝色圆点添加断点。 68 | 69 | ![](./images/ida_7.png) 70 | 71 | 11. 修改 Debugger 下拉框的值为 "Local Windows Debugger"。 72 | 73 | ![](./images/ida_8.png) 74 | 75 | 12. 如果有正在运行的 QQNT 客户端,先全部退出。打开一个新的 QQNT 客户端,进入登录界面并暂停操作。 76 | 77 | 13. 在 IDA 中点击顶部导航栏 "Debugger" 中的 "Attach to process..." 菜单项,打开 "Attach to process" 窗口。从最后开始找到第一个 `QQ.exe` 进程,双击打开。 78 | 79 | ![](./images/ida_9.png) 80 | 81 | 14. 等待加载完成后按快捷键 F9 继续运行。 82 | 83 | 15. 进行登录操作,触发断点。 84 | 85 | 16. 在 IDA 中点击顶部导航栏 "Debugger" 中的 "Debugger windows" 菜单项,打开 Locals 选项卡。 86 | 87 | ![](./images/ida_a.png) 88 | 89 | 17. 右击 Locals 选项卡的 `a3`,点击 "Jump to..." 菜单项。 90 | 91 | ![](./images/ida_b.png) 92 | 93 | 18. 记录对应地址从 `0` 到 `F` 的 16 个字节对应的字符串,即为数据库密码。 94 | 95 | ![](./images/ida_c.png) 96 | 97 | ### 数据导出 98 | 99 | 消息数据库默认位于 `%USERPROFILE%/Documents/Tencent Files/{qq}/nt_qq/nt_db/` 目录下,其中 `{qq}` 为 QQ 号。复制该目录下的 `nt_msg.db` 文件到本项目的 `./data/` 目录下。 100 | 101 | 1. 在复制过来的 `nt_msg.db` 所在文件夹运行以下命令,分离数据库头部与数据库本体。如果数据库文件较大,可能会花费较长时间。 102 | 103 | 使用 PowerShell 7: 104 | 105 | ```powershell 106 | $content = Get-Content -Path nt_msg.db -AsByteStream -Raw 107 | $content_header = $content[0..1024] 108 | $content_body = $content[1024..($content.length-1)] 109 | Set-Content -Path nt_msg.header.txt -Value $content_header -AsByteStream 110 | Set-Content -Path nt_msg.body.db -Value $content_body -AsByteStream 111 | ``` 112 | 113 | 如果安装有 WSL,可以在 WSL 中转到对应文件夹运行以下命令: 114 | 115 | ```bash 116 | cat nt_msg.db | head -c 1024 > nt_msg.header.txt 117 | cat nt_msg.db | tail -c +1025 > nt_msg.body.db 118 | ``` 119 | 120 | 2. 使用文本编辑器打开文件 `nt_msg.header.txt`,如果存在文本 `HMAC_` 则记录对应的 HMAC 算法。例如 `HMAC_SHA1` 对应的 HMAC 算法为 `SHA1`,如果没有对应文本则为 `SHA512`。 121 | 122 | 3. 打开 `DB Browser for SQLCipher.exe`,点击 "File" 菜单中的 "Open Database..." 菜单项,打开 `nt_msg.body.db` 文件。 123 | 124 | 4. 在弹出的 "SQLCipher encryption" 窗口中的 Password 输入框中输入数据库密码,Encryption settings 选择 "Custom",修改 KDF iterations 为 `4000`,修改 HMAC algorithm 为第 2 步所获取的 HMAC 算法,点击 "OK" 按钮。 125 | 126 | ![](./images/sql_0.png) 127 | 128 | 5. 在 Database Structure 标签页中,可以查看数据库中的表。其中 `c2c_msg_table` 表为私聊消息表;`group_msg_table` 表为群聊消息表。 129 | 130 | ![](./images/sql_1.png) 131 | 132 | 6. 在 Browse Data 标签页中,可以查看表中的数据;在 Execute SQL 标签页中,可以执行 SQL 语句。如果数据量不大,可以直接使用 SQL 语句进行数据分析。数据量较大或需要进行消息内容分析时,需要先进行数据过滤,然后导出。需要过滤单个群聊的 2024 年数据时,在 Execute SQL 标签页中执行(快捷键 F5)以下 SQL 语句,其中 `{group_id}` 为群号。 133 | 134 | ```sql 135 | SELECT * 136 | FROM group_msg_table 137 | WHERE "40027" = {group_id} 138 | AND "40058" >= 1704038400 139 | AND "40058" < 1735574400 140 | ``` 141 | 142 | 7. 待执行生成后,将结果保存为 view 并命名,如 `group_export`。 143 | 144 | ![](./images/sql_2.png) 145 | 146 | 8. 在 "File" 菜单中选择 "Export" 菜单项,点击 "Table(s) to JSON..."。 147 | 148 | ![](./images/sql_3.png) 149 | 150 | 9. 选择刚刚保存的 view,点击 "Save" 按钮,选择路径为本项目的 `./data/` 目录,等待导出完成。 151 | 152 | ![](./images/sql_4.png) 153 | 154 | ## 数据分析 155 | 156 | TODO 157 | 158 | ## 数据库字段含义 159 | 160 | `group_msg_table` 表中的部分列含义如下: 161 | 162 | | 列名 | 类型 | 含义 | 说明 | 163 | | ----- | ----- | ------------ | --------------------------------------------------------------------------------- | 164 | | 40001 | int | 消息 ID | | 165 | | 40003 | int | 消息序号 | 在每个群聊中依次递增 | 166 | | 40020 | str | UID | nt_uid, 对应 nt_uid_mapping_table | 167 | | 40021 | str | 群号 | | 168 | | 40027 | int | 群号 | | 169 | | 40030 | int | 群号 | QQNT 保存的群号 | 170 | | 40033 | int | 发送者 QQ 号 | QQNT 保存发送者 QQ 号 | 171 | | 40050 | int | 时间 | 时间戳 | 172 | | 40058 | int | 日期 | 当日 0 时整的时间戳格式,时区为 GMT+0800 | 173 | | 40090 | str | 发送者群名片 | 旧版 QQ 迁移数据中格式为 `name(12345)` 或 `name`, QQNT 中为群名片 | 174 | | 40093 | str | 发送者昵称 | 旧版 QQ 此字段为空,QQNT 中未设置群名片时才有此字段 | 175 | | 40600 | bytes | 撤回状态 | protobuf 格式 | 176 | | 40800 | bytes | 消息内容 | protobuf 格式 | 177 | | 40850 | int | 回复消息序号 | 该消息所回复的消息的序号 | 178 | 179 | ## Protobuf 消息格式 180 | 181 | 消息内容 protobuf 的部分字段含义如下: 182 | 183 | | Field Number | 类型 | 含义 | 说明 | 184 | | ------------ | -------------------------- | ------ | -------------------------------------------- | 185 | | 40800 | protobuf 或 protobuf array | 消息段 | 一条消息中可以有多个消息段,部分类型中可嵌套 | 186 | 187 | 消息段(40800)的部分字段含义如下: 188 | 189 | | Field Number | 类型 | 含义 | 说明 | 190 | | ------------ | -------- | -------------------------------------------------------- | ------------------ | 191 | | 45001 | int | 消息段 ID | | 192 | | 45002 | int | 消息类型 | 见下表 | 193 | | 45101 | str | 消息文本 | 适用于文本消息 | 194 | | 45102 | str | 图片文件名 | 适用于图片消息 | 195 | | 45402 | str | 图片文件名 | 适用于图片消息 | 196 | | 45411 | int | 图片宽度(压制后) | 适用于图片消息 | 197 | | 45412 | int | 图片高度(压制后) | 适用于图片消息 | 198 | | 45812 | str | 本地缓存目录 | 适用于图片消息 | 199 | | 45815 | str | 替代文本,如 "[动画表情]" | 适用于图片消息 | 200 | | 47402 | int | 原消息序号 | 适用于引用消息 | 201 | | 47403 | int | 原消息发送者 | 适用于引用消息 | 202 | | 47404 | int | 原消息时间 | 适用于引用消息 | 203 | | 47410 | protobuf | 格式复杂,存储原消息文本,疑似原消息过期后用以替代 47423 | 适用于引用消息 | 204 | | 47413 | str | 显示的引用文本 | 适用于引用消息 | 205 | | 47423 | protobuf | 引用消息段(嵌套) | 适用于引用消息 | 206 | | 47713 | str | 撤回消息后缀 | 适用于系统撤回消息 | 207 | | 48602 | str | XML 消息内容 | 适用于 XML 消息 | 208 | 209 | 其中消息类型(45002)的已知消息类型与对应序号如下: 210 | 211 | | 45002 | 含义 | 说明 | 212 | | ----- | -------- | --------------------------------------------------------------------------------------- | 213 | | 1 | 文本消息 | 普通纯文本消息,以及 at 消息本质上为**独立成消息段**且内容为 "@群昵称" 的消息,包含于此 | 214 | | 2 | 图片消息 | | 215 | | 3 | 文件消息 | | 216 | | 4 | 语音消息 | | 217 | | 6 | 表情 | | 218 | | 7 | 引用 | 即常说的“回复”,位于消息段开头,其后为正式消息 | 219 | | 8 | 系统消息 | 显示于屏幕中央的灰色小字提示,如撤回、接收文件 | 220 | | 10 | 应用消息 | | 221 | | 11 | 表情 | | 222 | | 16 | XML 消息 | 转发聊天记录本质上也是 XML 消息,包含于此 | 223 | | 21 | 通话消息 | | 224 | | 26 | 动态消息 | | 225 | 226 | QQDecrypt: 227 | -------------------------------------------------------------------------------- /data/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/data/.gitkeep -------------------------------------------------------------------------------- /images/ida_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_0.png -------------------------------------------------------------------------------- /images/ida_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_1.png -------------------------------------------------------------------------------- /images/ida_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_2.png -------------------------------------------------------------------------------- /images/ida_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_3.png -------------------------------------------------------------------------------- /images/ida_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_4.png -------------------------------------------------------------------------------- /images/ida_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_5.png -------------------------------------------------------------------------------- /images/ida_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_6.png -------------------------------------------------------------------------------- /images/ida_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_7.png -------------------------------------------------------------------------------- /images/ida_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_8.png -------------------------------------------------------------------------------- /images/ida_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_9.png -------------------------------------------------------------------------------- /images/ida_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_a.png -------------------------------------------------------------------------------- /images/ida_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_b.png -------------------------------------------------------------------------------- /images/ida_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/ida_c.png -------------------------------------------------------------------------------- /images/sql_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/sql_0.png -------------------------------------------------------------------------------- /images/sql_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/sql_1.png -------------------------------------------------------------------------------- /images/sql_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/sql_2.png -------------------------------------------------------------------------------- /images/sql_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/sql_3.png -------------------------------------------------------------------------------- /images/sql_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mobyw/GroupChatAnnualReport/521810f648b8c6a02aeb15f4671d1ff55054d6a2/images/sql_4.png --------------------------------------------------------------------------------