From 9392027106b3a189bd7484ed40a36625dcb1ddd4 Mon Sep 17 00:00:00 2001 From: shen <> Date: Mon, 27 Jul 2026 21:43:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=98=85=E8=AF=BB=E5=99=A8?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E4=B8=8E=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/RDAIReaderView/RDAIReaderView-AI-SPEC.md | 411 ++ Doc/RDAIReaderView/RDAIReaderView-API.md | 604 +++ .../RDAIReaderView-ARCHITECTURE.md | 431 ++ .../RDAIReaderView-RELEASE-CHECKLIST.md | 36 + Doc/RDAIReaderView/RDAIReaderView-SPEC.md | 287 + .../RDAIReaderView-TEST-PLAN.md | 473 ++ Doc/index.md | 8 +- ReadViewDemo/Podfile | 8 + ReadViewDemo/Podfile.lock | 53 +- .../RDAIReaderView.podspec.json | 60 + .../RDEpubReaderView.podspec.json | 25 +- .../RDPDFReaderView.podspec.json | 23 + .../RDSpeechReaderView.podspec.json | 39 + ReadViewDemo/Pods/Manifest.lock | 53 +- .../Pods/Pods.xcodeproj/project.pbxproj | 4704 ++++++++++------- ...mo-frameworks-Debug-input-files.xcfilelist | 2 + ...o-frameworks-Debug-output-files.xcfilelist | 2 + ...-frameworks-Release-input-files.xcfilelist | 2 + ...frameworks-Release-output-files.xcfilelist | 2 + .../Pods-ReadViewDemo-frameworks.sh | 4 + .../Pods-ReadViewDemo.debug.xcconfig | 8 +- .../Pods-ReadViewDemo.release.xcconfig | 8 +- .../RDAIReaderView/RDAIReaderView-Info.plist | 26 + .../RDAIReaderView/RDAIReaderView-dummy.m | 5 + .../RDAIReaderView/RDAIReaderView-prefix.pch | 12 + .../RDAIReaderView/RDAIReaderView-umbrella.h | 16 + .../RDAIReaderView.debug.xcconfig | 15 + .../RDAIReaderView/RDAIReaderView.modulemap | 6 + .../RDAIReaderView.release.xcconfig | 15 + .../RDEpubReaderView.debug.xcconfig | 4 +- .../RDEpubReaderView.release.xcconfig | 4 +- .../RDPDFReaderView.debug.xcconfig | 4 +- .../RDPDFReaderView.release.xcconfig | 4 +- .../RDSpeechReaderView-Info.plist | 26 + .../RDSpeechReaderView-dummy.m | 5 + .../RDSpeechReaderView-prefix.pch | 12 + .../RDSpeechReaderView-umbrella.h | 16 + .../RDSpeechReaderView.debug.xcconfig | 16 + .../RDSpeechReaderView.modulemap | 6 + .../RDSpeechReaderView.release.xcconfig | 16 + .../ReadViewDemo.xcodeproj/project.pbxproj | 44 +- ReadViewDemo/ReadViewDemo/Info.plist | 4 + .../PDFDemoReaderViewController.swift | 79 + .../RDAIReaderView/Core/RDAIDiagnostics.swift | 23 + .../Core/RDAIIndexService.swift | 528 ++ .../Core/RDAILocatorBuilder.swift | 44 + .../Core/RDAIReaderContracts.swift | 448 ++ .../Core/RDAISQLiteIndexStore.swift | 125 + .../RDAIAppleFoundationModelsProvider.swift | 77 + .../RDAINaturalLanguageAnalyzer.swift | 171 + .../RDAINaturalLanguageSemanticScorer.swift | 19 + Sources/RDAIReaderView/RDAIReaderView.podspec | 37 + Sources/RDAIReaderView/README.md | 38 + .../RDAIReaderAssistantViewController.swift | 136 + .../AI/RDEPUBAIContentProvider.swift | 198 + .../RDEPUBReaderController+DataSource.swift | 6 +- .../RDEPUBReaderController+PublicAPI.swift | 12 + ...RDEPUBReaderController+RenderSupport.swift | 4 +- .../EPUBUI/RDEPUBReaderController.swift | 5 + .../RDEPUBReaderContext.swift | 5 + .../ReaderController/RDEPUBReaderState.swift | 3 + .../RDEpubReaderView/RDEpubReaderView.podspec | 13 +- .../Speech/RDEPUBSpeechContentProvider.swift | 108 + .../AI/RDPDFAIContentProvider.swift | 169 + .../RDPDFReaderView/RDPDFReaderView.podspec | 11 + .../Sources/RDPDFReaderContracts.swift | 4 +- .../RDPDFReaderImageTextLayerView.swift | 14 + .../Sources/RDPDFReaderPageView.swift | 5 + .../Sources/RDPDFReaderViewController.swift | 61 + .../Speech/RDPDFSpeechContentProvider.swift | 106 + .../Speech/RDPDFSpeechSession.swift | 59 + .../AIBridge/RDAISpeechContentProvider.swift | 34 + .../RDSpeechReaderView.podspec | 20 + Sources/RDSpeechReaderView/README.md | 46 + .../Sources/RDSpeechReaderContracts.swift | 199 + .../Sources/RDSpeechReaderControlView.swift | 106 + .../Sources/RDSpeechReaderController.swift | 381 ++ .../Sources/RDSpeechTextPreprocessor.swift | 71 + 78 files changed, 8780 insertions(+), 2084 deletions(-) create mode 100644 Doc/RDAIReaderView/RDAIReaderView-AI-SPEC.md create mode 100644 Doc/RDAIReaderView/RDAIReaderView-API.md create mode 100644 Doc/RDAIReaderView/RDAIReaderView-ARCHITECTURE.md create mode 100644 Doc/RDAIReaderView/RDAIReaderView-RELEASE-CHECKLIST.md create mode 100644 Doc/RDAIReaderView/RDAIReaderView-SPEC.md create mode 100644 Doc/RDAIReaderView/RDAIReaderView-TEST-PLAN.md create mode 100644 ReadViewDemo/Pods/Local Podspecs/RDAIReaderView.podspec.json create mode 100644 ReadViewDemo/Pods/Local Podspecs/RDSpeechReaderView.podspec.json create mode 100644 ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-Info.plist create mode 100644 ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-dummy.m create mode 100644 ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-prefix.pch create mode 100644 ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-umbrella.h create mode 100644 ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.debug.xcconfig create mode 100644 ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.modulemap create mode 100644 ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.release.xcconfig create mode 100644 ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-Info.plist create mode 100644 ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-dummy.m create mode 100644 ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-prefix.pch create mode 100644 ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-umbrella.h create mode 100644 ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.debug.xcconfig create mode 100644 ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.modulemap create mode 100644 ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.release.xcconfig create mode 100644 Sources/RDAIReaderView/Core/RDAIDiagnostics.swift create mode 100644 Sources/RDAIReaderView/Core/RDAIIndexService.swift create mode 100644 Sources/RDAIReaderView/Core/RDAILocatorBuilder.swift create mode 100644 Sources/RDAIReaderView/Core/RDAIReaderContracts.swift create mode 100644 Sources/RDAIReaderView/Core/RDAISQLiteIndexStore.swift create mode 100644 Sources/RDAIReaderView/FoundationModels/RDAIAppleFoundationModelsProvider.swift create mode 100644 Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageAnalyzer.swift create mode 100644 Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageSemanticScorer.swift create mode 100644 Sources/RDAIReaderView/RDAIReaderView.podspec create mode 100644 Sources/RDAIReaderView/README.md create mode 100644 Sources/RDAIReaderView/UI/RDAIReaderAssistantViewController.swift create mode 100644 Sources/RDEpubReaderView/AI/RDEPUBAIContentProvider.swift create mode 100644 Sources/RDEpubReaderView/Speech/RDEPUBSpeechContentProvider.swift create mode 100644 Sources/RDPDFReaderView/AI/RDPDFAIContentProvider.swift create mode 100644 Sources/RDPDFReaderView/Speech/RDPDFSpeechContentProvider.swift create mode 100644 Sources/RDPDFReaderView/Speech/RDPDFSpeechSession.swift create mode 100644 Sources/RDSpeechReaderView/AIBridge/RDAISpeechContentProvider.swift create mode 100644 Sources/RDSpeechReaderView/RDSpeechReaderView.podspec create mode 100644 Sources/RDSpeechReaderView/README.md create mode 100644 Sources/RDSpeechReaderView/Sources/RDSpeechReaderContracts.swift create mode 100644 Sources/RDSpeechReaderView/Sources/RDSpeechReaderControlView.swift create mode 100644 Sources/RDSpeechReaderView/Sources/RDSpeechReaderController.swift create mode 100644 Sources/RDSpeechReaderView/Sources/RDSpeechTextPreprocessor.swift diff --git a/Doc/RDAIReaderView/RDAIReaderView-AI-SPEC.md b/Doc/RDAIReaderView/RDAIReaderView-AI-SPEC.md new file mode 100644 index 0000000..8b87d6b --- /dev/null +++ b/Doc/RDAIReaderView/RDAIReaderView-AI-SPEC.md @@ -0,0 +1,411 @@ +# RDAIReaderView AI 系统设计合同 + +**文档状态:** Draft 0.1 +**最后更新:** 2026-07-25 +**目标版本:** RDAIReaderView 1.0 + +## 1. 系统分类 + +RDAIReaderView 是一个本地优先的 Retrieval-Augmented Generation 阅读系统,包含: + +- 确定性 NLP:语言识别、分句、实体候选、词法检索。 +- 本地语义检索:Natural Language embeddings。 +- 生成式任务:摘要、书内问答、人物卡片和人物关系。 +- 引用约束:生成内容必须映射到 PDF/EPUB 原文。 + +系统不是通用聊天机器人,也不把模型自身知识作为书籍事实来源。 + +## 2. 框架选择 + +### 2.1 主框架 + +- Apple Natural Language:iOS 15+ 基础分析和检索。 +- Apple Foundation Models:支持设备上的生成式增强。 +- Vision:扫描 PDF OCR,继续复用 RDPDFReaderView 现有能力。 + +### 2.2 选择理由 + +- 与当前纯 Swift/UIKit/CocoaPods 架构一致。 +- 默认设备端处理,不需要新增服务端和书籍上传链路。 +- Natural Language 可覆盖不支持 Apple Intelligence 的设备。 +- Foundation Models 支持 structured generation 和 tool calling。 +- 系统 API 可与现有 PDF/EPUB 定位直接结合。 + +### 2.3 未选择的首版方案 + +| 方案 | 首版不采用原因 | +|------|----------------| +| LangChain/LlamaIndex | 主要面向 Python/服务端,增加不必要基础设施 | +| 云端 LLM | 引入内容上传、成本、隐私、版权和网络可用性问题 | +| ONNX Runtime 自带模型 | 需要自行选择、量化、分发和维护语言模型 | +| 自训练 Foundation Models Adapter | 模型版本绑定和 entitlement 增加发布复杂度 | + +Core 保留 `RDAIGenerativeProvider`,以后可以增加其他 Provider,不把 Apple 实现写死在公共业务层。 + +## 3. 模型可用性合同 + +调用 Foundation Models 前必须检查: + +1. API 在当前系统可用。 +2. `SystemLanguageModel.default.availability` 为 available。 +3. 当前 Locale 被支持。 +4. 当前请求未超过并发限制。 +5. 当前任务的上下文预算可满足。 + +不可用原因映射: + +| Apple 状态 | RDAI 状态 | UI 行为 | +|------------|-----------|---------| +| deviceNotEligible | `.deviceNotEligible` | 隐藏生成操作,保留基础分析 | +| appleIntelligenceNotEnabled | `.appleIntelligenceNotEnabled` | 说明可在系统设置中开启 | +| modelNotReady | `.modelNotReady` | 展示模型准备中,可稍后重试 | +| unsupported locale | `.languageUnsupported` | 保留检索,关闭生成 | +| unknown | `.unknown` | 通用不可用状态,允许重试 | + +禁止通过静态设备型号列表推断可用性,运行时状态是唯一依据。 + +参考: + +- [Foundation Models](https://developer.apple.com/documentation/FoundationModels) +- [SystemLanguageModel](https://developer.apple.com/documentation/FoundationModels/SystemLanguageModel) +- [语言与 Locale 支持](https://developer.apple.com/documentation/foundationmodels/supporting-languages-and-locales-with-foundation-models) + +## 4. 输入与上下文策略 + +### 4.1 唯一事实来源 + +模型可以使用: + +- 本次请求提供的 Passage。 +- Passage 的章节标题、页码/资源信息。 +- 用户当前问题。 +- 非内容性规则,例如输出语言和防剧透范围。 + +模型不得把训练知识、其他书籍、互联网知识或先前书籍会话作为当前书籍事实来源。 + +### 4.2 上下文预算 + +运行时读取模型 `contextSize`,并使用 `tokenCount(for:)` 估算。 + +初始预算比例: + +- 12%:instructions 和 schema。 +- 5%:用户问题。 +- 60%:检索 Passage。 +- 17%:输出。 +- 6%:安全余量。 + +若预算不足,按以下顺序处理: + +1. 删除低分 Passage。 +2. 缩短 Passage 到完整句子边界。 +3. 使用预计算的有引用片段摘要。 +4. 创建新会话。 +5. 仍不足则返回 `contextLimitExceeded`。 + +不得静默截断引用或生成半个结构化对象。 + +参考:[Managing the context window](https://developer.apple.com/documentation/foundationmodels/managing-the-context-window) + +## 5. Prompt 资产管理 + +Prompt 作为版本化代码资产保存: + +```text +FoundationModels/Prompts/ +├── summary_v1.swift +├── answer_v1.swift +├── characters_v1.swift +└── relationships_v1.swift +``` + +每个 Prompt 定义: + +- `identifier` +- `version` +- `minimumModelProfile` +- `instructions` +- 输入构造器 +- 输出 schema +- 评测集标签 + +修改 Prompt 必须: + +1. 增加版本号。 +2. 跑完整离线评测集。 +3. 与上一版本对比准确率、拒答、引用和延迟。 +4. 更新缓存失效策略。 + +## 6. 通用 Instructions + +所有任务共享以下不可省略规则: + +```text +你是书内阅读助手。 +只使用提供的原文片段,不使用外部知识补充书中事实。 +每个事实性结论必须引用一个或多个有效片段 ID。 +证据不足时返回 insufficientEvidence,不猜测。 +不得引用允许阅读范围之外的内容。 +区分原文明确事实与可能推断。 +使用用户当前语言回答。 +``` + +实际实现使用简洁英文或经评测验证的目标语言 instructions;以上文字表达语义合同,不要求逐字使用。 + +## 7. 结构化输出 + +### 7.1 摘要 Schema + +```swift +@Generable +struct GeneratedSummary { + var overview: String + + @Guide(.maximumCount(6)) + var points: [GeneratedStatement] +} + +@Generable +struct GeneratedStatement { + var text: String + + @Guide(.minimumCount(1), .maximumCount(3)) + var passageIDs: [String] +} +``` + +规则: + +- `overview` 只能概括已提供 Passage。 +- 每个 point 必须有 Passage ID。 +- brief 最多 3 点,standard 最多 6 点。 + +### 7.2 问答 Schema + +```swift +@Generable +enum GeneratedAnswerStatus { + case answered + case insufficientEvidence +} + +@Generable +struct GeneratedAnswer { + var status: GeneratedAnswerStatus + var answer: String + + @Guide(.maximumCount(6)) + var statements: [GeneratedStatement] +} +``` + +若 `status == insufficientEvidence`: + +- `statements` 必须为空。 +- `answer` 只说明当前已读内容没有足够依据。 +- 不推荐用户从互联网获取答案,除非宿主未来明确增加该产品能力。 + +### 7.3 人物 Schema + +```swift +@Generable +struct GeneratedCharacter { + var displayName: String + + @Guide(.maximumCount(6)) + var aliases: [String] + + var description: String + + @Guide(.minimumCount(1), .maximumCount(6)) + var evidencePassageIDs: [String] +} +``` + +人物必须在 Passage 中有明确名称或可验证别名。纯代词不能单独创建人物。 + +### 7.4 关系 Schema + +```swift +@Generable +enum GeneratedRelationshipStatus { + case confirmed + case possible + case conflicting +} + +@Generable +struct GeneratedRelationship { + var sourceName: String + var targetName: String + var label: String + var status: GeneratedRelationshipStatus + + @Guide(.minimumCount(1), .maximumCount(5)) + var evidencePassageIDs: [String] +} +``` + +关系标签应简短,例如“师徒”“同事”“敌对”“亲属”。描述性事件放在人物事件中,不无限创建关系类型。 + +## 8. 任务设计 + +### 8.1 章节摘要 + +输入: + +- 当前章节 Passage,或已读范围内的章节片段摘要。 +- 目标长度。 +- 用户 Locale。 + +流程: + +1. 章节能放入上下文时直接生成。 +2. 超长章节分块生成带引用局部摘要。 +3. 聚合局部摘要时保留原 Passage ID。 +4. 运行引用验证。 + +禁止只把局部摘要文本作为最终事实来源而丢失原始 Passage ID。 + +### 8.2 书内问答 + +流程: + +1. 识别问题语言和实体词。 +2. Hybrid Retrieval 召回 30 个候选。 +3. 重排并过滤到 3-4 个 Passage。 +4. 直接把 Passage 放入 Prompt。 +5. 生成结构化答案。 +6. 验证引用和阅读范围。 +7. 无有效事实项时拒答。 + +首版优先使用代码检索,不默认使用 Tool Calling,这样召回过程更确定、可测试、节省 token。 + +### 8.3 人物卡片 + +流程: + +1. Natural Language 提供人物候选及出现位置。 +2. 按名称和明确别名聚合候选。 +3. 检索候选周边 Passage。 +4. Foundation Models 生成结构化人物信息。 +5. 代码校验所有别名和证据。 +6. 低置信别名保持独立候选。 + +### 8.4 人物关系 + +采用两阶段: + +1. Chunk-level extraction:从局部 Passage 提取关系候选。 +2. Document-level merge:按人物 ID、关系标签和时间顺序合并。 + +合并规则: + +- 相同关系 + 相同方向:合并证据。 +- 对称关系可由受控词典决定是否双向展示。 +- 新证据否定旧关系:状态变为 conflicting。 +- 隐含动机、情感和立场默认 possible。 +- 任何关系没有有效证据时不入库。 + +## 9. Tool Calling + +仅在单次检索无法回答、且评测证明多轮查找有明显收益时启用。最多提供三个工具: + +```text +searchBook(query, scope, limit) +getPassages(ids) +getCharacterEvidence(name, scope, limit) +``` + +要求: + +- 工具只读。 +- 工具强制应用文档和已读范围过滤。 +- 参数有严格长度和数量上限。 +- 返回内容有 token 上限。 +- 每个请求最大 Tool 调用次数为 3。 +- 检测重复参数调用并终止循环。 +- 工具调用和结果 ID进入本地 trace,但不记录原文。 + +不提供跳页、删除、购买、网络请求等副作用工具。 + +参考:[Expanding generation with tool calling](https://developer.apple.com/documentation/foundationmodels/expanding-generation-with-tool-calling) + +## 10. 确定性后处理 + +模型输出必须经过: + +1. Schema 解码。 +2. Passage ID 存在性校验。 +3. 阅读范围校验。 +4. Quote/Locator 构造。 +5. 重复 statement 合并。 +6. 空文本和长度校验。 +7. 敏感内容与系统错误映射。 +8. Artifact 元数据补齐。 + +模型不能直接构造页码、CFI、CGRect 或数据库 ID;这些字段全部由代码通过 Passage ID解析。 + +## 11. 安全与产品规则 + +- 不将 AI 输出表示为作者原话。 +- UI 明确标记“AI 生成”。 +- possible/conflicting 关系必须视觉区分。 +- 用户问题涉及未读内容时,默认拒绝并提示防剧透设置。 +- 原文包含违法或敏感内容时,遵循系统模型 guardrails;不能绕过。 +- 输入和输出触发系统安全限制时,返回稳定、非技术性的不可生成状态。 +- 不要求模型提供医学、法律或金融建议;如果书中包含相关内容,只能解释“书中写了什么”。 + +发布前必须复核 Apple Foundation Models acceptable use requirements 和最新 App Review Guidelines。 + +## 12. 关键失败模式 + +| 失败模式 | 检测 | 处理 | +|----------|------|------| +| 模型编造人物或关系 | Passage ID/名称验证 | 删除无效项,无结果则拒答 | +| 引用存在但不支持结论 | 人工评测 + LLM judge | Prompt 调整,低分结果进入回归集 | +| 同名人物合并 | 别名证据检查 | 保持独立,标记待确认 | +| 未读内容泄漏 | Scope validator | 阻断输出并记录安全计数 | +| OCR 错字导致错误事实 | OCR source 标记和置信策略 | 降低置信度,展示 OCR 来源 | +| Prompt 在系统更新后退化 | 模型版本分桶评测 | 版本化 Prompt 和缓存 | +| 上下文溢出 | tokenCount/contextSize | 重建上下文或分层摘要 | +| Tool 循环 | 调用次数和参数去重 | 终止并降级为现有证据回答 | +| 用户快速重复请求 | request actor + cancellation | 取消旧任务或排队 | + +## 13. 评测维度 + +| 维度 | 定义 | 1.0 门槛 | +|------|------|----------| +| Citation validity | 引用能否恢复到原文 | ≥ 99% | +| Context faithfulness | 事实是否由引用支持 | ≥ 98% | +| Refusal accuracy | 无证据时是否拒答 | ≥ 95% | +| Spoiler safety | 是否只使用允许范围 | 100% | +| Schema validity | 结构化输出是否通过校验 | ≥ 99.5% | +| Character precision | 人物是否真实出现 | ≥ 97% | +| Relationship evidence | 关系是否至少有一条证据 | 100% | +| Alias precision | 自动合并别名是否正确 | ≥ 98% | +| Retrieval recall@5 | 正确证据是否在 Top 5 | ≥ 90% | +| Answer usefulness | 人工 1-5 分平均值 | ≥ 4.0 | + +## 14. 评测方法 + +- 代码指标:Schema、引用 ID、范围、阅读权限、延迟和拒答格式。 +- 人工标注:人物、别名、关系、引用支持度、剧透边界。 +- LLM judge:只用于语气、完整性和引用支持度的辅助评估;必须先与人工评分校准。 +- 生产抽样:只上传宿主允许的匿名数值和用户显式反馈;不上传书籍原文。 + +评测集和完整方法见 [RDAIReaderView-TEST-PLAN.md](RDAIReaderView-TEST-PLAN.md)。 + +## 15. 发布检查清单 + +- [ ] 所有 Prompt 有 identifier 和 version。 +- [ ] 每个生成任务使用 `@Generable`。 +- [ ] 每个事实输出经过 Citation Validator。 +- [ ] 防剧透 Scope 在检索前和生成后各检查一次。 +- [ ] Foundation Models 不可用路径已真机验证。 +- [ ] 上下文预算使用运行时 API 计算。 +- [ ] 模型版本变化不会复用旧缓存。 +- [ ] 评测集达到所有 1.0 门槛。 +- [ ] 日志不包含原文、问题或完整回答。 +- [ ] Apple 最新 acceptable use 与审核要求已复核。 + diff --git a/Doc/RDAIReaderView/RDAIReaderView-API.md b/Doc/RDAIReaderView/RDAIReaderView-API.md new file mode 100644 index 0000000..c85c1fb --- /dev/null +++ b/Doc/RDAIReaderView/RDAIReaderView-API.md @@ -0,0 +1,604 @@ +# RDAIReaderView 公共 API 设计 + +**文档状态:** Proposal 0.1 +**最后更新:** 2026-07-25 +**目标版本:** RDAIReaderView 1.0 + +## 1. API 设计原则 + +- Core 最低支持 iOS 15,不直接依赖 UIKit、PDFKit、DTCoreText 或 FoundationModels。 +- 公共模型优先使用值类型,并遵循 `Codable`、`Sendable`、`Equatable`。 +- 文本范围统一使用 UTF-16 偏移,与现有 PDF、EPUB、NSString 和 TTS 范围保持一致。 +- Reader Adapter 负责格式转换,Core 不识别 PDF 页视图或 EPUB 排版对象。 +- Foundation Models 通过 Provider 协议接入,不能泄漏到基础 API。 +- 公开 API 在 1.0 后遵循语义化版本;新增字段必须有解码默认值。 + +本文中的 Swift 定义是实现合同,允许在不改变语义的前提下调整文件组织和内部实现。 + +## 2. 标识符与基础范围 + +```swift +import Foundation + +public struct RDAIDocumentIdentifier: RawRepresentable, Codable, Hashable, Sendable { + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} + +public struct RDAIResourceIdentifier: RawRepresentable, Codable, Hashable, Sendable { + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} + +public struct RDAITextRange: Codable, Hashable, Sendable { + public var location: Int + public var length: Int + + public init(location: Int, length: Int) { + self.location = max(0, location) + self.length = max(0, length) + } + + public var upperBound: Int { location + length } +} +``` + +约束: + +- `RDAIDocumentIdentifier` 必须与宿主书籍 ID 一致并保持稳定。 +- `RDAIResourceIdentifier` 在 PDF 中使用页索引字符串,在 EPUB 中使用规范化 `href`。 +- 所有文本范围均针对资源原始文本,不针对规范化搜索文本。 + +## 3. 定位与引用 + +### 3.1 归一化矩形 + +Core 使用自定义矩形,避免公共存储格式依赖 UIKit: + +```swift +public struct RDAINormalizedRect: Codable, Hashable, Sendable { + public var x: Double + public var y: Double + public var width: Double + public var height: Double + + public init(x: Double, y: Double, width: Double, height: Double) { + self.x = x + self.y = y + self.width = width + self.height = height + } +} +``` + +所有值应限制在 `0...1`。Reader Adapter 负责与 `CGRect` 转换。 + +### 3.2 格式 Anchor + +```swift +public struct RDAIPDFAnchor: Codable, Hashable, Sendable { + public enum TextSource: String, Codable, Sendable { + case native + case ocr + } + + public var pageIndex: Int + public var rects: [RDAINormalizedRect] + public var textSource: TextSource + public var readingOrder: Int? +} + +public struct RDAIEPUBAnchor: Codable, Hashable, Sendable { + public var href: String + public var cfi: String? + public var rangeCFI: String? + public var progression: Double? +} + +public enum RDAIAnchor: Codable, Hashable, Sendable { + case pdf(RDAIPDFAnchor) + case epub(RDAIEPUBAnchor) +} +``` + +`RDAIAnchor` 必须实现显式 Codable discriminator,例如 `type: "pdf"`,未知类型解码为明确错误,不能误当成其他格式。 + +### 3.3 通用定位 + +```swift +public struct RDAILocator: Codable, Hashable, Sendable { + public var documentIdentifier: RDAIDocumentIdentifier + public var resourceIdentifier: RDAIResourceIdentifier + public var textRange: RDAITextRange + public var anchor: RDAIAnchor + public var sourceHash: String +} + +public struct RDAICitation: Codable, Hashable, Sendable, Identifiable { + public let id: String + public let passageIdentifier: String + public let quote: String + public let locator: RDAILocator +} +``` + +引用恢复流程: + +1. 校验文档和资源存在。 +2. 校验 `sourceHash`。 +3. 优先按格式 Anchor 恢复。 +4. Anchor 失败时使用文本范围和 quote 搜索。 +5. 仍失败则返回 `staleCitation`,不得跳转到近似但未验证的位置。 + +## 4. 文档与资源 + +```swift +public enum RDAIDocumentFormat: String, Codable, Sendable { + case pdf + case epub +} + +public struct RDAIDocumentDescriptor: Codable, Equatable, Sendable { + public let identifier: RDAIDocumentIdentifier + public let title: String + public let format: RDAIDocumentFormat + public let contentRevision: String +} + +public struct RDAIResourceDescriptor: Codable, Equatable, Sendable { + public let identifier: RDAIResourceIdentifier + public let title: String? + public let order: Int + public let estimatedUTF16Length: Int? +} + +public struct RDAIResourceSnapshot: Sendable { + public let descriptor: RDAIResourceDescriptor + public let sourceText: String + public let sourceHash: String + public let locatorRuns: [RDAILocatorRun] +} + +public struct RDAILocatorRun: Sendable { + public let textRange: RDAITextRange + public let anchor: RDAIAnchor +} +``` + +`contentRevision` 由宿主提供;若宿主没有版本号,Adapter 使用资源哈希汇总生成。 + +## 5. 内容提供协议 + +```swift +@MainActor +public protocol RDAIContentProvider: AnyObject { + func aiDocumentDescriptor() -> RDAIDocumentDescriptor + func aiResources() async throws -> [RDAIResourceDescriptor] + func aiResourceSnapshot( + for identifier: RDAIResourceIdentifier + ) async throws -> RDAIResourceSnapshot + func aiNavigate(to locator: RDAILocator, animated: Bool) async throws + func aiShowCitationHighlight(_ citation: RDAICitation) async throws + func aiClearCitationHighlight() +} +``` + +协议标记为 `@MainActor`,因为现有 Reader Controller 和页面缓存均由主线程管理。实现必须只在主线程获取快照引用和 UI 状态;OCR、分块、分析和数据库写入移交后台 actor。 + +可选读取范围协议: + +```swift +public struct RDAIReadScope: Codable, Equatable, Sendable { + public let upperBound: RDAILocator? + public let includesWholeDocument: Bool +} + +@MainActor +public protocol RDAIReadScopeProviding: AnyObject { + func aiCurrentReadScope() -> RDAIReadScope +} +``` + +未实现时,默认只允许当前资源及之前的资源,不能默认整本书。 + +## 6. Passage 与分析结果 + +```swift +public enum RDAIPassageKind: String, Codable, Sendable { + case title + case paragraph + case list + case table + case code + case footnote + case unknown +} + +public struct RDAIPassage: Codable, Equatable, Sendable, Identifiable { + public let id: String + public let documentIdentifier: RDAIDocumentIdentifier + public let resourceIdentifier: RDAIResourceIdentifier + public let text: String + public let languageCode: String? + public let kind: RDAIPassageKind + public let locator: RDAILocator + public let contentHash: String + public let order: Int +} + +public enum RDAIEntityKind: String, Codable, Sendable { + case person + case place + case organization + case other +} + +public struct RDAIEntityMention: Codable, Equatable, Sendable, Identifiable { + public let id: String + public let normalizedName: String + public let surfaceText: String + public let kind: RDAIEntityKind + public let confidence: Double + public let locator: RDAILocator +} +``` + +Natural Language 的标签不是最终人物事实,只是 `RDAIEntityMention` 候选。 + +## 7. 索引 API + +```swift +public enum RDAIIndexState: Equatable, Sendable { + case notStarted + case indexing(completedResources: Int, totalResources: Int) + case paused + case ready + case failed(RDAIError) +} + +public struct RDAIIndexOptions: Sendable { + public var scope: RDAIReadScope + public var priorityResource: RDAIResourceIdentifier? + public var allowsEmbeddingAssetDownload: Bool +} + +public protocol RDAIIndexing: AnyObject, Sendable { + func prepareIndex(options: RDAIIndexOptions) async throws + func pauseIndexing() async + func resumeIndexing() async + func indexState() async -> RDAIIndexState + func stateUpdates() async -> AsyncStream + func removeIndex() async throws +} +``` + +要求: + +- `prepareIndex` 幂等。 +- 重复调用只能扩大范围或提高优先级,不能创建重复 Job。 +- `removeIndex` 删除索引、实体和生成缓存,但不删除原书或用户笔记。 + +## 8. 能力与可用性 + +```swift +public enum RDAICapability: String, Codable, Sendable { + case languageAnalysis + case entityExtraction + case lexicalSearch + case semanticSearch + case summarization + case questionAnswering + case characterRelationships +} + +public enum RDAIUnavailableReason: Equatable, Sendable { + case operatingSystemUnsupported + case deviceNotEligible + case appleIntelligenceNotEnabled + case modelNotReady + case languageUnsupported(String?) + case embeddingAssetsUnavailable + case providerNotInstalled + case unknown(String) +} + +public enum RDAICapabilityAvailability: Equatable, Sendable { + case available + case degraded(reason: RDAIUnavailableReason) + case unavailable(reason: RDAIUnavailableReason) +} + +public protocol RDAICapabilityProviding: Sendable { + func availability( + for capability: RDAICapability, + locale: Locale? + ) async -> RDAICapabilityAvailability +} +``` + +UI 只能根据枚举状态展示文案,不能匹配本地化 Error 字符串。 + +## 9. 检索 API + +```swift +public struct RDAIRetrievalOptions: Sendable { + public var maximumResults: Int + public var scope: RDAIReadScope + public var minimumScore: Double +} + +public struct RDAIRetrievalMatch: Sendable, Identifiable { + public let id: String + public let passage: RDAIPassage + public let score: Double + public let lexicalScore: Double? + public let semanticScore: Double? +} + +public protocol RDAIRetrieving: Sendable { + func retrieve( + query: String, + options: RDAIRetrievalOptions + ) async throws -> [RDAIRetrievalMatch] +} +``` + +检索分数只用于同一索引版本内排序,不承诺跨版本数值稳定。 + +## 10. 生成结果 + +### 10.1 摘要 + +```swift +public enum RDAISummaryLength: String, Codable, Sendable { + case brief + case standard + case detailed +} + +public struct RDAISummary: Codable, Sendable { + public let title: String + public let overview: String + public let keyPoints: [RDAISourcedStatement] + public let citations: [RDAICitation] + public let metadata: RDAIGenerationMetadata +} +``` + +### 10.2 问答 + +```swift +public enum RDAIAnswerStatus: String, Codable, Sendable { + case answered + case insufficientEvidence + case unsupportedLanguage + case unavailable +} + +public struct RDAIAnswer: Codable, Sendable { + public let status: RDAIAnswerStatus + public let text: String + public let statements: [RDAISourcedStatement] + public let citations: [RDAICitation] + public let metadata: RDAIGenerationMetadata +} + +public struct RDAISourcedStatement: Codable, Sendable, Identifiable { + public let id: String + public let text: String + public let citationIdentifiers: [String] +} +``` + +### 10.3 人物关系 + +```swift +public enum RDAIRelationshipStatus: String, Codable, Sendable { + case confirmed + case possible + case conflicting +} + +public struct RDAICharacter: Codable, Sendable, Identifiable { + public let id: String + public let displayName: String + public let aliases: [String] + public let description: String + public let firstAppearance: RDAICitation? + public let evidence: [RDAICitation] +} + +public struct RDAIRelationship: Codable, Sendable, Identifiable { + public let id: String + public let sourceCharacterIdentifier: String + public let targetCharacterIdentifier: String + public let label: String + public let status: RDAIRelationshipStatus + public let evidence: [RDAICitation] +} +``` + +### 10.4 生成元数据 + +```swift +public struct RDAIGenerationMetadata: Codable, Sendable { + public let providerIdentifier: String + public let modelVersion: String? + public let promptIdentifier: String + public let promptVersion: Int + public let generatedAt: Date + public let scopeHash: String +} +``` + +元数据用于缓存失效和问题追踪,不向普通用户展示内部 Prompt。 + +## 11. 高层服务 + +```swift +public protocol RDAIReaderServicing: AnyObject, Sendable { + func prepare(options: RDAIIndexOptions) async throws + + func summarize( + scope: RDAIReadScope, + length: RDAISummaryLength + ) async throws -> RDAISummary + + func answer( + question: String, + scope: RDAIReadScope + ) async throws -> RDAIAnswer + + func characters( + scope: RDAIReadScope + ) async throws -> [RDAICharacter] + + func relationships( + scope: RDAIReadScope + ) async throws -> [RDAIRelationship] + + func removeAllAIData() async throws +} +``` + +建议具体实现为 actor。若用户开始新的同类请求,UI 层负责决定取消旧请求或并行;同一 Foundation Models session 不允许并行请求。 + +## 12. Provider 协议 + +```swift +public struct RDAIGenerationRequest: Sendable { + public let task: RDAIGenerationTask + public let userText: String? + public let passages: [RDAIPassage] + public let locale: Locale + public let scope: RDAIReadScope +} + +public enum RDAIGenerationTask: Sendable { + case summary(RDAISummaryLength) + case answer + case characters + case relationships +} + +public protocol RDAIGenerativeProvider: Sendable { + var identifier: String { get } + func availability(locale: Locale) async -> RDAICapabilityAvailability + func generate(_ request: RDAIGenerationRequest) async throws -> RDAIGeneratedArtifact +} +``` + +`RDAIGeneratedArtifact` 是 Core 内部或受控公共枚举,用于把 Provider 输出转换为第 10 节模型。Provider 不能直接保存结果或操作 Reader UI。 + +## 13. 错误模型 + +```swift +public enum RDAIError: Error, Equatable, Sendable { + case invalidDocument + case resourceUnavailable(RDAIResourceIdentifier) + case staleCitation + case indexingFailed(code: String) + case modelUnavailable(RDAIUnavailableReason) + case unsupportedLanguage(String?) + case contextLimitExceeded + case invalidGeneratedStructure + case invalidCitation + case insufficientEvidence + case cancelled + case storageFailure(code: String) +} +``` + +公共错误不携带原文或数据库底层错误字符串。内部错误映射为稳定 code,并通过本地诊断系统保存脱敏详情。 + +## 14. PDF Adapter + +建议公开: + +```swift +public extension RDPDFReaderViewController { + func makeAIContentProvider() -> RDPDFAIContentProvider + func makeAIReaderService( + configuration: RDAIReaderConfiguration = .default + ) throws -> RDAIReaderServicing +} +``` + +映射要求: + +- 页面资源 ID 为十进制页索引。 +- 文本顺序使用 `RDPDFReaderTextRun.readingOrder`。 +- `normalizedRects` 转换为 `RDAINormalizedRect`。 +- 原生文本标记为 `.native`,Vision OCR 标记为 `.ocr`。 +- AI 高亮复用或泛化现有 speech highlight,不同时维护两个相互覆盖的临时层。 + +## 15. EPUB Adapter + +建议公开: + +```swift +public extension RDEPUBReaderController { + func makeAIContentProvider() -> RDEPUBAIContentProvider + func makeAIReaderService( + configuration: RDAIReaderConfiguration = .default + ) throws -> RDAIReaderServicing +} +``` + +映射要求: + +- 资源 ID 使用 ResourceResolver 规范化后的 `href`。 +- Passage 范围从章节 attributed content 的原始字符串计算。 +- 使用现有 index table 生成 `cfi` 和 `rangeCFI`。 +- 导航复用 `go(to:)`/位置恢复流程。 +- 固定版式或无法提取文本的章节返回明确 unavailable,不制造空 Passage。 + +## 16. TTS 集成 + +AI 层不依赖 RDSpeechReaderView。宿主可以把摘要或回答转换为临时 `RDSpeechContentProvider`。 + +后续可增加桥接 Pod: + +```ruby +pod 'RDSpeechReaderView/AI' +``` + +桥接只负责朗读 AI 结果;Natural Language 的分句与语言识别实现应抽取为共享内部组件,避免同一文本产生不同范围。 + +## 17. 配置 + +```swift +public struct RDAIReaderConfiguration: Sendable { + public var spoilerPolicy: RDAISpoilerPolicy + public var maximumRetrievedPassages: Int + public var allowsEmbeddingAssetDownload: Bool + public var storesGeneratedArtifacts: Bool + public var diagnosticsLevel: RDAIDiagnosticsLevel + + public static let `default`: RDAIReaderConfiguration +} +``` + +默认值: + +- `spoilerPolicy = .readContentOnly` +- `maximumRetrievedPassages = 4` +- `allowsEmbeddingAssetDownload = false` +- `storesGeneratedArtifacts = true` +- `diagnosticsLevel = .metadataOnly` + +## 18. API 演进规则 + +- 1.0 前可以调整命名,但每次调整同步更新五份设计文档。 +- 1.0 后删除或改变语义需要主版本升级。 +- Codable 枚举新增 case 时必须实现向后兼容策略。 +- 数据库 Schema 版本与 SDK 版本独立。 +- Prompt 版本与 SDK 版本独立。 +- Reader Adapter 可以增加格式能力,但不能改变 Core Locator 的 UTF-16 语义。 + diff --git a/Doc/RDAIReaderView/RDAIReaderView-ARCHITECTURE.md b/Doc/RDAIReaderView/RDAIReaderView-ARCHITECTURE.md new file mode 100644 index 0000000..60bc1d6 --- /dev/null +++ b/Doc/RDAIReaderView/RDAIReaderView-ARCHITECTURE.md @@ -0,0 +1,431 @@ +# RDAIReaderView 架构设计 + +**文档状态:** Draft 0.1 +**最后更新:** 2026-07-25 +**目标版本:** RDAIReaderView 1.0 + +## 1. 架构目标 + +RDAIReaderView 必须满足四个架构目标: + +1. 不改变 RDPDFReaderView、RDEpubReaderView 和 RDSpeechReaderView 的核心职责。 +2. iOS 15 用户继续获得稳定阅读、基础 NLP 和 TTS;Foundation Models 仅作为可选增强。 +3. 所有生成结果都能追溯到稳定原文位置。 +4. AI Provider、索引实现和 UI 可替换,公共数据模型保持稳定。 + +## 2. 总体分层 + +```text +┌─────────────────────────────────────────────────────────────┐ +│ Host App / RDAIReaderViewUI │ +│ AI 面板、摘要、问答、人物卡片、关系图、引用跳转 │ +├─────────────────────────────────────────────────────────────┤ +│ RDAIReaderView │ +│ Query Service / Summary Service / Character Service │ +├───────────────────────┬─────────────────────────────────────┤ +│ NaturalLanguage │ FoundationModels │ +│ 分句/语言/实体/检索 │ 结构化生成/工具调用/拒答 │ +├───────────────────────┴─────────────────────────────────────┤ +│ Index & Storage │ +│ Passage / EntityMention / Citation / Artifact / Job │ +├───────────────────────┬─────────────────────────────────────┤ +│ RDPDFReaderView/AI │ RDEpubReaderView/AI │ +│ 页码/范围/矩形/OCR │ href/CFI/范围/章节 │ +├───────────────────────┴─────────────────────────────────────┤ +│ RDPDFReaderView / RDEpubReaderView / RDSpeechReaderView │ +└─────────────────────────────────────────────────────────────┘ +``` + +依赖方向只能从上到下。阅读器核心不能反向依赖 RDAIReaderView。 + +## 3. CocoaPods 模块设计 + +建议新增: + +```ruby +pod 'RDAIReaderView/Core' +pod 'RDAIReaderView/NaturalLanguage' +pod 'RDAIReaderView/FoundationModels' +pod 'RDAIReaderView/UI' +pod 'RDPDFReaderView/AI' +pod 'RDEpubReaderView/AI' +``` + +### 3.1 Core + +- 最低 iOS 15。 +- 只依赖 Foundation、SQLite3/CryptoKit 等系统能力。 +- 包含公共协议、数据模型、索引调度、存储和查询编排。 +- 不导入 UIKit、PDFKit、DTCoreText 或 FoundationModels。 + +### 3.2 NaturalLanguage + +- 最低 iOS 15。 +- 依赖 Core 和 NaturalLanguage。 +- 提供语言识别、分句、实体候选、关键词和语义评分。 +- iOS 17+ 可选使用 `NLContextualEmbedding`;资源不可用时降级。 + +### 3.3 FoundationModels + +- 源码使用 `@available(iOS 26.0, *)` 隔离。 +- 依赖 Core 和系统 FoundationModels。 +- 需要支持 Foundation Models 的 Xcode 工具链。 +- 不被基础 Pod 默认引入,避免旧工具链客户无法编译。 + +### 3.4 UI + +- 最低 iOS 15。 +- 依赖 Core,可选识别 FoundationModels 可用性。 +- UI 不直接构造 Prompt,也不直接访问数据库。 + +### 3.5 Reader Adapters + +- `RDPDFReaderView/AI` 依赖 RDAIReaderView/Core。 +- `RDEpubReaderView/AI` 依赖 RDAIReaderView/Core。 +- Adapter 只负责内容快照、定位转换、跳转和高亮。 + +## 4. 建议目录 + +```text +Sources/RDAIReaderView/ +├── RDAIReaderView.podspec +├── Core/ +│ ├── Contracts/ +│ ├── Models/ +│ ├── Indexing/ +│ ├── Retrieval/ +│ ├── Storage/ +│ └── Services/ +├── NaturalLanguage/ +│ ├── Analysis/ +│ ├── Embeddings/ +│ └── Retrieval/ +├── FoundationModels/ +│ ├── Availability/ +│ ├── Generation/ +│ ├── Prompts/ +│ ├── Schemas/ +│ └── Tools/ +├── UI/ +│ ├── Assistant/ +│ ├── Citations/ +│ └── Characters/ +└── Tests/ + +Sources/RDPDFReaderView/AI/ +Sources/RDEpubReaderView/AI/ +``` + +## 5. 核心数据流 + +### 5.1 建立索引 + +```text +ContentProvider + ↓ 读取资源快照 +Text Snapshot + Stable Locator + ↓ +Language Detection + ↓ +Paragraph/Sentence Chunking + ↓ +Entity Mentions + Keywords + Embeddings + ↓ +Transactional Storage + ↓ +Index Checkpoint +``` + +每次数据库事务只提交一个资源或一组有界片段。应用退出时,最多重做当前事务,不重做整本书。 + +### 5.2 问答 + +```text +User Question + ↓ +Language / Intent / Spoiler Scope + ↓ +Hybrid Retrieval + ↓ +Access + Read-Progress Filter + ↓ +Context Budget Builder + ↓ +Foundation Models Structured Generation + ↓ +Citation Validator + ↓ +Answer or Evidence-Insufficient Refusal +``` + +检索由代码执行。首版不让模型自由遍历整本数据库,只有需要多轮查找时才使用受限 Tool Calling。 + +### 5.3 人物关系 + +```text +Entity Mentions + ↓ +Alias Candidate Grouping + ↓ +Chunk-level Structured Extraction + ↓ +Evidence Validation + ↓ +Relationship Merge + ↓ +confirmed / possible / conflicting +``` + +代码只能自动合并完全相同的标准化名称和明确别名。代词消解、同名人物合并和隐含关系必须保持低置信度,等待更多证据或用户确认。 + +## 6. 稳定定位模型 + +### 6.1 通用定位 + +`RDAILocator` 包含: + +- `documentIdentifier` +- `resourceIdentifier` +- `utf16Range` +- `sourceHash` +- 格式专属 Anchor + +文本范围统一使用 UTF-16,与现有 RDSpeechReaderView、NSString 和 EPUB 搜索范围保持一致。 + +### 6.2 PDF Anchor + +```text +pageIndex +normalizedRects +textSource: native / ocr +readingOrder +``` + +PDF Adapter 从现有 `RDPDFReaderTextRun` 构建连续页文本和 UTF-16 范围。每个 Passage 必须保留与 run 的映射,不能在 AI 层重新拼接后丢失矩形。 + +扫描 PDF 使用现有 `speechTextRuns(at:)`/OCR 能力,但商用实现应增加独立的 AI OCR 调度入口,避免页面导航取消请求时同时取消后台索引。 + +### 6.3 EPUB Anchor + +```text +normalizedHref +cfi +rangeCFI +rangeAnchor +progressionFallback +``` + +优先级: + +1. `rangeCFI` +2. `cfi + UTF-16 range` +3. `rangeAnchor` +4. `href + progression` + +屏幕页码只用于展示,不能作为持久化引用主键。 + +## 7. 文本快照与分块 + +### 7.1 不修改原文 + +索引保存两份文本信息: + +- `sourceText`:原始文本,用于引用与范围映射。 +- `searchText`:规范化副本,用于检索。 + +禁止使用规范化文本范围直接驱动阅读器高亮。 + +### 7.2 分块策略 + +- 先按资源和章节边界划分。 +- 再按段落划分。 +- 超长段落使用 `NLTokenizer(unit: .sentence)`。 +- 中文目标 600-900 字;英文目标 300-600 词。 +- 片段之间保留 1-2 句重叠。 +- 表格、代码、脚注和标题保留语义类型,避免与正文无差别拼接。 + +### 7.3 内容哈希 + +建议使用 SHA-256: + +```text +documentHash = hash(ordered resource identifiers + resource hashes) +resourceHash = hash(source text + format-specific stable metadata) +passageHash = hash(resource hash + UTF-16 range + source text) +``` + +书籍更新时按资源哈希增量失效。 + +## 8. 检索架构 + +首版采用 Hybrid Retrieval: + +```text +finalScore = + 0.45 * lexicalScore + + 0.40 * semanticScore + + 0.10 * proximityScore + + 0.05 * headingBoost +``` + +权重是初始值,必须通过评测集调优,不作为永久常量。 + +检索步骤: + +1. 规范化查询并识别语言。 +2. 关键词倒排召回 Top 30。 +3. 语义相似度重排。 +4. 合并高度重叠 Passage。 +5. 按已读范围、文档授权和最大上下文过滤。 +6. 返回 Top 3-4,并保留评分解释。 + +若语义模型资源不可用,使用纯词法检索,不阻塞问答入口;UI 可提示结果质量可能降低。 + +## 9. Foundation Models 编排 + +### 9.1 Provider 抽象 + +Core 只依赖 `RDAIGenerativeProvider`。Apple 实现位于 FoundationModels 子模块,未来可增加 Core ML、MLX 或经用户授权的云端实现。 + +### 9.2 会话策略 + +- 摘要、问答、人物关系使用不同 instructions 和独立会话。 +- 同一会话只处理一个并发请求。 +- 用户切换书籍、变更阅读范围或取消时终止任务。 +- 达到上下文阈值前主动新建会话,不等待系统抛错。 +- 记录 Prompt 版本、模型可用性分类、耗时和 token 数,不记录原文。 + +### 9.3 上下文预算 + +默认预算建议: + +| 项目 | Token 预算 | +|------|------------| +| Instructions + Schema | 500 | +| 用户问题 | 200 | +| 检索上下文 | 2400 | +| 模型输出 | 700 | +| 安全余量 | 296 | + +实际使用 `contextSize` 和 `tokenCount(for:)` 动态计算,不写死为 4096。 + +### 9.4 引用验证 + +生成后执行确定性校验: + +1. Citation ID 必须存在于本次上下文。 +2. Citation 必须属于当前文档和允许阅读范围。 +3. 引用文本必须能在 Passage 原文中匹配。 +4. 每个事实项至少有一个有效引用。 +5. 删除无效项后答案为空,则返回 evidence insufficient。 + +## 10. 存储设计 + +建议使用 SQLite,Schema 初稿: + +```text +documents +resources +passages +passage_fts +embeddings +entity_mentions +entities +entity_aliases +relationships +relationship_evidence +artifacts +index_jobs +schema_metadata +``` + +关键原则: + +- FTS 和关系表通过 Passage ID 关联原文。 +- 向量数据按模型标识符、revision 和语言分区。 +- 生成结果不覆盖人工编辑内容。 +- 每个 Artifact 保存 Prompt/模型/输入哈希。 +- 索引表支持按文档级联删除。 + +## 11. 并发与生命周期 + +建议采用 Swift Concurrency: + +- `RDAIIndexCoordinator`:actor,管理索引队列和 checkpoint。 +- `RDAIStore`:actor,串行化数据库写入。 +- `RDAIRetriever`:Sendable 服务,可并发读取快照。 +- Reader Adapter:`@MainActor`,仅提取 UI/阅读器状态和执行跳转。 +- Foundation Models Session:由单请求 actor 或服务隔离。 + +优先级: + +1. 用户当前问答所需 Passage。 +2. 当前章节。 +3. 相邻章节。 +4. 已读范围。 +5. 其余获准内容。 + +发生内存警告时: + +- 取消低优先级 embedding 任务。 +- 卸载 contextual embedding。 +- 清理内存 Passage/向量缓存。 +- 保留已提交数据库和当前用户请求。 + +## 12. 可用性与降级 + +```text +Foundation Models available + ├─ 是 → 完整生成能力 + └─ 否 + ├─ Natural Language available → 索引、实体、基础检索 + └─ 语言/资源不支持 → 关键词检索与基础分段 +``` + +降级状态是公共 API 的一部分,UI 不根据 Error 字符串猜测原因。 + +## 13. 安全与隐私 + +- 默认 Provider 为设备端 Provider。 +- Core 不包含网络代码。 +- 云端 Provider 若未来增加,必须是单独 Pod,并要求宿主显式配置。 +- 日志只记录文档匿名哈希、阶段、耗时、错误类别和计数。 +- 禁止记录 Prompt、Passage、用户问题和模型回答全文。 +- 导出诊断包前再次脱敏。 +- 删除书籍时由宿主调用 `removeDocument`,同时删除索引、关系和生成缓存。 + +## 14. 可观测性 + +本地指标: + +- 索引耗时、资源数、片段数、失败类别。 +- 检索 P50/P95、召回数量和降级模式。 +- 生成耗时、取消率、错误类别和引用校验失败率。 +- Foundation Models availability 分布。 +- 缓存命中率和数据库大小。 + +商用版本默认只汇总数值。任何远程遥测必须由宿主决定,并遵守其隐私政策。 + +## 15. 架构决策记录 + +实施时至少补充以下 ADR: + +- ADR-001:独立 RDAIReaderView 而非嵌入阅读器核心。 +- ADR-002:UTF-16 作为跨模块文本范围。 +- ADR-003:本地 SQLite 和增量资源哈希。 +- ADR-004:检索先行、生成后置、引用强校验。 +- ADR-005:Foundation Models 可选依赖和运行时降级。 +- ADR-006:已读范围作为默认安全边界。 + +## 16. 已知技术风险 + +| 风险 | 影响 | 缓解 | +|------|------|------| +| 中文小说实体识别不足 | 人物漏识别或误合并 | 规则候选 + 结构化模型提取 + 证据与置信度 | +| OCR 阅读顺序错误 | 摘要和引用错误 | 保留 readingOrder、双栏测试、允许宿主提供文本 | +| PDF OCR 请求被页面导航取消 | 后台索引不完整 | AI 使用独立调度队列与缓存 | +| EPUB 重排后范围变化 | 引用跳转漂移 | CFI/rangeCFI 优先,文本哈希校验 | +| 系统模型更新 | Prompt 质量回归 | Prompt 版本化、模型版本分层评测 | +| 上下文不足 | 回答遗漏 | 检索压缩、分层摘要、新会话 | +| 同名人物 | 错误关系合并 | 不自动合并低置信候选,保留冲突 | + diff --git a/Doc/RDAIReaderView/RDAIReaderView-RELEASE-CHECKLIST.md b/Doc/RDAIReaderView/RDAIReaderView-RELEASE-CHECKLIST.md new file mode 100644 index 0000000..dd0d2ee --- /dev/null +++ b/Doc/RDAIReaderView/RDAIReaderView-RELEASE-CHECKLIST.md @@ -0,0 +1,36 @@ +# RDAIReaderView Release Checklist + +This checklist records the external validation required after the local build +passes. It intentionally contains no book text, prompts, answers or user data. + +> Status on 2026-07-25: Apple Intelligence eligible hardware, App Store privacy +> submission and TestFlight rollout access are temporarily unavailable. The +> unchecked physical-device and release gates below are deferred, not passed. + +## Local Gates + +- [x] Core, NaturalLanguage, FoundationModels and UI compile for iPhoneOS. +- [x] PDF and EPUB adapters compile in the ReadViewDemo workspace. +- [x] PDF/EPUB citations use stable locators and transient highlights. +- [x] SQLite data, FTS and generated artifacts are deleted with a book. +- [ ] Add fixture-backed XCTest coverage for locators, SQLite migration, scope, + citation validation, pause/resume and artifact invalidation. +- [ ] Add UI automation for index, summary, answer, citation jump, clear data + and VoiceOver labels. + +## Physical Device Gates + +- [ ] On an eligible iOS 26 device, verify each `SystemLanguageModel` + availability state and its UI fallback. +- [ ] Run structured summary and question-answering evaluation fixtures; record + citation validity, faithfulness and spoiler-safety without uploading text. +- [ ] Verify Vision OCR quality and cancellation/retry on scanned PDF samples. +- [ ] Measure index latency, memory, battery and citation jump P95 targets. + +## Release Gates + +- [ ] Create a feature flag/remote configuration policy owned by the host app. +- [ ] Complete App Store privacy labels, Foundation Models acceptable-use review + and network audit. +- [ ] Run TestFlight rollout 5%, 25%, then 100% with P0/P1 stop conditions. +- [ ] Confirm crash-free and AI quality metrics meet the published thresholds. diff --git a/Doc/RDAIReaderView/RDAIReaderView-SPEC.md b/Doc/RDAIReaderView/RDAIReaderView-SPEC.md new file mode 100644 index 0000000..c7aa17c --- /dev/null +++ b/Doc/RDAIReaderView/RDAIReaderView-SPEC.md @@ -0,0 +1,287 @@ +# RDAIReaderView 产品与开发规格 + +**文档状态:** Draft 0.1 +**最后更新:** 2026-07-25 +**目标版本:** RDAIReaderView 1.0 +**适用工程:** ReadViewSDK + +## 1. 文档目的 + +本文档锁定 RDAIReaderView 首个商用版本的产品范围、系统兼容策略、功能要求、非功能要求和发布门槛。架构、公共 API、生成式 AI 约束和测试方法分别见同目录其他文档。 + +## 2. 背景与现状 + +ReadViewSDK 已具备以下基础: + +- RDPDFReaderView:PDF 页面、原生文本、Vision OCR、页内文本矩形、跳页与临时朗读高亮。 +- RDEpubReaderView:EPUB 章节、`href`、CFI、UTF-16 文本范围、搜索与位置恢复。 +- RDSpeechReaderView:基于 Natural Language 的语言识别和分句、系统 TTS、断点续听、后台播放与锁屏控制。 +- 最低部署版本为 iOS 15,Demo 使用 iOS 15.6。 + +当前缺少统一的文档语义索引、可追溯引用、书内问答、章节摘要和人物关系能力。 + +## 3. 产品目标 + +RDAIReaderView 1.0 的目标是提供一个默认本地运行、可选启用 Apple Foundation Models、可被 PDF 和 EPUB 阅读器复用的智能阅读能力层。 + +首版必须实现: + +1. 对书籍内容建立增量、可恢复的本地索引。 +2. 识别语言、句子、人物、地点、组织和关键词。 +3. 生成当前章节或已读范围摘要。 +4. 回答书内问题,并为事实性陈述提供可跳转的原文引用。 +5. 生成人物卡片和带证据的人物关系。 +6. Foundation Models 不可用时安全降级,不影响阅读、搜索和 TTS。 +7. 所有 AI 结果默认限制在用户已读内容,避免剧透。 + +## 4. 非目标 + +RDAIReaderView 1.0 不包含: + +- 互联网百科、新闻或通用知识问答。 +- 无来源的文学评价、复杂逻辑推理或事实推断。 +- 自动改写、续写或批量导出版权书籍内容。 +- 云端上传书籍全文。 +- 自训练 Foundation Models Adapter。 +- 自动替用户发布内容、发送消息或执行购买行为。 +- 对 CBZ、漫画图片内容进行视觉剧情理解。 +- 对 DRM 内容绕过访问控制或持久化超出宿主授权范围的文本。 + +上述能力必须在后续版本单独评审产品价值、版权、隐私和审核风险。 + +## 5. 用户价值与首版场景 + +### 5.1 阅读回顾 + +用户重新打开书籍时,可请求: + +- 上次阅读内容的 3 句回顾。 +- 当前章节摘要。 +- 已读部分的关键人物变化。 + +输入范围默认从最近一个自然章节边界到当前阅读位置,不得包含未读段落。 + +### 5.2 书内问答 + +用户可以询问当前书籍,例如: + +- “这一章发生了什么?” +- “张三为什么离开?” +- “这里提到的组织是什么?” + +系统先检索相关段落,再基于检索结果生成答案。答案中的事实性结论必须关联一个或多个 `RDAICitation`。没有充分证据时必须明确拒答,而不是依赖模型常识补全。 + +### 5.3 人物与关系 + +人物卡片包含: + +- 标准显示名和已发现的别名。 +- 首次出现位置。 +- 仅基于已读内容的简短介绍。 +- 关键行为及证据。 +- 与其他人物的关系边及证据。 + +关系状态分为: + +- `confirmed`:原文明确表达。 +- `possible`:模型推断但证据不充分,UI 必须显示“可能”。 +- `conflicting`:不同段落给出冲突信息,UI 展示冲突而非自动覆盖。 + +### 5.4 与阅读器联动 + +- 点击引用跳转到 PDF 页面或 EPUB CFI。 +- 跳转后高亮对应原文范围。 +- 摘要、答案和人物卡片可交给 RDSpeechReaderView 朗读。 +- 用户调整字体、页面尺寸或翻页方式后,EPUB 引用仍应通过 CFI/文本范围恢复。 + +## 6. 功能要求 + +### FR-001 文档导入 + +- AI 层只能通过 `RDAIContentProvider` 读取宿主已授权的文本快照。 +- 不直接读取宿主数据库或下载接口。 +- 支持取消导入、增量恢复和内容变更检测。 + +### FR-002 稳定定位 + +- PDF:使用文档 ID、页索引、页内 UTF-16 范围和归一化矩形。 +- EPUB:使用文档 ID、规范化 `href`、UTF-16 范围和 CFI;CFI 不可用时才使用 progression 兜底。 +- 所有引用必须保存源文本哈希,恢复时验证引用是否仍指向相同内容。 + +### FR-003 文本分析 + +- 使用 `NLLanguageRecognizer` 识别资源或段落语言。 +- 使用 `NLTokenizer` 切分句子,保持原始 UTF-16 偏移。 +- 使用 `NLTagger` 生成人名、地点、组织候选。 +- 实体候选必须保留每次出现的原文位置,不能只保存名称。 +- Natural Language 不支持或质量不足的语言,降级为字符/标点分段和关键词检索。 + +### FR-004 分块与索引 + +- 中文片段建议 600-900 个字符;拉丁文字建议 300-600 词。 +- 优先在章节、段落和句子边界切分,不截断组合字符。 +- 相邻片段保留 1-2 句重叠,便于跨边界检索。 +- 每个片段保存内容哈希、语言、顺序、定位和索引版本。 +- 索引任务在后台执行,并按当前章节、相邻章节、其余内容的优先级处理。 + +### FR-005 检索 + +- 首版采用关键词/BM25 风格评分与 Natural Language 语义相似度融合。 +- 结果必须经过文档 ID、已读范围和访问范围过滤。 +- 默认返回 3-4 个片段,最大不超过 5 个。 +- 检索结果必须包含分数、匹配原因和稳定定位。 + +### FR-006 Foundation Models 可用性 + +- 编译期使用可选子模块,不提高 Core 的 iOS 15 最低版本。 +- 运行时检查系统版本、设备资格、Apple Intelligence 开关、模型准备状态和语言支持。 +- UI 必须区分 `deviceNotEligible`、`appleIntelligenceNotEnabled`、`modelNotReady`、不支持语言和未知错误。 +- 不可用时隐藏生成入口或提供明确说明,Natural Language 索引、搜索和 TTS 保持可用。 + +### FR-007 结构化生成 + +- 摘要、答案、实体和关系均使用 `@Generable` 结构化输出。 +- 输出不得依赖字符串正则解析。 +- 每个事实项必须携带检索片段 ID;生成后由代码验证 ID 是否真实存在。 +- 无效引用、越权引用或未读范围引用必须删除;删除后答案无证据则转为拒答。 + +### FR-008 防剧透 + +- 默认分析范围为“当前位置及之前”。 +- 用户主动切换到整本书模式时必须进行一次明确确认。 +- 缓存键包含阅读范围;已读摘要不得复用整本书摘要。 +- 人物关系图默认只展示已读范围内已出现的人物和关系。 + +### FR-009 缓存与恢复 + +- 索引、实体、摘要和问答缓存均存储在应用沙盒。 +- 缓存键包含文档内容哈希、索引版本、Prompt 版本、模型版本和阅读范围。 +- 内容哈希变化时,失效受影响资源,不强制删除整本书其他有效索引。 +- 提供按书删除、删除全部 AI 数据和存储空间统计接口。 + +### FR-010 用户控制 + +- 所有长任务支持取消。 +- UI 展示索引或生成状态,不伪造确定进度。 +- 用户可关闭 AI、清除 AI 缓存、选择“仅本地处理”。 +- 生成失败不得阻塞翻页、搜索、标注或 TTS。 + +## 7. 系统兼容矩阵 + +| 环境 | 必须提供的能力 | +|------|----------------| +| iOS 15+ | 语言识别、分句、实体候选、关键词索引、基础检索 | +| iOS 17+ | 可选 contextual embedding;资源不存在时允许下载或降级 | +| iOS 26+ 且模型可用 | 摘要、问答、人物关系、结构化笔记 | +| 不支持 Apple Intelligence | Natural Language 能力完整可用,生成式入口降级 | +| 离线 | 已下载模型与本地索引可用;不得要求联网 | +| 扫描 PDF | 使用现有 Vision OCR;OCR 失败的页面明确标记不可分析 | + +## 8. 非功能要求 + +### 8.1 性能 + +- 索引不得在主线程执行文本分析、向量计算或数据库批量写入。 +- 当前章节索引优先完成,目标 P95 不超过 2 秒;具体阈值以目标真机基线校准。 +- 10 万中文字的基础索引目标 P95 不超过 30 秒,允许后台增量完成。 +- 索引期间阅读页面滚动/翻页帧率不得出现持续性下降。 +- 单次 Foundation Models 响应首个可展示结果目标 P95 不超过 5 秒。 +- AI 模块空闲 30 秒后应释放 contextual embedding 和不必要的内存缓存。 + +### 8.2 稳定性 + +- AI 相关 crash-free session 不低于 99.9%。 +- Foundation Models 不可用或生成失败时降级成功率为 100%。 +- 强制退出后索引可从最后一个已提交资源恢复。 +- 数据库迁移失败时保留原数据库备份,并允许重建索引。 + +### 8.3 准确性 + +- 引用定位有效率不低于 99%。 +- 事实性陈述有原文支持的比例不低于 98%。 +- 无答案问题正确拒答率不低于 95%。 +- 人物关系证据覆盖率为 100%。 +- 结构化输出通过本地校验的比例不低于 99.5%。 + +### 8.4 隐私与安全 + +- 默认不上传书籍文本、查询、摘要、人物关系和阅读历史。 +- 日志不得包含原文、用户问题全文或模型完整输出。 +- 调试日志必须经过显式编译配置才能包含脱敏片段。 +- AI 数据遵循宿主账户登出、删书和清除缓存生命周期。 +- 文件保护等级、备份策略和共享容器由宿主配置,SDK 提供明确接口和文档。 + +### 8.5 可访问性 + +- 所有 AI 控件支持 VoiceOver、Dynamic Type 和 Reduce Motion。 +- 状态变化使用可访问性公告,但不得连续播报索引细节。 +- “AI 生成”“可能关系”“无原文证据”等状态不能只靠颜色表达。 + +## 9. 商用验收门槛 + +以下条件全部满足后才可发布 1.0: + +- Core、NaturalLanguage、FoundationModels、PDF Adapter、EPUB Adapter 均有单元测试。 +- 关键用户流有 UI 自动化测试。 +- 完成至少 100 条人工标注的产品评测集。 +- 所有准确性指标达到第 8.3 节门槛。 +- 在最低支持系统、主流支持设备和至少两代 Apple Intelligence 设备上完成真机验证。 +- 完成模型不可用、未下载、语言不支持、上下文溢出和生成取消测试。 +- 完成隐私清单、App Store 隐私申报和 AI 功能说明审核。 +- TestFlight 灰度无 P0/P1 缺陷,AI 相关 crash-free session 达标。 +- 现有 PDF、EPUB、搜索、标注和 TTS 回归全部通过。 + +## 10. 实施路线 + +以下排期按 2 名 iOS 工程师、1 名测试工程师、产品/内容评测兼职参与估算,总周期 12-14 周。单人开发建议按 18-22 周估算。 + +| 周期 | 阶段 | 主要交付 | 退出条件 | +|------|------|----------|----------| +| 第 1 周 | 合同与工程骨架 | 五份开发文档、Podspec、目录、CI Scheme、ADR | 文档评审通过,空库支持 iOS 15 编译 | +| 第 2-3 周 | Core 与存储 | 公共模型、SQLite Schema、迁移、Job/Checkpoint、删除接口 | 崩溃恢复和增量失效单测通过 | +| 第 4-5 周 | Natural Language | 分句、语言、实体候选、词法/语义检索 | 基础检索评测达标,TTS 范围无漂移 | +| 第 6 周 | PDF Adapter | 原生文本/OCR 快照、Locator、引用跳转和高亮 | PDF 引用恢复率达到门槛 | +| 第 7 周 | EPUB Adapter | href/CFI/rangeCFI 快照、Locator、跳转和高亮 | 重排后引用恢复率达到门槛 | +| 第 8-9 周 | Foundation Models | 可用性、摘要、问答、结构化输出、引用校验 | 不可用降级与 AI 评测通过 | +| 第 10 周 | 人物关系 | 人物、别名、关系、冲突和证据合并 | 人物/关系指标达到门槛 | +| 第 11 周 | 商用 UI | AI 面板、状态、取消、引用、防剧透、无障碍 | 核心 UI 自动化通过 | +| 第 12 周 | 性能与隐私 | 内存、耗电、数据库、日志、清除数据、隐私说明 | 无 P0/P1,性能与隐私门禁通过 | +| 第 13-14 周 | TestFlight 灰度 | 5%→25%→100% 分阶段发布 | Crash-free 和质量反馈持续达标 | + +每阶段要求: + +- 功能代码、单元测试和文档同一阶段完成。 +- 公共 API 变更必须先更新 API 文档。 +- Prompt 变更必须增加版本并跑 AI 回归集。 +- 阶段退出条件未满足时不得把未验证能力带入下一阶段默认开启。 + +## 11. 版本范围 + +### 1.0 + +- 本地索引。 +- 章节摘要。 +- 带引用的书内问答。 +- 人物卡片和基础人物关系。 +- PDF/EPUB 引用跳转。 +- 防剧透和完整降级。 + +### 1.1 候选 + +- 关系时间线与冲突关系展示。 +- 用户划线/笔记参与问答。 +- 多本书对照,仅限用户主动选择的本地书籍。 +- 可选 Core ML/MLX 或云端 Provider。 + +### 2.0 候选 + +- 多模态图片理解。 +- 漫画/图文书内容理解。 +- 经过独立法律和产品评审的云端增强能力。 + +## 12. 依赖文档 + +- [RDAIReaderView-ARCHITECTURE.md](RDAIReaderView-ARCHITECTURE.md) +- [RDAIReaderView-API.md](RDAIReaderView-API.md) +- [RDAIReaderView-AI-SPEC.md](RDAIReaderView-AI-SPEC.md) +- [RDAIReaderView-TEST-PLAN.md](RDAIReaderView-TEST-PLAN.md) diff --git a/Doc/RDAIReaderView/RDAIReaderView-TEST-PLAN.md b/Doc/RDAIReaderView/RDAIReaderView-TEST-PLAN.md new file mode 100644 index 0000000..d57bad3 --- /dev/null +++ b/Doc/RDAIReaderView/RDAIReaderView-TEST-PLAN.md @@ -0,0 +1,473 @@ +# RDAIReaderView 商用测试与发布计划 + +**文档状态:** Draft 0.1 +**最后更新:** 2026-07-25 +**目标版本:** RDAIReaderView 1.0 + +## 1. 目标 + +测试计划验证以下结论: + +1. AI 模块不会破坏现有 PDF、EPUB、搜索、标注和 TTS。 +2. 索引和引用在书籍更新、分页变化、OCR 和应用中断后仍然可靠。 +3. Foundation Models 的输出有证据、可拒答、不剧透并可安全降级。 +4. 性能、内存、耗电、隐私和可访问性达到商用要求。 +5. Prompt 或系统模型更新后,可以通过可重复评测发现质量回归。 + +## 2. 测试层级 + +```text +人工与 TestFlight 验收 + ↑ +UI / 真机系统测试 + ↑ +PDF / EPUB / TTS 集成测试 + ↑ +AI 产品评测与 Prompt 回归 + ↑ +Core / Storage / NLP 单元测试 +``` + +确定性校验优先放在单元测试;非确定性生成质量使用固定数据集、多次运行和人工评审。 + +## 3. 测试目标与 Target + +建议新增: + +```text +RDAIReaderViewCoreTests +RDAIReaderViewNaturalLanguageTests +RDAIReaderViewFoundationModelsTests +RDPDFReaderViewAITests +RDEpubReaderViewAITests +ReadViewDemoAIUITests +``` + +Foundation Models 真机测试与普通 CI 分离,避免不支持模型的 Runner 造成假失败。 + +## 4. 测试数据 + +### 4.1 数据来源 + +只使用: + +- 公版书籍。 +- 项目拥有测试授权的书籍。 +- 团队自行编写的合成文本。 +- 经过脱敏、明确允许进入测试仓库的样本。 + +不得把商业书籍全文或用户内容提交到测试仓库。 + +### 4.2 数据集组成 + +首版至少包含: + +| 类型 | 最低数量 | 重点 | +|------|----------|------| +| 中文小说章节 | 20 | 多人物、别名、代词、倒叙、否定关系 | +| 英文小说章节 | 10 | 名称大小写、代词、长句 | +| 中文技术/非虚构 | 10 | 术语、组织、事实问答 | +| 英文技术/非虚构 | 10 | 代码块、列表、表格 | +| 原生文本 PDF | 5 本/50 页 | 单栏、双栏、页眉页脚 | +| 扫描 PDF | 5 本/50 页 | OCR 错字、旋转、低清晰度 | +| EPUB | 5 本/30 章 | CFI、脚注、长章节、重排 | +| 无答案问题 | 20 | 拒答 | +| 剧透边界问题 | 20 | 已读/未读范围隔离 | +| 同名或别名关系 | 20 | 实体合并准确性 | + +首版产品评测集不少于 100 个 Case。每个 Case 保存输入、允许范围、期望证据、可接受答案要点和禁止行为。 + +### 4.3 Case 格式 + +建议使用 JSONL: + +```json +{ + "id": "qa-zh-001", + "task": "questionAnswering", + "documentFixture": "novel-zh-01", + "readScope": { + "resourceOrderUpperBound": 3, + "utf16UpperBound": 8200 + }, + "input": "林川为什么离开村庄?", + "expectedPassageIDs": ["p-3-18", "p-3-19"], + "requiredFacts": ["受到追捕"], + "forbiddenFacts": ["第四章之后的身份揭示"], + "expectedStatus": "answered" +} +``` + +测试结果不得把 fixture 原文写入可上传日志。 + +## 5. Core 单元测试 + +### 5.1 文本范围 + +- 空文本、空白文本和超长文本。 +- Emoji、组合字符、代理对、中文标点和换行。 +- UTF-16 范围与 Swift String Index 双向转换。 +- 搜索规范化不能改变 source range。 +- Passage 重叠不能产生错误 Locator。 + +### 5.2 哈希与失效 + +- 相同内容产生相同哈希。 +- 只改变一个章节时只失效该资源。 +- Prompt 版本变化只失效相关 Artifact。 +- embedding 模型 revision 变化只重建对应向量。 +- 阅读范围扩大不复用越界缓存。 + +### 5.3 存储与迁移 + +- 首次建库、重复打开和并发读取。 +- 每个 Schema 版本向下一版本迁移。 +- 迁移中断后恢复或回滚。 +- 数据库损坏时保留诊断并可安全重建。 +- 按书删除和删除全部数据。 +- 登出/删书回调后无孤立 Passage、向量或 Artifact。 + +### 5.4 索引调度 + +- 当前章节优先。 +- 暂停、恢复、取消和重复 prepare。 +- 应用强制退出后从 checkpoint 恢复。 +- 内存警告取消低优先级任务。 +- 内容 Provider 释放后任务安全失败,不野指针或永久等待。 + +## 6. Natural Language 测试 + +### 6.1 语言与分句 + +- 中文、英文、中英混排。 +- 无标点长段落。 +- 缩写、小数、网址和引号。 +- 句子范围与 RDSpeechReaderView 结果一致。 +- 不支持语言的降级分块。 + +### 6.2 实体 + +按任务统计 Precision、Recall、F1: + +```text +precision = 正确识别实体 / 所有识别实体 +recall = 正确识别实体 / 所有标注实体 +F1 = 2 * precision * recall / (precision + recall) +``` + +首版门槛: + +- 人物候选 Precision ≥ 0.95。 +- 人物候选 Recall ≥ 0.85。 +- 地点/组织作为辅助信息,F1 ≥ 0.80。 + +人物候选宁可少召回,也不能大量创建虚假人物。 + +### 6.3 检索 + +- 关键词命中、同义表达、别名和错别字。 +- Top 5 包含正确证据的 Recall@5 ≥ 0.90。 +- 无 embedding 资源时词法检索仍可返回结果。 +- 已读范围外 Passage 召回数必须为 0。 +- 相同输入和索引版本的词法结果顺序稳定。 + +## 7. PDF Adapter 测试 + +- 原生文本 run 按 `readingOrder` 正确拼接。 +- 双栏页面不会按几何坐标错误穿插。 +- run 间换行计入 UTF-16 范围。 +- Passage 范围映射回正确 normalized rects。 +- characterRects 存在/缺失均可高亮。 +- OCR 与原生文本来源正确标记。 +- OCR 缓存命中、失败、取消和重试。 +- 页面缓存裁剪后 Citation 仍可重新加载。 +- 跳转后目标页和高亮正确。 +- 旋转、横屏、竖滑、双页模式下高亮位置正确。 +- 页面导航取消 OCR 时,AI 索引任务不应永久丢失。 + +PDF 引用定位有效率必须 ≥ 99%。 + +## 8. EPUB Adapter 测试 + +- `href` 规范化一致。 +- UTF-16 range、rangeAnchor、CFI 和 rangeCFI 互相映射。 +- 改字号、行距、边距、字体和横竖屏后 Citation 可恢复。 +- 长章节按需加载时可提取目标资源。 +- 脚注、列表、图片替代文本和代码块类型正确。 +- EPUB 更新导致 source hash 变化时旧 Citation 标记 stale。 +- CFI 缺失时 progression 只作兜底。 +- 引用跳转复用标准位置恢复流程。 +- 固定版式无文本章节返回明确不可分析状态。 + +EPUB 重排后引用定位有效率必须 ≥ 99%。 + +## 9. Foundation Models 产品评测 + +### 9.1 运行方式 + +- 每个 Case 至少运行 3 次,避免偶然结果掩盖问题。 +- 按系统模型版本、系统语言和设备分桶。 +- Prompt 新版本同时运行旧版和新版,生成差异报告。 +- 代码校验先执行,再进入人工/模型评分。 + +### 9.2 摘要 Rubric + +| 分数 | 标准 | +|------|------| +| 5 | 覆盖关键事件,全部有证据,无未读信息,表述简洁 | +| 3 | 基本正确但遗漏一项重要内容,或引用不够精确 | +| 1 | 包含无证据事实、重大误解或剧透 | + +发布门槛: + +- 平均分 ≥ 4.0。 +- 任一剧透 Case 失败即阻断发布。 +- 无证据事实比例 ≤ 2%。 + +### 9.3 问答 Rubric + +检查: + +- 是否回答用户问题。 +- 每个事实是否被引用支持。 +- 是否遗漏关键反证。 +- 证据不足时是否拒答。 +- 是否泄漏未读内容。 + +发布门槛: + +- Context faithfulness ≥ 98%。 +- 无答案正确拒答率 ≥ 95%。 +- Citation validity ≥ 99%。 +- Spoiler safety = 100%。 + +### 9.4 人物与关系 Rubric + +检查: + +- 人物真实出现。 +- 别名有明确证据。 +- 同名人物未误合并。 +- 关系方向正确。 +- `confirmed` 与 `possible` 分类合理。 +- 冲突关系没有被静默覆盖。 + +发布门槛: + +- Character precision ≥ 97%。 +- Alias merge precision ≥ 98%。 +- 关系证据覆盖率 = 100%。 +- 无证据关系数 = 0。 + +### 9.5 LLM Judge + +LLM Judge 只作为辅助: + +- 使用固定 Rubric,不使用泛化“是否有帮助”问题。 +- 先对至少 30 个 Case 与人工评分校准。 +- Spearman/Pearson 相关性低于 0.7 时不得作为发布门禁。 +- Judge 分歧、低分和边界 Case 必须人工复核。 +- 若使用云端 Judge,测试原文必须为可上传的公版或合成数据。 + +## 10. 可用性与错误测试 + +覆盖: + +- iOS 15/17:Foundation Models 模块不参与运行。 +- iOS 26+ 不支持设备。 +- Apple Intelligence 未开启。 +- 模型正在下载或未准备。 +- 当前语言不支持。 +- context limit exceeded。 +- guardrail 拒绝输入或输出。 +- 生成中取消、切书、关闭页面、进入后台。 +- 同一 session 并发请求。 +- 低存储空间和数据库写入失败。 + +每种情况必须产生稳定枚举状态,并保持阅读器可操作。 + +## 11. UI 与可访问性 + +### 11.1 UI 自动化 + +- 打开/关闭 AI 面板。 +- 当前章节索引状态。 +- 发起问题、取消和重试。 +- 点击引用并跳转高亮。 +- 仅已读范围默认开启。 +- 整本书模式确认。 +- Foundation Models 不可用状态。 +- 清除本书和全部 AI 数据。 +- AI 结果交给 TTS 朗读。 + +### 11.2 可访问性 + +- VoiceOver 顺序和标签。 +- Dynamic Type 最大辅助字号。 +- Reduce Motion。 +- 深色模式和高对比度。 +- `possible`/`conflicting` 不只依赖颜色。 +- 加载、取消和失败状态有可访问性公告。 + +## 12. 性能与资源测试 + +目标设备至少覆盖: + +- 最低性能 iOS 15 支持设备。 +- iOS 17 中档设备。 +- 一台首代支持 Apple Intelligence 的设备。 +- 一台当前系统的高性能设备。 + +基准: + +| 指标 | 1.0 目标 | +|------|----------| +| 当前章节基础索引 P95 | ≤ 2 秒 | +| 10 万中文字基础索引 P95 | ≤ 30 秒 | +| 本地检索 P95 | ≤ 300 ms | +| 生成首个可展示结果 P95 | ≤ 5 秒 | +| 引用跳转 P95 | ≤ 500 ms,不含未缓存页面加载 | +| 索引峰值额外内存 | 目标 ≤ 150 MB,按真机基线确认 | +| 空闲内存释放 | 30 秒内释放 embedding 和大文本缓存 | +| AI crash-free session | ≥ 99.9% | + +测试同时记录: + +- CPU time。 +- 主线程卡顿。 +- thermal state。 +- 电量变化。 +- 数据库大小/万字。 +- embedding 资源加载耗时。 +- 缓存命中率。 + +性能基线变化超过 15% 时 CI 或发布报告必须提示。 + +## 13. 隐私与安全测试 + +- 网络抓包确认默认实现不上传书籍或问题。 +- 搜索日志、控制台日志和 crash breadcrumbs 不含原文。 +- 清除 AI 数据后数据库、缓存和临时文件均删除。 +- 删除书籍和退出账户触发相同清除路径。 +- Scope 过滤在检索前和生成后均执行。 +- 构造伪造 Passage ID,确认 Citation Validator 拒绝。 +- 构造路径、超长查询和大量 Tool 参数,确认边界限制。 +- Tool Calling 最大次数和重复调用检测生效。 +- 数据库迁移和诊断包不泄漏原文。 + +## 14. 回归测试 + +每次合入必须运行: + +- Core 单元测试。 +- Natural Language 确定性测试。 +- PDF/EPUB Adapter fixture 测试。 +- 现有 PDF、EPUB 和 TTS 编译。 +- `git diff --check` 和公共 API 兼容检查。 + +每日或候选发布运行: + +- UI smoke。 +- 完整 AI 评测集。 +- 大书索引性能。 +- Foundation Models 真机矩阵。 +- 现有 `ReadViewDemoUITests` 回归。 + +## 15. CI 建议 + +```text +PR: + lint/diff-check + Core unit tests + NLP unit tests + Adapter tests + build iOS 15 target + build iOS 26 FoundationModels target + +Nightly: + Full reader UI regression + AI deterministic evals + Performance fixtures + +Release candidate: + Foundation Models physical-device eval + Human review sample + Privacy/network audit + Migration matrix +``` + +设备模型评测结果应保存以下元数据: + +- OS 版本。 +- 模型版本或可识别 profile。 +- Prompt identifier/version。 +- fixture version。 +- SDK commit。 +- 各指标与失败 Case ID。 + +不得保存生产用户原文。 + +## 16. 缺陷分级 + +### P0 + +- 泄漏书籍内容或阅读历史。 +- 绕过已读范围造成剧透。 +- 删除用户原书、标注或笔记。 +- 大面积崩溃或数据库不可恢复损坏。 + +### P1 + +- 无引用或错误引用的事实作为确定答案展示。 +- 人物关系大面积误合并。 +- Foundation Models 不可用导致阅读器不可用。 +- 引用跳转到错误章节/页面。 + +### P2 + +- 摘要遗漏、检索质量下降、局部 UI 或性能问题。 +- 可重试且不影响阅读主流程的生成失败。 + +发布时 P0/P1 必须为 0;P2 必须有明确接受记录和后续版本计划。 + +## 17. TestFlight 灰度 + +### 阶段 A:内部 + +- 团队和测试设备。 +- 至少 7 天。 +- 完整日志仅限脱敏元数据。 + +### 阶段 B:5% + +- 只开启摘要和问答。 +- 观察 crash-free、取消率、拒答率、引用点击成功率。 +- 人物关系仍受远程/本地 feature flag 控制。 + +### 阶段 C:25% + +- 开启人物卡片。 +- 关系图只对达到索引完整度的书籍开放。 +- 至少稳定 7 天。 + +### 阶段 D:100% + +- 所有发布门禁持续达标。 +- 保留快速关闭 Foundation Models 功能的配置,但关闭后基础阅读和 NLP 正常。 + +## 18. 最终发布门禁 + +- [ ] 五份开发文档与实现一致。 +- [ ] 公共 API 兼容检查通过。 +- [ ] Core/NLP/Adapter 单元和集成测试通过。 +- [ ] 现有 Reader 与 TTS 回归通过。 +- [ ] 100+ AI Case 全量运行并达到指标。 +- [ ] Foundation Models 支持与不支持路径均完成真机测试。 +- [ ] PDF/EPUB Citation validity ≥ 99%。 +- [ ] Context faithfulness ≥ 98%。 +- [ ] Spoiler safety = 100%。 +- [ ] AI crash-free session ≥ 99.9%。 +- [ ] 隐私和网络审计通过。 +- [ ] 无 P0/P1 缺陷。 +- [ ] TestFlight 灰度指标稳定。 + diff --git a/Doc/index.md b/Doc/index.md index 11e30be..3d8c4a6 100644 --- a/Doc/index.md +++ b/Doc/index.md @@ -1,6 +1,6 @@ # ReadViewSDK 文档索引 -> 最后更新:2026-06-18 +> 最后更新:2026-07-25 --- @@ -33,6 +33,12 @@ | 文档 | 说明 | |------|------| +| [RDAIReaderView/RDAIReaderView-SPEC.md](RDAIReaderView/RDAIReaderView-SPEC.md) | AI 阅读能力产品范围、兼容策略、实施路线与商用验收门槛 | +| [RDAIReaderView/RDAIReaderView-ARCHITECTURE.md](RDAIReaderView/RDAIReaderView-ARCHITECTURE.md) | RDAIReaderView 模块、索引、检索、存储、引用和降级架构 | +| [RDAIReaderView/RDAIReaderView-API.md](RDAIReaderView/RDAIReaderView-API.md) | RDAIReaderView 公共模型、Provider、Reader Adapter 和服务 API 合同 | +| [RDAIReaderView/RDAIReaderView-AI-SPEC.md](RDAIReaderView/RDAIReaderView-AI-SPEC.md) | Natural Language 与 Foundation Models 的 Prompt、结构化输出、安全和评测合同 | +| [RDAIReaderView/RDAIReaderView-TEST-PLAN.md](RDAIReaderView/RDAIReaderView-TEST-PLAN.md) | AI 商用测试集、质量指标、真机矩阵、CI、灰度与发布门禁 | +| [RDAIReaderView/RDAIReaderView-RELEASE-CHECKLIST.md](RDAIReaderView/RDAIReaderView-RELEASE-CHECKLIST.md) | 本地构建后所需的真机、隐私、TestFlight 与发布验证清单 | | [TYPESetter_PIPELINE.md](TYPESetter_PIPELINE.md) | Typesetter 排版管线详解:HTML 规范化、语义标记注入、CFI 标记、样式合成为、字体规范化、片段标记 | | [CHAPTER_RUNTIME.md](CHAPTER_RUNTIME.md) | 章节运行时详解:按需加载、章节窗口协调、页图管理、磁盘缓存、后台补全 | | [CFI_SUBSYSTEM.md](CFI_SUBSYSTEM.md) | CFI 子系统详解:EPUB CFI 解析、生成、序列化、范围、恢复引擎 | diff --git a/ReadViewDemo/Podfile b/ReadViewDemo/Podfile index a1d5e4e..4b2b037 100644 --- a/ReadViewDemo/Podfile +++ b/ReadViewDemo/Podfile @@ -3,8 +3,16 @@ platform :ios, '15.6' target 'ReadViewDemo' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! + pod 'RDSpeechReaderView/AI', :path => '../Sources/RDSpeechReaderView' + pod 'RDAIReaderView/NaturalLanguage', :path => '../Sources/RDAIReaderView' + pod 'RDAIReaderView/FoundationModels', :path => '../Sources/RDAIReaderView' + pod 'RDAIReaderView/UI', :path => '../Sources/RDAIReaderView' pod 'RDEpubReaderView', :path => '../Sources/RDEpubReaderView' + pod 'RDEpubReaderView/Speech', :path => '../Sources/RDEpubReaderView' + pod 'RDEpubReaderView/AI', :path => '../Sources/RDEpubReaderView' pod 'RDPDFReaderView', :path => '../Sources/RDPDFReaderView' + pod 'RDPDFReaderView/Speech', :path => '../Sources/RDPDFReaderView' + pod 'RDPDFReaderView/AI', :path => '../Sources/RDPDFReaderView' end diff --git a/ReadViewDemo/Podfile.lock b/ReadViewDemo/Podfile.lock index 55adce1..605eb49 100644 --- a/ReadViewDemo/Podfile.lock +++ b/ReadViewDemo/Podfile.lock @@ -16,18 +16,59 @@ PODS: - DTFoundation/Core - DTFoundation/UIKit (1.7.19): - DTFoundation/Core + - RDAIReaderView/Core (0.1.0) + - RDAIReaderView/FoundationModels (0.1.0): + - RDAIReaderView/Core (~> 0.1) + - RDAIReaderView/NaturalLanguage (0.1.0): + - RDAIReaderView/Core (~> 0.1) + - RDAIReaderView/UI (0.1.0): + - RDAIReaderView/Core (~> 0.1) - RDEpubReaderView (0.0.2): - DTCoreText (~> 1.6) + - RDEpubReaderView/AI (= 0.0.2) + - RDEpubReaderView/Speech (= 0.0.2) + - SnapKit (~> 5.7) + - ZIPFoundation (~> 0.9) + - RDEpubReaderView/AI (0.0.2): + - DTCoreText (~> 1.6) + - RDAIReaderView/NaturalLanguage (~> 0.1) + - RDAIReaderView/UI (~> 0.1) + - SnapKit (~> 5.7) + - ZIPFoundation (~> 0.9) + - RDEpubReaderView/Speech (0.0.2): + - DTCoreText (~> 1.6) + - RDSpeechReaderView (~> 0.1) - SnapKit (~> 5.7) - ZIPFoundation (~> 0.9) - RDPDFReaderView (0.0.1): + - RDPDFReaderView/AI (= 0.0.1) + - RDPDFReaderView/Speech (= 0.0.1) - SnapKit (~> 5.7) + - RDPDFReaderView/AI (0.0.1): + - RDAIReaderView/NaturalLanguage (~> 0.1) + - RDAIReaderView/UI (~> 0.1) + - SnapKit (~> 5.7) + - RDPDFReaderView/Speech (0.0.1): + - RDSpeechReaderView (~> 0.1) + - SnapKit (~> 5.7) + - RDSpeechReaderView (0.1.0): + - RDSpeechReaderView/AI (= 0.1.0) + - RDSpeechReaderView/AI (0.1.0): + - RDAIReaderView/Core (~> 0.1) - SnapKit (5.7.1) - ZIPFoundation (0.9.20) DEPENDENCIES: + - RDAIReaderView/FoundationModels (from `../Sources/RDAIReaderView`) + - RDAIReaderView/NaturalLanguage (from `../Sources/RDAIReaderView`) + - RDAIReaderView/UI (from `../Sources/RDAIReaderView`) - RDEpubReaderView (from `../Sources/RDEpubReaderView`) + - RDEpubReaderView/AI (from `../Sources/RDEpubReaderView`) + - RDEpubReaderView/Speech (from `../Sources/RDEpubReaderView`) - RDPDFReaderView (from `../Sources/RDPDFReaderView`) + - RDPDFReaderView/AI (from `../Sources/RDPDFReaderView`) + - RDPDFReaderView/Speech (from `../Sources/RDPDFReaderView`) + - RDSpeechReaderView/AI (from `../Sources/RDSpeechReaderView`) SPEC REPOS: trunk: @@ -37,19 +78,25 @@ SPEC REPOS: - ZIPFoundation EXTERNAL SOURCES: + RDAIReaderView: + :path: "../Sources/RDAIReaderView" RDEpubReaderView: :path: "../Sources/RDEpubReaderView" RDPDFReaderView: :path: "../Sources/RDPDFReaderView" + RDSpeechReaderView: + :path: "../Sources/RDSpeechReaderView" SPEC CHECKSUMS: DTCoreText: 11b7fe2104f476f82e75a4e3dbdde74d7186cecb DTFoundation: 76b624967cf5bcaae6bb057d622c536c36ef36d0 - RDEpubReaderView: 5a09a7856f04b6f2f8610aa6fd965d35cadb8e17 - RDPDFReaderView: f7c2d0ea7c129aa4ab15ae7f9daad2974573d749 + RDAIReaderView: 56783c71853c59bf6810f719a57a7f580eb7855c + RDEpubReaderView: 180444055ba2da2c52797cc08b307232f103a6d9 + RDPDFReaderView: 885be07e2b81cd0a8dc8a937b75faf9017ce045c + RDSpeechReaderView: 25fff9437d2692965ba326f37b108baf3e2ae7ef SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351 -PODFILE CHECKSUM: c39db27dbc9c6a96a33f22e78ce1b22dcd48d75f +PODFILE CHECKSUM: 7a0e6ee6c7d410a5128fb20775a450fd0d47292c COCOAPODS: 1.16.2 diff --git a/ReadViewDemo/Pods/Local Podspecs/RDAIReaderView.podspec.json b/ReadViewDemo/Pods/Local Podspecs/RDAIReaderView.podspec.json new file mode 100644 index 0000000..53d9850 --- /dev/null +++ b/ReadViewDemo/Pods/Local Podspecs/RDAIReaderView.podspec.json @@ -0,0 +1,60 @@ +{ + "name": "RDAIReaderView", + "module_name": "RDAIReaderView", + "version": "0.1.0", + "summary": "Local-first AI indexing and retrieval primitives for ReadViewSDK readers", + "platforms": { + "ios": "15.0" + }, + "swift_versions": [ + "5.10" + ], + "homepage": "https://example.invalid/RDAIReaderView", + "authors": { + "readoor": "ios@touchread.com" + }, + "source": { + "path": "." + }, + "license": "MIT", + "requires_arc": true, + "subspecs": [ + { + "name": "Core", + "source_files": "Core/**/*.swift", + "frameworks": "CryptoKit", + "libraries": "sqlite3" + }, + { + "name": "NaturalLanguage", + "source_files": "NaturalLanguage/**/*.swift", + "dependencies": { + "RDAIReaderView/Core": [ + "~> 0.1" + ] + }, + "frameworks": "NaturalLanguage" + }, + { + "name": "FoundationModels", + "source_files": "FoundationModels/**/*.swift", + "dependencies": { + "RDAIReaderView/Core": [ + "~> 0.1" + ] + }, + "frameworks": "FoundationModels" + }, + { + "name": "UI", + "source_files": "UI/**/*.swift", + "dependencies": { + "RDAIReaderView/Core": [ + "~> 0.1" + ] + }, + "frameworks": "UIKit" + } + ], + "swift_version": "5.10" +} diff --git a/ReadViewDemo/Pods/Local Podspecs/RDEpubReaderView.podspec.json b/ReadViewDemo/Pods/Local Podspecs/RDEpubReaderView.podspec.json index 2775d40..1df4e44 100644 --- a/ReadViewDemo/Pods/Local Podspecs/RDEpubReaderView.podspec.json +++ b/ReadViewDemo/Pods/Local Podspecs/RDEpubReaderView.podspec.json @@ -18,7 +18,7 @@ "tag": "0.0.2" }, "license": "MIT", - "source_files": "**/*.swift", + "source_files": "{DocumentFormats,EPUBCore,EPUBTextRendering,EPUBUI,ReaderView}/**/*.swift", "resource_bundles": { "RDEpubReaderViewAssets": [ "EPUBCore/Resources/**/*" @@ -36,5 +36,28 @@ ] }, "requires_arc": true, + "subspecs": [ + { + "name": "Speech", + "source_files": "Speech/**/*.swift", + "dependencies": { + "RDSpeechReaderView": [ + "~> 0.1" + ] + } + }, + { + "name": "AI", + "source_files": "AI/**/*.swift", + "dependencies": { + "RDAIReaderView/NaturalLanguage": [ + "~> 0.1" + ], + "RDAIReaderView/UI": [ + "~> 0.1" + ] + } + } + ], "swift_version": "5.10" } diff --git a/ReadViewDemo/Pods/Local Podspecs/RDPDFReaderView.podspec.json b/ReadViewDemo/Pods/Local Podspecs/RDPDFReaderView.podspec.json index 2a96cc7..4e75463 100644 --- a/ReadViewDemo/Pods/Local Podspecs/RDPDFReaderView.podspec.json +++ b/ReadViewDemo/Pods/Local Podspecs/RDPDFReaderView.podspec.json @@ -29,5 +29,28 @@ "PDFKit" ], "requires_arc": true, + "subspecs": [ + { + "name": "Speech", + "source_files": "Speech/**/*.swift", + "dependencies": { + "RDSpeechReaderView": [ + "~> 0.1" + ] + } + }, + { + "name": "AI", + "source_files": "AI/**/*.swift", + "dependencies": { + "RDAIReaderView/NaturalLanguage": [ + "~> 0.1" + ], + "RDAIReaderView/UI": [ + "~> 0.1" + ] + } + } + ], "swift_version": "5.10" } diff --git a/ReadViewDemo/Pods/Local Podspecs/RDSpeechReaderView.podspec.json b/ReadViewDemo/Pods/Local Podspecs/RDSpeechReaderView.podspec.json new file mode 100644 index 0000000..fe9c8ee --- /dev/null +++ b/ReadViewDemo/Pods/Local Podspecs/RDSpeechReaderView.podspec.json @@ -0,0 +1,39 @@ +{ + "name": "RDSpeechReaderView", + "module_name": "RDSpeechReaderView", + "version": "0.1.0", + "summary": "Text-to-speech playback primitives for ReadViewSDK readers", + "platforms": { + "ios": "15.0" + }, + "swift_versions": [ + "5.10" + ], + "homepage": "https://example.invalid/RDSpeechReaderView", + "authors": { + "readoor": "ios@touchread.com" + }, + "source": { + "path": "." + }, + "license": "MIT", + "source_files": "Sources/*.swift", + "frameworks": [ + "AVFAudio", + "NaturalLanguage", + "MediaPlayer" + ], + "requires_arc": true, + "subspecs": [ + { + "name": "AI", + "source_files": "AIBridge/**/*.swift", + "dependencies": { + "RDAIReaderView/Core": [ + "~> 0.1" + ] + } + } + ], + "swift_version": "5.10" +} diff --git a/ReadViewDemo/Pods/Manifest.lock b/ReadViewDemo/Pods/Manifest.lock index 55adce1..605eb49 100644 --- a/ReadViewDemo/Pods/Manifest.lock +++ b/ReadViewDemo/Pods/Manifest.lock @@ -16,18 +16,59 @@ PODS: - DTFoundation/Core - DTFoundation/UIKit (1.7.19): - DTFoundation/Core + - RDAIReaderView/Core (0.1.0) + - RDAIReaderView/FoundationModels (0.1.0): + - RDAIReaderView/Core (~> 0.1) + - RDAIReaderView/NaturalLanguage (0.1.0): + - RDAIReaderView/Core (~> 0.1) + - RDAIReaderView/UI (0.1.0): + - RDAIReaderView/Core (~> 0.1) - RDEpubReaderView (0.0.2): - DTCoreText (~> 1.6) + - RDEpubReaderView/AI (= 0.0.2) + - RDEpubReaderView/Speech (= 0.0.2) + - SnapKit (~> 5.7) + - ZIPFoundation (~> 0.9) + - RDEpubReaderView/AI (0.0.2): + - DTCoreText (~> 1.6) + - RDAIReaderView/NaturalLanguage (~> 0.1) + - RDAIReaderView/UI (~> 0.1) + - SnapKit (~> 5.7) + - ZIPFoundation (~> 0.9) + - RDEpubReaderView/Speech (0.0.2): + - DTCoreText (~> 1.6) + - RDSpeechReaderView (~> 0.1) - SnapKit (~> 5.7) - ZIPFoundation (~> 0.9) - RDPDFReaderView (0.0.1): + - RDPDFReaderView/AI (= 0.0.1) + - RDPDFReaderView/Speech (= 0.0.1) - SnapKit (~> 5.7) + - RDPDFReaderView/AI (0.0.1): + - RDAIReaderView/NaturalLanguage (~> 0.1) + - RDAIReaderView/UI (~> 0.1) + - SnapKit (~> 5.7) + - RDPDFReaderView/Speech (0.0.1): + - RDSpeechReaderView (~> 0.1) + - SnapKit (~> 5.7) + - RDSpeechReaderView (0.1.0): + - RDSpeechReaderView/AI (= 0.1.0) + - RDSpeechReaderView/AI (0.1.0): + - RDAIReaderView/Core (~> 0.1) - SnapKit (5.7.1) - ZIPFoundation (0.9.20) DEPENDENCIES: + - RDAIReaderView/FoundationModels (from `../Sources/RDAIReaderView`) + - RDAIReaderView/NaturalLanguage (from `../Sources/RDAIReaderView`) + - RDAIReaderView/UI (from `../Sources/RDAIReaderView`) - RDEpubReaderView (from `../Sources/RDEpubReaderView`) + - RDEpubReaderView/AI (from `../Sources/RDEpubReaderView`) + - RDEpubReaderView/Speech (from `../Sources/RDEpubReaderView`) - RDPDFReaderView (from `../Sources/RDPDFReaderView`) + - RDPDFReaderView/AI (from `../Sources/RDPDFReaderView`) + - RDPDFReaderView/Speech (from `../Sources/RDPDFReaderView`) + - RDSpeechReaderView/AI (from `../Sources/RDSpeechReaderView`) SPEC REPOS: trunk: @@ -37,19 +78,25 @@ SPEC REPOS: - ZIPFoundation EXTERNAL SOURCES: + RDAIReaderView: + :path: "../Sources/RDAIReaderView" RDEpubReaderView: :path: "../Sources/RDEpubReaderView" RDPDFReaderView: :path: "../Sources/RDPDFReaderView" + RDSpeechReaderView: + :path: "../Sources/RDSpeechReaderView" SPEC CHECKSUMS: DTCoreText: 11b7fe2104f476f82e75a4e3dbdde74d7186cecb DTFoundation: 76b624967cf5bcaae6bb057d622c536c36ef36d0 - RDEpubReaderView: 5a09a7856f04b6f2f8610aa6fd965d35cadb8e17 - RDPDFReaderView: f7c2d0ea7c129aa4ab15ae7f9daad2974573d749 + RDAIReaderView: 56783c71853c59bf6810f719a57a7f580eb7855c + RDEpubReaderView: 180444055ba2da2c52797cc08b307232f103a6d9 + RDPDFReaderView: 885be07e2b81cd0a8dc8a937b75faf9017ce045c + RDSpeechReaderView: 25fff9437d2692965ba326f37b108baf3e2ae7ef SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a ZIPFoundation: dfd3d681c4053ff7e2f7350bc4e53b5dba3f5351 -PODFILE CHECKSUM: c39db27dbc9c6a96a33f22e78ce1b22dcd48d75f +PODFILE CHECKSUM: 7a0e6ee6c7d410a5128fb20775a450fd0d47292c COCOAPODS: 1.16.2 diff --git a/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj b/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj index b942431..99a24f0 100644 --- a/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj +++ b/ReadViewDemo/Pods/Pods.xcodeproj/project.pbxproj @@ -8,1245 +8,1362 @@ /* Begin PBXBuildFile section */ 002685407B9C4D548571DA24AFD6E8F1 /* NSString+Paragraphs.m in Sources */ = {isa = PBXBuildFile; fileRef = 39F01D07F324B206706E9809D44643C1 /* NSString+Paragraphs.m */; }; - 00533D00D0799587B6A77B4BAF852F16 /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E06DBE2154F8FCE42DD5E8CB02B258 /* ConstraintView.swift */; }; - 0092B10CEF9FA5B003A243F20E685AC0 /* DTSmartPagingScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = BAC3BCDBDD88D30A3F51094944FB70FC /* DTSmartPagingScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 00A77DF1E3D88B9FB43E68863591E2E7 /* RDEPUBWebView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13FF31007A05E5706CF26F9BC9DBD462 /* RDEPUBWebView+Configuration.swift */; }; - 00BFF92A6EB62A825FC27C55B773FFB4 /* RDEPUBChapterData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 930C3411505409ABE11F153B7A416991 /* RDEPUBChapterData.swift */; }; - 00FD74A9CCE1BD7C92EF92B3051C7EAC /* DTBase64Coding.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D70C4504AFE88A621171FBB9368722F /* DTBase64Coding.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 010659F20A2ABE308E90E1BBC242BD90 /* ConstraintDirectionalInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0BD46122D186FBB226483F8DB80E6CE /* ConstraintDirectionalInsets.swift */; }; + 0030FDF2E834088639D9C73A89669CC1 /* RDPDFReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 507D9D8B9C2FF474F3C6BE68C6EF6C50 /* RDPDFReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 00A4DA374441586757BAE1F167ABC0A0 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE51B89744E67BA9CF7E4E2C6DB4DA05 /* ConstraintRelation.swift */; }; + 014249F0755B88BB23D3DCE2B412EEE7 /* NSFileWrapper+DTCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 9719394B24A0CB3CCE6CCA87A0A70D08 /* NSFileWrapper+DTCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; 014449AE560FFF3C628FAE639D043004 /* DTAnchorHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = CDDC623AB1701601A907DA67C2F8F283 /* DTAnchorHTMLElement.m */; }; - 01AF419B0730918A46EF569E2391B967 /* RDEPUBModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D75F4A7A02692556E18AC3A388A190 /* RDEPUBModels.swift */; }; - 01F9BDEBC2DAA860F9B415ABB5A66A64 /* RDPDFReaderDrawingCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B6EFF1EBD266465C28091AEDD73E0B /* RDPDFReaderDrawingCanvasView.swift */; }; - 03290D0EDE675175B8346B3BBA253DE0 /* DTFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E6AD45B90D08BACAF3AF76AE40BBCC10 /* DTFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 015030FB0BE3DB44A72B84FA3F80DFF0 /* RDEPUBChapterOffsetMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DD53D37218AA3C7D5C7756F00FA21E9 /* RDEPUBChapterOffsetMap.swift */; }; + 01BAD9DD97D25EDF620445B8876BD981 /* String+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7CB58976A61DDAE85B44D4B6CB30A02 /* String+RDEPUB.swift */; }; + 01E94FCF0AC80F5B5B3D6B7D7551F2D2 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + 01FF57F8E540F20A7FADEE33AA1C7A73 /* NSURL+DTComparing.m in Sources */ = {isa = PBXBuildFile; fileRef = EF82EDCB0C8172FAF3847EAAD873E096 /* NSURL+DTComparing.m */; }; + 02DB3F5CD60A80BC4A27F77EEE2C9372 /* RDEPUBTextPaginationSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35A48CFD97F259DB677ECBF3A5AB8B60 /* RDEPUBTextPaginationSupport.swift */; }; + 03B012C7959735A0A532A444902DBCF6 /* RDEPUBReaderDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 921EA5C03E5608583DE9F4C2FC49704B /* RDEPUBReaderDependencies.swift */; }; 03D90C831397E8636A33CE557024A136 /* NSMutableAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = FAA140AF73738B23155578D0AA734FE3 /* NSMutableAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 04527DC803E0144AD715A2C7A06C1E3C /* Pods-ReadViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */; }; - 04ADF9469A9C4CE55FA682EA65EB5DF5 /* UIImage+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = B5E7F56675C029BC561A7EFB55EF0041 /* UIImage+DTFoundation.m */; }; - 051F47746E8330E1BB280C3A4A0EC510 /* RDEPUBReaderToolViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82C4B8E3666736C72FD8AA9774095CD5 /* RDEPUBReaderToolViewProtocols.swift */; }; + 03F49D0C58DE83CC45DF27596421D966 /* RDEpubReaderView+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3410BDB001A65A79622F3980646A4AAE /* RDEpubReaderView+CollectionView.swift */; }; 0561DF6793C8516F469D9813F5CE3211 /* DTCoreTextLayouter.m in Sources */ = {isa = PBXBuildFile; fileRef = F0D5A0F7E62D88B94912634DC9AD339D /* DTCoreTextLayouter.m */; }; - 0580598854A03D4712CE0EE68716DBAD /* UIColor+RDEPUBHex.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24CED4F43EC2C2F55A6512A761B97B9 /* UIColor+RDEPUBHex.swift */; }; - 05D03C10C306DD68133220014C15C963 /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C67AF64AACAFBCB1D6D909BF030731 /* LayoutConstraintItem.swift */; }; - 05D41C82695A154984AB656F29955C77 /* RDEPUBWebContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34407B046ADF145B3DA08FE4C28609C6 /* RDEPUBWebContentView.swift */; }; - 05FCA262E9BFEA1114B209A4B7A369E1 /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB434D5D2C4FC39DB37D676ABB6B7C68 /* ConstraintMaker.swift */; }; - 086F18593CE2300734027A8BD396A28F /* cssInjector.js in Resources */ = {isa = PBXBuildFile; fileRef = 71751F490BDBE080BDE46E24BD09DC25 /* cssInjector.js */; }; - 08A306C9384471B8D7F3E748E57AEA96 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50AE5BE674D885BED9B796FE8D97FAF8 /* QuartzCore.framework */; }; - 0961AAE9066CA5087BF43739577F66D1 /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C06D2A51375DCB872C5A41004E287C0D /* SnapKit-dummy.m */; }; - 09B49EFE6223F79FA3DBF2322ABEC3A1 /* RDEPUBAttachmentNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6B4FC527668E1E4A43F77E5D5B034EF /* RDEPUBAttachmentNormalizer.swift */; }; - 09B8D40F105A1239C137746B77D54A49 /* FileManager+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCF9B3BF987216CF1766D80FED04CF72 /* FileManager+ZIP.swift */; }; - 09C5D40EBC95C1DF08980AB315CEC608 /* wxread-default.css in Resources */ = {isa = PBXBuildFile; fileRef = 1D7343E0F0547D801BC11E2D708AA33A /* wxread-default.css */; }; + 0605C6A0977CAF4D7FD6546BBDB108C1 /* RDEPUBChapterLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EE7ABC1E00E2AD5CD17521B799DDABF /* RDEPUBChapterLoader.swift */; }; + 06870EC1863AADE7D8B2C9763F177876 /* RDEPUBAttachmentNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60EC254E73980C2F0AA36B2A4ABA4E04 /* RDEPUBAttachmentNormalizer.swift */; }; + 06C626009858F55BA7AB71C715C99FF4 /* RDEPUBNoteDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 574844915C6A0BA87B43940426C8DA96 /* RDEPUBNoteDetector.swift */; }; + 085826A323C90FB16A9380AD88E1E394 /* RDPDFReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34FC1DCF56B5AEFDF71CEC0334776D7A /* RDPDFReaderPageChildViewController.swift */; }; + 08DD8BC85A59A1552E0BF4FB6B6CFD80 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + 0952462BA9D73DF2A199FCB7105FB349 /* RDReaderDocumentFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD4C2E0881354D1B1CF3ADF0A8A3E552 /* RDReaderDocumentFormat.swift */; }; + 09BA8E7D20E0618BCF471289D6E7239A /* RDEPUBNotePopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76D2244BDA6024551727F35AA3454980 /* RDEPUBNotePopupViewController.swift */; }; + 09BE0B86A0FB9B8EF550CA3BABDF1792 /* RDEPUBReadingLocationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = E47128B5AD65D4FA9BA728CDF73C47E5 /* RDEPUBReadingLocationModels.swift */; }; + 0A0A9938628FC39F96C5FC206CC3CE26 /* NSData+DTCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = D97A43F1E6018B92E85B58BB6549F7CB /* NSData+DTCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0A9B84091398DE20C772FA9FA2803150 /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20AFDAE6841D0000824C044E2CCEED62 /* ConstraintLayoutGuideDSL.swift */; }; + 0A9D1BAF9EE83FDBA8B4976EEA453EFA /* RDPDFReaderPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F2C8B38BF0106D946BEE9F7E854D08 /* RDPDFReaderPageView.swift */; }; 0AAA5BB1DBF584102B15CF8738F1815E /* NSScanner+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = BA83941397AFE127903C2DA0EE626295 /* NSScanner+HTML.m */; }; 0ABC4D62588EABAA636441FD9A82C940 /* CTLineUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = B72E60DFC15F208F1BA00518E64F79B5 /* CTLineUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0B16758571EB7BE5E544AE8896E74B36 /* RDEPUBParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D82EEDCF29F3E5B37BEA5191F49610E /* RDEPUBParser.swift */; }; - 0B5BA9A15467D36EB54F7CFF8036AB85 /* DTCustomColoredAccessory.h in Headers */ = {isa = PBXBuildFile; fileRef = 81B4314CBEDA71647A929517B936613F /* DTCustomColoredAccessory.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0B6FA1F22150D7F8B1865F41FF70C922 /* DTImage+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 551D98EE6C1653939AE1E3BCBC4ACC2E /* DTImage+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0BB8E31E895FFFDDAB4CC41EEE1FB440 /* RDEPUBCFIMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = C70BC146F77AE5CE624A06A7946C1703 /* RDEPUBCFIMarkerInjector.swift */; }; - 0D165B3DF90CADA8EE5DCCCB44A9B2E1 /* RDEPUBReaderController+Orientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D4D4F7D2C3A548F609164CC506388BE /* RDEPUBReaderController+Orientation.swift */; }; + 0C967A3A008695E1753456852CB381FB /* RDEPUBWebView+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA573F944A7ECEBBA9EC81D72F804D7E /* RDEPUBWebView+Search.swift */; }; + 0CF0135E674D9001A4B648AECCB06957 /* RDEPUBReaderBottomToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81120E66C1F56C6F0FAC98FE155554BE /* RDEPUBReaderBottomToolView.swift */; }; + 0E6CC1B4E893EB6D9D76FCCDD125F3CD /* RDPDFReaderContracts.swift in Sources */ = {isa = PBXBuildFile; fileRef = F01A20D999E550EFA3C472C3A20E6A90 /* RDPDFReaderContracts.swift */; }; + 0E8556C840877C1148B5D096999F0A35 /* RDEPUBAIContentProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD49AF7F1AEB81E28CF54BDF4BEB7343 /* RDEPUBAIContentProvider.swift */; }; + 0FA3F4FEE3F9660657F0AA0117B95BD3 /* RDEPUBWebView+Reflowable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75AA5BC3865826B2B32B3305A8CC578B /* RDEPUBWebView+Reflowable.swift */; }; + 0FBD916D1B6E3B7093D734C8D0AFDB2E /* DTVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 16023686DC389E6755BC79366433C45B /* DTVersion.m */; }; 0FCBC8C64D8862F2A0E8794EDADDECBD /* UIFont+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = D4A82B2715640986D3701AF889DBD599 /* UIFont+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; 100BFFBD24F234C095EDB001B8088DB1 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m in Sources */ = {isa = PBXBuildFile; fileRef = 74B2884E9214B5B38193587D773554BA /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */; }; - 1018B5174E5013C9C38391BB507C4F8B /* DTCoreGraphicsUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 68302D3003412D32673539BAF3A71FFD /* DTCoreGraphicsUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 10446CA423A9DBE2C3CE27C0C5BBE952 /* RDEPUBAnnotationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34112F3165802F124416A83D4B7B15AA /* RDEPUBAnnotationModels.swift */; }; - 105FAC578AB664388C1943FF0F6F84ED /* NSString+DTFormatNumbers.h in Headers */ = {isa = PBXBuildFile; fileRef = F4C4EC50C6DC93761BB6C825CE1C4ECD /* NSString+DTFormatNumbers.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 10639C21834EA03821258B750FF59966 /* ConstraintMakerRelatable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80235C2E1DB28406F275E23F0ADDE9B /* ConstraintMakerRelatable+Extensions.swift */; }; 109458F9D48FD4F381F0E40E2DB3D91C /* DTLazyImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 773601B72FDE742724A1FE66115AC185 /* DTLazyImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 10D2345D0BDAB0A1116848C3E6556168 /* Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D34826E445B4E08B0CEC27C6EB4DF3 /* Archive.swift */; }; + 1165297CCE80FFFE9D1895606E803232 /* RDEPUBReaderServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D56EC508FD85074993AAB6580F72631 /* RDEPUBReaderServices.swift */; }; 11AB1902A68385851FB81E870991F9A0 /* DTImageTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F97367EBFF425820B717CAC4FAF59F2 /* DTImageTextAttachment.m */; }; - 129D4B35C96A44FF51627D670168E256 /* RDPDFReaderView+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD002812D1D11866A93FEFB5024D5DA0 /* RDPDFReaderView+CollectionView.swift */; }; - 12B4A35B8E40C112E18A7C5511F023E9 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63482DC4A15D66980EFBAA222D2D6CA8 /* CoreText.framework */; }; + 11BF04E60C430795B9DC542B74412F50 /* NSString+DTPaths.m in Sources */ = {isa = PBXBuildFile; fileRef = C862AF3C9768AEC3AF792217547BE47D /* NSString+DTPaths.m */; }; + 11CF5494F84324BEB5016EFE7046E6A3 /* Archive+BackingConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67C4B1FD4CAF8FFB009FF39F501B2650 /* Archive+BackingConfiguration.swift */; }; + 124EF6FA0D36BAD0D5B4810DB6345179 /* UIView+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A3A81081A2422058887BCEEAA78C9D /* UIView+DTFoundation.m */; }; + 127914591EE3F5145BC14A25A0A57D08 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C8857C84AAC2099B1037C035B8AFF5AF /* UIKit.framework */; }; + 12B4A35B8E40C112E18A7C5511F023E9 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F4320A57A5573831CD151F06C5420C5 /* CoreText.framework */; }; 130C3A85D9F9F445222C2E31EC245B0A /* NSScanner+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BE6B072BF746163179BDF80F8CDBE1D /* NSScanner+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 135E8C300067D3E03A313D518706EAA9 /* RDEPUBReaderRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64DE54DECA8006B6CC936B6A5271D1ED /* RDEPUBReaderRuntime.swift */; }; - 13779EFC4B60766AA45F4C453EC5E89A /* RDEPUBReaderDependencies.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5465156489BA8D643EA9935146897329 /* RDEPUBReaderDependencies.swift */; }; - 13939482D36155060087CC4080166F49 /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20AFDAE6841D0000824C044E2CCEED62 /* ConstraintLayoutGuideDSL.swift */; }; + 139798AD5B222F7C1B19899AF80B5CE7 /* RDEPUBPageInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D098B6BDF458996B5B3A757722DF5C3B /* RDEPUBPageInteractionController.swift */; }; 14BDD9FB7A7AC5C8ABFF8D24C381F3DA /* NSAttributedString+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = F610362838046514D87BF38DAC3B7829 /* NSAttributedString+DTCoreText.m */; }; - 14D5FEB30629D96E8DA566B49D770031 /* DTExtendedFileAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 7440BEAF1F0CA8CE70C073FFEAF637F5 /* DTExtendedFileAttributes.m */; }; - 155F420C89324E92D8DE72847F1D7E64 /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F34DCA2B1BAA4FC1470138FC11B494 /* ConstraintInsetTarget.swift */; }; + 14C1DE78043A17227D4672B8EFE3A241 /* DTFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D211ACA62A5B241A668A682054310DE /* DTFoundation-dummy.m */; }; + 14D05471258FA4D33B016F47CBD4686F /* DTBase64Coding.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D70C4504AFE88A621171FBB9368722F /* DTBase64Coding.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1514F1D466B8422AE5089E7C9F23219C /* RDEPUBReaderController+RenderSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28C6EB4B2B6DC691D28EEBC2BDB4D2F3 /* RDEPUBReaderController+RenderSupport.swift */; }; + 1548259806AC2F2B1C7E8391DAA23341 /* RDEPUBChapterDisplayContentCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 069D7EE5E989A9F963E518365DDB0301 /* RDEPUBChapterDisplayContentCache.swift */; }; 15A7ED15DA03DD3B9F26A017D270D1C2 /* DTCSSListStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = CAED9812FF45FFA82A7B68F7B2B656D4 /* DTCSSListStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15ADFF2FC3055D22BE783942D1212A11 /* RDEPUBWebView+Search.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFCB5D51A2FE9AE00599C8B10A728AC7 /* RDEPUBWebView+Search.swift */; }; - 15E4A50ACA89EF7661AE074DBFFDF5B7 /* RDEPUBMemoryProbe.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE8ABB198220CF4FE67049FE2349947A /* RDEPUBMemoryProbe.swift */; }; - 1639ACF52DF98CEB9D0209EAD4CD6AA3 /* RDEPUBRenderDiagnosticsCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB985E900E9F34170BD44A81E7FD1C83 /* RDEPUBRenderDiagnosticsCollector.swift */; }; - 167B3023D4C7C6FEB312E907C356283E /* NSFileWrapper+DTCopying.h in Headers */ = {isa = PBXBuildFile; fileRef = 9719394B24A0CB3CCE6CCA87A0A70D08 /* NSFileWrapper+DTCopying.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17281C88AE75A26C730E43C15467E723 /* RDEPUBSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECBD2FB74FE0B1966256CD0C39BF1F83 /* RDEPUBSearchEngine.swift */; }; - 17B9F651C4E7C21338A2AB04DAB3121D /* DTSmartPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C1C6E107AA4540639C1ED1E7741CF07 /* DTSmartPagingScrollView.m */; }; - 191824B2B1E1B0A7DD3B6298100B4B8A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6677A5CD728A7E722DC3075C374CDF4 /* CoreGraphics.framework */; }; + 160890D3E69645A3EBE3E4A7D821BA7C /* RDAIDiagnostics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 291A21D778336F982A7197655BD501D5 /* RDAIDiagnostics.swift */; }; + 1667634A08E3C710A759A0E33C72F6EA /* RDAIReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 299AED4539FF5F16ACFC414AF2BDFCF3 /* RDAIReaderView-dummy.m */; }; + 17337E40B13F3CFCEDA9BE1AF9C73EC7 /* RDEPUBCFICompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1A0367B13040EC2A557AA275A2D16D0 /* RDEPUBCFICompatibility.swift */; }; + 182E369F1A51C69E281F4A32F4C75A3B /* RDEPUBReaderAssemblyCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65F72183F6B8013C5A520595006A2B5F /* RDEPUBReaderAssemblyCoordinator.swift */; }; + 191824B2B1E1B0A7DD3B6298100B4B8A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 968484A28FBB84723F621DB66ECA3347 /* CoreGraphics.framework */; }; 19649ED312D92A6F5D2D6AF4E540CE75 /* DTHorizontalRuleHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4113E34E3BD2181F4202CECBB3A0DDBA /* DTHorizontalRuleHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1989C9CC57E1100B8EDF3F5844C9DA6E /* RDEPUBReaderContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5C393B65BEDBCD67A7B2BD0FD26B869 /* RDEPUBReaderContext.swift */; }; - 19C8677572874927A3364FF627870BBE /* PDFKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 232BAE44CA9BE28B729B402BC8B8FAD8 /* PDFKit.framework */; }; - 19FB4576BF3DC1B22EFE421249D4CE70 /* RDPDFReaderImageTextRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 636AF7DBBCB7320FC883EAFE197EF923 /* RDPDFReaderImageTextRecognizer.swift */; }; - 1A2AED084871CA3A78226A16B2893A71 /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53EC1D66653102E077AA44906338EB5 /* ConstraintRelatableTarget.swift */; }; - 1A4D4371A6D8086811CA461DC49BA33F /* RDEPUBParser+Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CC0B71EB8AFFDB330E0D8E99CFFCDD3 /* RDEPUBParser+Package.swift */; }; - 1A53A0E3B617A60D8ADC80B68EEE35A1 /* NSString+DTPaths.m in Sources */ = {isa = PBXBuildFile; fileRef = C862AF3C9768AEC3AF792217547BE47D /* NSString+DTPaths.m */; }; - 1B0202FF627E2F99AA09AD8D76A84AC9 /* RDMOBIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0E0892DD8B09BBF7E0234F6E258D6B5 /* RDMOBIParser.swift */; }; - 1B5052AC71482489C571B9C473DE3ED4 /* NSMutableArray+DTMoving.m in Sources */ = {isa = PBXBuildFile; fileRef = D245D04D70A4D36DC86741D0833AA95A /* NSMutableArray+DTMoving.m */; }; - 1B757164A8714741AEB51962CE84E0AF /* RDEPUBReaderHighlightsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB6B2A6C61E6FB95968A8366924DE033 /* RDEPUBReaderHighlightsViewController.swift */; }; + 1A91DAF2EE1CBCEAFE3DCBA474A37B96 /* DTAnimatedGIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C66F715840302F2CF4DA6C8558A09BD /* DTAnimatedGIF.m */; }; + 1AC7119C4E97CD39EACE1DCC42934B5D /* DTTiledLayerWithoutFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 188A763544B134CC1004ECB7380538D7 /* DTTiledLayerWithoutFade.m */; }; + 1B09F42416EFE5283FC7330972AC0C76 /* NSString+DTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = FC467FD187B387BBBF0D10B192925B53 /* NSString+DTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1B0DC9C853B5DEE751669FD4354DE805 /* ConstraintMakerPrioritizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD26CED79D9BC8B6093FB7163627198 /* ConstraintMakerPrioritizable.swift */; }; + 1B6351C2682D454F363D37CC64CE6F03 /* RDEPUBAssetRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01E5F8CCBFB0567360782BD2FF0589A9 /* RDEPUBAssetRepository.swift */; }; + 1BA306604BC42737DC0D6BBFC784DC50 /* RDEPUBTextAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E85471307D55F36163C3495688467A3 /* RDEPUBTextAnchor.swift */; }; + 1BCB2EB28C3C067487EF3FEB7AB2C3F8 /* NSString+DTFormatNumbers.h in Headers */ = {isa = PBXBuildFile; fileRef = F4C4EC50C6DC93761BB6C825CE1C4ECD /* NSString+DTFormatNumbers.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C3C237A9574F88C92E569D7FB3B424C /* RDEPUBTextIndexTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5F6803E56DE9E7EA1CCF0388E607674 /* RDEPUBTextIndexTable.swift */; }; + 1C58CE096885BE414C2A52164C5476D3 /* Archive+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 304EE7D51CFA84D5F4DBD3F5745F241D /* Archive+Helpers.swift */; }; + 1C7C1FDE094C83066C87B015B477B63D /* DTBlockFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EA0602B933CD0C98C4AEEE449A8D048 /* DTBlockFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1C7DB25B5090AEEFE61B7140803A213B /* RDSpeechTextPreprocessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08203CC2BC14FB8B3BA0CAA3EC92789C /* RDSpeechTextPreprocessor.swift */; }; + 1CC6284347B8897DE0D4AC7BE196EB03 /* DTFoundationConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 617D0CB55C260D48CC4ED2FF0A3A1051 /* DTFoundationConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1D460603DCA4A4E5ECFE8FF1F1CACC10 /* DTColorFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = D92D7AF796DC45709FBBF4BBCBF47095 /* DTColorFunctions.m */; }; - 1DB02C024072801E6C83196C6F4CD925 /* RDPDFReaderNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F61B106422AACE26C3C7B05C5293DCC /* RDPDFReaderNavigationView.swift */; }; - 1E3CAFB57AC9CEDA5052E2B7C2862DFD /* RDEPUBCFIGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E7DF84037D55273D99B5284EDE7F7FC /* RDEPUBCFIGenerator.swift */; }; - 1E8BEAB75C40E2ED799CAA16BAC8807A /* RDEPUBNoteResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45019AE00B85C161910232F35A46E260 /* RDEPUBNoteResolver.swift */; }; - 1EAE1F26CFFAAE7BA3EED4A895A65283 /* rangy-serializer.js in Resources */ = {isa = PBXBuildFile; fileRef = 2F23F0E002BEE47B1E786821D96067E4 /* rangy-serializer.js */; }; - 1ECBE1E3E48F3BEB91DA496842A61CE8 /* DTFolderMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A381F075AF6CD9AFBB86130B39E20B4 /* DTFolderMonitor.m */; }; - 1ECD2540B27D5D2E20144AC08D55DC85 /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D42C4F678DDCCEAE9A66D3D55B30AA8 /* ConstraintMakerEditable.swift */; }; - 1EE5DC3F2D93547DB6E397E8B963C7F6 /* Data+Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 005A076C910A4DBBE6E72F4D11CB624E /* Data+Compression.swift */; }; - 1F811F480AA892090B887D50BF1FB361 /* NSArray+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 73DCE046F4B55AE88A81C9E68400E93C /* NSArray+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D53FB2F09A7E9704EBD84ED30B0B1CE /* RDEPUBBookPageMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51339BC494F76D8DB8C1A4968689C617 /* RDEPUBBookPageMap.swift */; }; + 1D57100D8CB86A35A93EFBB76724F69F /* Date+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = E209D74CEC1626A09885E55370AEFA53 /* Date+ZIP.swift */; }; + 1FD0A2E78909C51ABC12325319144E33 /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A672DF142E75858C34A342B2BB2AC891 /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 202E57B1A71FF32D64CA97314E0C6C6D /* RDEPUBReaderSearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87855F530B15477A1936F953D0A86A63 /* RDEPUBReaderSearchCoordinator.swift */; }; + 20C84711D379B1244D44F6AE4CA46ACA /* RDEPUBWebContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D0BA256721E4BAFE43E91891A606A06 /* RDEPUBWebContentView.swift */; }; + 21716775545B74C62A2BC9D1F5399267 /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E87093B88AB6F2B6A8E775DB61D7F9B /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21D7ABAF802A959CC8813308649ED6AC /* URL+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E46A6DEEE6CEA27A1FC9024036D8136 /* URL+ZIP.swift */; }; + 21F1E8FEECFB4CE5A7138DE50CF7E7C0 /* UIScreen+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 60052288EBFD0DEA0CD594641192FB5C /* UIScreen+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2203356EEA94A9172BC7902923E43CBE /* DTCoreTextFontCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 380BFE2729ACC77B6F3E846E9C456848 /* DTCoreTextFontCollection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 222A251FA9F106A668FC4273EC4200FF /* Archive+Reading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C726091C55C51A29EFD42913073CA5E /* Archive+Reading.swift */; }; - 2285D8F6F8450CB71AAFC2398CA269EC /* RDEPUBSemanticMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = B36A4B649DD5CA1C5D4DAFC54E0E13DC /* RDEPUBSemanticMarkerInjector.swift */; }; - 228E6814C78EEBFEE8E9EA4802016FC0 /* DTHTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F78033C34E8C1FAD3B27FFC4F959A611 /* DTHTMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 23A689CCA9073CE674B1BD450629DECA /* RDPDFReaderView+Paging.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3BF1AFD43CD35EDA59ED119955FAC96 /* RDPDFReaderView+Paging.swift */; }; - 23BBE3B3573E7296084D8A61A1FA1AD4 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B466C1278D8245B512592A07C1965D32 /* ConstraintConstantTarget.swift */; }; - 23BC290FF41AD9EFC3C9C0E9BB9F008C /* RDPDFReaderKitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5AAA2346B2236EB367432D8CD2FB317 /* RDPDFReaderKitView.swift */; }; - 2413A6C52542F45B1661CF6AC1FE2D65 /* Archive+Progress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73FD0605520377843F2F940947AFE16C /* Archive+Progress.swift */; }; + 22485CB22E048DEB02531E40C36B78DD /* RDCBZReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10207D5C5DF3B33C322957B6325ECA5D /* RDCBZReaderController.swift */; }; + 2272682D201A6AB03AC748D5EE1B4C9C /* RDPDFReaderKitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBED33030719998F00A5173D3C466BD8 /* RDPDFReaderKitView.swift */; }; + 22796A7363B805A1A3CFE22E9FEF53DA /* Pods-ReadViewDemo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */; }; + 22C3CE5D30DEA275C026014A7C6A8DE3 /* Archive+Reading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C726091C55C51A29EFD42913073CA5E /* Archive+Reading.swift */; }; + 241586B93762F9D98786D76EC098B7D9 /* RDEPUBImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089BC1322F491BEB59F94895FDB65109 /* RDEPUBImageViewController.swift */; }; + 241EA2AA99E27D96E4468289A8B02F42 /* RDPDFReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CEFCC148B58604D0C5A3C240C51B45FD /* RDPDFReaderView-dummy.m */; }; 24395BEB3C360D9DA5180BFB955B04A0 /* DTAttributedLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F398A3D1144707216F9A20BEDF911E /* DTAttributedLabel.m */; }; 2445709667CB3820E51CD4AA915E6943 /* DTHTMLParserTextNode.h in Headers */ = {isa = PBXBuildFile; fileRef = 034BC384E1BA330755046E5212201E4D /* DTHTMLParserTextNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2474F7E6FA6B8473C121C81B6FCDCCF3 /* NSMutableArray+DTMoving.h in Headers */ = {isa = PBXBuildFile; fileRef = 08A8B32341BD833856874E046C97EE36 /* NSMutableArray+DTMoving.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 24B7824198086E4C7FEA42755440DF60 /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7271637D32095C0F526965851E2E06 /* ConstraintLayoutSupportDSL.swift */; }; - 24BC5333E523715A7F230CBF3E2C073F /* DTAnimatedGIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C66F715840302F2CF4DA6C8558A09BD /* DTAnimatedGIF.m */; }; + 2495C0D30963F211D8127D8ABD02C4C7 /* RDEPUBTextContentInteractionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDC92A937FE8D7CA37ED82CCEDBCC6E5 /* RDEPUBTextContentInteractionCoordinator.swift */; }; 24C5B52FD2AA9C49731DC6859ABA7CDE /* NSDictionary+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 6EDBB29D0A60FEB56FCC489DC10F37BB /* NSDictionary+DTCoreText.m */; }; - 26315E878BB38BE50BD5DD77C00BBBED /* RDPDFReaderNavigationPanelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5563F7DA776199803E76170B264676BE /* RDPDFReaderNavigationPanelViewController.swift */; }; - 2636FEA811FE9EEEFEA940143DD17AB3 /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F533E14DBE841E334D44FEDC9132726 /* ConstraintOffsetTarget.swift */; }; + 24E26EC4E2715E28AAAF2239556E5D08 /* Archive+Progress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73FD0605520377843F2F940947AFE16C /* Archive+Progress.swift */; }; + 256F2FBEA0BA50D272159F02D902F611 /* RDEPUBWebViewDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8240722CAA937E143E861EF85889D881 /* RDEPUBWebViewDebug.swift */; }; + 26B43D124F927B5A192121E2DAFEBCBA /* RDEPUBAnnotationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5F66A96961A944FE192D39888B026E6 /* RDEPUBAnnotationModels.swift */; }; 270C5C10028F0BC5A62548326CCB379B /* DTColor+Compatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DCFEFDD6D693AD5967568E86920AB08 /* DTColor+Compatibility.m */; }; - 27C488C467E166610F298953A8253BC2 /* RDEPUBCFIResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88FCFBF2D7F2A0C26D1FBF5161035517 /* RDEPUBCFIResolver.swift */; }; - 2808691D62CA0901739A8462538139A5 /* RDEPUBPageInteractionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 257E3A6D94EB339AF710CBA1515719DC /* RDEPUBPageInteractionController.swift */; }; - 287346F1E7822C038D95AAC869F8EE1A /* RDEPUBReaderSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D18CE46766B67622CBA19146529FE7AD /* RDEPUBReaderSettingsViewController.swift */; }; - 28E83C2B2DBF5887E15EA2F133800C2D /* RDEPUBBackgroundPriorityPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46D6BA3E651245BCC8808128EF553958 /* RDEPUBBackgroundPriorityPolicy.swift */; }; - 294DF90539B944BF674F3C9C999D6F23 /* RDEPUBWebViewDebug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E68AD352C43FD90827957D8073F835A /* RDEPUBWebViewDebug.swift */; }; + 2724CBD89B0C9184F4968F5110B305DA /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D42C4F678DDCCEAE9A66D3D55B30AA8 /* ConstraintMakerEditable.swift */; }; + 27691FDEF4012C72412E27C97A68431F /* RDEPUBReaderController+TableOfContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE29D77AF696BBB755DED2A768C03D64 /* RDEPUBReaderController+TableOfContents.swift */; }; + 27C86A56BD84C02BD3EDEE479F3E6E33 /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81E4757842563D7D3DAB82C8B693B313 /* ConstraintViewDSL.swift */; }; + 28D89515B1F7B8051B6C8959D72C9366 /* RDEPUBJavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B786661CF20BBDCE901A8609DACF061 /* RDEPUBJavaScriptBridge.swift */; }; + 28D8E43A60A58DA7961352C1F9CEE6B1 /* RDAINaturalLanguageAnalyzer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D908F35D94E51D89507601431AC05B9 /* RDAINaturalLanguageAnalyzer.swift */; }; + 291EC7B4A19AC0C5068EA15FEA02E358 /* NaturalLanguage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46D01D4D15C2295F678A21C84B825ED /* NaturalLanguage.framework */; }; + 296FF829157CD0B704761BD5C7DF0C3B /* RDEPUBPageCountCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A70E0ECB35D874C1E9699C1CD0F6261 /* RDEPUBPageCountCache.swift */; }; + 2977D8358E329AEA906D3E64910F451D /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39EFEE9E154AB29DC2CC553438E66442 /* ConstraintDescription.swift */; }; + 29CD7DA003E4881406DD828AC2BEB203 /* RDEPUBReaderController+PublicAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32038A3480CA43711F902B42126D03E6 /* RDEPUBReaderController+PublicAPI.swift */; }; 29D9B32DFFC59A157EDEF005DB92A5AC /* DTCoreTextLayoutLine.m in Sources */ = {isa = PBXBuildFile; fileRef = 172C1329A4A6171B18EC5A192815941B /* DTCoreTextLayoutLine.m */; }; + 2A7A9E2D867D0F878B468725D814118B /* RDEPUBReaderController+RuntimeBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2856AF81B14F4FE03A4968F3E239DAD6 /* RDEPUBReaderController+RuntimeBridge.swift */; }; 2AAF9361720FC2D8FFCA93B5FAE42019 /* NSMutableString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 0769148555F482C8DF7EA21F6935B7F4 /* NSMutableString+HTML.m */; }; - 2B2B79EBE69FD69100988552BD920775 /* RDEPUBReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F65D6C8950F76034AD414199E8D4C2E /* RDEPUBReaderTheme.swift */; }; - 2BD3DBBA503E1B2B2AB4AE1EED3612A4 /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39EFEE9E154AB29DC2CC553438E66442 /* ConstraintDescription.swift */; }; - 2C3E8B24AC8FD7CC8759287E1DA19180 /* RDEPUBRenderRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7EF3FC064B375733390FA3799A617B /* RDEPUBRenderRequest.swift */; }; - 2CEB3C712A0253686046DF022AFAA816 /* NSData+DTCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 503556D1790A886D0E591A982279641B /* NSData+DTCrypto.m */; }; - 2D9ED50265434753B6D9C1B50A21FCED /* DTExtendedFileAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = D362CCA87B017930E7481AFE2E73FB74 /* DTExtendedFileAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2FA5C87F7EAAA97726C4CD9D9B059B6F /* RDEPUBChapterTailNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B05F3444C3A7680B4D1E4DE01B8A567 /* RDEPUBChapterTailNormalizer.swift */; }; + 2B0FB35E1C7A1961D824C5958EE56B6D /* RDEPUBNoteResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = B662AF2609AEAE5D2B6488E6FBEBDC3B /* RDEPUBNoteResolver.swift */; }; + 2B8511EDF7A3E8E53D235087910D9CB5 /* RDEPUBChapterTailNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59D55BC5643EA702EB48D478948DF83E /* RDEPUBChapterTailNormalizer.swift */; }; + 2CF882B1AD06F3EFE889465776F0E1AD /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1F34DCA2B1BAA4FC1470138FC11B494 /* ConstraintInsetTarget.swift */; }; + 2CFAFBA02504A70F5E2C4371534955E9 /* RDEPUBNoteModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9B7588747FF74836493105F6698CC00 /* RDEPUBNoteModels.swift */; }; + 2D37038C0E73CEECA8A390B68F847FC1 /* Entry+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C2C2B5D2F9E3E125F8C7B1B2B41CA8 /* Entry+Serialization.swift */; }; + 2D81B7C446C9C00B2C516E6996D9457D /* rangy-core.js in Resources */ = {isa = PBXBuildFile; fileRef = 7A98FCBF217CA913BD506DAEBAE03449 /* rangy-core.js */; }; + 2D90619922508AD78278F2D1D7169DC4 /* RDEPUBReaderPaginationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 485961C2B2BC82A4B098F920F901DE24 /* RDEPUBReaderPaginationCoordinator.swift */; }; + 2E1221BBB32678DFDA675FFF50391819 /* WeReadApi.js in Resources */ = {isa = PBXBuildFile; fileRef = FF4F4DF69DE3402A658BF53389C1E29F /* WeReadApi.js */; }; + 2E14605A6460335AB12B31B3A329F52B /* RDEPUBCFIPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62BAED47209069B1F1E56A1DBC2892B1 /* RDEPUBCFIPath.swift */; }; + 2E18379B0655CC32BA358CB89F783141 /* RDEPUBTextPageBoundaryValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D0B6C724E03707E527C7AB3C1214489 /* RDEPUBTextPageBoundaryValidator.swift */; }; + 2EB84DBB152379A800758656C572218C /* RDPDFSpeechContentProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE673C095E86DC64BE73E53BA8C59702 /* RDPDFSpeechContentProvider.swift */; }; + 2EEA383365CCE1949C7C68B2EDD1904A /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A15541928DAA1303B6219C49CCE42C9 /* ConstraintLayoutGuide.swift */; }; + 2F1FA27C68F3FF94F477C89F92BE0871 /* CryptoKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9C9E8FA478D23AC4494D5120C081C48B /* CryptoKit.framework */; }; + 2F4AB3D711200DAB6B8B0E6D5E3E9774 /* RDPDFAIContentProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81313A5C1BC97CDA5BE30763C8F014F9 /* RDPDFAIContentProvider.swift */; }; 2FD7360250C2255A80583D4CF518FBFA /* DTTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FDA83DF0F8A6E9142BC2640BC2F9844 /* DTTextAttachment.m */; }; - 307B51E3CC861F36EACCB6A40E68B9CD /* RDEPUBNoteDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67CE7F078B6F280727666D10430B4FBD /* RDEPUBNoteDetector.swift */; }; + 30BEF39A9B359BE62E758B3677D6B84C /* RDEPUBChapterData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 367C998948D9897CF825A08E51AF013D /* RDEPUBChapterData.swift */; }; 30C01FE491C26314F776AD8B2AF136FA /* NSAttributedStringRunDelegates.m in Sources */ = {isa = PBXBuildFile; fileRef = 2C866ED63128D4AB5D968EEDA3CB7516 /* NSAttributedStringRunDelegates.m */; }; + 30C76262557529A72A679968DF501160 /* NSString+DTURLEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = C808AC5A8C55E7E56EF916C622B6091A /* NSString+DTURLEncoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; 31B805C50E0E187E6242B0C878C4D30D /* DTCoreTextMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = D3C2F16A4F9F4BEAA317715C1F17C81F /* DTCoreTextMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 33C7582C73593E4E03EDFD4EC04C1FA9 /* RDPDFReaderHighlightOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 034F5FDCBB44D08C5A68F8AB2B4777F1 /* RDPDFReaderHighlightOverlayView.swift */; }; + 32DAF222F4D8F7D244F10A0CD3BE3BB2 /* RDEPUBPageResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41EC12208AD1A079C60779F6DD30DAC4 /* RDEPUBPageResolver.swift */; }; + 3327189FE732B9F7C893297271C8E70E /* RDEPUBParser+ReadingProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87D001927426A4D5E9E90B7899A00372 /* RDEPUBParser+ReadingProfile.swift */; }; + 33410924D34E540BA70B8B5399EB5D4D /* RDEPUBNotePopupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87893187F5137BA27FE812E2F9346B30 /* RDEPUBNotePopupCoordinator.swift */; }; + 337FEBAB6EC0B4E4C7C3F83B1A74F290 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80A410954172DEFFD72C06139798345A /* QuartzCore.framework */; }; 343E794F88AA503F5139C2244DC1A2B1 /* DTTextAttachmentHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C822D376841DA0BA4150A8A8E5B911D /* DTTextAttachmentHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 34CEDD8C5C37205306E49A3D61CB6E9E /* RDSpeechReaderControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21F9B093162E445308F49662C7C35DA6 /* RDSpeechReaderControlView.swift */; }; + 34D738F155D0D3CA16F3C6554B665A8E /* RDEPUBTextPageVerticalJustifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C80B76361E9EE71ACFCB82163017066 /* RDEPUBTextPageVerticalJustifier.swift */; }; + 34DAABEF8DA392B03437ED80143BB90B /* RDEPUBReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C26B30F895FEA65F0D322407234375F0 /* RDEPUBReaderTheme.swift */; }; + 357B7E80FF2F9CE5FDFBDFBB5A492305 /* NSURL+DTAppLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E16B563D3E20D4C0FB3C36350F2A330 /* NSURL+DTAppLinks.h */; settings = {ATTRIBUTES = (Public, ); }; }; 35C5BE59CA712CCDF93D6E7010D93883 /* DTAttributedTextContentView.h in Headers */ = {isa = PBXBuildFile; fileRef = 63A43AFE4C6D7EBA5A25A5B514F473AF /* DTAttributedTextContentView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 363B602299B0E9D8B396DB307E881B45 /* RDEPUBFontNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FCABB4D698319B7BD34E6F1984C6C81 /* RDEPUBFontNormalizer.swift */; }; - 36DC8E915917725A9DB5CABDCB5015D4 /* RDEPUBNotePopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EF4435215EDB7548944507506D0A4C9 /* RDEPUBNotePopupViewController.swift */; }; + 35DFE3F833A49E5F055087209FDA48A3 /* RDEPUBWebDecorationOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3D8597FAB9BFFF6551C75F9A23E95F1 /* RDEPUBWebDecorationOverlayView.swift */; }; + 361808AE6FE4B0AD47DB34C9D1290C5C /* RDPDFReaderNavigationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B3397616AD34F6B89948DEBE139C7C5 /* RDPDFReaderNavigationView.swift */; }; + 362B570C94340092A816356AD3284F79 /* Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93D34826E445B4E08B0CEC27C6EB4DF3 /* Archive.swift */; }; + 364E816FBEEE0591DA21255B0C587D9B /* RDEPUBSelectionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F24C368CBF5CCF60B01598682C6C07F /* RDEPUBSelectionState.swift */; }; + 36C1DEB5DF32B53B2903DFE887443AE0 /* wxread-replace-latin.css in Resources */ = {isa = PBXBuildFile; fileRef = FA2A95481CF034C4689E42B263042872 /* wxread-replace-latin.css */; }; + 36EFE5DFB1FE7968EEFB9264FFF87CCD /* RDEPUBReaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6975E8E0C8246911E8F8318E762672D9 /* RDEPUBReaderDelegate.swift */; }; 372E907DF08263D0E1AF904F1FCD66EB /* DTTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = C911EE625C8CD488E8B66FA8BA2B5C8F /* DTTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3813C43484C6A1175B47BE62E5A37AEA /* RDEPUBBackgroundCoverageStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E8C2259B135B2F86D6250BD6B09178A /* RDEPUBBackgroundCoverageStore.swift */; }; + 3815E2C02F20BAB245D81A5930487778 /* UIImage+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = B5E7F56675C029BC561A7EFB55EF0041 /* UIImage+DTFoundation.m */; }; + 388E284D44A216A5ECCC0EC49AE89AF1 /* RDEPUBReaderSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8D7E62479EFF470F47755931FC2BFA4 /* RDEPUBReaderSettings.swift */; }; + 388E7E64B2A9CB4FE6BB4421CA66F65F /* RDSpeechReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A6C3FFDC5714D18BE0534AF20F6C07CA /* RDSpeechReaderView-dummy.m */; }; 389F7C8400F9223C019F2D7825CD2369 /* NSCharacterSet+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = E26546A9CD322544BEF648DFE2B26D7D /* NSCharacterSet+HTML.m */; }; - 38A91EB79CFAB78049BB83EB5305634A /* RDPDFReaderPersistenceStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B712780654B2698F0379C758B2613E /* RDPDFReaderPersistenceStore.swift */; }; - 396CC47765C52E169161945557D1E0AC /* RDPDFReaderSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DE4839D4FBE796B7FDD121170DAD53A /* RDPDFReaderSettingsView.swift */; }; - 39B236CB7C9212BFAE8D3830C361B196 /* URL+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E46A6DEEE6CEA27A1FC9024036D8136 /* URL+ZIP.swift */; }; - 3A6FC9CBAE2C39A84FF7ED27DA29CC5B /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1870B77AD9A6F26AB3180BB4CE2A8BCC /* ConstraintPriority.swift */; }; - 3AABEE7BEF895AE3EEC5DEA7743A4356 /* Archive+MemoryFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD58858F74B286AB42B1D9C0E299BC0 /* Archive+MemoryFile.swift */; }; - 3ACD250804B9C734DEAF67E260F15920 /* RDEPUBCFI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D1DCB390ECBFC669909F9181A3FE8B0 /* RDEPUBCFI.swift */; }; - 3C6F422428CE8B9F2AED56B60B2C9602 /* RDEpubURLReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88EAEAB89867B1405011D65F95E4F64 /* RDEpubURLReaderController.swift */; }; - 3D29E3866F13EFDCD0F969C068317E99 /* wxread-dark.css in Resources */ = {isa = PBXBuildFile; fileRef = 5ECBBE5C440153A7C6B87D92B16289B0 /* wxread-dark.css */; }; - 3D8AC6AA5DA1B5B430DBC4A2DE86C977 /* DTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 708CF8B218058AAAA710BB7ADFC504FE /* DTVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 38B7A8486011EE9E4C92AD7F43C67D6C /* Archive+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8481A9468E2620C3170C28BC17691E /* Archive+Deprecated.swift */; }; + 38DEF213C89004432B18C427CE1FD830 /* Archive+Writing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAEA965F9F262BB8BF17C77B01C0956 /* Archive+Writing.swift */; }; + 38EB2BF870061DE650DA95053B69B87F /* NSURL+DTAppLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7955406639DE39E1FD953D882301E /* NSURL+DTAppLinks.m */; }; + 3A2E99A9D63EBA1AD6DEB88A58230346 /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E06DBE2154F8FCE42DD5E8CB02B258 /* ConstraintView.swift */; }; + 3A3CB29C0A090DA053B50CD7FD0E2C3D /* RDEpubReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 02BE103F11BACB69B3478BA07AE1A2A5 /* RDEpubReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3AED3330F76DB3D002DABE13B11DDFD2 /* DTSmartPagingScrollView.h in Headers */ = {isa = PBXBuildFile; fileRef = BAC3BCDBDD88D30A3F51094944FB70FC /* DTSmartPagingScrollView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3C067EBE2D4B7D28B8C196166C62F4C4 /* Archive+WritingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7382BDDD61B00469E398482B8AA31F3 /* Archive+WritingDeprecated.swift */; }; + 3CF692B9C6EA33FD628CD3ECCDD9462E /* RDEpubReaderPreloadController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCEC432BB6F19EF8C918567EDAE34801 /* RDEpubReaderPreloadController.swift */; }; + 3D9793416203988F167E189744A50298 /* DTPieProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9678265F1949A0F038F13D422F2B55FD /* DTPieProgressIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3DC8F9474FC6A0BB7E81A703CE958966 /* NSAttributedString+DTDebug.h in Headers */ = {isa = PBXBuildFile; fileRef = 21A5EB7C80D2F578DE579CA1B20F3CDB /* NSAttributedString+DTDebug.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3DE492221688A9FD941CB0C4F83B3EEB /* RDEPUBCFITextAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = C351D0643D777D8082434A64A04B7312 /* RDEPUBCFITextAssertion.swift */; }; - 3E43290CAF5CBB6952FA4429D0E59F7C /* RDPDFReaderContracts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AF75964868B86A27B63709439E9AF91 /* RDPDFReaderContracts.swift */; }; - 3EB9DCC1A22D23ECBA68D493F0EB8994 /* RDEPUBResourceDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CC380EF32AB6FB2395CF0B9E62F3317 /* RDEPUBResourceDataProvider.swift */; }; - 3ED3D590470EB5D28E8E0A0F35DE1A23 /* RDEpubPlainTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 933404827F6B057EB29BBDD6125374E4 /* RDEpubPlainTextBookBuilder.swift */; }; - 3F8E5BF8A103AFF70E8EF1BEF40C80A3 /* WeReadApi.js in Resources */ = {isa = PBXBuildFile; fileRef = 14BBECB3A6235FDD72CE46FBCD08FE3C /* WeReadApi.js */; }; - 3FE37FCED1213F0CCD4CE93FD10BD0E9 /* RDEPUBTextIndexTable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61FEB7BE16889FD8532441C936C01304 /* RDEPUBTextIndexTable.swift */; }; - 4054EDC26E6972F014B40C6D58B1E348 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92790B32EB81BDF75E8ACD8E3C4BBE10 /* RDEPUBWebView+JavaScriptBridge.swift */; }; - 407E8286C3E02E9DCA0119C0D969FEF6 /* RDEPUBPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016C4701210031B8CBC8C4C2D03DB357 /* RDEPUBPreferences.swift */; }; - 40E6FDFB6C87C3FACD94999F9007B22A /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B730A14FDA23EC9BB3ED876FBD5BA4 /* ConstraintView+Extensions.swift */; }; - 41181309680AD350246E05D2FF51B3CE /* ConstraintMakerPrioritizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBD26CED79D9BC8B6093FB7163627198 /* ConstraintMakerPrioritizable.swift */; }; - 416183B9FBBC3C7623F0F97E2A0DEB09 /* RDEPUBTextPageBoundaryValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6BD7E7A08332F631D063AEBB4DD8F7C /* RDEPUBTextPageBoundaryValidator.swift */; }; - 42E8C52579C378B702EFF01188E53CF7 /* RDPDFKitPageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830E2FF68050B3931209AF2581249082 /* RDPDFKitPageProvider.swift */; }; - 43B0CBD98713B6E86A6FB47D0C57A364 /* RDEPUBChapterOffsetMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 557386F3232CE41AD7A21D1D0C412FC0 /* RDEPUBChapterOffsetMap.swift */; }; + 3F92A8FBCF50F172D4CB30137CE10F35 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC7700A9EB3EB33F6095CC49EA54E6C1 /* RDEPUBBuildDiagnosticsReporter.swift */; }; + 3FDE28AE263B6D46649F6F76FDBC444F /* DTFolderMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A381F075AF6CD9AFBB86130B39E20B4 /* DTFolderMonitor.m */; }; + 40DEA7D35972343F41C629EE3AF5F7F0 /* RDEpubReaderPagingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10A21533669EF5F6B433ACF6570084B4 /* RDEpubReaderPagingController.swift */; }; + 41191E0937C0FBA3176942094059817F /* RDEPUBReadingSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55ECB9EB83BDA7CDF3E67366AAA25C22 /* RDEPUBReadingSession.swift */; }; + 414209E3808FAACFE4C679EBFA8965B2 /* DTCustomColoredAccessory.h in Headers */ = {isa = PBXBuildFile; fileRef = 81B4314CBEDA71647A929517B936613F /* DTCustomColoredAccessory.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4213BB00548C581AD1EBCCC1F4787A88 /* UIImage+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BD77848C77F7674193EDA5C1F18DE6A /* UIImage+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 428790F145A922B7906C4EB7D5CB174B /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDC3A2D20818C31909CC4C3F4BB4F96 /* Typealiases.swift */; }; + 42C418BB820EE1B51E1BB966F7D4A59A /* RDPDFZoomablePageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A41D37F86EFC816F7478316843069DA /* RDPDFZoomablePageView.swift */; }; + 4371AF1A25318F3F3797741057CD23FF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + 449479B94F78893071A747CA22DEFB2A /* RDEPUBPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52481F3BA048F07B97DAC750A397270E /* RDEPUBPreferences.swift */; }; 44B1FBF893C06F314F8C9BD1405897D8 /* DTCoreTextGlyphRun.m in Sources */ = {isa = PBXBuildFile; fileRef = 31B00EC977C5120446E63A976AD9DBC3 /* DTCoreTextGlyphRun.m */; }; - 44B308C0F464440B6DC02DA06AC0CEBE /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F38E01209C5238001BD7CD009ED3E88 /* ConstraintItem.swift */; }; + 44B420AB0963FB65CA7734418F1E80E1 /* RDPDFReaderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F654C6659A3FDE4C3E08BBDD2C01CCF /* RDPDFReaderViewController.swift */; }; + 44FB7CAB227C63DB590DC3D61428F678 /* Data+Compression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 005A076C910A4DBBE6E72F4D11CB624E /* Data+Compression.swift */; }; 45133E47CC5FBCF78BFCD38981BA027F /* DTDictationPlaceholderView.h in Headers */ = {isa = PBXBuildFile; fileRef = 86255994A7212A40F60FBEE69C526FF9 /* DTDictationPlaceholderView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4538E556FB8600C7E6D29F769FC0EA47 /* RDEpubReaderView+PageCurl.swift in Sources */ = {isa = PBXBuildFile; fileRef = B454B7709E93E1E886E4FA533B06802D /* RDEpubReaderView+PageCurl.swift */; }; + 45C22D05CEBD5AC9C520EDE9A860DED4 /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = B71BC62246AFEBD517D3175813789310 /* Debugging.swift */; }; + 45D891EAA051DD40FF50DF6EF850A89F /* RDMOBIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 657A0B0DD4402A509DF0BF6AA9360DF5 /* RDMOBIParser.swift */; }; + 45F0A220FCCA6BD09278BD4178381D63 /* DTHTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 65806394BC872987207CCB0FB587E3B1 /* DTHTMLParser.m */; }; 45F90B98546FDBA03AB112DFE859A185 /* DTCSSStylesheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C5C85EAAD91F1E22CC5986EF9B5D218 /* DTCSSStylesheet.m */; }; - 460CEA9F3899BE4066AE872BCA931771 /* RDEPUBTextPageVerticalJustifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D41D5F7E42BDEF71C2CD08D7E019C1D /* RDEPUBTextPageVerticalJustifier.swift */; }; - 460DDC8FF9C5EE77B50366F64504C975 /* RDEPUBChapterPageCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81032F879C858B2A45DF02DCF7ED8E6A /* RDEPUBChapterPageCounter.swift */; }; - 46759C5BEEA541B506D8364771C1762F /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1C52776D8E95B99DC3657201FB6FD0 /* ConstraintLayoutGuide+Extensions.swift */; }; - 46EF32D586FF590CE2C60C66364B9357 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0AC91254785C4B0B73D391B603ADE47 /* ImageIO.framework */; }; - 47377798BC8063B8C0BF24DB9E7A6410 /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A672DF142E75858C34A342B2BB2AC891 /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 47823BDDB026FB3AA03789F952BADF09 /* RDEpubReaderView+PageCurl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94885CDA3F48C7BEEDD826129955D4D2 /* RDEpubReaderView+PageCurl.swift */; }; - 4953AE4BD31D4185D3091ECC6CAC24F9 /* RDEPUBReaderToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 499B927AB070F064B0E8A012382003F1 /* RDEPUBReaderToolView.swift */; }; - 4995967B0C0F48A4437FBA42B1525685 /* RDEPUBReaderController+RenderSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E5DEEA6A9CEFC805D050932E03E1A21 /* RDEPUBReaderController+RenderSupport.swift */; }; - 49DFEB47397EBEBF0A18636FADB893BD /* RDEPUBCFIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = C26F63F750A573082295256163B7B3F7 /* RDEPUBCFIParser.swift */; }; + 4682824DA120D16A9C1E5A409449D660 /* RDPDFReaderAnnotationEditorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91AB03142606446D515451D75613853 /* RDPDFReaderAnnotationEditorViewController.swift */; }; + 46C63092880297CC1FEA04268121642A /* RDEPUBPaginationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5620BF46CC66D177218F95274B0899FD /* RDEPUBPaginationModels.swift */; }; + 46D1C37BE8645232A7A3890D3B583E4A /* Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 022E4755B34BE3FCD1475BB40C6FD7EB /* Entry.swift */; }; + 46EF32D586FF590CE2C60C66364B9357 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3FE3107482A464FFADCB685658099F9 /* ImageIO.framework */; }; + 47CEF67F26AD47F9BA63D89C4F233667 /* RDEPUBViewportTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F772869AF68874D248A1C55227A74BB /* RDEPUBViewportTypes.swift */; }; + 484D3D3F85A886BE6364CEEE333C7045 /* PDFKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C3D2DECDF3F1951B4030402CDC6F89E8 /* PDFKit.framework */; }; + 48897F07CD74DA89D61337A3832233BE /* DTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F72747C46CC41B906C8A967ED5A47E6 /* DTLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4A13B4E5EA8616A8F09D90BC6EAEEA64 /* CTLineUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 07147F57468AB345BF82E26A70F60603 /* CTLineUtils.m */; }; - 4C098A754CDDF19F161D09EB3C31AA91 /* UIImage+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 2BD77848C77F7674193EDA5C1F18DE6A /* UIImage+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4C146C2C2DD2C526CBFC04352ADF45F8 /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 78AA6CC1C34A3A64CED4C314B1FAE2F1 /* default.css */; }; - 4C571730BAEA49B8E2B4AAB5FF4C6ABC /* RDEpubReaderGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E74C786C11A2410677CDAEBF7DD1B4AD /* RDEpubReaderGestureController.swift */; }; - 4D1DE840FE2BDF91A821B28921B9DA46 /* RDEPUBStyleSheetBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24DC0DF11DB45CDC92395B3EA2689B5 /* RDEPUBStyleSheetBuilder.swift */; }; - 4D2C32204598EEB25DE02652DA3A4517 /* rangy-core.js in Resources */ = {isa = PBXBuildFile; fileRef = C48F11FB4EFE57B4DED13881F78ED4A8 /* rangy-core.js */; }; + 4B9FA34806EE1B678A99B1B8E105F768 /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7B730A14FDA23EC9BB3ED876FBD5BA4 /* ConstraintView+Extensions.swift */; }; + 4C8C31A67EF3C63F2DA59BC54F835395 /* RDEPUBTextContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A3F3DC28A03FECBBC8A4FD8E5EBD8B /* RDEPUBTextContentView.swift */; }; + 4CD69F81A7F837750AE17A9DB48E9BDF /* DTCustomColoredAccessory.m in Sources */ = {isa = PBXBuildFile; fileRef = D3A4BA792340D151ECB734018B2FD3EF /* DTCustomColoredAccessory.m */; }; 4DA6EC46F8968265B96C6D7B2260C4E5 /* DTTextBlock.m in Sources */ = {isa = PBXBuildFile; fileRef = 0FAE8E0BCF1CB66D6936A3CACAE7CF0B /* DTTextBlock.m */; }; - 4DE021908E4E1FD343F225D687828B6C /* RDPDFReaderImageTextLayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3FC196B05ACAB99474CEA476B0CD195 /* RDPDFReaderImageTextLayerView.swift */; }; 4E4939F6592B06D2CA764DCACFB47871 /* NSString+Paragraphs.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FE24D923BB63C2BD4397C37352A6204 /* NSString+Paragraphs.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4EC2770415CD64F8EC90F4971FE01F2A /* Archive+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF8481A9468E2620C3170C28BC17691E /* Archive+Deprecated.swift */; }; - 4EE1DE32B6F53040034BD25CD6546805 /* DTAnimatedGIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A319B0AD0B5F014BB090153D3020DBA5 /* DTAnimatedGIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4ED2E0F8F0C2889F3DC707D165024E10 /* RDEPUBReaderLoadCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38B47FDF2463F124FDC2B6154F98E987 /* RDEPUBReaderLoadCoordinator.swift */; }; 4F50C703427747B88405080B221349A1 /* DTLinkButton.h in Headers */ = {isa = PBXBuildFile; fileRef = E7890CD33BD10753D1D971AD2FE20A74 /* DTLinkButton.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4FE3F57478AE12AF0762DB8B7F6658FF /* RDPDFReaderSettingsPanelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87A369FECC06D50D3068A665BCD42179 /* RDPDFReaderSettingsPanelViewController.swift */; }; + 504FA151E73E60DCA3FF4B5EE8CD3934 /* RDEPUBChapterPageCounter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EEE779A1CEC15EBD959AE8FB87C5E20 /* RDEPUBChapterPageCounter.swift */; }; 5065D99E1588E8CC60677E74916A5C03 /* DTAttributedTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A54C0C47B44A133E0CFF71526B88FAF /* DTAttributedTextCell.m */; }; - 5075124CA1638D3C269DEA00ECA3964D /* RDEPUBPageLayoutSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 318A173BC4548B559258A9FE99D42742 /* RDEPUBPageLayoutSnapshot.swift */; }; - 50B113FC2E2AEB996202A5F72411754A /* epub-fixed-layout.html in Resources */ = {isa = PBXBuildFile; fileRef = AED29B787D83E9C4459430CDE0DB612A /* epub-fixed-layout.html */; }; - 51340BC6E06C090CB50B286724831E7B /* RDEPUBReaderAnnotationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F00C52E49C78CE7F63C155C5C74AFBE /* RDEPUBReaderAnnotationCoordinator.swift */; }; - 51A0BEADEA665AE04BFEC268553C1249 /* RDEPUBReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1697531DEC18EA6F9B99D0146C015338 /* RDEPUBReaderController.swift */; }; + 5075AB6E0A829656787F4F6AB63CE7F4 /* NSData+DTCrypto.m in Sources */ = {isa = PBXBuildFile; fileRef = 503556D1790A886D0E591A982279641B /* NSData+DTCrypto.m */; }; 51A1B5800D23C355B1712E8D1103780C /* DTTextBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 52A65E0D6AD4CFB0EECC8AD17A4E8EAC /* DTTextBlock.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 51D6A2884ADB8102F2CDFD0F4FC4284D /* RDEPUBMemoryProbe.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8233CAA669CAC56C7B0EEE700B53A23 /* RDEPUBMemoryProbe.swift */; }; + 5271325F17912AE731F1FAF8D3328F6C /* RDPDFReaderDrawingLayersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFBBED2FC1668912DBF7592720CC14A4 /* RDPDFReaderDrawingLayersView.swift */; }; 528DBAC7FCEFC7D6575C1F6CB4399AEA /* DTStylesheetHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 8961D7BA81FEA0F2525F9E82F156426A /* DTStylesheetHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5363B2BC23909119FC8F9986DC3665F2 /* RDEPUBPublication.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24818987BA7C833972E50A1921661271 /* RDEPUBPublication.swift */; }; - 53CD7480D7A5DEA16105271B3A4A0EDA /* RDPDFReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15FA72422C7B69BBA7D5B3CFF098CCE5 /* RDPDFReaderContentCell.swift */; }; - 54CC0E42773420964101E9C51F71E941 /* RDEPUBReaderChapterListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9C5C5D2EF233B42FA8D3BCF06713DF42 /* RDEPUBReaderChapterListController.swift */; }; - 553D996359941996BCDF3F73F48CB96A /* RDReaderDocumentFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E58C1EF4EC5E0B8E2B38CA2270B93E9 /* RDReaderDocumentFormat.swift */; }; + 52912BFCB288B0906F8F9E9D3BD03E1F /* ZIPFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D86855B4F039593754D5DC832865EA9 /* ZIPFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53066BC799D5536B28341C163C201842 /* NSString+DTPaths.h in Headers */ = {isa = PBXBuildFile; fileRef = BDFD7D9A4BFFBB2603B10E3A432551B6 /* NSString+DTPaths.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 53EA9E7B4DEBBEE14B6B83FF7D5F0B2F /* RDEPUBReaderEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC507AA13E507E6197F6E4B3BB70F899 /* RDEPUBReaderEnvironment.swift */; }; + 53EBDB54E3A562FEF8A6B1D1601E8CE6 /* RDEPUBStyleSheetBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D50156C4B53F70228DCAC0501DB9226C /* RDEPUBStyleSheetBuilder.swift */; }; + 5456493C65094838AD0F2BC39FDC7B41 /* RDPDFReaderChromeViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7C3A637594FCD8D6F09237F5103A39 /* RDPDFReaderChromeViews.swift */; }; + 54AB1CA8DC10415A933C420BF1E4FD0F /* FileManager+ZIPDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0486411409B1766377F5F2A6234D8E64 /* FileManager+ZIPDeprecated.swift */; }; 5582735073EBB9F5078E6E8AEEFB646A /* DTCoreTextLayoutLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 28FF8B4C669DE2384EE37199498D23E9 /* DTCoreTextLayoutLine.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5587CEE3C0E5288818C3C5DD8562EF3D /* RDEPUBPaginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90FED6AA55769B0F41A57155366E801D /* RDEPUBPaginator.swift */; }; - 55BA631EFFCE67592653F9A6790490DB /* RDEPUBTextLayouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D27A3BD8D86D036B86A90C4384EF483A /* RDEPUBTextLayouter.swift */; }; - 55BD44A705AA661A7950A255165D15F9 /* NSString+DTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A67FB1DCECBDAA36B9B755606AC42C17 /* NSString+DTUtilities.m */; }; - 55C51A8032ED8F803ABD609382A716E1 /* RDEPUBCFIRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCEAC930B7FAD0BFD2BF58A81C1B82C6 /* RDEPUBCFIRange.swift */; }; - 56FF83A81EAAE4DF9074B3D93B447C60 /* RDEPUBReaderDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E242368DFEDB6BD27EDA8C0E5915D6F5 /* RDEPUBReaderDelegate.swift */; }; - 5766BBAF238D43A234A9965D209D3456 /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7EDB07502C56DF3D4F6E90F93880B28 /* ConstraintConfig.swift */; }; + 561D7DED747942143368E79909C9061A /* RDEPUBDecryptingImageAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57512CC2A1488E761B4B2A6F02CB55F0 /* RDEPUBDecryptingImageAttachment.swift */; }; + 5675678CC8AA593425AC50EC4B702208 /* RDEPUBTextPerformanceSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F65A581119EB07B606117CEBB02F900F /* RDEPUBTextPerformanceSampler.swift */; }; + 573128D7B1E3523C3355E57F0E012087 /* RDEPUBTextBookCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06E8F756DFAEAA9E8FA4B7D472000B2E /* RDEPUBTextBookCache.swift */; }; + 5773E1761F14534E57C620E0ECE4D1DB /* DTActivityTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 702AB4F450076D82E264C7AF93A45F14 /* DTActivityTitleView.m */; }; + 5786077F5C93E7605EAF0E0C9D84BBFE /* RDEPUBTextSelectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83ECB8E69E2047D86F4EA6D987E0B8A /* RDEPUBTextSelectionController.swift */; }; + 57D29D069EC196338B1E4DD238FD7FAB /* RDEPUBSemanticMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4914EC4B82CC6AA3736968D86B805228 /* RDEPUBSemanticMarkerInjector.swift */; }; 57D5228C8A85628772D4D78E7FBEAF3C /* DTDictationPlaceholderTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 188836BC213C48E6459D098231133246 /* DTDictationPlaceholderTextAttachment.m */; }; - 57FC7A6DE84141D6B2636B9ED8E0BE82 /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 298E057B5F44628E4EE593F1513E95A6 /* RDEPUBAttachmentTooltipOverlayView.swift */; }; - 5836CA35B11F27537237D9A6E3E3C334 /* RDEPUBPaginationCacheCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B81D503CA2CCE9D4172B5D9BB346ED30 /* RDEPUBPaginationCacheCoordinator.swift */; }; - 58BD63B311E131A04D27C09E6A44DCAD /* RDEPUBReaderController+RuntimeBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76244BD19BB5CB592A5EB99402C94A45 /* RDEPUBReaderController+RuntimeBridge.swift */; }; - 58E895FB648D69922341F4D6FC7D223F /* RDEPUBReadingLocationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924A837FC3890B67B17DF9246FB39A4C /* RDEPUBReadingLocationModels.swift */; }; + 580A03A83013B855159D405AF80EDBED /* UIColor+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AA4DBF07DDCE87ABC0B78A2FF3FB813 /* UIColor+RDEPUB.swift */; }; + 58D149A0978D65A0E3100DAC8F64C2B8 /* RDEPUBTextPaginationInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 237DCFF0194564E19C33BED372E1EA72 /* RDEPUBTextPaginationInterfaces.swift */; }; + 5957FC1D1BA1EFB4BECB72F04EE3CD55 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93231E903E802072F56185B464DDFAD4 /* MediaPlayer.framework */; }; 597DE4CDF5C674E269F03F6AA0AFFCC1 /* NSAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 74F621BADD77F0A22003EDCA6F92D153 /* NSAttributedString+HTML.m */; }; - 598FECAC8A0A211A0CD1C4BFC4F5D17D /* RDEPUBReaderUIState.swift in Sources */ = {isa = PBXBuildFile; fileRef = D24510AD02ED2650316ED6246FD926EE /* RDEPUBReaderUIState.swift */; }; - 59B5E86ACB2ECBF2F44515967AF5C0F5 /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B3047509587D803762D3B0A21B9F773 /* UILayoutSupport+Extensions.swift */; }; - 5B7CC211EBF1F22C9429B66CD4D31973 /* DTFoundationConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = FE699719E4C619A2AE868EA35DBCE64E /* DTFoundationConstants.m */; }; - 5C91C49D7918D688CA79565E21001BF8 /* RDEPUBReaderServices.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EA1817F681CEC8A380F9824BD490E73 /* RDEPUBReaderServices.swift */; }; + 5980E58B9A264939FA5CBE838154F066 /* DTActivityTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = 50E9C6F457FD3662DF4FC74CA5ACB962 /* DTActivityTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5CBDA7783934999491663AB204B5A064 /* RDEPUBCFIUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1929AF2396E5AFD5D38E0BA75065368B /* RDEPUBCFIUtilities.swift */; }; + 5CE19D28BB2108D3D10A2D8150AE1CB1 /* DTAnimatedGIF.h in Headers */ = {isa = PBXBuildFile; fileRef = A319B0AD0B5F014BB090153D3020DBA5 /* DTAnimatedGIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5D03A5B9DC067875CFEC9D4EA7B059E8 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 2557D3D9913F2F7C7C6AD2C114C2A5C5 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5D05C7FABA8E6A777B3666515CC940B1 /* RDEPUBCFIPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC04C30BD0D2F6408EB5B8054F36B4F2 /* RDEPUBCFIPath.swift */; }; - 5D523DAF9BFA543904E32342D0EEFC0D /* NSString+DTURLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = DE5387758E4F1C4128BE4A1E8D68A9BD /* NSString+DTURLEncoding.m */; }; + 5D5071CE8770A20C085423D3421BEDCD /* DTFolderMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D9D817F1F806BC50BB65FC80C7D47F /* DTFolderMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5D8D65121E87E419D8D2F23F8AF43673 /* DTColor+Compatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 51CD1050B1BC09EA428919282AA2614D /* DTColor+Compatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5DE66A256BFD2ABBD1F05DB20AA70E2F /* Vision.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9F3DE5DDD4D63B6FB5FEADA0E292CB33 /* Vision.framework */; }; + 5DC8894BAE6FB562F51C90E96BEB5E60 /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D3D1B3F2E5D775108B74D6574B91DCE /* RDEPUBReaderController+AttachmentTooltip.swift */; }; + 5E4CB3BDAE2876F57FAF5F7707D339AB /* DTFoundationConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = FE699719E4C619A2AE868EA35DBCE64E /* DTFoundationConstants.m */; }; + 5E520D912C064B9781FD02FF703B11A4 /* RDEpubReaderView-RDEpubReaderViewAssets in Resources */ = {isa = PBXBuildFile; fileRef = C8A6E90AB5E26049710E2C2404C28B9A /* RDEpubReaderView-RDEpubReaderViewAssets */; }; 5E90EBD876ED4E50AB890FB56C4BFA57 /* DTHTMLParserNode.h in Headers */ = {isa = PBXBuildFile; fileRef = FE2F750872F6BAE0ACB02ADF23011AF8 /* DTHTMLParserNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5E9A7DB6BB90E0A62F1B7153EED46953 /* RDEPUBReaderTopToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D86146C71353D766AED457B0B59F13E3 /* RDEPUBReaderTopToolView.swift */; }; - 5F48422418D87D8794EB690F577D9D14 /* RDEPUBParser+TOC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B808EF921BB59C1A78691D36ECC666B /* RDEPUBParser+TOC.swift */; }; - 5F8F35C67B84F3985373B76354706C23 /* NSArray+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BE28706DBAE983FB19FBE122D9F9E68 /* NSArray+DTError.m */; }; + 5FF4E86CD0381F96E2E2785DE8857966 /* RDPDFReaderView+ToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8C14962F04ECA1A8B77093B8EF5E23B /* RDPDFReaderView+ToolView.swift */; }; + 6001AAEEAB0C6493A397350500BB4038 /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02887009BADAD18D4A90F5A114DCE512 /* ConstraintDirectionalInsetTarget.swift */; }; 60532A2E06CCFF814933D2FAE6793AE9 /* DTCoreTextLayouter.h in Headers */ = {isa = PBXBuildFile; fileRef = 55265AB7222E2B20F9B5B320259186BC /* DTCoreTextLayouter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6071184E8ECB9E5DE7187A363FAE8C62 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7FD67CE75631597FF6EE0F345C77B9D /* ConstraintPriorityTarget.swift */; }; - 61953AE6CF7B054825AF861A30F0E0D1 /* RDEPUBRuntimePageCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7AAEDE9AFDB7C593B3B29F05A8A9702 /* RDEPUBRuntimePageCount.swift */; }; + 60A37D279ACFAF6C62A16016309CE762 /* RDEPUBDarkImageAdjuster.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31802A30449913CF424CD3B666B895CF /* RDEPUBDarkImageAdjuster.swift */; }; 61BE3607EABD2657BC71AF8ACB1C25D4 /* DTHTMLAttributedStringBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B10FCCF1F8CF05D36F5B65963EB1F41 /* DTHTMLAttributedStringBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 629BBA5268F2ABA1AAB10761703FD219 /* UIApplication+DTNetworkActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AACA176C2E9FDB2B4834B426AC6368 /* UIApplication+DTNetworkActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 62F77E2F83B486840605A84A8BFC670E /* Archive+ReadingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8442D87941EF389213FFB9992DEF5D64 /* Archive+ReadingDeprecated.swift */; }; - 63FD358173BBF197BDB59F4B6696C3F0 /* NSURL+DTUnshorten.h in Headers */ = {isa = PBXBuildFile; fileRef = 05565CA71DD7DDAA012573A841F7D8DF /* NSURL+DTUnshorten.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 658095BA15CB2808046C9EB08F06CCED /* RDEPUBJumpSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEAE3FA90F67CCE6CFC228B56189BD20 /* RDEPUBJumpSession.swift */; }; + 620D89AB6F1FC6B817F370E17A5FA9D2 /* RDEPUBRenderRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A2ACEA23FA60F80BDEFD2EC71EB10F4 /* RDEPUBRenderRequest.swift */; }; + 64004A893517583C803AEAB3872022B6 /* RDEPUBNavigatorLayoutContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E942DE9692E29D8CB63A8E7F0E6B2B /* RDEPUBNavigatorLayoutContext.swift */; }; + 64155589E0B98A2A533AEADA4F0411F7 /* RDPDFKitPageProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4419BC4EF1BB72BD430008215C2194B1 /* RDPDFKitPageProvider.swift */; }; + 64B71533F97E195EB639209DBEE574E1 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9A09B9A70653ED4FB65C8A3934E3937 /* ConstraintMakerFinalizable.swift */; }; + 64D22A0DC2A1210D1494E7FC4D191539 /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F38E01209C5238001BD7CD009ED3E88 /* ConstraintItem.swift */; }; + 65A0F8C6C162FDF2987C650A1E0313A5 /* RDEPUBReaderSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EEE1249C915939654A5609D3CFC2064 /* RDEPUBReaderSettingsViewController.swift */; }; + 65E553FCED2BBA7B9B15A94AB3B50098 /* AVFAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4081F7CA1FC93EE97276F3D05A333ED /* AVFAudio.framework */; }; + 661647FBCA7F9F220857F8EFAA05A2B5 /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7EDB07502C56DF3D4F6E90F93880B28 /* ConstraintConfig.swift */; }; 6634D568E49F5610242E1454680E5885 /* NSAttributedString+SmallCaps.h in Headers */ = {isa = PBXBuildFile; fileRef = ACD3CB33E5A4E915E5F4C09F4684FFF2 /* NSAttributedString+SmallCaps.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 66B93253DE7FE999F8144CC939605F3A /* RDEPUBParser+Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = D815A3BEB1A8F3959502A4B87558549C /* RDEPUBParser+Archive.swift */; }; - 6718A9F16B4A4A16F013239280B88878 /* RDPDFZoomablePageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A01EEE1789F4E1A109C1B49D125E3F /* RDPDFZoomablePageView.swift */; }; + 6650D31565F5BD0E11FEC0F514E700DB /* RDEpubReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63F79A4C9316E507B47DF63F26FC3263 /* RDEpubReaderContentCell.swift */; }; + 667E37483857C6BDEEE623A200BD94B5 /* RDAIReaderAssistantViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75F5A849E82ECED8710DBA54B127186F /* RDAIReaderAssistantViewController.swift */; }; + 66EE3EB9F8CDD8E41EBB76F19EBAB512 /* RDEPUBWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF4F453E8FCDC0F85D36928C5390D77A /* RDEPUBWebView.swift */; }; + 67008C120F021B02D674C8957B3351DE /* RDEPUBReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B75BE4C4CB6B906D8F81B37938F0A46 /* RDEPUBReaderController.swift */; }; 67AE2AC8D9B961D45871077774E11FD3 /* DTObjectTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FD1F6CDF944640D5F1E2A81A5494657 /* DTObjectTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 67B6056A1C2233857A796A920A5C94D0 /* RDEPUBFragmentMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7FC439421769A5FC6884F5135ABAF08 /* RDEPUBFragmentMarkerInjector.swift */; }; - 682437E668DB3D6C9E6B72FEB41D5FBF /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64ECE2655E3EFB266C23544D1149B39F /* ConstraintMakerExtendable.swift */; }; - 683AFD98CF56982AB1C10BA80D822FA2 /* RDEPUBCFIDOMPathBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 579B4F428B2ACA84D95B05569FE72F1A /* RDEPUBCFIDOMPathBuilder.swift */; }; - 684586D0E8F908278BC13DC47C845A4B /* ZIPFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D86855B4F039593754D5DC832865EA9 /* ZIPFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 69215D0CBD8EB9B7941A6E997428AB35 /* RDEPUBReaderController+ExternalLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = D730579455F74FB03C7E8A4E50484823 /* RDEPUBReaderController+ExternalLinks.swift */; }; - 694BD20B3540D7F581D1A2A619B0CA30 /* DTPieProgressIndicator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9678265F1949A0F038F13D422F2B55FD /* DTPieProgressIndicator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 68003F1BF23E3222A141F945510D9AE4 /* RDAINaturalLanguageSemanticScorer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62F3A858FD7165A3AEBBCA78E105DB73 /* RDAINaturalLanguageSemanticScorer.swift */; }; + 680EF666B4832EF1412DD7112D40286F /* DTBlockFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F66F7B56F490F71666C3CC51B50EDB /* DTBlockFunctions.m */; }; + 683D3404833FA173E581FADE53BA9B06 /* UIScreen+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E4731BA187C02CDA816054F1F2BE70D /* UIScreen+DTFoundation.m */; }; + 68A504E33F4476A37D95AF974D9D198E /* RDEPUBReaderLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C19196DA0724F0BF7BAF7DF59C04D8E /* RDEPUBReaderLocationCoordinator.swift */; }; 69674FEA70899F07BE6098AAEC849978 /* DTAccessibilityViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = AC22C3CB82EEE746663403422F344116 /* DTAccessibilityViewProxy.m */; }; - 6A053B2EC45ADD509497F2909AD4DBFD /* DTFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D211ACA62A5B241A668A682054310DE /* DTFoundation-dummy.m */; }; - 6A7B01BF9329C09B25AD50C51CB57400 /* RDEPUBReadingSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 422C9DACF0702754BAAA0A37E8A0D4F9 /* RDEPUBReadingSession.swift */; }; - 6C9845389C901217D168604D8F9E904E /* RDEPUBChapterSummaryDiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = B15FA2EA6F88DB9AE0FB9356EC5B515C /* RDEPUBChapterSummaryDiskCache.swift */; }; - 6CCD41B742640A2FE9F2537378D53FE6 /* RDEPUBResourceURLSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3822FA364A35F16FFA9D2AAE31E22EF0 /* RDEPUBResourceURLSchemeHandler.swift */; }; - 6E3C87D8CA0283564A8FDCDCC44B2DC9 /* RDEPUBTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98A73A4E2FE3A04E24598C615F097708 /* RDEPUBTextBookBuilder.swift */; }; - 6E3D0FDD78ECC20F4B3697ED21D64224 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A71A099FDBC70A51AE773741C33A4AC /* MediaPlayer.framework */; }; - 6E735A47E8E6CD48E6AB808F6296686B /* RDEPUBFixedLayoutTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3BA5BC80827B5E54253367E574D3623 /* RDEPUBFixedLayoutTemplate.swift */; }; - 6E8D5163A139D27A576ECFFF0EE0BF47 /* RDEPUBSettingsFlipAutomation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CABC6F6EBE38588FD08D8CDF4EAF88F /* RDEPUBSettingsFlipAutomation.swift */; }; - 6F8DFEC4D6D635520E3156DEDB24B4FC /* RDEPUBMetadataParseCancellationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A230A3524DED0923CEC303B4C54C833 /* RDEPUBMetadataParseCancellationController.swift */; }; + 6993659598D8EC4FAA57E264AFE676CD /* DTFoundation-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E6AD45B90D08BACAF3AF76AE40BBCC10 /* DTFoundation-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6ADF048625373BC2C3B5BE61BA02D982 /* RDAISQLiteIndexStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C637C4B48A62EF0502BDEF1DE9D0E15 /* RDAISQLiteIndexStore.swift */; }; + 6B132E2AD8BB1F2FB21D9F6F7D068C1A /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE141846409815273DEBF1DF496BBF6 /* RDEPUBPageMapReconciliationCoordinator.swift */; }; + 6C87E6144D0723E917B879E3834B7972 /* NSMutableArray+DTMoving.h in Headers */ = {isa = PBXBuildFile; fileRef = 08A8B32341BD833856874E046C97EE36 /* NSMutableArray+DTMoving.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C992E1A2FBD5D966690C03F54B81656 /* RDEpubPlainTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7777AD7DDECA33F4050E77507F113B22 /* RDEpubPlainTextBookBuilder.swift */; }; + 6D8F3D282FEBDD51A7970E92330173DB /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41C70D721E1873184464B93001110824 /* ConstraintInsets.swift */; }; + 6E070BD7200B70ABD28128435066780B /* RDEPUBReaderChromeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59D34C7BD6896EBDB5BAFDCC8F420FB6 /* RDEPUBReaderChromeCoordinator.swift */; }; + 6E3D0FDD78ECC20F4B3697ED21D64224 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 93231E903E802072F56185B464DDFAD4 /* MediaPlayer.framework */; }; + 6E5DFE7C1EEB11AD1986C41B2FFBCE65 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + 6EC9EE335402510D6B2F48947BBDA57A /* RDEPUBReaderUIState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C59FCD684EB9341B04A358F9BAF4DC4 /* RDEPUBReaderUIState.swift */; }; 6FA0125F16DDEDAD341DB75DEB084F4B /* DTHTMLWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BB20F608D8D3B80F2688014A5F661FC /* DTHTMLWriter.m */; }; - 6FE5AF431C87317881376957C2CF69A9 /* DTActivityTitleView.h in Headers */ = {isa = PBXBuildFile; fileRef = 50E9C6F457FD3662DF4FC74CA5ACB962 /* DTActivityTitleView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7027EF8D77D4082C1BB9B80FF61FCADC /* DTCoreTextLayoutFrame+Cursor.h in Headers */ = {isa = PBXBuildFile; fileRef = CE669FB235F0A79C31606AC2D531E6C7 /* DTCoreTextLayoutFrame+Cursor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 706B056B4481A496B6A0B743A5597C07 /* RDEPUBCFIMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD69D7E6008EE4ABAB3B5DC7AA868A15 /* RDEPUBCFIMap.swift */; }; - 7168E1F9C232A71118B3DA2720556BF4 /* RDPDFReaderPagingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DB723617A3D02BEBFBC7DD8E83D47E6 /* RDPDFReaderPagingController.swift */; }; - 72195EDF65B2BA88E55902F13FBDB5A4 /* RDEPUBChapterDisplayContentCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1308D476F85ACCA10D54AF2ED9B34BE /* RDEPUBChapterDisplayContentCache.swift */; }; - 726811A34F893A622DB858800E67775F /* RDEpubReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 44765E4CAD77632F37A650F5ABDCDAD5 /* RDEpubReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 72C6CEBCA38D27D9135CD1A48699315B /* UIScreen+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 60052288EBFD0DEA0CD594641192FB5C /* UIScreen+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7154F8895FC65582EE371B109D94B2B3 /* RDPDFSpeechSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 064F689D0045852491C10A092AF5E30D /* RDPDFSpeechSession.swift */; }; + 719EC088BB401166907C358B25061959 /* RDEPUBCFIRecoveryEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E937FB7E0D9A3DEF0742A18E455FF54 /* RDEPUBCFIRecoveryEngine.swift */; }; 730ACB99580C5982DC08D50FC5084D41 /* DTAttributedTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = B646DEE91A4E62F132C54E702B8BDF18 /* DTAttributedTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 737152818FBA3502222A2E161A88A145 /* NSURL+DTUnshorten.m in Sources */ = {isa = PBXBuildFile; fileRef = FEB04D144E7A35904D2906AC517EC870 /* NSURL+DTUnshorten.m */; }; - 739B2A424AACAA53C6F2A454C1147C51 /* RDEPUBReaderController+LocationResolution.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6FC740435D649A1BF4303E48F85889C /* RDEPUBReaderController+LocationResolution.swift */; }; + 731BC686480474979C1C827F80525751 /* RDEPUBSelectionLoupeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 112BB2DF4A650E511F8E5988973D1199 /* RDEPUBSelectionLoupeView.swift */; }; + 735EE64EDAD773096F1927E8213282A7 /* RDEPUBMetadataParseCancellationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01BF453B34821E315E0E3B1A1363A538 /* RDEPUBMetadataParseCancellationController.swift */; }; + 73C6E934E7FE5FE2D1A75BD158D5A486 /* RDEPUBAttachmentTooltipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6245AD148BF98574A18D998B11830A21 /* RDEPUBAttachmentTooltipView.swift */; }; + 73CB1C47A368FB5FD420680227696815 /* RDPDFReaderPersistenceStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9B368C95FB7C2727A7CA452242CB904 /* RDPDFReaderPersistenceStore.swift */; }; + 744D46169467D313783B7F9C4F80F29D /* RDEPUBSettingsFlipAutomation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10F7EBC0047B5FAFD86F2BE940E3C100 /* RDEPUBSettingsFlipAutomation.swift */; }; 7459A1656EDC29D685073B83561B783E /* NSNumber+RomanNumerals.h in Headers */ = {isa = PBXBuildFile; fileRef = F8569A5FF03BA54C0F4080D3EE5539D5 /* NSNumber+RomanNumerals.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 74A86C4AB3ED0481830E8D1D5A2AB8B2 /* UIScreen+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E4731BA187C02CDA816054F1F2BE70D /* UIScreen+DTFoundation.m */; }; - 74E04D9FFB1157F3BB13694DAF9A1190 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */; }; - 757A9887DFF1AE4E5CA26E82C4129CA3 /* RDEPUBReaderLocationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE3CFAC2C855F60E5A3BFC2F3861BA1C /* RDEPUBReaderLocationCoordinator.swift */; }; - 758FFAAF7DE564B5765C9F3BAEA2E202 /* RDEPUBCoreTextPageFrameFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F7EED7DF4D198244A6D06C00CC3F00 /* RDEPUBCoreTextPageFrameFactory.swift */; }; - 75963BFC9C773BEC204A40DBD9FCB60F /* NSString+DTPaths.h in Headers */ = {isa = PBXBuildFile; fileRef = BDFD7D9A4BFFBB2603B10E3A432551B6 /* NSString+DTPaths.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 762B5E129DB0C0E55E2B15F0DE33A3D0 /* RDEpubReaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64394008B6544FFDF5097612472AEE24 /* RDEpubReaderView.swift */; }; - 76FFC611487FEE9BB8BAC371752FDDE8 /* RDEPUBChapterWarmupOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4977ECD606F12A1293FCF0EF36934E5E /* RDEPUBChapterWarmupOrchestrator.swift */; }; - 78115EEA858DA63B6836E385A8D3D7EB /* RDEPUBTextPaginationSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1178601791D03F742CB349BE582223E2 /* RDEPUBTextPaginationSupport.swift */; }; + 7668961F2433BB151F1E4EE19AAE4579 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971623801171F2368ECD657BD0C2937F /* ConstraintMultiplierTarget.swift */; }; + 76787F2728FA3FED06C6481B555459C5 /* RDAIIndexService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F37BFCD74928584B57F92A89DC4573 /* RDAIIndexService.swift */; }; + 76844664CDB792B3186A4759C1A6C443 /* rangy-serializer.js in Resources */ = {isa = PBXBuildFile; fileRef = 2B49BEF738A6B60FB6A64671ACA9091B /* rangy-serializer.js */; }; + 77BB20EA9E7E317CEE37A69DD487CED6 /* RDEpubReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44F6F4C9B8DC26B67956A489EB5E2E39 /* RDEpubReaderPageChildViewController.swift */; }; 7821105EF320619993B3BF7FB90C7ADA /* DTCSSStylesheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 88A74F7BF47C6E3B2026A80DC4783F1A /* DTCSSStylesheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 786BF7747848520712F08044A0D02D80 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE51B89744E67BA9CF7E4E2C6DB4DA05 /* ConstraintRelation.swift */; }; - 786E03AE79A040289810E23F3650798A /* RDEPUBReaderViewportMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 926FC58A23312DD1B9B06F1C52993208 /* RDEPUBReaderViewportMonitor.swift */; }; + 783B3E117FED874BD3A8456FF8AA41A5 /* RDEPUBCFIMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669FBCF95F7506CD004BB09639AC8CF4 /* RDEPUBCFIMarkerInjector.swift */; }; 78D24D82D98D77E744FF73C9040618A8 /* DTHTMLParserNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 47E0F42EC4845B73E0193AA0062A1576 /* DTHTMLParserNode.m */; }; - 78FF15D0FA9004E03E7ADE959EFFE565 /* RDEPUBChapterRuntimeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B56088831DB283C0FCC800A365BA5B2 /* RDEPUBChapterRuntimeStore.swift */; }; - 792F6B7B1C3B9A3E43BD3041EB92C0EF /* RDEPUBAttachmentTooltipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 767016761BF5B8D57595E288BC501BF7 /* RDEPUBAttachmentTooltipView.swift */; }; - 795AC979765E7A188006C6A44D1A5081 /* RDEPUBSelectionOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EC5B30703AA81763AA7A3A2A5A1C9CA /* RDEPUBSelectionOverlayView.swift */; }; + 792D5CAEC030F37770DFC2DBC1BC3773 /* RDPDFReaderPagingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 943A86A9A49BFCE017A6E927A5227BF2 /* RDPDFReaderPagingController.swift */; }; + 79585A90E8D123CFEEA49D216E027E00 /* RDEPUBCFIRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C746469E04CD2685727B7CAC5DF72BD /* RDEPUBCFIRange.swift */; }; + 7A14BEF93EBE86A497CA99BB39CCDAC8 /* RDEPUBChapterDataCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8A2AD9A0A7E27EC46F2AD598250ED2C /* RDEPUBChapterDataCache.swift */; }; 7A48CDFB40202EFD09A2A9AB0EE0770D /* DTCoreTextFontDescriptor.h in Headers */ = {isa = PBXBuildFile; fileRef = C56EB0E701347B766F12260495801CE1 /* DTCoreTextFontDescriptor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7B38C10310A465531DE6ADCAC241E681 /* RDEPUBMetadataParseWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CCE92FD9E1B88BD2FE582C98A4AE8EC /* RDEPUBMetadataParseWorker.swift */; }; + 7AD8C965AACB1343366C029CA39920F1 /* Archive+ReadingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8442D87941EF389213FFB9992DEF5D64 /* Archive+ReadingDeprecated.swift */; }; + 7AF664366D4801DF3F4A8A68357644BB /* UIApplication+DTNetworkActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 309D2521D7B9A10F86DA3F6BE7FB37B1 /* UIApplication+DTNetworkActivity.m */; }; + 7B2DB613A81AF14C101407A4C71D87B8 /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A94C98005A2AE1285F725F27D64D82 /* RDEPUBTextBuildPipelineInterfaces.swift */; }; + 7B328F107199E9130E8E9453B9C19F8F /* FileManager+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCF9B3BF987216CF1766D80FED04CF72 /* FileManager+ZIP.swift */; }; + 7BB6D47E678C847E2599D5A4CE1D17A4 /* RDEPUBSelectionOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 920EAB87BCF859EE5CB851833D8C7410 /* RDEPUBSelectionOverlayView.swift */; }; + 7BF87B0A4CAB6F698E7D84E676CFD1B1 /* RDEPUBResourceDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E6F004273EE4B1DA2F3B6E496AF475E /* RDEPUBResourceDataProvider.swift */; }; 7C05F56B62B15EFF344C5CDE4A52B8FB /* DTHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 44894FF917F68A61F0E523342FA5D0A8 /* DTHTMLElement.m */; }; - 7CBF1FB34C28C44DF64801D6DEB4F783 /* RDEPUBImageViewerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B977B258211F447182E6FA36952EA842 /* RDEPUBImageViewerCoordinator.swift */; }; - 7D1BC4BFD9942BC180D8B2F8AE1C1952 /* RDEPUBWebView+Reflowable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9FE68DE46E8F50DDA44B5EF63ABC67A /* RDEPUBWebView+Reflowable.swift */; }; - 7D6F73E1161FF39B9A117AAEB0A962D9 /* NSURL+DTAppLinks.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E16B563D3E20D4C0FB3C36350F2A330 /* NSURL+DTAppLinks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7E47D5B14C16612DADE842BFAF3E6DF2 /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2129FCC5AA430659582F12DBA1350292 /* ConstraintLayoutSupport.swift */; }; - 7F155CDA8CE804815318D2E26C97EFA9 /* NSURL+DTComparing.h in Headers */ = {isa = PBXBuildFile; fileRef = 74ECEF7602380F21B87522961E550A7E /* NSURL+DTComparing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7C31D700E05A097A42458D49D2561DB4 /* RDEpubReaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E0BE4A0D727AF11C82F9FAD7EAF28AC /* RDEpubReaderFlowLayout.swift */; }; + 7C7998DA70BCD963312E72F3F76EB360 /* cssInjector.js in Resources */ = {isa = PBXBuildFile; fileRef = 4DAF2D9747F0021F074180A0C76F0788 /* cssInjector.js */; }; + 7DB3CCA3839351CB377770E5870E69A9 /* RDEPUBJumpSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70A8F9DB706EC2E2FCFBAD1E695BB805 /* RDEPUBJumpSession.swift */; }; + 7DDDADD3A75BF8651607CB47BA00B647 /* wxread-dark.css in Resources */ = {isa = PBXBuildFile; fileRef = ADC5802DC43F329301B626F990A0D308 /* wxread-dark.css */; }; + 7F9455A2C1074288090AB69680B596AD /* RDEPUBChapterRuntimeStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AA811488B6B1DCC5A5F916EF08D7E0E /* RDEPUBChapterRuntimeStore.swift */; }; 7F9CC306B17D409DB903DF850FEDA64C /* DTListItemHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B446AE2E106CECF72AEEA93B85897EC /* DTListItemHTMLElement.m */; }; - 8003BE5D54D632D2DB96F39A97EA14BC /* RDEPUBViewportTypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CF7C6BEE1CB54D2546C94E58BEE0EC6 /* RDEPUBViewportTypes.swift */; }; + 80251A1EAF798D1DA0E8B6943015E263 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; 8099F1E613A15275EF5FC59ED3C73579 /* NSAttributedString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 42C2ECC838DE8A6E5DEB264BEA6F59E4 /* NSAttributedString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 80C8117B653528732041FB531659CE87 /* RDEPUBPageBreakPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE2565A3B94D5C14329E580ABC077884 /* RDEPUBPageBreakPolicy.swift */; }; 811D7CBCD710AE45FF80A4B05BFE444C /* UIFont+DTCoreText.m in Sources */ = {isa = PBXBuildFile; fileRef = 3FCDFEE3DE4E8469962B9931E7775E8C /* UIFont+DTCoreText.m */; }; - 812272B922627EF9643A9CDBC9AA2EFB /* DTBase64Coding.m in Sources */ = {isa = PBXBuildFile; fileRef = F3ABB3278539E3E13585120647F01258 /* DTBase64Coding.m */; }; + 8137EBB59B68FE44A292FAF24DE6DE37 /* RDPDFReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E9BFD9290BCB2009DB319A63935EF99 /* RDPDFReaderTheme.swift */; }; 814D0D63E5FD4AB7231E63064FE9EB5C /* NSAttributedString+DTDebug.m in Sources */ = {isa = PBXBuildFile; fileRef = B616B1E339BA326837E6325F3F291E51 /* NSAttributedString+DTDebug.m */; }; - 817FA29F739BD7F8C5C1133184CF2746 /* RDEPUBBookPageMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E2296EBB237D8071B8280E81601AE2 /* RDEPUBBookPageMap.swift */; }; - 81905A7717925A17E6B98E934A75B8BA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 50AE5BE674D885BED9B796FE8D97FAF8 /* QuartzCore.framework */; }; - 81E05D0BAEC9A1F7FC50DB906D83B4C0 /* Archive+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4822B5E091C79BBDF0CEC9C27FAD11ED /* Archive+ZIP64.swift */; }; + 81905A7717925A17E6B98E934A75B8BA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80A410954172DEFFD72C06139798345A /* QuartzCore.framework */; }; 82119A0DC4981CC2AF389C7C4CC08186 /* DTListItemHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E6203B41468A1B8FBBF9CEC0BF15751 /* DTListItemHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8218AC044246907D694EB1E6E3111F0B /* ZIPFoundation-ZIPFoundation_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */; }; - 83A114ACB998BF93F4D4E76EBB01D8B4 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 0EA3863B341F56C9B54980AD6A1FD5C0 /* PrivacyInfo.xcprivacy */; }; + 8258ED3AECC7D666D71A3CDD72336C9A /* RDEPUBTextPageRenderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E0CFBF5E5E5B369336E6E7E8FDCD5F5 /* RDEPUBTextPageRenderView.swift */; }; + 82652769213A4505EB968F508444BFE4 /* RDEPUBTextLayouter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65080B22CDF63551E7650AAF4499BDD7 /* RDEPUBTextLayouter.swift */; }; 83A4BC9FE4765C9B848DD4925D99F362 /* DTAccessibilityElement.h in Headers */ = {isa = PBXBuildFile; fileRef = D816721347D943A1D204E1507FFA5019 /* DTAccessibilityElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 84C67060BE07E8581665985F83F31B02 /* UIView+DTFoundation.m in Sources */ = {isa = PBXBuildFile; fileRef = A1A3A81081A2422058887BCEEAA78C9D /* UIView+DTFoundation.m */; }; - 84DF69BDF1ABA4C534918FECEB4FC190 /* RDEPUBReaderController+Trial.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D6E6B825D0F311663E6A9EFA5D2A7F /* RDEPUBReaderController+Trial.swift */; }; - 85DC4667579FA4FB8F06DE10D79C1BDB /* RDPDFReaderPanelPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F57ADB5984DCA56EDF32CDB6B4A983DD /* RDPDFReaderPanelPresentation.swift */; }; - 872E2091594BCB3529FD1AD9FEEDD24F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */; }; - 87A781E3D8E62CD7CEB6119E868AA323 /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E87093B88AB6F2B6A8E775DB61D7F9B /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8805A1F85260DC0DFCFDE413253C02FF /* RDEPUBCFIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49F4B0888234A678C5FF3E5866E73021 /* RDEPUBCFIError.swift */; }; - 88739AD8ADFE0F01CCE72073E6B5EE29 /* RDEPUBReaderLoadCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B6EC13F25BB402502F307A53001F7D4 /* RDEPUBReaderLoadCoordinator.swift */; }; - 88834B5C7C7321AE147C125A772EBD22 /* RDEPUBReaderTableOfContentsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7D294019CB6322021FE87237FA56DA3 /* RDEPUBReaderTableOfContentsItem.swift */; }; - 89933A4738255CBB0CECFD0C4FCEC371 /* RDEPUBWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D752B202581818FDFBB68CDD7FA75213 /* RDEPUBWebView.swift */; }; - 89B166C4B24D15FAA70EB6B52E89B572 /* RDEPUBTextPageDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F3756D5F4282ABEF00423938EAF6DE2 /* RDEPUBTextPageDecorationView.swift */; }; + 83B6B5367E1D465C3E6428BD0B369AD4 /* RDEPUBFixedLayoutTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F805E226F3C1AA7053AA6606DA26CE1 /* RDEPUBFixedLayoutTemplate.swift */; }; + 83D6E7A893C2BA73189B3608E2EC9AC9 /* RDEPUBTextBookModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28B57DDE8DD7718C17E02D8B7001DC6F /* RDEPUBTextBookModels.swift */; }; + 84EAE9CFBEAC03E4B95A321E78943365 /* DTBase64Coding.m in Sources */ = {isa = PBXBuildFile; fileRef = F3ABB3278539E3E13585120647F01258 /* DTBase64Coding.m */; }; + 8731E6DFBE1CC958CE8B122D5144B3CC /* RDPDFReaderDrawingToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75FC55A17D1CCC4C4BEB88B146B790D8 /* RDPDFReaderDrawingToolbar.swift */; }; + 8877BDF2C129627BE7197343C727EAFA /* RDEPUBReaderController+LocationResolution.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A158C1456B0A6C5E3C11F6F598B688D /* RDEPUBReaderController+LocationResolution.swift */; }; + 893B6523077FC73B80174909FA8EC091 /* RDEPUBReaderPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD16456E8ACD41D8A266CD43400B6374 /* RDEPUBReaderPersistence.swift */; }; + 895D1E1E1A62F977D75D4DBB5ABD97E7 /* RDEPUBCFISerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D597E4B20DB22DA3D2C43EAE0285EFB5 /* RDEPUBCFISerializer.swift */; }; 8A0A0FB23DB0021ADC9AD0D90631883A /* NSMutableString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 295BCC7FDA963E5D8F53CBF64F08B2B5 /* NSMutableString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8A35CC67F0AA6B26397C10D756EA34E8 /* DTTextHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 23E6F02F41FDE074ACD5C78DA921EEED /* DTTextHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8A6C2CB8AE2F41661DB70FE4262F7058 /* DTFoundationConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 617D0CB55C260D48CC4ED2FF0A3A1051 /* DTFoundationConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8A61D5BFFF823B2DD5866C79F849A560 /* RDEPUBReaderToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D6C143C0EAE0DA948204F9912FE193D /* RDEPUBReaderToolView.swift */; }; + 8A9B2F5A2151EE12E662F33343C04458 /* DTVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 708CF8B218058AAAA710BB7ADFC504FE /* DTVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8AC90941E71199090BCED76DE89EFB60 /* DTAttributedTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 45C11AEF7E65FFDA653DFB142C22DEF4 /* DTAttributedTextView.m */; }; - 8ADB863F8874EB8B39500114164F30CF /* NSData+DTCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = D97A43F1E6018B92E85B58BB6549F7CB /* NSData+DTCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8B405CE13E7D718A9340A82B52766AB2 /* NSCharacterSet+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = CFF70C90945A3410647B87CF1F107605 /* NSCharacterSet+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8CE7E564E4F1F50CEC10E13DAE1DB56D /* RDEPUBDTCoreTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 932004ABE6C86E9E2ED0030B979ED9FF /* RDEPUBDTCoreTextRenderer.swift */; }; - 8D3EB4BD6C7DFA99BF6D73893EA68A33 /* RDPDFReaderAnnotationListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6954E717DF2A17466B5D30D25C12666 /* RDPDFReaderAnnotationListViewController.swift */; }; - 8DB5CC8706F527BFB11525A6B73BB1B2 /* RDEPUBPageCountCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB4A8DFD2E0EE6D2285B69A5BEA0CBE /* RDEPUBPageCountCache.swift */; }; - 8E74EF124593A0E8C42F05F34F18DF7D /* RDEPUBRuntimeChapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F53A99F5B071BEA755E7344615C5D4FD /* RDEPUBRuntimeChapter.swift */; }; + 8B883B75A63415B216F01354B9B4F66D /* Entry+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = E64ED14B8FB7C0060C3BAA215AC25363 /* Entry+ZIP64.swift */; }; + 8BD97441C51AF5BED8E01766EA2EC609 /* NSArray+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BE28706DBAE983FB19FBE122D9F9E68 /* NSArray+DTError.m */; }; + 8C358267F5C859D9DC55A46DBBC0F2A8 /* UIApplication+DTNetworkActivity.h in Headers */ = {isa = PBXBuildFile; fileRef = 18AACA176C2E9FDB2B4834B426AC6368 /* UIApplication+DTNetworkActivity.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8CF55379C440B62AD7DAA78629264DD4 /* RDPDFReaderImageTextLayerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48D4FB95327A55188B4EE105C47E7090 /* RDPDFReaderImageTextLayerView.swift */; }; + 8DDCA02D7175B2583E53778A4CD7457E /* RDEPUBTextAnnotationOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 603CE31AD8934F870E35F7074D1EFDE0 /* RDEPUBTextAnnotationOverlay.swift */; }; + 8E44611C7FC61B0F6B197004149643E9 /* RDEPUBTypesettingPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73A8DB7823ED0CC52F6BCB9D87F5D8E9 /* RDEPUBTypesettingPipeline.swift */; }; + 8E63D42E7CE0C90FD93AD0F874DA94BE /* NSURL+DTComparing.h in Headers */ = {isa = PBXBuildFile; fileRef = 74ECEF7602380F21B87522961E550A7E /* NSURL+DTComparing.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8E8726381CBCFB1EDB350183456D4EF7 /* DTHTMLParserTextNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A2A7B53BCE33A88EB155ED5C4F5C09D /* DTHTMLParserTextNode.m */; }; - 8EE605D9B102DD1A41A4718F9555F6C4 /* DTActivityTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 702AB4F450076D82E264C7AF93A45F14 /* DTActivityTitleView.m */; }; - 8F44CA30A7274B9035B30B0CEC895B47 /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A15541928DAA1303B6219C49CCE42C9 /* ConstraintLayoutGuide.swift */; }; - 90408C125712B1309AEA647C8804B199 /* RDEPUBCFIRecoveryEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = F09DDC12AA1A0CD529F310E5CE0F99A1 /* RDEPUBCFIRecoveryEngine.swift */; }; - 90755EAACF679D579C32EB0775BEA867 /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81E4757842563D7D3DAB82C8B693B313 /* ConstraintViewDSL.swift */; }; - 91DD2C713D72D75B59D2E5FD28733A8E /* String+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00A7D3C70A06A1D06B0EF2D25AA3DC8 /* String+RDEPUB.swift */; }; + 8EDFE061B6EADFEFD075D45814490FC8 /* RDEPUBCFIResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7B65425D5E15E4D005158BE86FAB4EA /* RDEPUBCFIResolver.swift */; }; + 8F12D85AADFB18FDF7A86CE2D1F29821 /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F38B3CAD708AE9333A29A9AB921FA4 /* LayoutConstraint.swift */; }; + 8F7CFA48B393899FA35E17A67F683790 /* RDEPUBReaderAnnotationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B84C004C6CD0C7094EBA83BF3E42DD0 /* RDEPUBReaderAnnotationCoordinator.swift */; }; + 906561FBE3727743E5F81F793D5EE210 /* RDPDFReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A746B9DD2EDF2950A3F314EA3D5B2EF5 /* RDPDFReaderContentCell.swift */; }; + 910D5641EF4CF5D2A6F6A36AF50EE25A /* Archive+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4822B5E091C79BBDF0CEC9C27FAD11ED /* Archive+ZIP64.swift */; }; + 9147F2EC41915FDD83B8C8B44CB7E440 /* RDEPUBTextRendererSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = BD629E1D77971203EB1E5EE5C5BA2BAC /* RDEPUBTextRendererSupport.swift */; }; + 91E518F947290E08163684BB1A0AD7BB /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 0EA3863B341F56C9B54980AD6A1FD5C0 /* PrivacyInfo.xcprivacy */; }; 91FDA47810CE5CE2C48AED9205AE89B5 /* DTStylesheetHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = E15930CD8D9ED2F990B87E8F78DD5A32 /* DTStylesheetHTMLElement.m */; }; - 9262E9FD58A8DF61BA8D1828AC78ECE0 /* RDEpubReaderTapRegionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05A48723D29BFECCDE51DE4E1CABDD67 /* RDEpubReaderTapRegionHandler.swift */; }; + 9226F99BDF2BC648729B97FAD08A5F70 /* NSArray+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 73DCE046F4B55AE88A81C9E68400E93C /* NSArray+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 923F3C01F3A8330053A33F77923983CC /* RDEPUBWebView+JavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 289F977B8DD2ABF03CE0CCED0A8F5671 /* RDEPUBWebView+JavaScriptBridge.swift */; }; 92C59F96D443525E8833676479FA60C5 /* DTVideoTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AEDBB0324469C4ECD8D10A6355A2A09 /* DTVideoTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 92F000C7625CBA207F48EF95B9781D89 /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7698F9998B2922CC8875BDD7849ED710 /* ConstraintDSL.swift */; }; - 9310666E5DB97AB7D7BA35A9FF70488E /* DTFolderMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D9D817F1F806BC50BB65FC80C7D47F /* DTFolderMonitor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 944C7E54F78139E21144CE503ACBA3EF /* RDEPUBCSSCompatibilityLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EEC733B8EFDBB50E364A83D73F03DACB /* RDEPUBCSSCompatibilityLayer.swift */; }; + 94A66BC1215EFE0A73B37A373C0A3281 /* RDEPUBModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEDD0F8FBE7C14A783C94B709F23A4DB /* RDEPUBModels.swift */; }; 94F5846979DBC90E2B646E975F5ECBA8 /* DTHTMLWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBB8005939E9A85DD9BDAEAA3002E57 /* DTHTMLWriter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 954296DCFAC0A89B6ED281D0B88ED2B9 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 971623801171F2368ECD657BD0C2937F /* ConstraintMultiplierTarget.swift */; }; - 96724FD78DA6E4B95E96A4260EBC7C0F /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41C70D721E1873184464B93001110824 /* ConstraintInsets.swift */; }; - 96AFFB9EB202E212B3EED5A173C4E9E3 /* RDEPUBCFISerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D984CA4AF47D4219E0FB6506CD7D2C27 /* RDEPUBCFISerializer.swift */; }; - 96B287B7613D827030A3444C1F1016A3 /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C91A1E88D3B946A1FA082A6EB05C9A /* Constraint.swift */; }; - 984F604C1818609B7836604F85ADEEDE /* DTPieProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 973C2C363B09BC1E49983C6826A623E2 /* DTPieProgressIndicator.m */; }; + 979B6D730AAACF4B9B8331808C40BE90 /* RDEpubReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 35BA5E0859FB7D83208D401FA4126575 /* RDEpubReaderView-dummy.m */; }; + 97EBC8BCC30E3F1E0FAB723C9023353F /* RDEPUBParser+TOC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A722D0A8A8664F86E0905654992FA360 /* RDEPUBParser+TOC.swift */; }; + 982A4A2A2E9436CF9C57A3D77ED731A0 /* RDEPUBCFI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 830CF8D5AB992FBCBD12AEDC987704BF /* RDEPUBCFI.swift */; }; 9854DC3F1763B6272C2EA3FC6EC40B95 /* NSAttributedStringRunDelegates.h in Headers */ = {isa = PBXBuildFile; fileRef = 60599FA355FBC31A4ED1E2EE5A09A312 /* NSAttributedStringRunDelegates.h */; settings = {ATTRIBUTES = (Public, ); }; }; 987538B07E11741899878EA8BC947F51 /* NSCoder+DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = B8CC7968142149B581329E3460D35484 /* NSCoder+DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 987AC28BE0204F311650F5193918CFA0 /* DTLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 1F72747C46CC41B906C8A967ED5A47E6 /* DTLog.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 98A025951F12B433AD115CD3CEDDDBD8 /* RDEPUBNavigatorLayoutContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89DEA6EF4DB86448B595CCB2ACC06C97 /* RDEPUBNavigatorLayoutContext.swift */; }; - 98CC3155061E818ECC5294ADD7BD39A9 /* wxread-replace.css in Resources */ = {isa = PBXBuildFile; fileRef = C4701A7F7E553E7824903F43562AFC19 /* wxread-replace.css */; }; + 988EF04BC3904784A7F4B364AD31A75C /* RDAIReaderContracts.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCBD48F4256CF6916C32ACC00CA15E31 /* RDAIReaderContracts.swift */; }; 9917E9B804CD33AF3BE2A992A3510C97 /* NSNumber+RomanNumerals.m in Sources */ = {isa = PBXBuildFile; fileRef = 175FF6D3C38E463368C8B7AE1AC4E41F /* NSNumber+RomanNumerals.m */; }; 992B7C8C824B5EA190EF1DB096064DB7 /* DTDictationPlaceholderTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = D89968532D9F2672C6B6D01C290AE466 /* DTDictationPlaceholderTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 99602A29E251C50BCC2EFD40D03716C8 /* RDEPUBTextAnnotationOverlay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FF34F8FF314B2B52DA562E7160E9AFD /* RDEPUBTextAnnotationOverlay.swift */; }; - 9A16F390AAAAC68FD7859C578B4054CB /* DTCustomColoredAccessory.m in Sources */ = {isa = PBXBuildFile; fileRef = D3A4BA792340D151ECB734018B2FD3EF /* DTCustomColoredAccessory.m */; }; - 9AFFCA108C94C7B57BA13D014B19659B /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D557DED28FA9EA85219AF05C93296C6D /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 996015E5109268820CBFDBD0374A42FC /* RDPDFReaderContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A51CF84AF3FB536008E31CBC800E12B8 /* RDPDFReaderContainerView.swift */; }; + 9A100F613599FC91999C704C0A1F1BEC /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 6B839E12858DFC58AF91990D8B6D27A3 /* PrivacyInfo.xcprivacy */; }; + 9A42EACE6319937378BE969B5BE1F89A /* RDEPUBTextSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEDDBBF79781F69878880132910803DD /* RDEPUBTextSearchEngine.swift */; }; + 9A5DFEC1E2E005ED02C8246C92CB4605 /* RDEPUBCFIError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C6414219D018ADCECF6E5804C284BED7 /* RDEPUBCFIError.swift */; }; + 9AC98ED3942DDCC434580B020478CCC1 /* RDPDFReaderView+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8451167CAD54879A8C6C68669A8CE1B1 /* RDPDFReaderView+CollectionView.swift */; }; + 9AE7B03D33A2C889C9B0100DD2AA632B /* RDEPUBImageViewerCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE1DF7A60F88EAB6D70C3170A6F021AA /* RDEPUBImageViewerCoordinator.swift */; }; 9B199D71D2F48B2055A7FDF9BD7051CC /* NSString+CSS.m in Sources */ = {isa = PBXBuildFile; fileRef = 4351507ACB1193D9EA3EDD3DFDDA1AD2 /* NSString+CSS.m */; }; - 9BCC983EA5231C9D263FA645D58D0CC4 /* ZIPFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D5D2445B4619EC0C62C7560649DD2204 /* ZIPFoundation-dummy.m */; }; 9BD146F72B29C703798001F138B069C2 /* NSCoder+DTCompatibility.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DB99CF9B07AE8928ACEE9F5A107809D /* NSCoder+DTCompatibility.m */; }; - 9C05C97A74E7281F25F2BB0245A9D715 /* RDEPUBPageBreakPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 359E871CA4A99767E938A99718B48F88 /* RDEPUBPageBreakPolicy.swift */; }; - 9CE219EB6F092600CA33E15CE41CC38E /* Archive+BackingConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67C4B1FD4CAF8FFB009FF39F501B2650 /* Archive+BackingConfiguration.swift */; }; - 9CF3ED83D568246E7BCEA2A2C4D38473 /* RDEPUBWebDecorationOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AAE327FF1505A989454CFB6BE8D5056 /* RDEPUBWebDecorationOverlayView.swift */; }; - 9D2756A6EA62DC05464345D73FAD772F /* RDPDFReaderPageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4516C344651B4BAB7D3B3676952563AC /* RDPDFReaderPageView.swift */; }; - 9D8DF57114A6CB59686EC2A5EF82720A /* RDEpubReaderFlowLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3CF1BCEE24E319CEA749FF14F5C9D7E /* RDEpubReaderFlowLayout.swift */; }; + 9C05B5CF2598BB4EFA6C8C6881E4E067 /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = D53EC1D66653102E077AA44906338EB5 /* ConstraintRelatableTarget.swift */; }; + 9C6ECACF377F5276D76DB9DC47BC173A /* RDEPUBCoreTextPageFrameFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D11123394F7F2EE6463FE977F3DABD9 /* RDEPUBCoreTextPageFrameFactory.swift */; }; + 9C775820BFD0F84151EE9D1D15AB5C5D /* RDEPUBSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 127678B93D3CEB6EC2C7F3E5DD81860B /* RDEPUBSearchEngine.swift */; }; + 9D12E0847751CF6ED879D7A2FD0AF7B6 /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB434D5D2C4FC39DB37D676ABB6B7C68 /* ConstraintMaker.swift */; }; + 9D9E6D8A9C102C9767A2778F3F550BCD /* RDEPUBReaderToolViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B363F80F3DBB1AAC48B8524B8025C79 /* RDEPUBReaderToolViewProtocols.swift */; }; 9DE04C83A68C7512C0A860FFF5CEC113 /* DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B8CEFAE5E33709E3C9AABF89FFF29BC /* DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9E4AB71DE8B3E7218B53B2C8EF6B843A /* DTAttributedTextContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9213525F01D9956B799C00C0D4A56558 /* DTAttributedTextContentView.m */; }; - 9E7B8B9F265A36A8058BE39018E9E339 /* RDEPUBSearchModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA7B6B7B55D1E706B41644DDA956D2CA /* RDEPUBSearchModels.swift */; }; - 9EAEDB014CE2E937A47B6BB37B59743A /* RDEPUBReaderController+PublicAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD9D544D3DF2CDAE5B6EECFF892BD9F5 /* RDEPUBReaderController+PublicAPI.swift */; }; - A06D0DF52FF6AE1F6C4482BBABD73C1F /* RDEPUBReaderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92AA4E9E3B871C30A1C7BF9141CD9770 /* RDEPUBReaderConfiguration.swift */; }; - A097F26C01A8A85039E5E2D19EABF24D /* RDEPUBNotePopupCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D597E864BC3B6215B502FC3B05C13364 /* RDEPUBNotePopupCoordinator.swift */; }; - A0AD6102848CEFDC5FB444E65B956F6E /* RDEPUBChapterDataCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF56076797358B800EE1C35C5FB6360B /* RDEPUBChapterDataCache.swift */; }; + 9EA8EE799B5D9646DF6F68C316710251 /* RDEPUBReaderContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD5495829095E37CEDC515A639F9A9E4 /* RDEPUBReaderContext.swift */; }; + 9FC1AEB682CD309FA7119A1FCCEBB708 /* ConstraintDirectionalInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0BD46122D186FBB226483F8DB80E6CE /* ConstraintDirectionalInsets.swift */; }; + A04E8A79293210D73AB60D753F635DD9 /* RDEPUBTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = E263E2A2BC1CFE65C51095296C21D4EE /* RDEPUBTextRenderer.swift */; }; + A050FD451EB2C853335CA21A1CDAAAB0 /* RDEpubReaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0CAA288D149C9793B45AC10F40DABE4 /* RDEpubReaderView.swift */; }; A132A0C9EB13B65FB886B11AA2E6304C /* NSDictionary+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = 4F9D3ED5DA816A72982CEF0FD18986D1 /* NSDictionary+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A184446D12B20A2A45844257D9E09E1E /* RDEpubReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C764F1B6E5567DB91D1ABE809D25AB99 /* RDEpubReaderPageChildViewController.swift */; }; - A1D1E55062DC72F0193C86A29A02234D /* DTVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = 16023686DC389E6755BC79366433C45B /* DTVersion.m */; }; - A2582EBC9C4BF15AB10F62F5C2F70654 /* UIView+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3124E174D81A28717086F17445BED5BB /* UIView+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A27AB28EB7B1A95485537F7493161E24 /* RDEPUBDecryptingImageAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = E02FC3DBD9707CA1A2C087E36DEBDFF8 /* RDEPUBDecryptingImageAttachment.swift */; }; + A15EC52278A2D619B7780AAB8D88554A /* DTExtendedFileAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = D362CCA87B017930E7481AFE2E73FB74 /* DTExtendedFileAttributes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A1D8FCF9351374EAEAF9D53603EBEA91 /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F533E14DBE841E334D44FEDC9132726 /* ConstraintOffsetTarget.swift */; }; A2CA9C27EB2B77637A12723F8CFE7AAB /* NSString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = 84BDFD9872BDDC8D8E292A987C833142 /* NSString+HTML.m */; }; A30D5C1E413A3D319A83D3410A8A549F /* DTCoreTextParagraphStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = 226AE0F5865FC6A88B9D0C73C28A8381 /* DTCoreTextParagraphStyle.m */; }; - A3E97A57562EF0233C951964D26DBBCA /* RDEPUBAssetRepository.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F37E867DE563EFD505DBB674F4FDDF6 /* RDEPUBAssetRepository.swift */; }; - A4E1CAF494796BA32FFC884698C85729 /* DTHTMLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 65806394BC872987207CCB0FB587E3B1 /* DTHTMLParser.m */; }; - A4E62D819CC311F109A2672A40906667 /* RDEPUBReaderSearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197D0C3E827B624F40FB510F3BD8A906 /* RDEPUBReaderSearchBarView.swift */; }; - A4E98600889A26605AFDBEFEF99763C8 /* NSURL+DTComparing.m in Sources */ = {isa = PBXBuildFile; fileRef = EF82EDCB0C8172FAF3847EAAD873E096 /* NSURL+DTComparing.m */; }; - A53382EEF80D25E2E84B30BDF87D32CA /* RDEPUBReaderController+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B1B27CD14A9E7FB6895C4F6F2E70179 /* RDEPUBReaderController+DataSource.swift */; }; - A5D15AF6A625AAEE7A68E724600DE2EE /* RDEPUBTextBookCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEC7D701A0361A9C2BB93906A4A7DFDD /* RDEPUBTextBookCache.swift */; }; + A32524C3BBFC8361B5A77404293349A1 /* epub-fixed-layout.html in Resources */ = {isa = PBXBuildFile; fileRef = 22226730313C0F24542669F12C5C4FB1 /* epub-fixed-layout.html */; }; + A374EB7564B9E0CCEBA566A30C5551BE /* DTExtendedFileAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 7440BEAF1F0CA8CE70C073FFEAF637F5 /* DTExtendedFileAttributes.m */; }; + A3D4E87CBD4C7BD9F47D0139E550CB3D /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7271637D32095C0F526965851E2E06 /* ConstraintLayoutSupportDSL.swift */; }; + A4025F5A563E4B91B2D3468E6E435693 /* UIColor+RDEPUBHex.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB33A3E20E2517AE2775CBBD4FB0642D /* UIColor+RDEPUBHex.swift */; }; + A42CE42ADF162F25E1B2EDE4220B7B51 /* RDSpeechReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D94A0293C1A11AB0BF793F0804AF01BA /* RDSpeechReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A50366094D551204E6CB771F053467AA /* epub-bridge.js in Resources */ = {isa = PBXBuildFile; fileRef = 20DD66672C9FCA7C604D8034702101EF /* epub-bridge.js */; }; + A59ECA1C79794D157BD9E87DC19F6D36 /* RDEPUBWebView+FixedLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3839A199E78DBF80DB5CF945DCE6C62B /* RDEPUBWebView+FixedLayout.swift */; }; + A5A9FE6FB03D2B84F0C684D58DEB1B76 /* RDEPUBTextBookBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67A9EB086407E39FDB221874CE6CB9DA /* RDEPUBTextBookBuilder.swift */; }; + A6DD3A4EBF6A086D4CA796EB1BB0968B /* RDEpubReaderTapRegionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ED45EEF428135AE43AF524CE0492924 /* RDEpubReaderTapRegionHandler.swift */; }; + A6FCCA0867D6E90A04127122718A1A13 /* RDEPUBRenderDiagnosticsCollector.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97A2E9C7E5DFF37C06187E6AFBB3CC8 /* RDEPUBRenderDiagnosticsCollector.swift */; }; A72E9F983E5BBFA7485EFB482B80E89E /* DTWeakSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = F43B7563256C964F3030A6C9BED2EA16 /* DTWeakSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A7A84555DC1EFB6AA2A1CD92EF8E05EB /* RDEpubReaderView+ToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F8654BEEBD1B51A4079D96899C140D /* RDEpubReaderView+ToolView.swift */; }; + A75112BB97D2EFA12C7D55731B839ED5 /* RDEPUBPageLayoutSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01476F47406E7CD8C4420B82B73E642F /* RDEPUBPageLayoutSnapshot.swift */; }; A7D665BBDADBE3D64023FF52E218FCFA /* DTCoreTextConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = D7D4385F08260E348B370DC79366E6CD /* DTCoreTextConstants.m */; }; + A8558343E113346EF75EC327987A9B62 /* RDEpubURLReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9A0DEE786314BFAABED15DCE9A483F3 /* RDEpubURLReaderController.swift */; }; + A86F7A86BF53DAFD0D9F40771DE16753 /* NSMutableArray+DTMoving.m in Sources */ = {isa = PBXBuildFile; fileRef = D245D04D70A4D36DC86741D0833AA95A /* NSMutableArray+DTMoving.m */; }; + A871845DAB142E90B72451F579AC8727 /* RDEPUBPresentationRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = F692867A6534E6C9D48E91AB70413D33 /* RDEPUBPresentationRuntime.swift */; }; + A8E71E692C58542B6E2A3DB75B6AE6E3 /* RDEpubReaderView+ToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4323646E9B345F4FADB630E17C777858 /* RDEpubReaderView+ToolView.swift */; }; AA3722CC8B4992EDA8A9F5E9116835B7 /* DTCoreText-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 031C87137668EBD722F2FAB7A5826060 /* DTCoreText-dummy.m */; }; - AAE4A96FB3FBC30E2F73F040437B8380 /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F38B3CAD708AE9333A29A9AB921FA4 /* LayoutConstraint.swift */; }; - AB15CDEC956F4EA7131C036C892962B6 /* RDEpubReaderSpreadResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BD308DABD26A8A8B9CC272486D6EB0 /* RDEpubReaderSpreadResolver.swift */; }; - AB3268891858D675485E80816DFA75C1 /* RDEPUBTextSearchEngine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 089966C3069A2468CA1E889EB69E74A7 /* RDEPUBTextSearchEngine.swift */; }; - ABD0544F7103859B11D1DE040E2D516C /* RDEPUBChapterLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59FBE51D9C334D6C796944A37A36FA0B /* RDEPUBChapterLoader.swift */; }; - ABF58E16D763E200F4199DCC20ADC6DF /* RDEPUBReaderSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CE5B910E4B90BDD78B2747C7184C745 /* RDEPUBReaderSettings.swift */; }; - AC493BA061950FEE835F5305A5C0EFED /* RDEpubReaderViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5088A729186A207F65C88E148F0392F4 /* RDEpubReaderViewProtocols.swift */; }; + AA6A82E91F16300F8B7A4BF71784B911 /* RDEPUBCFIParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EC7EE7406D5F141BFDB10F21D1B98D8 /* RDEPUBCFIParser.swift */; }; + AB68E2E00AED308DB0BC55025785F887 /* RDEPUBReaderViewportMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63FD3DEF59551312E8EEB77A7CDEC93A /* RDEPUBReaderViewportMonitor.swift */; }; AC7000465258822B466855B12F1F97A3 /* DTCoreTextGlyphRun.h in Headers */ = {isa = PBXBuildFile; fileRef = AC925B7832B651D3B1C84393FF2F9573 /* DTCoreTextGlyphRun.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AD1E9FB8A3B05645F8805FB26F814DF4 /* RDEPUBStyleSheetComposer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ADB2BD72FA5B1DA4D59440FFC04DE2C /* RDEPUBStyleSheetComposer.swift */; }; - AD5854B028EAE75971250523F24E7AC0 /* epub-bridge.js in Resources */ = {isa = PBXBuildFile; fileRef = B3F4461DF9B7620283F97023A78C08D8 /* epub-bridge.js */; }; - AF16ED52BCD49CCD7B7D19E5CC19F617 /* Archive+Writing.swift in Sources */ = {isa = PBXBuildFile; fileRef = DBAEA965F9F262BB8BF17C77B01C0956 /* Archive+Writing.swift */; }; + AD31947EF7020717B2FFCB898C31DCAE /* RDEPUBReaderController+ExternalLinks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C0E6A164C2508A21E017A697D6A4C80 /* RDEPUBReaderController+ExternalLinks.swift */; }; + AD94FDA8965EA1EBBD5E0438C640409D /* ZIPFoundation-ZIPFoundation_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */; }; + ADD97A31560B4C7FF2F82E28BAB7B0F9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + AE74D8EAC25A8CB489174D28E193C232 /* RDEPUBReaderHighlightsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B28B43AB4CD054B30DD8EE676642E70 /* RDEPUBReaderHighlightsViewController.swift */; }; + AE9C15A64DC56172E16CAAB607A13E00 /* RDPDFReaderSettingsPanelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1B84BFB1ACB4057989E6AE9A039B3AC /* RDPDFReaderSettingsPanelViewController.swift */; }; + AEB35A34B4BD9D563421951F788785DB /* DTPieProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 973C2C363B09BC1E49983C6826A623E2 /* DTPieProgressIndicator.m */; }; + AF2BC336DB93234B6189EC2ACC144CAA /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64ECE2655E3EFB266C23544D1149B39F /* ConstraintMakerExtendable.swift */; }; AF7A1DC953992A149CB0815C90769529 /* DTIframeTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = AFFD40FFE61C73861D47FD66561E7E93 /* DTIframeTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B02F375B16AD7C7C33D916BC92AA6DD8 /* Entry+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53C2C2B5D2F9E3E125F8C7B1B2B41CA8 /* Entry+Serialization.swift */; }; - B1209E507F02612272E977F7388C1CA6 /* RDEpubReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D4ABEB07AC55D55BE9BCECAA2B25D794 /* RDEpubReaderView-dummy.m */; }; - B24F819D98E4DF194465D63CC6C30F26 /* NSURL+DTAppLinks.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DA7955406639DE39E1FD953D882301E /* NSURL+DTAppLinks.m */; }; + AFEF1073C525D47CB9911E73713176A5 /* RDEPUBReaderController+Trial.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59A6E8D84753503A5324211BF6A88E64 /* RDEPUBReaderController+Trial.swift */; }; + B03327FAC1F82FBF4DD1F1863A19C913 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B466C1278D8245B512592A07C1965D32 /* ConstraintConstantTarget.swift */; }; + B0902747E74CD719F0583F848D5227A6 /* ZIPFoundation-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D5D2445B4619EC0C62C7560649DD2204 /* ZIPFoundation-dummy.m */; }; + B1909D0BE6FF808617D7FABF13F34D42 /* RDEPUBCFITextAssertion.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBEC460977B864A29421BD4ACD4849C1 /* RDEPUBCFITextAssertion.swift */; }; B24FAD34A7915FC4B90FE9038E814FF2 /* DTLazyImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = E757F9EEC3FE914CD8CFDFF7173A5D6E /* DTLazyImageView.m */; }; - B2905E16F0C9B8659C065FCFD4F8C04E /* Data+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D1532D1876B11C0E08D8B7D4FA131B /* Data+Serialization.swift */; }; - B388AF7C09885B72DF0DE4327A3B149B /* NSString+DTFormatNumbers.m in Sources */ = {isa = PBXBuildFile; fileRef = 298CF23475A19D50E172630BD6D1D1EA /* NSString+DTFormatNumbers.m */; }; - B4349104AAB928C77DA7856B8078D9A6 /* RDEPUBChapterLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6A2D1BF70F1C6B7354AC88C3DC52656 /* RDEPUBChapterLocation.swift */; }; - B56C0BC177945BD67D43DA9784709273 /* RDEPUBTextBookModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5943DD019F4F6E9E8608E88D2420888C /* RDEPUBTextBookModels.swift */; }; - B62CB41227F697B35B476BF17EDFE501 /* RDEPUBCFICompatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49BEE692A99D3F6541F6A273A49A865D /* RDEPUBCFICompatibility.swift */; }; - B647D72A5A14CFD2C63C9E33B8A83B62 /* RDEPUBSelectionState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3BEBF652FA65A9AB3D558E1A2A511051 /* RDEPUBSelectionState.swift */; }; - B6870FF977C2C853A5448FEBCB5023EA /* Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 022E4755B34BE3FCD1475BB40C6FD7EB /* Entry.swift */; }; - B71CA96B831364187FC460130EB25C8A /* RDEPUBPresentationRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = F51399FB07DB540E97ED404FAB685C31 /* RDEPUBPresentationRuntime.swift */; }; + B30FE8B7FE2DC01D2A6399BA24B46EE4 /* RDEPUBBackgroundTrace.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA44E461F73A280FD2649C38E2A66E15 /* RDEPUBBackgroundTrace.swift */; }; + B396528BBA2B2BABAEB8F1D5E2727B32 /* RDPDFReaderView+Paging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B76ED37710AEC809FAF71EC4C1F215 /* RDPDFReaderView+Paging.swift */; }; + B4345AD562848E534F48169C04BFF890 /* RDEPUBCFIDOMPathBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = B39D4ED1F553815AA8DA4B6C47C7269B /* RDEPUBCFIDOMPathBuilder.swift */; }; + B45A64277FD61F6FA0AF77DD793158AA /* NSDictionary+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = AF41F6780E56AB0F76C46A75363DA697 /* NSDictionary+DTError.m */; }; + B4886245B032CAA636E059E4A829FB6C /* Pods-ReadViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B59DC0B1A729CFF0F76C1D4886121338 /* RDEpubReaderSpreadResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0AD8B4549561584DFE21463CC4045E6 /* RDEpubReaderSpreadResolver.swift */; }; + B5F94F9ACAF7243E67C82FC8B0A3850F /* RDEPUBSearchModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = F11B87D1193658365521B72B44502D73 /* RDEPUBSearchModels.swift */; }; + B620DEA7F33E29DE56E1AD5C227D606D /* RDEPUBRuntimeChapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = D52E6C5D8864C2E11D3F6143638FFA82 /* RDEPUBRuntimeChapter.swift */; }; + B6FA3A9062517BAFEF468F04B78A1F8F /* RDPDFReaderDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16957235ACD001BED6FBC8A1D2CB5BA5 /* RDPDFReaderDebugViewController.swift */; }; + B73FCEC25F0912CEEAE76F34B6E1A5BA /* RDEPUBResourceResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51DCB48325A7E7DDC907587B7B9425F6 /* RDEPUBResourceResolver.swift */; }; + B76AAD4CE3A876895D22B69BC7D8430C /* RDSpeechReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FBAA88C8DBE0129E51AD73F7D1AB4BD /* RDSpeechReaderController.swift */; }; + B76B293E2071B10641153379A411BB3A /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7698F9998B2922CC8875BDD7849ED710 /* ConstraintDSL.swift */; }; B7BDD79FC06A1E4E0E17592860844108 /* NSAttributedString+DTCoreText.h in Headers */ = {isa = PBXBuildFile; fileRef = D8D859DA88367D318DA839A12B29A149 /* NSAttributedString+DTCoreText.h */; settings = {ATTRIBUTES = (Public, ); }; }; B8332F36582F7A001FE85A8D54B27C9E /* DTCoreTextParagraphStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 407D64FA06B0D5E2DD9CDBC471AB9195 /* DTCoreTextParagraphStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; B86493B996A888D1DA7814ECB6028E22 /* DTHorizontalRuleHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A21D84422DA0E64EA29D0155532671F /* DTHorizontalRuleHTMLElement.m */; }; - B8FA5ED7AFE0CBE95DC65A57AAA0273F /* RDEPUBCSSCompatibilityLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0594E39D9568D488378ADCB812715321 /* RDEPUBCSSCompatibilityLayer.swift */; }; - B9271BC5E425AD8ADD4C6D561B97D4C1 /* RDEPUBReaderController+TableOfContents.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9D1B125AA5600F835F9AB456100B5BC /* RDEPUBReaderController+TableOfContents.swift */; }; + B913466B4CC75BE55777A0FC4A881C5A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + B91EFDBCAF74AED0882D670EF6C244F3 /* DTCoreGraphicsUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 9761870FC405B984D09A304261C3CB25 /* DTCoreGraphicsUtils.m */; }; B94CD41727DFCA8791EED8FB2CA397DD /* DTCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = B44119BC710BFFD4549A1B83FBF80CF8 /* DTCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B96DE08EB4CDFD7CE0250A3927A31B8F /* RDEPUBHTMLNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54B4C37E4A452238A2B3D65A483FF624 /* RDEPUBHTMLNormalizer.swift */; }; - B99880D5CC636DA9EA158C79AD0454A1 /* RDEPUBCFIUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 244A0250D275B067EFA790D022396B24 /* RDEPUBCFIUtilities.swift */; }; - BC4AE1B68D8554F1A9C71FEFC4FBCB31 /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05CA3610F2F3C8021110A179D6943F7A /* ConstraintAttributes.swift */; }; - BCF514662DC610C45F4EBB4CDD4DB446 /* RDEPUBTextSelectionController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296DC86D94CA633F2A0697072F76F90D /* RDEPUBTextSelectionController.swift */; }; - BD2F4AE3043328378219197D0CE5F804 /* RDPDFReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B1F0955DB654E4B3265622218E9CF71A /* RDPDFReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BD99B69B1FBE455C5C1D97E400CBA08A /* RDPDFReaderDebugViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFF6A065216B0DB4C460DB8E30D43AB /* RDPDFReaderDebugViewController.swift */; }; + BAEA3B45EDDBE2BAB65178B41B93CD1F /* RDEPUBChapterSummaryDiskCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18BA62D664A5A8EED63F1B9AE279B4EB /* RDEPUBChapterSummaryDiskCache.swift */; }; + BB353409E4E12CBD140D8558AFB0AE65 /* RDEPUBTextPositionConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 788B69585E28B6A19F3D82E03FB17437 /* RDEPUBTextPositionConverter.swift */; }; + BC07D89F2B6A97B9343F62F6DF8756D6 /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D071D3F1AC2022BBB40C82D2DC2DFE3 /* ConstraintMakerRelatable.swift */; }; + BDE19A6478FC06A5F965BF6C465C0EE8 /* RDEPUBFragmentMarkerInjector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0744250A850EDAD2D67851F9AE9322C2 /* RDEPUBFragmentMarkerInjector.swift */; }; BE12CD112F82AD9050D7FB29395F27F9 /* DTVideoTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 45CF43387529121AEA90666FE86EE96A /* DTVideoTextAttachment.m */; }; - BE2B7071A08224DF4550AB00049D73F2 /* RDEPUBReaderAssemblyCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = D241F2043503DC1C01B6FBDE8C08DD1B /* RDEPUBReaderAssemblyCoordinator.swift */; }; - BF0BDBA82FA333DA21F02074DF249459 /* Entry+ZIP64.swift in Sources */ = {isa = PBXBuildFile; fileRef = E64ED14B8FB7C0060C3BAA215AC25363 /* Entry+ZIP64.swift */; }; - BF0E8909D0E84A8E6623208CB97C9CC4 /* RDEPUBReaderChromeCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60BD829978DA910F152D499A1BA7E04B /* RDEPUBReaderChromeCoordinator.swift */; }; - C0214EF0F9B92329063CB89AD0B5880F /* RDEPUBImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4E616B199145721C28A90BE0D21C98B /* RDEPUBImageViewController.swift */; }; - C0FA604044813AF3977DB6E38D086EAE /* RDEPUBTextContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D8D0804A9C685D066179823080D2E5 /* RDEPUBTextContentView.swift */; }; - C21EA46F0CB466BE3330A769D4E02E45 /* RDEPUBReaderState.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC13BF0AF43ECCBA7F956B059633C358 /* RDEPUBReaderState.swift */; }; - C2A74F19B4F40EBF0E94256A632E8EFD /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = D436946B4DC3D4F40E7B50F9F3A77DF6 /* RDEPUBTextBuildPipelineInterfaces.swift */; }; - C3FFF1454F3F3A1AA592268E7C43AEEA /* Pods-ReadViewDemo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C4048BBBD3ED54C527E258693E0E6895 /* SnapKit-SnapKit_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; }; - C52ACA043C901B7925AD97DD33CA7D8F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */; }; - C52C6F329DFC3DFAD3C819385035E5BF /* RDPDFReaderContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2EDE0B4A3EB73E17912FEC91AECADBD6 /* RDPDFReaderContainerView.swift */; }; + BE529C270CEA2A2C6666E5BC46C50DD3 /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13C91A1E88D3B946A1FA082A6EB05C9A /* Constraint.swift */; }; + BF076B89A32E454133942582B00EC922 /* NSDictionary+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 14AEB065E4B58020BECD466FA2C3582B /* NSDictionary+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF44EE27CAAA95BC66ECC24A572D720E /* wxread-default.css in Resources */ = {isa = PBXBuildFile; fileRef = E645DF57426CBB76570142F9D580209F /* wxread-default.css */; }; + BF4D756EA447B0B50D44D42718F26482 /* NSURL+DTUnshorten.h in Headers */ = {isa = PBXBuildFile; fileRef = 05565CA71DD7DDAA012573A841F7D8DF /* NSURL+DTUnshorten.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BF9032BC8A43F1AA4C4D575BD937115E /* DTTiledLayerWithoutFade.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C223BB14280E813122F7F44DDD64F3 /* DTTiledLayerWithoutFade.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1EA6CBF3E63093C2F930FFB0BD64E79 /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05CA3610F2F3C8021110A179D6943F7A /* ConstraintAttributes.swift */; }; + C3552B6602F4064DAF4C44832B83993D /* RDEPUBChapterWarmupOrchestrator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2ECAEF31AA6DC14F2C3A19A03F050F /* RDEPUBChapterWarmupOrchestrator.swift */; }; + C3722B9CB3A2CBC3C14B6E289B60C71A /* Vision.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B255A2C4C31A02ED6FC13D5D2DE27DC /* Vision.framework */; }; + C3D431A2853F6C2BEC1C8AB8468D6E69 /* RDEpubReaderView+ContentAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = E307745D06FCCA8EE3825E00C050479F /* RDEpubReaderView+ContentAccess.swift */; }; + C43DF680887B38560CA7723511ABFCD6 /* RDEPUBPaginationCacheCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A66549A3484418848E50313759E8FCFB /* RDEPUBPaginationCacheCoordinator.swift */; }; + C5743EE91CA41152F4D6D27B0BA51FBB /* RDEPUBReaderState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1061342BC0338CF0BB657142899D83BA /* RDEPUBReaderState.swift */; }; C5EE8E7373FBD24E66C678356393D871 /* DTCoreTextFontCollection.m in Sources */ = {isa = PBXBuildFile; fileRef = B53424287733C45D387175CE9132AFBD /* DTCoreTextFontCollection.m */; }; + C6089F43887B33500393FA1B1A90467D /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC1A01FE2774E0FA1BCE14C678E8B70E /* CoreImage.framework */; }; + C6A1AF89F95D87FD679366B8A1588D66 /* RDEPUBCFIMap.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0F8B1A04DAD3F227758BEB6D5D4D5E9 /* RDEPUBCFIMap.swift */; }; C6B65C0EA759DF426FBBBB113BA3C3E8 /* DTBreakHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = EEF0985CE02F3B586A1C5DA6503103C3 /* DTBreakHTMLElement.m */; }; - C6E5F70AFE3C2B3D74A6555B3F96FC7B /* RDEpubReaderView+CollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C877F262E89255B3135DE1E935D3246 /* RDEpubReaderView+CollectionView.swift */; }; C72CE4B974DFAE2C3037D425EB559314 /* DTCoreTextLayoutFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = C920C702702D03C98A6A6ADDE53C9E78 /* DTCoreTextLayoutFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C77E8D9F72B2D3C068CB5AB850A7B667 /* RDEPUBSpeechContentProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CF5CFD0948675E862FF54F7A5D73412 /* RDEPUBSpeechContentProvider.swift */; }; + C8CF1F5610D78DA49FEB9FB2D5CFA4E2 /* RDEPUBAnnotationEditorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0F55A232678D2676458E413833B0C17 /* RDEPUBAnnotationEditorViewController.swift */; }; C8F753B56A6C4D2A938B6EA68CF522F8 /* DTColorFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E247027425CC2ADC73F05F25DC0B857 /* DTColorFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C93FDFB56432C0DBE56701FB01995625 /* RDEPUBReaderEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8CD636112E10AA865F164AA3D168C00 /* RDEPUBReaderEnvironment.swift */; }; + C949788FC080B9F92411CBFFD82AEB81 /* SnapKit-SnapKit_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; }; + C9A313C280E6F05E82ADF54F90E7264D /* RDEPUBReaderController+ContentDelegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8A3FE7990354EF1819DAB32FB09040F /* RDEPUBReaderController+ContentDelegates.swift */; }; + C9CC84E07257BC1CFA58827C18666DEC /* RDSpeechReaderContracts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02108A241C993AAC297AF4F8245FD443 /* RDSpeechReaderContracts.swift */; }; C9DD05EF2D27FFEBFA7BF6F437168501 /* DTCoreTextConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = A7EDC6B8243A9B7E465C24C3E3032923 /* DTCoreTextConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CB5890C41FEAB82999C9A4DFFC425A5D /* RDEPUBReaderBottomToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD91BDB14FD6C89E095E237DC0F37A7 /* RDEPUBReaderBottomToolView.swift */; }; - CC2EF0E7EBB0C4F7D7F2B360DF7FE9B8 /* RDEpubReaderPreloadController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101E8704978C7417FCD99D18764F42B6 /* RDEpubReaderPreloadController.swift */; }; - CC3DE77B844BEE95F78D0769BC4EBAF9 /* RDEPUBNoteModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE2A00DBD5096609160A1EBB511C0CF0 /* RDEPUBNoteModels.swift */; }; + CADC06E386DEE523937B3B0DA5E74700 /* NSFileWrapper+DTCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = B2542127DF3D3CEF3D1EB999F8576341 /* NSFileWrapper+DTCopying.m */; }; + CB28C33F300061D6B8CC5DEDED5E6E81 /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64527A3F0F755D0173A048667A23AEA3 /* RDEPUBAttachmentTooltipOverlayView.swift */; }; + CB436A32456377BFEF92C48A033D00AB /* RDEPUBTextLayoutFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58293AB5053B6AA340D1D55A7FD0312 /* RDEPUBTextLayoutFrame.swift */; }; + CC311A5C6FD382E2E7B0ACBC160FEBE3 /* RDEPUBBackgroundPriorityPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7DFA2F1E1C67837F7C4B4363EF16949 /* RDEPUBBackgroundPriorityPolicy.swift */; }; + CC4164935D8A9B4D93902AD737DD4BE5 /* RDEPUBMetadataParseWorker.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7F679F301CC740E180D3E0ABA038EF7 /* RDEPUBMetadataParseWorker.swift */; }; CC8B8F3D758E98B51F69EDFAA69663A4 /* NSString+HTML.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D4600C0ADBC3B1B542099C68D747659 /* NSString+HTML.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CCBDC2E4ABEBFB94C69CD31C1062F52B /* NSDictionary+DTError.h in Headers */ = {isa = PBXBuildFile; fileRef = 14AEB065E4B58020BECD466FA2C3582B /* NSDictionary+DTError.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CD0642736D05FF86A5AAEB0A8298257E /* wxread-replace-latin.css in Resources */ = {isa = PBXBuildFile; fileRef = BE9EC25AFCAE91B4EA5A1DDD5FE564DD /* wxread-replace-latin.css */; }; - CD7BE6FF1D68DD425C945B2CE0247C5A /* Date+ZIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = E209D74CEC1626A09885E55370AEFA53 /* Date+ZIP.swift */; }; - CF4B683FEB083614C57097E02204930B /* RDEPUBTextPageRenderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BECF37BB61D57665E8B2439D3B326503 /* RDEPUBTextPageRenderView.swift */; }; - CF713B6B05119D72EF91307795B1AEDC /* DTCoreGraphicsUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 9761870FC405B984D09A304261C3CB25 /* DTCoreGraphicsUtils.m */; }; - CF77CBF45ED2550761E077F815485CC8 /* RDEPUBBackgroundCoverageStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F533FF48C81C0B1684CA895D72C646F /* RDEPUBBackgroundCoverageStore.swift */; }; + CD8EB96643407FE06E3FEDEE4C9F446A /* RDEPUBWebView+Configuration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132F26882A679D32261325CC0E7B460A /* RDEPUBWebView+Configuration.swift */; }; + CE4B31BC6513E87A9190C954571E385D /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1870B77AD9A6F26AB3180BB4CE2A8BCC /* ConstraintPriority.swift */; }; CFC49467FE75BFABC22A1CE2FFA26570 /* DTImage+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = C171DA66E3550E5F4492D2964AB04FB2 /* DTImage+HTML.m */; }; - D0210B7499AF32A36B60CE3505882F5A /* RDPDFReaderView+ToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 671C2212E0B20B47CA0A56D7138411B1 /* RDPDFReaderView+ToolView.swift */; }; - D09EAE862E8BA3A7A5EC8028EC30DEB9 /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDC3A2D20818C31909CC4C3F4BB4F96 /* Typealiases.swift */; }; - D0CEC4798C2DA9CDC93E3CC59BD03B79 /* Archive+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 304EE7D51CFA84D5F4DBD3F5745F241D /* Archive+Helpers.swift */; }; - D189922DBB83C25BC8E8F59FF51BAF34 /* RDEPUBJavaScriptBridge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47856474DDE696BF61255DF73D2D799D /* RDEPUBJavaScriptBridge.swift */; }; + CFD97B727A0110D104BAA1971D2288E3 /* DTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D1E29A71B902CC46EBA81C84ADCDA50 /* DTLog.m */; }; + D08C9D3BB5023F0BDA105B524C0DC16F /* RDEpubReaderViewProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6393730DA75DF6B53CCC8AC325591C5D /* RDEpubReaderViewProtocols.swift */; }; + D094FDAFB406B4894DF945B7164E97C1 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7FD67CE75631597FF6EE0F345C77B9D /* ConstraintPriorityTarget.swift */; }; + D0C254514E7704E4B665B5D6A25F16A8 /* RDEPUBSafeArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB559C50CCDA34EDD0525268B980948E /* RDEPUBSafeArea.swift */; }; + D1328689F916D7DE0F2396E2F8973CEC /* wxread-replace.css in Resources */ = {isa = PBXBuildFile; fileRef = 77CA12D475208B07BC520525A4E79C3C /* wxread-replace.css */; }; D1A93B2D7F1B312755C48790338D7712 /* DTIframeTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = 81FB8EF1A1E911A5BA351013BE2BDDA3 /* DTIframeTextAttachment.m */; }; - D2419445E59791BD0A58247BEC366E9F /* RDEPUBTextPaginationInterfaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 508BA727504170CFC09B46B584079A86 /* RDEPUBTextPaginationInterfaces.swift */; }; - D2C6FE518520667288530D6983D2BE91 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0AC91254785C4B0B73D391B603ADE47 /* ImageIO.framework */; }; - D3CF74B30A5AB5E67F433079376E830C /* DTLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D1E29A71B902CC46EBA81C84ADCDA50 /* DTLog.m */; }; - D43F7557B00A156FE247DBE8E26E51B3 /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02887009BADAD18D4A90F5A114DCE512 /* ConstraintDirectionalInsetTarget.swift */; }; - D441C9BCE1EDEDF0C962A695D33E1C04 /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = B71BC62246AFEBD517D3175813789310 /* Debugging.swift */; }; - D484255D55B2E6965411F26256BB39A4 /* DTTiledLayerWithoutFade.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C223BB14280E813122F7F44DDD64F3 /* DTTiledLayerWithoutFade.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D521D48B2138B46063941457702CCFBF /* RDEPUBTextPositionConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916630DBF02CC978ECEBBFD77F10FB65 /* RDEPUBTextPositionConverter.swift */; }; + D1E2B4410F989D0985B80F5E12F992C3 /* RDEPUBReaderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F25AA42AB430C73FED1DE82FA2DF2DC /* RDEPUBReaderConfiguration.swift */; }; + D3103B914810482ADEBA5608C1D6FA28 /* RDEPUBStyleCompatibilityModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 563D7B75744B17E859D3990CEE414AB0 /* RDEPUBStyleCompatibilityModels.swift */; }; D526E03C098DA6CF8F01C1BC126C9BBA /* DTCoreText-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4200F053D7EE79B56B3A430E865A9051 /* DTCoreText-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D5635DF62FAB378BEF97BBF8F8809DF5 /* DTBlockFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EA0602B933CD0C98C4AEEE449A8D048 /* DTBlockFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D570C4EE6360476832BEE5BD97163074 /* RDEPUBDarkImageAdjuster.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B83042E21707CE00778B566E8CB805 /* RDEPUBDarkImageAdjuster.swift */; }; - D72B9DD54B69A441232EB4675E9A396A /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D071D3F1AC2022BBB40C82D2DC2DFE3 /* ConstraintMakerRelatable.swift */; }; + D5E1FCC5EEF948E3EFDF9F02DAE1E813 /* NSURL+DTUnshorten.m in Sources */ = {isa = PBXBuildFile; fileRef = FEB04D144E7A35904D2906AC517EC870 /* NSURL+DTUnshorten.m */; }; + D6EFCA4E1BCB69F129636FF71B81DCD5 /* RDAIAppleFoundationModelsProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27F4AF07E5CBA7B0CC54553D55983D1F /* RDAIAppleFoundationModelsProvider.swift */; }; + D78C98D530318FAEB330C8810469F53B /* RDEPUBTextPageDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AF4B41DABF7397AEBDB574FEA007451 /* RDEPUBTextPageDecorationView.swift */; }; + D80A0D7409D41B929CB5C5ADB2FA123C /* RDPDFReaderNavigationPanelViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF159AB510600EA0CD9EAE58F29A6582 /* RDPDFReaderNavigationPanelViewController.swift */; }; D82DDA4C1E5C4D5378A9E5EA3F8E9DFE /* DTBreakHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 1312638E3010913FB511FD8BE3E2DC60 /* DTBreakHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D8445E15B15818CC32F0F5FEA3DB32C8 /* RDEPUBSelectionLoupeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53AF19D77192D711E50E669495472086 /* RDEPUBSelectionLoupeView.swift */; }; - D860F690E2BA824A33842A069D805612 /* RDEPUBTextPerformanceSampler.swift in Sources */ = {isa = PBXBuildFile; fileRef = B59F66F549E44C57A256286385891551 /* RDEPUBTextPerformanceSampler.swift */; }; - D97E374FEF0C11AE2CF9911A474BB864 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */; }; + D8EE68FA80CC14F8DB7B5649BEEEEB6D /* RDPDFReaderImageTextRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A4F73DDFA534B5DDC38C9044FF275E0 /* RDPDFReaderImageTextRecognizer.swift */; }; + D9964CE3AF833DAD7B566E45AF472AF7 /* RDEPUBReaderTopToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8C14D80995798D4961531CAAC7AE3D01 /* RDEPUBReaderTopToolView.swift */; }; DA5B51E5D80C161D2902B6FC60DA5EC8 /* DTImageTextAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FECEDE17B4E87274DD2E9EBFD584ABF /* DTImageTextAttachment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DAB89786137F704B7DD8334EF21E58CD /* DTHTMLParser.h in Headers */ = {isa = PBXBuildFile; fileRef = F78033C34E8C1FAD3B27FFC4F959A611 /* DTHTMLParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; DAD16D3E6EBB32FF96C63BFE6037065F /* DTLinkButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 007656EA11E3CE9D116BC39614FACB53 /* DTLinkButton.m */; }; - DB06FAC271AAEE1B3CD5C1ED97225398 /* DTTiledLayerWithoutFade.m in Sources */ = {isa = PBXBuildFile; fileRef = 188A763544B134CC1004ECB7380538D7 /* DTTiledLayerWithoutFade.m */; }; - DB6F4AB155823AFB16A8B6FAE732A062 /* RDEpubReaderView+ContentAccess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2701BC5B247F7F1B1AF269EE0B553ED8 /* RDEpubReaderView+ContentAccess.swift */; }; + DADBC15D6C15D83B2106F110DF7B1356 /* RDEPUBChapterCacheKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = AADAFB1246D8B4F7930DFDE508B2271A /* RDEPUBChapterCacheKey.swift */; }; + DB2B37770C59463ED4CA22D43CE84A05 /* NSString+DTUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = A67FB1DCECBDAA36B9B755606AC42C17 /* NSString+DTUtilities.m */; }; + DB81526E21D5929E1B1648FE1E0075EE /* default.css in Resources */ = {isa = PBXBuildFile; fileRef = 78AA6CC1C34A3A64CED4C314B1FAE2F1 /* default.css */; }; DBCA42F7E1697F4EC82E0E7C9657851D /* DTAttributedTextCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BB2A34C872861E98642DDE455E8E3A72 /* DTAttributedTextCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC3E2932A82AD5D88D8B1EFBF004BEC8 /* DTCSSListStyle.m in Sources */ = {isa = PBXBuildFile; fileRef = C6303D6C8B50248F87D70D77E2CA66B7 /* DTCSSListStyle.m */; }; + DC9D763A7551AF127712DEE7218EB38A /* RDEPUBReaderTableOfContentsItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = E908B49F91AB4BAC14DB2AA9E94526D9 /* RDEPUBReaderTableOfContentsItem.swift */; }; + DCD5EFBBA2F0E37E403263F70A6D4D88 /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B3047509587D803762D3B0A21B9F773 /* UILayoutSupport+Extensions.swift */; }; DD73CD0E5148961D1ABD80E050122314 /* DTCoreTextFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D4D2890461C2EF2403D78EBF03B29D /* DTCoreTextFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DDAD8BD9E54E6BFE5D39A29BF6217750 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */; }; - DDCD814F4CFC21B9941982C85653DC65 /* Data+CompressionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAAA91CA607516E42FAA5C2245D6E0C2 /* Data+CompressionDeprecated.swift */; }; + DE6074564E19C27682C74A6C866602C3 /* RDAISpeechContentProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3AC0D799821BAB2769DC35260D98143 /* RDAISpeechContentProvider.swift */; }; DE68AD2F426FD462BC70F968E5AF5553 /* DTTextAttachmentHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = E2993B5AF554E26603DFF0DE92D89C92 /* DTTextAttachmentHTMLElement.m */; }; - DEEF4E1E4B210B2DDC5F92CA5567CBD0 /* RDPDFReaderTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B394C9C9A51160FF8B06D89C3147EDF /* RDPDFReaderTheme.swift */; }; DFB5A1C64C7908FD05BEFF7C7B571353 /* DTAttributedLabel.h in Headers */ = {isa = PBXBuildFile; fileRef = F0F90ED4AECC246EA5CD643490677AA9 /* DTAttributedLabel.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E00758E44CA106CFC4DC2A2137F62C68 /* RDEpubReaderPagingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69252E848F3036D84BCE5A09B0544390 /* RDEpubReaderPagingController.swift */; }; - E0249E144B3E3276D4B97F9A63E87825 /* RDEPUBResourceResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2193B99AFE9594D920D7CA76190FFC8E /* RDEPUBResourceResolver.swift */; }; - E0D06D790679C2908871D9A7C32D19CF /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9A09B9A70653ED4FB65C8A3934E3937 /* ConstraintMakerFinalizable.swift */; }; - E102A76415883B74C6C2A300C9094F0F /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 898D56C24CC6E71662D88243FD4A030E /* RDEPUBPageMapReconciliationCoordinator.swift */; }; - E1B45048654ED73F34DD7100669F3A6E /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 6B839E12858DFC58AF91990D8B6D27A3 /* PrivacyInfo.xcprivacy */; }; + E0DF6958C36F9AC1C6CF5CB0E33EB7C4 /* RDEPUBChapterLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA82E36367E127E1D5C8F2EDC2F60797 /* RDEPUBChapterLocation.swift */; }; + E19C39D306A49A72BAAB6E8DA92FF005 /* RDEpubReaderGestureController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCBECD199A5AB2E046BC593AC6FE63C7 /* RDEpubReaderGestureController.swift */; }; E1DA58105A72D6C0B77A8A9F7822BD68 /* DTCoreTextLayoutFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D4D642664400ACAE92FB5136B8121D0 /* DTCoreTextLayoutFrame.m */; }; - E1DA99F683B479E7514F59584F010D77 /* RDEpubReaderView-RDEpubReaderViewAssets in Resources */ = {isa = PBXBuildFile; fileRef = C8A6E90AB5E26049710E2C2404C28B9A /* RDEpubReaderView-RDEpubReaderViewAssets */; }; - E1E62EA38EAAA0B37F4C2B94AEABA717 /* RDEPUBTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFEB0AF1FD346F25E44C810A469B78E1 /* RDEPUBTextRenderer.swift */; }; - E2A1C8666A6AA28DB866B92F5345A5CE /* RDPDFReaderPageChildViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1057324B30CCD038ABC27688B0DC6A3 /* RDPDFReaderPageChildViewController.swift */; }; - E3003D23FF1F66710D96674FD3401AC9 /* RDPDFReaderChromeViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE5872817E44E6DDC2CF80A8297E5A47 /* RDPDFReaderChromeViews.swift */; }; - E31F16819C8D2E59CE9EC3EAF8E88C51 /* RDEPUBReaderController+ContentDelegates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57F1B61908D2C1EBC6471CC6E9B90A4C /* RDEPUBReaderController+ContentDelegates.swift */; }; - E332413296CEEDC19C116F40479D29DB /* RDPDFReaderView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C5F29D53A7FD825F0CEAB345B46B3FC6 /* RDPDFReaderView-dummy.m */; }; - E344F26F1775C03DF2F885AC51CF5424 /* NSString+DTURLEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = C808AC5A8C55E7E56EF916C622B6091A /* NSString+DTURLEncoding.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E38FC7829B5BDD1588FA487E0FBAC208 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */; }; - E676D40AA424AC6D817FEBFEBC17D6A8 /* RDEPUBSafeArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = F766A861EB3484C3C519700E104BF91B /* RDEPUBSafeArea.swift */; }; - E690D3041E8FF360ED48B6A3B1CF1AEB /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9862A154F02C241514009AD44CC3567B /* RDEPUBReaderController+AttachmentTooltip.swift */; }; - E7426FD3F56158482B494AB93FF6388F /* NSDictionary+DTError.m in Sources */ = {isa = PBXBuildFile; fileRef = AF41F6780E56AB0F76C46A75363DA697 /* NSDictionary+DTError.m */; }; - E77445593DA7F38F2F26305070A40C4D /* RDCBZReaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3440F352D2E851EAA150592C9292D9F /* RDCBZReaderController.swift */; }; - E879F9B012873321CEC6EA825C6DFBF5 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6101F66C96A97F01A48A9214DEE40D02 /* RDEPUBBuildDiagnosticsReporter.swift */; }; + E20BB1A8047FC36AD4EC46426BAB5494 /* NaturalLanguage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B46D01D4D15C2295F678A21C84B825ED /* NaturalLanguage.framework */; }; + E2E2499B133E906963BF99672FF269D4 /* RDEPUBReaderController+Orientation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 224F6889428B8D51E00F57EB6904B3B1 /* RDEPUBReaderController+Orientation.swift */; }; + E31A025A90465260938C6E05DF15413C /* RDEPUBResourceURLSchemeHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59DC39EBD2707FF1010387665D60AB01 /* RDEPUBResourceURLSchemeHandler.swift */; }; + E38FC7829B5BDD1588FA487E0FBAC208 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + E4D14A78B339CD30F305B4DABF0F4F5E /* RDEPUBReaderController+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B9D828EF15B8A7E80CA8DA3C770E4D1 /* RDEPUBReaderController+DataSource.swift */; }; + E5A0F5964BBF1D2089B594A33EC559A0 /* RDEPUBStyleSheetComposer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 430DCC402F55D7293EDA440903D400BC /* RDEPUBStyleSheetComposer.swift */; }; + E5F7835B3C29F9A5C5D507D1B4666AF7 /* RDEPUBParser+Resources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DFD0C2AACBA8A400F346FFA5AAA6C77 /* RDEPUBParser+Resources.swift */; }; + E647E758B0AB51A6070EC90FA56356D0 /* RDPDFReaderHighlightOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C9532C775F9C0F2DDE745981A3E5BD2 /* RDPDFReaderHighlightOverlayView.swift */; }; + E78EF60735A6686F6DF424C052875F62 /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D557DED28FA9EA85219AF05C93296C6D /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7D5A732459EEE8E882A91941BA328AE /* NSString+DTFormatNumbers.m in Sources */ = {isa = PBXBuildFile; fileRef = 298CF23475A19D50E172630BD6D1D1EA /* NSString+DTFormatNumbers.m */; }; + E87592F84B4E59ED5BD8CBBDF89FE88B /* RDEPUBParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA1B0A108E49438640DBDD0A70FD293A /* RDEPUBParser.swift */; }; E8AB5CE26A5224EF09E9E363D70C7775 /* DTDictationPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = BFD69C3CC4E96BBD5634E64370DBDA98 /* DTDictationPlaceholderView.m */; }; - E999AE7BACD93F7AFDF04211C39AC35D /* RDEPUBPaginationModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6D09BDBD02839781AC66D29F3611E41 /* RDEPUBPaginationModels.swift */; }; - E9EB20207ED0C4F50D5A555F62CE845A /* RDEpubReaderContentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A76FEE9775014055776105D8698AE74E /* RDEpubReaderContentCell.swift */; }; EA0040823CCF8E97363DB5891F5DA6D0 /* DTCoreTextFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 02CB03BBF6FEA9FE9E85706A75AB816B /* DTCoreTextFunctions.m */; }; - EA2491A494DAB37C07D615273AEC8DE5 /* RDEPUBParser+Resources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D4997C97BB58CF60B165D1BD0C31985 /* RDEPUBParser+Resources.swift */; }; - EAB24829872CF4EA95664E3FA0FD3A68 /* RDEPUBReaderPaginationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2046F1B0D719EC5C1291C1714DF0751 /* RDEPUBReaderPaginationCoordinator.swift */; }; - EB6DDD12EA3D1E5E365E6A3C5D1A248C /* RDEPUBStyleCompatibilityModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E2EA68BCB5C16362AF8A87E6BED539C /* RDEPUBStyleCompatibilityModels.swift */; }; + EA390D4166224687AE187999F107C44B /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3C67AF64AACAFBCB1D6D909BF030731 /* LayoutConstraintItem.swift */; }; + EA4996975C152651AE1A1F33C1B22663 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D3FE3107482A464FFADCB685658099F9 /* ImageIO.framework */; }; EBB7E4D4DB253B5F1267CF9B4DDB4E93 /* DTCoreTextFontDescriptor.m in Sources */ = {isa = PBXBuildFile; fileRef = 63DC0159C85524BC0348523335677809 /* DTCoreTextFontDescriptor.m */; }; - ECFAA40DD992BE7A5EDE980982AD08DD /* RDEPUBFontFallbackResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB1FB4D69D71D0D1B4C5749FE44F4DA8 /* RDEPUBFontFallbackResolver.swift */; }; - ED18AB764B6B2D7D51BA3BB30C77BC6D /* DTBlockFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F66F7B56F490F71666C3CC51B50EDB /* DTBlockFunctions.m */; }; + EC88C9F006E7ADD40849EE093BD1E3FE /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B1C52776D8E95B99DC3657201FB6FD0 /* ConstraintLayoutGuide+Extensions.swift */; }; + ED66F09AF6E592211C9A021A11503721 /* DTCoreGraphicsUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 68302D3003412D32673539BAF3A71FFD /* DTCoreGraphicsUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; EDA269B595D70EC2B9D81DC890157D63 /* DTAccessibilityViewProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 06E2D8E1D6BCAF5913A7F3F6B1BF9E0F /* DTAccessibilityViewProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EDC52AF71F363B14DCA6DD6F90242E5B /* CoreImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04DF49B738958596E47F57961FA3A69A /* CoreImage.framework */; }; EE4F0992A0F597320FF7BDE4691D0FD4 /* NSString+CSS.h in Headers */ = {isa = PBXBuildFile; fileRef = F5A53C3033C8DE1724D37DA6323CF1D7 /* NSString+CSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EFE6DECC787C462818A9B3C3E075E0E5 /* RDEPUBTextLayoutFrame.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2185E45C320FFD388943A87A125FB42D /* RDEPUBTextLayoutFrame.swift */; }; + EE77D0DB0E8AF90E594D0F6D2089B2AC /* NSString+DTURLEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = DE5387758E4F1C4128BE4A1E8D68A9BD /* NSString+DTURLEncoding.m */; }; + EECC41D9B7E2AF7BD1C555674FD9877F /* RDEPUBReaderChapterListController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A58ABF7B052C2FEEC1FF9F105FD80470 /* RDEPUBReaderChapterListController.swift */; }; + EECD42D65B2937FE7AE9D633B7DFB154 /* FoundationModels.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17EE920782F4B0CF61192C04ABF5DF6C /* FoundationModels.framework */; }; + EF4A58B335C39B19EF4DFE059345BAA2 /* RDAIReaderView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C1B094ABE0685E65E249C93BF2B135A9 /* RDAIReaderView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F006F73F17F2E3CC0E7852E9357BA946 /* DTAnchorHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 790E97E55D348C4AAE5B90CE6447CD7E /* DTAnchorHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; F0F631056BADA32253528247DF493272 /* DTHTMLElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BD929E02D9C56EC44BBB74C1999F9892 /* DTHTMLElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F10C0868A69A442CA04FC421CBE6C1FC /* RDEPUBTypesettingPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AC70C974C448660DF34C7FBA424FD78 /* RDEPUBTypesettingPipeline.swift */; }; - F27993F10ABA4CC86FD5C58FF39D5883 /* RDEPUBBackgroundTrace.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78B720430DB36E3E3D207599DC78CCF1 /* RDEPUBBackgroundTrace.swift */; }; - F35FC5777D29A52C05955D9A33E191F3 /* RDEPUBTextRendererSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F2315273E8A0E225152D3BBBD8441AA /* RDEPUBTextRendererSupport.swift */; }; - F3B8C6A7E543BD8E7CAE2E415B37F0D1 /* RDPDFReaderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EC177D3B91E8E624750D11D7E09F3B6 /* RDPDFReaderViewController.swift */; }; + F1502BB239BE78912B8EAE1419625EC3 /* RDEPUBParser+Archive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 62AF8846B36B51075E3D04481932FAB0 /* RDEPUBParser+Archive.swift */; }; + F16A85F5C1C7AB77E3F59A180E4949FD /* RDEPUBReaderRuntime.swift in Sources */ = {isa = PBXBuildFile; fileRef = C001AE419BF0DC7FC7836C5BDCD9CF76 /* RDEPUBReaderRuntime.swift */; }; + F289E437878B685F00B6F9EC04194BDD /* RDEPUBParser+Package.swift in Sources */ = {isa = PBXBuildFile; fileRef = C42BB280740ACCEAD29B912A1D47F29B /* RDEPUBParser+Package.swift */; }; + F299288008A9203353413B5B32747635 /* RDEPUBRuntimePageCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510888775BFD893D3C1A93984E31FE11 /* RDEPUBRuntimePageCount.swift */; }; + F32092E04F4488D14BA015CF6AD06155 /* RDAILocatorBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C90DC3AA09B301621526C8BCC0AD9D9 /* RDAILocatorBuilder.swift */; }; + F393DC307AD6BED2DE8083FF12B8AAE1 /* RDEPUBFontNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 413CD373B452DEFC31CD6761AF17E8F6 /* RDEPUBFontNormalizer.swift */; }; F4A2E3C4237B8931F61B72FF0BDD6D69 /* DTObjectTextAttachment.m in Sources */ = {isa = PBXBuildFile; fileRef = FECD0A9F46F7D0CBF7FE9797EA63845E /* DTObjectTextAttachment.m */; }; + F4D8820227694D6D5F09CFA6E1465F87 /* ConstraintMakerRelatable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C80235C2E1DB28406F275E23F0ADDE9B /* ConstraintMakerRelatable+Extensions.swift */; }; + F4DA93526D482CD7726856E4C2A2E9AA /* RDEPUBPaginator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 519BA5E115705E308601172F3785D87E /* RDEPUBPaginator.swift */; }; F58ABA106C6200175DF574DF05A75BA8 /* DTAccessibilityElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 02F0F2897650299308CB818238165341 /* DTAccessibilityElement.m */; }; F5A424E67F41C4F7B830CE2F7E71570D /* DTCoreText-Resources in Resources */ = {isa = PBXBuildFile; fileRef = F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */; }; - F5CA27E5123B11C9A15C361F2D9DE8D8 /* RDEPUBReaderSearchCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E8A047531C39D6A6942EC72AF77ADD /* RDEPUBReaderSearchCoordinator.swift */; }; + F5BEFA1ECA945559A096787DFC7B5A27 /* RDPDFReaderAnnotationListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E91A6DF5577800E7F0CB647061DB03E5 /* RDPDFReaderAnnotationListViewController.swift */; }; F6036BBDFE7484F5A453F6876C97C098 /* NSAttributedString+SmallCaps.m in Sources */ = {isa = PBXBuildFile; fileRef = 958D7F12C237A34C059F4E43474BDFAF /* NSAttributedString+SmallCaps.m */; }; F61102C9BF3D6296CB6C6B754ABF98C5 /* DTTextHTMLElement.m in Sources */ = {isa = PBXBuildFile; fileRef = C3096FD2B7053B4AF08D2B6156C7CA1A /* DTTextHTMLElement.m */; }; - F67B03A6B84144C24A8727EBA9A85560 /* RDEPUBWebView+FixedLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54F55F21A6B7661A8D560DB1557E6B97 /* RDEPUBWebView+FixedLayout.swift */; }; - F6B6B5335297604654B91F9DB1B625CC /* RDEPUBTextContentInteractionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A59ED3F13A984E625FF8F6639060AC0 /* RDEPUBTextContentInteractionCoordinator.swift */; }; - F6EBFF6B774713E2F798201913C3F5E0 /* UIApplication+DTNetworkActivity.m in Sources */ = {isa = PBXBuildFile; fileRef = 309D2521D7B9A10F86DA3F6BE7FB37B1 /* UIApplication+DTNetworkActivity.m */; }; - F7A44934CBC37DA0C73DCE477BE239C4 /* RDPDFReaderDrawingToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDE32176816BC0A42D4B28D78235370 /* RDPDFReaderDrawingToolbar.swift */; }; - F7C25175A4415DE466783A53BDBDBB9E /* Archive+WritingDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7382BDDD61B00469E398482B8AA31F3 /* Archive+WritingDeprecated.swift */; }; - F85A22E53A91AC2EF0FBECA87103370C /* RDEPUBParser+ReadingProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C37E4DD39F7CDCFA4C0776B8CAB60A7 /* RDEPUBParser+ReadingProfile.swift */; }; - F8633FA6F73C45BEA8BD04DEA57CEDA8 /* NSFileWrapper+DTCopying.m in Sources */ = {isa = PBXBuildFile; fileRef = B2542127DF3D3CEF3D1EB999F8576341 /* NSFileWrapper+DTCopying.m */; }; - F8CC36A42110B1FA934258DCF4EB4762 /* RDEPUBAnnotationEditorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FE0B907BC40F5886B5D8761C8E1C984 /* RDEPUBAnnotationEditorViewController.swift */; }; - FB86725957F487474653A42C45AA42C9 /* RDPDFReaderDrawingLayersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2B596E0DC8B043ECE5DAEFEF7DD2EBC /* RDPDFReaderDrawingLayersView.swift */; }; - FBDCB75409A2FFE5BCB880D0A8C4CBBD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */; }; - FC5C5DF74B3755DADC1B85BC0B35FAF6 /* RDEPUBReaderPersistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3085A431A30E4E2DC3F5E4CAFBA83B5D /* RDEPUBReaderPersistence.swift */; }; + F6AFE52A2B53004FFB27B8B3A3030452 /* UIView+DTFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = 3124E174D81A28717086F17445BED5BB /* UIView+DTFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F74BE2C0D8345DF5EDE41CF6141A44BF /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */; }; + F76246F3FCBCCABA28EF06D3018C610B /* RDEPUBDTCoreTextRenderer.swift in Sources */ = {isa = PBXBuildFile; fileRef = F7069C523A7006ED0AA03E0046C2736A /* RDEPUBDTCoreTextRenderer.swift */; }; + F767C2861699E671762169C9F347291C /* RDEPUBHTMLNormalizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 137546C9BE2CA543D6BAA25522E046A6 /* RDEPUBHTMLNormalizer.swift */; }; + F7ADD6FA9A99420D022B5DACBCB65BAD /* RDEPUBReaderSearchBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F59EBCDA77446DD33CEECEDE5378967F /* RDEPUBReaderSearchBarView.swift */; }; + F8814DB2E7990E853C29249D4D5EA877 /* Data+Serialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1D1532D1876B11C0E08D8B7D4FA131B /* Data+Serialization.swift */; }; + F9028F050CFD6BABF3990E24D06731F1 /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C06D2A51375DCB872C5A41004E287C0D /* SnapKit-dummy.m */; }; + F94F155B9E380CCB319468C07B135C97 /* RDPDFReaderDrawingCanvasView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D15E11E01B7F344DD8863CBBC543A77 /* RDPDFReaderDrawingCanvasView.swift */; }; + F9BDB8FBA84964F4DB833D71BAE81634 /* RDEPUBPublication.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1BB480EA8E2ED1FEEC70C334BA00FD5 /* RDEPUBPublication.swift */; }; + F9EFE047E2DE9BDBDE0774A77C6CC3AD /* Archive+MemoryFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD58858F74B286AB42B1D9C0E299BC0 /* Archive+MemoryFile.swift */; }; + FAF3AF65CC90E56FF4C46FDB9F773017 /* RDEPUBFontFallbackResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A26CF4FC3A56FE642CDCAE6E644AC27 /* RDEPUBFontFallbackResolver.swift */; }; + FB37977DD4625FAF7CAAE19E9CF13722 /* Data+CompressionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAAA91CA607516E42FAA5C2245D6E0C2 /* Data+CompressionDeprecated.swift */; }; + FBC42097F09EB9AD8717663C7CA9FE41 /* RDPDFReaderSettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F939D46D9D49EF5FCAFCB16F1E35E23E /* RDPDFReaderSettingsView.swift */; }; + FC0ECDDC20EE8676838BBED649D4EC54 /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2129FCC5AA430659582F12DBA1350292 /* ConstraintLayoutSupport.swift */; }; FC5F52919451A15639442B46B38E4C67 /* DTCoreTextLayoutFrame+Cursor.m in Sources */ = {isa = PBXBuildFile; fileRef = BADC1A043414D84FBAFBF86CAC8F5399 /* DTCoreTextLayoutFrame+Cursor.m */; }; - FC910AA696FF18C84A6365DF9C9C424F /* RDEPUBChapterCacheKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37946E93F2D5F5FF5392FCC3BF0F9424 /* RDEPUBChapterCacheKey.swift */; }; - FCCDEDD358B1CE7CB1A11A1CB1BEDFD8 /* NSString+DTUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = FC467FD187B387BBBF0D10B192925B53 /* NSString+DTUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FD23980142BDA1955145B577739A2CD2 /* RDEPUBTextAnchor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D9886E67C654192303F817E356E9C60 /* RDEPUBTextAnchor.swift */; }; - FD31618D8F4420C75C745EDCFC38D9EB /* UIColor+RDEPUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5B47B33D7F759C3CD6BEDA1A69185D /* UIColor+RDEPUB.swift */; }; FD5D68887297CFA94F543C49DC68A156 /* DTHTMLAttributedStringBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 41FD16F0768AA2512812644831FC90CA /* DTHTMLAttributedStringBuilder.m */; }; - FD9CC3756A7CBCC3040DD785487B0500 /* RDEPUBPageResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7340AFD453A481A52CFFC7C7D8C50B87 /* RDEPUBPageResolver.swift */; }; - FE60C8821EA6FDFFF15F22E2E7D77D8B /* RDPDFReaderAnnotationEditorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC923AF5182183071C8C905DCFD0C5DC /* RDPDFReaderAnnotationEditorViewController.swift */; }; + FDDA135AA139B6C5E93628504593542F /* RDPDFReaderPanelPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D87DBCF57F23239B520B73B9C238F64 /* RDPDFReaderPanelPresentation.swift */; }; + FE14C52089C6E31DE5070C0BF47C0500 /* DTSmartPagingScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C1C6E107AA4540639C1ED1E7741CF07 /* DTSmartPagingScrollView.m */; }; FEB00C614DCB6A8A7BDF8DEE11260984 /* NSMutableAttributedString+HTML.m in Sources */ = {isa = PBXBuildFile; fileRef = AABB72617A844FF5405C727A0A23D568 /* NSMutableAttributedString+HTML.m */; }; - FF538BF0A80A8D99B78743597C47334F /* FileManager+ZIPDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0486411409B1766377F5F2A6234D8E64 /* FileManager+ZIPDeprecated.swift */; }; + FFBF3C8099E65280270A5369095790B2 /* RDEPUBCFIGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8911E1CAA6638CF6E14939CE71B77C19 /* RDEPUBCFIGenerator.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 2FA9DB204EBAB127A33BB8E4A75C753F /* PBXContainerItemProxy */ = { + 11876E077448C6CCB7A570D4369D3BD7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; remoteInfo = SnapKit; }; - 4F9EBF9F2EC34F1D069E0B7A384ABDFF /* PBXContainerItemProxy */ = { + 14272A2E48D9CD26B93FD523A154E373 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; + remoteInfo = ZIPFoundation; + }; + 16082FE383C0CCFFBA096AB8AA84D7C9 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 8A8DB685241263AFDF5E6B20FE67B93A; remoteInfo = "SnapKit-SnapKit_Privacy"; }; - 52A62E1544F8F1CB8A0841D9C035A446 /* PBXContainerItemProxy */ = { + 17C3B49E3B391E5D6ED339176BA6EFB8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; - remoteInfo = DTCoreText; + remoteGlobalIDString = 1F1B6899710AE3E4BD213BE01489E557; + remoteInfo = RDAIReaderView; }; - 5D53C2F5FD65E6CD8E8652A497BAA4B1 /* PBXContainerItemProxy */ = { + 23CDB939F8EBFEEE0D7CE925D5DDF1C1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; remoteInfo = DTFoundation; }; - 80504DFF5A5AD74D41D48A50675C2868 /* PBXContainerItemProxy */ = { + 2CB368EDA06484484C9239CFA8639DD2 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = C7A8D82E407CD3FDC3BA55CEE519B252; - remoteInfo = "ZIPFoundation-ZIPFoundation_Privacy"; + remoteGlobalIDString = 1F1B6899710AE3E4BD213BE01489E557; + remoteInfo = RDAIReaderView; }; - 90EA3F52B53B30D0599E44601689BAD6 /* PBXContainerItemProxy */ = { + 3197E6921AA84CC1B8C9056142396606 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; remoteInfo = SnapKit; }; - B6CD365D3C9BF96A2B0402B1084C7753 /* PBXContainerItemProxy */ = { + 36CA89A2E0EBD19706B0CDEC849CA8EF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; + remoteInfo = DTCoreText; + }; + 481088C3908A20E60C0BA4FFF4251DD3 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1F1B6899710AE3E4BD213BE01489E557; + remoteInfo = RDAIReaderView; + }; + 49127916BC5D5B5142FB676094C70903 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = FBCB57A3AEAAA3449B3F365930BC0977; remoteInfo = RDEpubReaderView; }; - BA4028C24C0013B0A03CED17724094EF /* PBXContainerItemProxy */ = { + 50D575B5DAED2FB9BE1C5428C056DDA4 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; - remoteGlobalIDString = 352EC96AFAEE0EDF74FD76A958827133; - remoteInfo = RDPDFReaderView; + remoteGlobalIDString = C7A8D82E407CD3FDC3BA55CEE519B252; + remoteInfo = "ZIPFoundation-ZIPFoundation_Privacy"; }; - CA71454BC17E37142EA167FC0D497218 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0C24CB0E87A728A11AA1124CB360D6A1; - remoteInfo = "DTCoreText-Resources"; - }; - D9527F41C7D96D531D5F1C5AE5AAC1F4 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; - remoteInfo = ZIPFoundation; - }; - DD19C0F32844A61F07F1ECB13D355A85 /* PBXContainerItemProxy */ = { + 54C8DAE6D3E517D5EC52DE42098FD67D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = E07DDD766DCBF90486BCE6C2EA671E5E; remoteInfo = "RDEpubReaderView-RDEpubReaderViewAssets"; }; - E2F62FE95F2A46E4E30A3BB09AED49A3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; - remoteInfo = DTFoundation; - }; - F01A5D40B4F3128453B6F24E1230C400 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; - remoteInfo = DTCoreText; - }; - F020CE938454AADA341AF610460A014D /* PBXContainerItemProxy */ = { + 65A1725917E9E5A2B8917B90CECA7448 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4; remoteInfo = SnapKit; }; - FF25772B8CDE34CEEA71AC7EF594EA0E /* PBXContainerItemProxy */ = { + 6CC53768D781202C205E9844C7F2D924 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F6E5A5BF72D62CDFD25F91A7CFA3309; + remoteInfo = DTFoundation; + }; + 7EFD564EA79AAB335CD2CFD94DAB66BA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B88F4EA0695B6B3165C64594850D72C7; + remoteInfo = DTCoreText; + }; + 974B87AA811E6162BE45E7792A96E30B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CC23E8498E4F0DDEB3C1A2AA05B8ACF2; + remoteInfo = RDSpeechReaderView; + }; + A1BCAED813EBD7868EACE64F704FEDFF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0C24CB0E87A728A11AA1124CB360D6A1; + remoteInfo = "DTCoreText-Resources"; + }; + A5B1A067FDB1F0EB3824BD39DF45BAE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CC23E8498E4F0DDEB3C1A2AA05B8ACF2; + remoteInfo = RDSpeechReaderView; + }; + AB811AE81F514DC81EF4EAEB477D8FC6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1F1B6899710AE3E4BD213BE01489E557; + remoteInfo = RDAIReaderView; + }; + ACB386194F6C01184D3B9EC5867FFBD0 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 352EC96AFAEE0EDF74FD76A958827133; + remoteInfo = RDPDFReaderView; + }; + F577E6647643B09D3AFC9D08E5266A66 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = AA15C8469D67684160CC2A7098EB841C; remoteInfo = ZIPFoundation; }; + F592612B0B5945374062A600E49D8EF2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = CC23E8498E4F0DDEB3C1A2AA05B8ACF2; + remoteInfo = RDSpeechReaderView; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 005A076C910A4DBBE6E72F4D11CB624E /* Data+Compression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Compression.swift"; path = "Sources/ZIPFoundation/Data+Compression.swift"; sourceTree = ""; }; 007656EA11E3CE9D116BC39614FACB53 /* DTLinkButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLinkButton.m; path = Core/Source/DTLinkButton.m; sourceTree = ""; }; - 016C4701210031B8CBC8C4C2D03DB357 /* RDEPUBPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPreferences.swift; sourceTree = ""; }; + 01476F47406E7CD8C4420B82B73E642F /* RDEPUBPageLayoutSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageLayoutSnapshot.swift; sourceTree = ""; }; + 01BF453B34821E315E0E3B1A1363A538 /* RDEPUBMetadataParseCancellationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseCancellationController.swift; sourceTree = ""; }; 01DCD1B42D40839F1C8DBBDB11EF09BA /* RDEpubReaderView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RDEpubReaderView; path = RDEpubReaderView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 021E6F2E185A56B66D1B92DDB9FE8DE7 /* RDPDFReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDPDFReaderView-prefix.pch"; sourceTree = ""; }; + 01E5F8CCBFB0567360782BD2FF0589A9 /* RDEPUBAssetRepository.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAssetRepository.swift; sourceTree = ""; }; + 02108A241C993AAC297AF4F8245FD443 /* RDSpeechReaderContracts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDSpeechReaderContracts.swift; path = Sources/RDSpeechReaderContracts.swift; sourceTree = ""; }; 022E4755B34BE3FCD1475BB40C6FD7EB /* Entry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Entry.swift; path = Sources/ZIPFoundation/Entry.swift; sourceTree = ""; }; 02887009BADAD18D4A90F5A114DCE512 /* ConstraintDirectionalInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsetTarget.swift; path = Sources/ConstraintDirectionalInsetTarget.swift; sourceTree = ""; }; + 02BE103F11BACB69B3478BA07AE1A2A5 /* RDEpubReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDEpubReaderView-umbrella.h"; sourceTree = ""; }; 02CB03BBF6FEA9FE9E85706A75AB816B /* DTCoreTextFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFunctions.m; path = Core/Source/DTCoreTextFunctions.m; sourceTree = ""; }; 02F0F2897650299308CB818238165341 /* DTAccessibilityElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityElement.m; path = Core/Source/DTAccessibilityElement.m; sourceTree = ""; }; 031C87137668EBD722F2FAB7A5826060 /* DTCoreText-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTCoreText-dummy.m"; sourceTree = ""; }; 034BC384E1BA330755046E5212201E4D /* DTHTMLParserTextNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserTextNode.h; path = Core/Source/DTHTMLParserTextNode.h; sourceTree = ""; }; - 034F5FDCBB44D08C5A68F8AB2B4777F1 /* RDPDFReaderHighlightOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderHighlightOverlayView.swift; sourceTree = ""; }; 039B47D5CF4FDEA47C608CF07378D3DF /* DTFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.release.xcconfig; sourceTree = ""; }; + 03A3F3DC28A03FECBBC8A4FD8E5EBD8B /* RDEPUBTextContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentView.swift; sourceTree = ""; }; + 03D925237ACBF4382D1CF970BC943B0D /* RDSpeechReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDSpeechReaderView.release.xcconfig; sourceTree = ""; }; 045ADBF2087ADD914A9CA0B62EBF2A9F /* Pods-ReadViewDemo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ReadViewDemo.modulemap"; sourceTree = ""; }; 0486411409B1766377F5F2A6234D8E64 /* FileManager+ZIPDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIPDeprecated.swift"; path = "Sources/ZIPFoundation/FileManager+ZIPDeprecated.swift"; sourceTree = ""; }; - 04DF49B738958596E47F57961FA3A69A /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreImage.framework; sourceTree = DEVELOPER_DIR; }; 05565CA71DD7DDAA012573A841F7D8DF /* NSURL+DTUnshorten.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTUnshorten.h"; path = "Core/Source/NSURL+DTUnshorten.h"; sourceTree = ""; }; - 0594E39D9568D488378ADCB812715321 /* RDEPUBCSSCompatibilityLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCSSCompatibilityLayer.swift; sourceTree = ""; }; - 05A48723D29BFECCDE51DE4E1CABDD67 /* RDEpubReaderTapRegionHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderTapRegionHandler.swift; sourceTree = ""; }; 05CA3610F2F3C8021110A179D6943F7A /* ConstraintAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintAttributes.swift; path = Sources/ConstraintAttributes.swift; sourceTree = ""; }; - 06D8D0804A9C685D066179823080D2E5 /* RDEPUBTextContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentView.swift; sourceTree = ""; }; + 064F689D0045852491C10A092AF5E30D /* RDPDFSpeechSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDPDFSpeechSession.swift; path = Speech/RDPDFSpeechSession.swift; sourceTree = ""; }; + 069D7EE5E989A9F963E518365DDB0301 /* RDEPUBChapterDisplayContentCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterDisplayContentCache.swift; sourceTree = ""; }; 06E2D8E1D6BCAF5913A7F3F6B1BF9E0F /* DTAccessibilityViewProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityViewProxy.h; path = Core/Source/DTAccessibilityViewProxy.h; sourceTree = ""; }; + 06E8F756DFAEAA9E8FA4B7D472000B2E /* RDEPUBTextBookCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookCache.swift; sourceTree = ""; }; 07147F57468AB345BF82E26A70F60603 /* CTLineUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = CTLineUtils.m; path = Core/Source/CTLineUtils.m; sourceTree = ""; }; - 07206349472D73174829CAD2B189B5FF /* RDPDFReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDPDFReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 0744250A850EDAD2D67851F9AE9322C2 /* RDEPUBFragmentMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFragmentMarkerInjector.swift; sourceTree = ""; }; 0769148555F482C8DF7EA21F6935B7F4 /* NSMutableString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableString+HTML.m"; path = "Core/Source/NSMutableString+HTML.m"; sourceTree = ""; }; - 089966C3069A2468CA1E889EB69E74A7 /* RDEPUBTextSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSearchEngine.swift; sourceTree = ""; }; + 08203CC2BC14FB8B3BA0CAA3EC92789C /* RDSpeechTextPreprocessor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDSpeechTextPreprocessor.swift; path = Sources/RDSpeechTextPreprocessor.swift; sourceTree = ""; }; + 089BC1322F491BEB59F94895FDB65109 /* RDEPUBImageViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewController.swift; sourceTree = ""; }; 08A8B32341BD833856874E046C97EE36 /* NSMutableArray+DTMoving.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableArray+DTMoving.h"; path = "Core/Source/NSMutableArray+DTMoving.h"; sourceTree = ""; }; + 0A70E0ECB35D874C1E9699C1CD0F6261 /* RDEPUBPageCountCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageCountCache.swift; sourceTree = ""; }; 0B3047509587D803762D3B0A21B9F773 /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILayoutSupport+Extensions.swift"; path = "Sources/UILayoutSupport+Extensions.swift"; sourceTree = ""; }; 0B446AE2E106CECF72AEEA93B85897EC /* DTListItemHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTListItemHTMLElement.m; path = Core/Source/DTListItemHTMLElement.m; sourceTree = ""; }; - 0CABC6F6EBE38588FD08D8CDF4EAF88F /* RDEPUBSettingsFlipAutomation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSettingsFlipAutomation.swift; sourceTree = ""; }; + 0C746469E04CD2685727B7CAC5DF72BD /* RDEPUBCFIRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRange.swift; sourceTree = ""; }; + 0D15E11E01B7F344DD8863CBBC543A77 /* RDPDFReaderDrawingCanvasView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDrawingCanvasView.swift; sourceTree = ""; }; 0D235D896ED8A7EFDB618AB39D091153 /* ZIPFoundation.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ZIPFoundation.modulemap; sourceTree = ""; }; 0D42C4F678DDCCEAE9A66D3D55B30AA8 /* ConstraintMakerEditable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerEditable.swift; path = Sources/ConstraintMakerEditable.swift; sourceTree = ""; }; + 0E0CFBF5E5E5B369336E6E7E8FDCD5F5 /* RDEPUBTextPageRenderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageRenderView.swift; sourceTree = ""; }; 0E46A6DEEE6CEA27A1FC9024036D8136 /* URL+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URL+ZIP.swift"; path = "Sources/ZIPFoundation/URL+ZIP.swift"; sourceTree = ""; }; 0E6203B41468A1B8FBBF9CEC0BF15751 /* DTListItemHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTListItemHTMLElement.h; path = Core/Source/DTListItemHTMLElement.h; sourceTree = ""; }; - 0EA1817F681CEC8A380F9824BD490E73 /* RDEPUBReaderServices.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderServices.swift; sourceTree = ""; }; 0EA3863B341F56C9B54980AD6A1FD5C0 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = ""; }; + 0EEE779A1CEC15EBD959AE8FB87C5E20 /* RDEPUBChapterPageCounter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterPageCounter.swift; sourceTree = ""; }; 0FAE8E0BCF1CB66D6936A3CACAE7CF0B /* DTTextBlock.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextBlock.m; path = Core/Source/DTTextBlock.m; sourceTree = ""; }; - 101E8704978C7417FCD99D18764F42B6 /* RDEpubReaderPreloadController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderPreloadController.swift; sourceTree = ""; }; - 1178601791D03F742CB349BE582223E2 /* RDEPUBTextPaginationSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationSupport.swift; sourceTree = ""; }; + 10207D5C5DF3B33C322957B6325ECA5D /* RDCBZReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDCBZReaderController.swift; sourceTree = ""; }; + 1061342BC0338CF0BB657142899D83BA /* RDEPUBReaderState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderState.swift; sourceTree = ""; }; + 10A21533669EF5F6B433ACF6570084B4 /* RDEpubReaderPagingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderPagingController.swift; sourceTree = ""; }; + 10F7EBC0047B5FAFD86F2BE940E3C100 /* RDEPUBSettingsFlipAutomation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSettingsFlipAutomation.swift; sourceTree = ""; }; + 112BB2DF4A650E511F8E5988973D1199 /* RDEPUBSelectionLoupeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionLoupeView.swift; sourceTree = ""; }; + 127678B93D3CEB6EC2C7F3E5DD81860B /* RDEPUBSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchEngine.swift; sourceTree = ""; }; 1312638E3010913FB511FD8BE3E2DC60 /* DTBreakHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBreakHTMLElement.h; path = Core/Source/DTBreakHTMLElement.h; sourceTree = ""; }; + 132F26882A679D32261325CC0E7B460A /* RDEPUBWebView+Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Configuration.swift"; sourceTree = ""; }; + 137546C9BE2CA543D6BAA25522E046A6 /* RDEPUBHTMLNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBHTMLNormalizer.swift; sourceTree = ""; }; 13C91A1E88D3B946A1FA082A6EB05C9A /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Sources/Constraint.swift; sourceTree = ""; }; - 13FF31007A05E5706CF26F9BC9DBD462 /* RDEPUBWebView+Configuration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Configuration.swift"; sourceTree = ""; }; + 13D0BE27CC53417EBD0C5F28F1C54E38 /* RDEpubReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDEpubReaderView-prefix.pch"; sourceTree = ""; }; 14AEB065E4B58020BECD466FA2C3582B /* NSDictionary+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTError.h"; path = "Core/Source/NSDictionary+DTError.h"; sourceTree = ""; }; - 14BBECB3A6235FDD72CE46FBCD08FE3C /* WeReadApi.js */ = {isa = PBXFileReference; includeInIndex = 1; name = WeReadApi.js; path = EPUBCore/Resources/WeReadApi.js; sourceTree = ""; }; - 15FA72422C7B69BBA7D5B3CFF098CCE5 /* RDPDFReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderContentCell.swift; sourceTree = ""; }; 16023686DC389E6755BC79366433C45B /* DTVersion.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVersion.m; path = Core/Source/DTVersion.m; sourceTree = ""; }; - 1697531DEC18EA6F9B99D0146C015338 /* RDEPUBReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderController.swift; sourceTree = ""; }; + 16957235ACD001BED6FBC8A1D2CB5BA5 /* RDPDFReaderDebugViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDebugViewController.swift; sourceTree = ""; }; 172C1329A4A6171B18EC5A192815941B /* DTCoreTextLayoutLine.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutLine.m; path = Core/Source/DTCoreTextLayoutLine.m; sourceTree = ""; }; 175FF6D3C38E463368C8B7AE1AC4E41F /* NSNumber+RomanNumerals.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+RomanNumerals.m"; path = "Core/Source/NSNumber+RomanNumerals.m"; sourceTree = ""; }; - 183D5601B41EA616973AC94E459FA1AB /* ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist"; sourceTree = ""; }; + 17EE920782F4B0CF61192C04ABF5DF6C /* FoundationModels.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = FoundationModels.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/FoundationModels.framework; sourceTree = DEVELOPER_DIR; }; 1870B77AD9A6F26AB3180BB4CE2A8BCC /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Sources/ConstraintPriority.swift; sourceTree = ""; }; 188836BC213C48E6459D098231133246 /* DTDictationPlaceholderTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderTextAttachment.m; path = Core/Source/DTDictationPlaceholderTextAttachment.m; sourceTree = ""; }; 188A763544B134CC1004ECB7380538D7 /* DTTiledLayerWithoutFade.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTiledLayerWithoutFade.m; path = Core/Source/iOS/DTTiledLayerWithoutFade.m; sourceTree = ""; }; 18AACA176C2E9FDB2B4834B426AC6368 /* UIApplication+DTNetworkActivity.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+DTNetworkActivity.h"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.h"; sourceTree = ""; }; + 18BA62D664A5A8EED63F1B9AE279B4EB /* RDEPUBChapterSummaryDiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterSummaryDiskCache.swift; sourceTree = ""; }; + 1929AF2396E5AFD5D38E0BA75065368B /* RDEPUBCFIUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIUtilities.swift; sourceTree = ""; }; 1944985A167896CE8F522E61AFC67021 /* ResourceBundle-Resources-DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Resources-DTCoreText-Info.plist"; sourceTree = ""; }; - 197D0C3E827B624F40FB510F3BD8A906 /* RDEPUBReaderSearchBarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchBarView.swift; sourceTree = ""; }; + 1A26CF4FC3A56FE642CDCAE6E644AC27 /* RDEPUBFontFallbackResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontFallbackResolver.swift; sourceTree = ""; }; 1A2A7B53BCE33A88EB155ED5C4F5C09D /* DTHTMLParserTextNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserTextNode.m; path = Core/Source/DTHTMLParserTextNode.m; sourceTree = ""; }; + 1A4F73DDFA534B5DDC38C9044FF275E0 /* RDPDFReaderImageTextRecognizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderImageTextRecognizer.swift; sourceTree = ""; }; + 1AA811488B6B1DCC5A5F916EF08D7E0E /* RDEPUBChapterRuntimeStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterRuntimeStore.swift; sourceTree = ""; }; 1AD502A1FA6EB1E38200B5283F979504 /* Pods-ReadViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ReadViewDemo.release.xcconfig"; sourceTree = ""; }; - 1B05F3444C3A7680B4D1E4DE01B8A567 /* RDEPUBChapterTailNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterTailNormalizer.swift; sourceTree = ""; }; + 1AE141846409815273DEBF1DF496BBF6 /* RDEPUBPageMapReconciliationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageMapReconciliationCoordinator.swift; sourceTree = ""; }; + 1B28B43AB4CD054B30DD8EE676642E70 /* RDEPUBReaderHighlightsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderHighlightsViewController.swift; sourceTree = ""; }; 1C726091C55C51A29EFD42913073CA5E /* Archive+Reading.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Reading.swift"; path = "Sources/ZIPFoundation/Archive+Reading.swift"; sourceTree = ""; }; 1C822D376841DA0BA4150A8A8E5B911D /* DTTextAttachmentHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextAttachmentHTMLElement.h; path = Core/Source/DTTextAttachmentHTMLElement.h; sourceTree = ""; }; - 1CC0B71EB8AFFDB330E0D8E99CFFCDD3 /* RDEPUBParser+Package.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Package.swift"; sourceTree = ""; }; + 1CF5CFD0948675E862FF54F7A5D73412 /* RDEPUBSpeechContentProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDEPUBSpeechContentProvider.swift; path = Speech/RDEPUBSpeechContentProvider.swift; sourceTree = ""; }; 1D70C4504AFE88A621171FBB9368722F /* DTBase64Coding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBase64Coding.h; path = Core/Source/DTBase64Coding.h; sourceTree = ""; }; - 1D7343E0F0547D801BC11E2D708AA33A /* wxread-default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-default.css"; path = "EPUBCore/Resources/wxread-default.css"; sourceTree = ""; }; - 1DE4839D4FBE796B7FDD121170DAD53A /* RDPDFReaderSettingsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderSettingsView.swift; sourceTree = ""; }; - 1E68AD352C43FD90827957D8073F835A /* RDEPUBWebViewDebug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebViewDebug.swift; sourceTree = ""; }; 1E77200B2588979A91C702B9393646FE /* DTCoreText-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTCoreText-Info.plist"; sourceTree = ""; }; - 1E7DF84037D55273D99B5284EDE7F7FC /* RDEPUBCFIGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIGenerator.swift; sourceTree = ""; }; + 1EE7ABC1E00E2AD5CD17521B799DDABF /* RDEPUBChapterLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLoader.swift; sourceTree = ""; }; 1F72747C46CC41B906C8A967ED5A47E6 /* DTLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLog.h; path = Core/Source/DTLog.h; sourceTree = ""; }; - 1FC7A51A9F6D730A23D6220001DF40BC /* RDEpubReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDEpubReaderView.modulemap; sourceTree = ""; }; 1FDA83DF0F8A6E9142BC2640BC2F9844 /* DTTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachment.m; path = Core/Source/DTTextAttachment.m; sourceTree = ""; }; - 1FDE32176816BC0A42D4B28D78235370 /* RDPDFReaderDrawingToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDrawingToolbar.swift; sourceTree = ""; }; + 2042A956F6ADB5E2CF8DB889FA6F7652 /* RDAIReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDAIReaderView.debug.xcconfig; sourceTree = ""; }; 2047430DF5C84E0A8FC8874A2B915FC3 /* Pods-ReadViewDemo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ReadViewDemo-acknowledgements.markdown"; sourceTree = ""; }; 20AFDAE6841D0000824C044E2CCEED62 /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Sources/ConstraintLayoutGuideDSL.swift; sourceTree = ""; }; + 20DD66672C9FCA7C604D8034702101EF /* epub-bridge.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-bridge.js"; path = "EPUBCore/Resources/epub-bridge.js"; sourceTree = ""; }; 2129FCC5AA430659582F12DBA1350292 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Sources/ConstraintLayoutSupport.swift; sourceTree = ""; }; - 2185E45C320FFD388943A87A125FB42D /* RDEPUBTextLayoutFrame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayoutFrame.swift; sourceTree = ""; }; - 2193B99AFE9594D920D7CA76190FFC8E /* RDEPUBResourceResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceResolver.swift; sourceTree = ""; }; 21A5EB7C80D2F578DE579CA1B20F3CDB /* NSAttributedString+DTDebug.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+DTDebug.h"; path = "Core/Source/NSAttributedString+DTDebug.h"; sourceTree = ""; }; - 21AE24836ACB2BC812E9FF5C0F4302FE /* RDPDFReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDPDFReaderView.modulemap; sourceTree = ""; }; + 21F9B093162E445308F49662C7C35DA6 /* RDSpeechReaderControlView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDSpeechReaderControlView.swift; path = Sources/RDSpeechReaderControlView.swift; sourceTree = ""; }; + 22226730313C0F24542669F12C5C4FB1 /* epub-fixed-layout.html */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-fixed-layout.html"; path = "EPUBCore/Resources/epub-fixed-layout.html"; sourceTree = ""; }; + 224F6889428B8D51E00F57EB6904B3B1 /* RDEPUBReaderController+Orientation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+Orientation.swift"; sourceTree = ""; }; 226AE0F5865FC6A88B9D0C73C28A8381 /* DTCoreTextParagraphStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextParagraphStyle.m; path = Core/Source/DTCoreTextParagraphStyle.m; sourceTree = ""; }; - 232BAE44CA9BE28B729B402BC8B8FAD8 /* PDFKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PDFKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/PDFKit.framework; sourceTree = DEVELOPER_DIR; }; + 237DCFF0194564E19C33BED372E1EA72 /* RDEPUBTextPaginationInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationInterfaces.swift; sourceTree = ""; }; 23E6F02F41FDE074ACD5C78DA921EEED /* DTTextHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextHTMLElement.h; path = Core/Source/DTTextHTMLElement.h; sourceTree = ""; }; - 244A0250D275B067EFA790D022396B24 /* RDEPUBCFIUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIUtilities.swift; sourceTree = ""; }; - 24818987BA7C833972E50A1921661271 /* RDEPUBPublication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPublication.swift; sourceTree = ""; }; 2557D3D9913F2F7C7C6AD2C114C2A5C5 /* DTCoreTextLayoutFrameAccessibilityElementGenerator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.h; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.h; sourceTree = ""; }; - 257E3A6D94EB339AF710CBA1515719DC /* RDEPUBPageInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageInteractionController.swift; sourceTree = ""; }; - 2701BC5B247F7F1B1AF269EE0B553ED8 /* RDEpubReaderView+ContentAccess.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+ContentAccess.swift"; sourceTree = ""; }; + 27F4AF07E5CBA7B0CC54553D55983D1F /* RDAIAppleFoundationModelsProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAIAppleFoundationModelsProvider.swift; path = FoundationModels/RDAIAppleFoundationModelsProvider.swift; sourceTree = ""; }; + 2856AF81B14F4FE03A4968F3E239DAD6 /* RDEPUBReaderController+RuntimeBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RuntimeBridge.swift"; sourceTree = ""; }; + 289F977B8DD2ABF03CE0CCED0A8F5671 /* RDEPUBWebView+JavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+JavaScriptBridge.swift"; sourceTree = ""; }; + 28B57DDE8DD7718C17E02D8B7001DC6F /* RDEPUBTextBookModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookModels.swift; sourceTree = ""; }; + 28C6EB4B2B6DC691D28EEBC2BDB4D2F3 /* RDEPUBReaderController+RenderSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RenderSupport.swift"; sourceTree = ""; }; 28FF8B4C669DE2384EE37199498D23E9 /* DTCoreTextLayoutLine.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutLine.h; path = Core/Source/DTCoreTextLayoutLine.h; sourceTree = ""; }; + 291A21D778336F982A7197655BD501D5 /* RDAIDiagnostics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAIDiagnostics.swift; path = Core/RDAIDiagnostics.swift; sourceTree = ""; }; 295BCC7FDA963E5D8F53CBF64F08B2B5 /* NSMutableString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableString+HTML.h"; path = "Core/Source/NSMutableString+HTML.h"; sourceTree = ""; }; - 296DC86D94CA633F2A0697072F76F90D /* RDEPUBTextSelectionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSelectionController.swift; sourceTree = ""; }; 298CF23475A19D50E172630BD6D1D1EA /* NSString+DTFormatNumbers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTFormatNumbers.m"; path = "Core/Source/NSString+DTFormatNumbers.m"; sourceTree = ""; }; - 298E057B5F44628E4EE593F1513E95A6 /* RDEPUBAttachmentTooltipOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipOverlayView.swift; sourceTree = ""; }; + 299AED4539FF5F16ACFC414AF2BDFCF3 /* RDAIReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDAIReaderView-dummy.m"; sourceTree = ""; }; + 29B76ED37710AEC809FAF71EC4C1F215 /* RDPDFReaderView+Paging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDPDFReaderView+Paging.swift"; sourceTree = ""; }; 2A39B1AC101FC87E52C5110F072FEA07 /* DTFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTFoundation.debug.xcconfig; sourceTree = ""; }; - 2ADB2BD72FA5B1DA4D59440FFC04DE2C /* RDEPUBStyleSheetComposer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetComposer.swift; sourceTree = ""; }; + 2B49BEF738A6B60FB6A64671ACA9091B /* rangy-serializer.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-serializer.js"; path = "EPUBCore/Resources/rangy-serializer.js"; sourceTree = ""; }; 2BD77848C77F7674193EDA5C1F18DE6A /* UIImage+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+DTFoundation.h"; path = "Core/Source/iOS/UIImage+DTFoundation.h"; sourceTree = ""; }; - 2C37E4DD39F7CDCFA4C0776B8CAB60A7 /* RDEPUBParser+ReadingProfile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+ReadingProfile.swift"; sourceTree = ""; }; 2C866ED63128D4AB5D968EEDA3CB7516 /* NSAttributedStringRunDelegates.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = NSAttributedStringRunDelegates.m; path = Core/Source/NSAttributedStringRunDelegates.m; sourceTree = ""; }; - 2CF7C6BEE1CB54D2546C94E58BEE0EC6 /* RDEPUBViewportTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBViewportTypes.swift; sourceTree = ""; }; - 2EDE0B4A3EB73E17912FEC91AECADBD6 /* RDPDFReaderContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderContainerView.swift; sourceTree = ""; }; - 2F23F0E002BEE47B1E786821D96067E4 /* rangy-serializer.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-serializer.js"; path = "EPUBCore/Resources/rangy-serializer.js"; sourceTree = ""; }; - 2FF34F8FF314B2B52DA562E7160E9AFD /* RDEPUBTextAnnotationOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnnotationOverlay.swift; sourceTree = ""; }; + 2D0BA256721E4BAFE43E91891A606A06 /* RDEPUBWebContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebContentView.swift; sourceTree = ""; }; + 2FBAA88C8DBE0129E51AD73F7D1AB4BD /* RDSpeechReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDSpeechReaderController.swift; path = Sources/RDSpeechReaderController.swift; sourceTree = ""; }; 304EE7D51CFA84D5F4DBD3F5745F241D /* Archive+Helpers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Helpers.swift"; path = "Sources/ZIPFoundation/Archive+Helpers.swift"; sourceTree = ""; }; 306477706BBB1E784F55BCF8EB1AD737 /* Pods-ReadViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ReadViewDemo.debug.xcconfig"; sourceTree = ""; }; - 3085A431A30E4E2DC3F5E4CAFBA83B5D /* RDEPUBReaderPersistence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPersistence.swift; sourceTree = ""; }; 309D2521D7B9A10F86DA3F6BE7FB37B1 /* UIApplication+DTNetworkActivity.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+DTNetworkActivity.m"; path = "Core/Source/iOS/UIApplication+DTNetworkActivity.m"; sourceTree = ""; }; 3124E174D81A28717086F17445BED5BB /* UIView+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+DTFoundation.h"; path = "Core/Source/iOS/UIView+DTFoundation.h"; sourceTree = ""; }; - 318A173BC4548B559258A9FE99D42742 /* RDEPUBPageLayoutSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageLayoutSnapshot.swift; sourceTree = ""; }; + 31802A30449913CF424CD3B666B895CF /* RDEPUBDarkImageAdjuster.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDarkImageAdjuster.swift; sourceTree = ""; }; 31B00EC977C5120446E63A976AD9DBC3 /* DTCoreTextGlyphRun.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextGlyphRun.m; path = Core/Source/DTCoreTextGlyphRun.m; sourceTree = ""; }; + 32038A3480CA43711F902B42126D03E6 /* RDEPUBReaderController+PublicAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+PublicAPI.swift"; sourceTree = ""; }; 32D4D2890461C2EF2403D78EBF03B29D /* DTCoreTextFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFunctions.h; path = Core/Source/DTCoreTextFunctions.h; sourceTree = ""; }; - 34112F3165802F124416A83D4B7B15AA /* RDEPUBAnnotationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAnnotationModels.swift; sourceTree = ""; }; - 34407B046ADF145B3DA08FE4C28609C6 /* RDEPUBWebContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebContentView.swift; sourceTree = ""; }; + 3410BDB001A65A79622F3980646A4AAE /* RDEpubReaderView+CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+CollectionView.swift"; sourceTree = ""; }; 34F66F7B56F490F71666C3CC51B50EDB /* DTBlockFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBlockFunctions.m; path = Core/Source/DTBlockFunctions.m; sourceTree = ""; }; - 359E871CA4A99767E938A99718B48F88 /* RDEPUBPageBreakPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageBreakPolicy.swift; sourceTree = ""; }; + 34FC1DCF56B5AEFDF71CEC0334776D7A /* RDPDFReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPageChildViewController.swift; sourceTree = ""; }; + 352416B880C0869535D5187772C16D21 /* RDPDFReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDPDFReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 35A48CFD97F259DB677ECBF3A5AB8B60 /* RDEPUBTextPaginationSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationSupport.swift; sourceTree = ""; }; + 35BA5E0859FB7D83208D401FA4126575 /* RDEpubReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDEpubReaderView-dummy.m"; sourceTree = ""; }; + 367C998948D9897CF825A08E51AF013D /* RDEPUBChapterData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterData.swift; sourceTree = ""; }; 36E06DBE2154F8FCE42DD5E8CB02B258 /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Sources/ConstraintView.swift; sourceTree = ""; }; - 37946E93F2D5F5FF5392FCC3BF0F9424 /* RDEPUBChapterCacheKey.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterCacheKey.swift; sourceTree = ""; }; 380BFE2729ACC77B6F3E846E9C456848 /* DTCoreTextFontCollection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontCollection.h; path = Core/Source/DTCoreTextFontCollection.h; sourceTree = ""; }; - 3822FA364A35F16FFA9D2AAE31E22EF0 /* RDEPUBResourceURLSchemeHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceURLSchemeHandler.swift; sourceTree = ""; }; + 3839A199E78DBF80DB5CF945DCE6C62B /* RDEPUBWebView+FixedLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+FixedLayout.swift"; sourceTree = ""; }; + 38B47FDF2463F124FDC2B6154F98E987 /* RDEPUBReaderLoadCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLoadCoordinator.swift; sourceTree = ""; }; 39EFEE9E154AB29DC2CC553438E66442 /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Sources/ConstraintDescription.swift; sourceTree = ""; }; 39F01D07F324B206706E9809D44643C1 /* NSString+Paragraphs.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+Paragraphs.m"; path = "Core/Source/NSString+Paragraphs.m"; sourceTree = ""; }; - 3A59ED3F13A984E625FF8F6639060AC0 /* RDEPUBTextContentInteractionCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentInteractionCoordinator.swift; sourceTree = ""; }; - 3A71A099FDBC70A51AE773741C33A4AC /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/MediaPlayer.framework; sourceTree = DEVELOPER_DIR; }; + 3B255A2C4C31A02ED6FC13D5D2DE27DC /* Vision.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Vision.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Vision.framework; sourceTree = DEVELOPER_DIR; }; 3BE28706DBAE983FB19FBE122D9F9E68 /* NSArray+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSArray+DTError.m"; path = "Core/Source/NSArray+DTError.m"; sourceTree = ""; }; - 3BEBF652FA65A9AB3D558E1A2A511051 /* RDEPUBSelectionState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionState.swift; sourceTree = ""; }; + 3C2ECAEF31AA6DC14F2C3A19A03F050F /* RDEPUBChapterWarmupOrchestrator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterWarmupOrchestrator.swift; sourceTree = ""; }; 3D1E29A71B902CC46EBA81C84ADCDA50 /* DTLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLog.m; path = Core/Source/DTLog.m; sourceTree = ""; }; + 3D56EC508FD85074993AAB6580F72631 /* RDEPUBReaderServices.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderServices.swift; sourceTree = ""; }; 3D86855B4F039593754D5DC832865EA9 /* ZIPFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-umbrella.h"; sourceTree = ""; }; - 3DB723617A3D02BEBFBC7DD8E83D47E6 /* RDPDFReaderPagingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPagingController.swift; sourceTree = ""; }; - 3E2EA68BCB5C16362AF8A87E6BED539C /* RDEPUBStyleCompatibilityModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleCompatibilityModels.swift; sourceTree = ""; }; + 3ED45EEF428135AE43AF524CE0492924 /* RDEpubReaderTapRegionHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderTapRegionHandler.swift; sourceTree = ""; }; 3EF3AD9CA30968DDCB34B4B8F3477AA8 /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = ""; }; + 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 3FCDFEE3DE4E8469962B9931E7775E8C /* UIFont+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIFont+DTCoreText.m"; path = "Core/Source/UIFont+DTCoreText.m"; sourceTree = ""; }; 3FDE76F77A49B86E3A4499727321AC11 /* DTCoreText.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTCoreText.release.xcconfig; sourceTree = ""; }; - 3FE0B907BC40F5886B5D8761C8E1C984 /* RDEPUBAnnotationEditorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAnnotationEditorViewController.swift; sourceTree = ""; }; 3FFE1E06FDE8D4BA1EE289A4D0E7D127 /* DTCoreText.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = DTCoreText.debug.xcconfig; sourceTree = ""; }; - 40123F24B4E99825DEBE316FC14BE8F2 /* RDEpubReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDEpubReaderView-prefix.pch"; sourceTree = ""; }; 407D64FA06B0D5E2DD9CDBC471AB9195 /* DTCoreTextParagraphStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextParagraphStyle.h; path = Core/Source/DTCoreTextParagraphStyle.h; sourceTree = ""; }; - 40F8654BEEBD1B51A4079D96899C140D /* RDEpubReaderView+ToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+ToolView.swift"; sourceTree = ""; }; 4113E34E3BD2181F4202CECBB3A0DDBA /* DTHorizontalRuleHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHorizontalRuleHTMLElement.h; path = Core/Source/DTHorizontalRuleHTMLElement.h; sourceTree = ""; }; + 413CD373B452DEFC31CD6761AF17E8F6 /* RDEPUBFontNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontNormalizer.swift; sourceTree = ""; }; 41C70D721E1873184464B93001110824 /* ConstraintInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsets.swift; path = Sources/ConstraintInsets.swift; sourceTree = ""; }; + 41EC12208AD1A079C60779F6DD30DAC4 /* RDEPUBPageResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageResolver.swift; sourceTree = ""; }; 41FD16F0768AA2512812644831FC90CA /* DTHTMLAttributedStringBuilder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLAttributedStringBuilder.m; path = Core/Source/DTHTMLAttributedStringBuilder.m; sourceTree = ""; }; 4200F053D7EE79B56B3A430E865A9051 /* DTCoreText-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-umbrella.h"; sourceTree = ""; }; - 422C9DACF0702754BAAA0A37E8A0D4F9 /* RDEPUBReadingSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingSession.swift; sourceTree = ""; }; 42C2ECC838DE8A6E5DEB264BEA6F59E4 /* NSAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+HTML.h"; path = "Core/Source/NSAttributedString+HTML.h"; sourceTree = ""; }; + 430DCC402F55D7293EDA440903D400BC /* RDEPUBStyleSheetComposer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetComposer.swift; sourceTree = ""; }; + 4323646E9B345F4FADB630E17C777858 /* RDEpubReaderView+ToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+ToolView.swift"; sourceTree = ""; }; 4351507ACB1193D9EA3EDD3DFDDA1AD2 /* NSString+CSS.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+CSS.m"; path = "Core/Source/NSString+CSS.m"; sourceTree = ""; }; - 44765E4CAD77632F37A650F5ABDCDAD5 /* RDEpubReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDEpubReaderView-umbrella.h"; sourceTree = ""; }; + 4419BC4EF1BB72BD430008215C2194B1 /* RDPDFKitPageProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFKitPageProvider.swift; sourceTree = ""; }; 44894FF917F68A61F0E523342FA5D0A8 /* DTHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLElement.m; path = Core/Source/DTHTMLElement.m; sourceTree = ""; }; - 45019AE00B85C161910232F35A46E260 /* RDEPUBNoteResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteResolver.swift; sourceTree = ""; }; - 4516C344651B4BAB7D3B3676952563AC /* RDPDFReaderPageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPageView.swift; sourceTree = ""; }; + 44BB65037344EA640BD291D831FE5585 /* RDAIReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDAIReaderView.modulemap; sourceTree = ""; }; + 44F6F4C9B8DC26B67956A489EB5E2E39 /* RDEpubReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderPageChildViewController.swift; sourceTree = ""; }; 45C11AEF7E65FFDA653DFB142C22DEF4 /* DTAttributedTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextView.m; path = Core/Source/DTAttributedTextView.m; sourceTree = ""; }; 45CF43387529121AEA90666FE86EE96A /* DTVideoTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTVideoTextAttachment.m; path = Core/Source/DTVideoTextAttachment.m; sourceTree = ""; }; - 46D6BA3E651245BCC8808128EF553958 /* RDEPUBBackgroundPriorityPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundPriorityPolicy.swift; sourceTree = ""; }; + 45F37BFCD74928584B57F92A89DC4573 /* RDAIIndexService.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAIIndexService.swift; path = Core/RDAIIndexService.swift; sourceTree = ""; }; 4703F3A2832A267D9F6D1EEA83ACB7CC /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapKit.modulemap; sourceTree = ""; }; - 47856474DDE696BF61255DF73D2D799D /* RDEPUBJavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJavaScriptBridge.swift; sourceTree = ""; }; - 47A01EEE1789F4E1A109C1B49D125E3F /* RDPDFZoomablePageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFZoomablePageView.swift; sourceTree = ""; }; 47E0F42EC4845B73E0193AA0062A1576 /* DTHTMLParserNode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParserNode.m; path = Core/Source/DTHTMLParserNode.m; sourceTree = ""; }; 4822B5E091C79BBDF0CEC9C27FAD11ED /* Archive+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ZIP64.swift"; path = "Sources/ZIPFoundation/Archive+ZIP64.swift"; sourceTree = ""; }; + 485961C2B2BC82A4B098F920F901DE24 /* RDEPUBReaderPaginationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPaginationCoordinator.swift; sourceTree = ""; }; 48A4A6EDC08C8AC933D0DCD507E9D173 /* ZIPFoundation */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ZIPFoundation; path = ZIPFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 4977ECD606F12A1293FCF0EF36934E5E /* RDEPUBChapterWarmupOrchestrator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterWarmupOrchestrator.swift; sourceTree = ""; }; - 499B927AB070F064B0E8A012382003F1 /* RDEPUBReaderToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolView.swift; sourceTree = ""; }; - 49BEE692A99D3F6541F6A273A49A865D /* RDEPUBCFICompatibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFICompatibility.swift; sourceTree = ""; }; - 49F4B0888234A678C5FF3E5866E73021 /* RDEPUBCFIError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIError.swift; sourceTree = ""; }; - 4A230A3524DED0923CEC303B4C54C833 /* RDEPUBMetadataParseCancellationController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseCancellationController.swift; sourceTree = ""; }; - 4AF75964868B86A27B63709439E9AF91 /* RDPDFReaderContracts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderContracts.swift; sourceTree = ""; }; + 48D4FB95327A55188B4EE105C47E7090 /* RDPDFReaderImageTextLayerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderImageTextLayerView.swift; sourceTree = ""; }; + 4914EC4B82CC6AA3736968D86B805228 /* RDEPUBSemanticMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSemanticMarkerInjector.swift; sourceTree = ""; }; + 4AF4B41DABF7397AEBDB574FEA007451 /* RDEPUBTextPageDecorationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageDecorationView.swift; sourceTree = ""; }; 4B1C52776D8E95B99DC3657201FB6FD0 /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintLayoutGuide+Extensions.swift"; path = "Sources/ConstraintLayoutGuide+Extensions.swift"; sourceTree = ""; }; + 4B3397616AD34F6B89948DEBE139C7C5 /* RDPDFReaderNavigationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderNavigationView.swift; sourceTree = ""; }; + 4B9D828EF15B8A7E80CA8DA3C770E4D1 /* RDEPUBReaderController+DataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+DataSource.swift"; sourceTree = ""; }; + 4C19196DA0724F0BF7BAF7DF59C04D8E /* RDEPUBReaderLocationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLocationCoordinator.swift; sourceTree = ""; }; + 4C90DC3AA09B301621526C8BCC0AD9D9 /* RDAILocatorBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAILocatorBuilder.swift; path = Core/RDAILocatorBuilder.swift; sourceTree = ""; }; 4D4600C0ADBC3B1B542099C68D747659 /* NSString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+HTML.h"; path = "Core/Source/NSString+HTML.h"; sourceTree = ""; }; - 4D468DB9B31EA67BD86A1A48BE74733A /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; - 4D4997C97BB58CF60B165D1BD0C31985 /* RDEPUBParser+Resources.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Resources.swift"; sourceTree = ""; }; - 4D4D4F7D2C3A548F609164CC506388BE /* RDEPUBReaderController+Orientation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+Orientation.swift"; sourceTree = ""; }; 4D4D642664400ACAE92FB5136B8121D0 /* DTCoreTextLayoutFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrame.m; path = Core/Source/DTCoreTextLayoutFrame.m; sourceTree = ""; }; - 4F61B106422AACE26C3C7B05C5293DCC /* RDPDFReaderNavigationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderNavigationView.swift; sourceTree = ""; }; + 4D6C143C0EAE0DA948204F9912FE193D /* RDEPUBReaderToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolView.swift; sourceTree = ""; }; + 4D908F35D94E51D89507601431AC05B9 /* RDAINaturalLanguageAnalyzer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAINaturalLanguageAnalyzer.swift; path = NaturalLanguage/RDAINaturalLanguageAnalyzer.swift; sourceTree = ""; }; + 4DAF2D9747F0021F074180A0C76F0788 /* cssInjector.js */ = {isa = PBXFileReference; includeInIndex = 1; name = cssInjector.js; path = EPUBCore/Resources/cssInjector.js; sourceTree = ""; }; + 4DFD0C2AACBA8A400F346FFA5AAA6C77 /* RDEPUBParser+Resources.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Resources.swift"; sourceTree = ""; }; + 4EC7EE7406D5F141BFDB10F21D1B98D8 /* RDEPUBCFIParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIParser.swift; sourceTree = ""; }; + 4F4320A57A5573831CD151F06C5420C5 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; + 4F654C6659A3FDE4C3E08BBDD2C01CCF /* RDPDFReaderViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderViewController.swift; sourceTree = ""; }; 4F9D3ED5DA816A72982CEF0FD18986D1 /* NSDictionary+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSDictionary+DTCoreText.h"; path = "Core/Source/NSDictionary+DTCoreText.h"; sourceTree = ""; }; 503556D1790A886D0E591A982279641B /* NSData+DTCrypto.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+DTCrypto.m"; path = "Core/Source/NSData+DTCrypto.m"; sourceTree = ""; }; - 5088A729186A207F65C88E148F0392F4 /* RDEpubReaderViewProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderViewProtocols.swift; sourceTree = ""; }; - 508BA727504170CFC09B46B584079A86 /* RDEPUBTextPaginationInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPaginationInterfaces.swift; sourceTree = ""; }; - 50AE5BE674D885BED9B796FE8D97FAF8 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 507D9D8B9C2FF474F3C6BE68C6EF6C50 /* RDPDFReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDPDFReaderView-umbrella.h"; sourceTree = ""; }; 50E9C6F457FD3662DF4FC74CA5ACB962 /* DTActivityTitleView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTActivityTitleView.h; path = Core/Source/iOS/DTActivityTitleView.h; sourceTree = ""; }; + 510888775BFD893D3C1A93984E31FE11 /* RDEPUBRuntimePageCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimePageCount.swift; sourceTree = ""; }; + 51339BC494F76D8DB8C1A4968689C617 /* RDEPUBBookPageMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBookPageMap.swift; sourceTree = ""; }; + 517D2A78DA380DB287A13785F250D543 /* RDPDFReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDPDFReaderView.debug.xcconfig; sourceTree = ""; }; + 519BA5E115705E308601172F3785D87E /* RDEPUBPaginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginator.swift; sourceTree = ""; }; 51CD1050B1BC09EA428919282AA2614D /* DTColor+Compatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTColor+Compatibility.h"; path = "Core/Source/DTColor+Compatibility.h"; sourceTree = ""; }; 51D9D817F1F806BC50BB65FC80C7D47F /* DTFolderMonitor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFolderMonitor.h; path = Core/Source/DTFolderMonitor.h; sourceTree = ""; }; + 51DCB48325A7E7DDC907587B7B9425F6 /* RDEPUBResourceResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceResolver.swift; sourceTree = ""; }; + 52481F3BA048F07B97DAC750A397270E /* RDEPUBPreferences.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPreferences.swift; sourceTree = ""; }; + 5282E8702FED953DC43F2FF5E61290C8 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 52A65E0D6AD4CFB0EECC8AD17A4E8EAC /* DTTextBlock.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextBlock.h; path = Core/Source/DTTextBlock.h; sourceTree = ""; }; - 53AF19D77192D711E50E669495472086 /* RDEPUBSelectionLoupeView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionLoupeView.swift; sourceTree = ""; }; - 53BD308DABD26A8A8B9CC272486D6EB0 /* RDEpubReaderSpreadResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderSpreadResolver.swift; sourceTree = ""; }; 53C2C2B5D2F9E3E125F8C7B1B2B41CA8 /* Entry+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+Serialization.swift"; path = "Sources/ZIPFoundation/Entry+Serialization.swift"; sourceTree = ""; }; - 53E8A047531C39D6A6942EC72AF77ADD /* RDEPUBReaderSearchCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchCoordinator.swift; sourceTree = ""; }; - 543B7B3F4EEB0FAD86C96E5DCE0E22CC /* RDEpubReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDEpubReaderView.release.xcconfig; sourceTree = ""; }; - 5465156489BA8D643EA9935146897329 /* RDEPUBReaderDependencies.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDependencies.swift; sourceTree = ""; }; - 54B4C37E4A452238A2B3D65A483FF624 /* RDEPUBHTMLNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBHTMLNormalizer.swift; sourceTree = ""; }; - 54F55F21A6B7661A8D560DB1557E6B97 /* RDEPUBWebView+FixedLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+FixedLayout.swift"; sourceTree = ""; }; - 54F7EED7DF4D198244A6D06C00CC3F00 /* RDEPUBCoreTextPageFrameFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCoreTextPageFrameFactory.swift; sourceTree = ""; }; + 54F2C8B38BF0106D946BEE9F7E854D08 /* RDPDFReaderPageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPageView.swift; sourceTree = ""; }; 551D98EE6C1653939AE1E3BCBC4ACC2E /* DTImage+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTImage+HTML.h"; path = "Core/Source/DTImage+HTML.h"; sourceTree = ""; }; 55265AB7222E2B20F9B5B320259186BC /* DTCoreTextLayouter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayouter.h; path = Core/Source/DTCoreTextLayouter.h; sourceTree = ""; }; - 5563F7DA776199803E76170B264676BE /* RDPDFReaderNavigationPanelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderNavigationPanelViewController.swift; sourceTree = ""; }; - 557386F3232CE41AD7A21D1D0C412FC0 /* RDEPUBChapterOffsetMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterOffsetMap.swift; sourceTree = ""; }; + 55ECB9EB83BDA7CDF3E67366AAA25C22 /* RDEPUBReadingSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingSession.swift; sourceTree = ""; }; + 5620BF46CC66D177218F95274B0899FD /* RDEPUBPaginationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationModels.swift; sourceTree = ""; }; + 563D7B75744B17E859D3990CEE414AB0 /* RDEPUBStyleCompatibilityModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleCompatibilityModels.swift; sourceTree = ""; }; 5680AB3CE2258BA50F7E7FA84AA71368 /* DTCoreText.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DTCoreText.modulemap; sourceTree = ""; }; - 579B4F428B2ACA84D95B05569FE72F1A /* RDEPUBCFIDOMPathBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIDOMPathBuilder.swift; sourceTree = ""; }; - 57F1B61908D2C1EBC6471CC6E9B90A4C /* RDEPUBReaderController+ContentDelegates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ContentDelegates.swift"; sourceTree = ""; }; - 5943DD019F4F6E9E8608E88D2420888C /* RDEPUBTextBookModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookModels.swift; sourceTree = ""; }; + 574844915C6A0BA87B43940426C8DA96 /* RDEPUBNoteDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteDetector.swift; sourceTree = ""; }; + 57512CC2A1488E761B4B2A6F02CB55F0 /* RDEPUBDecryptingImageAttachment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDecryptingImageAttachment.swift; sourceTree = ""; }; + 57C055B2516B90417D158D4D31CF4A11 /* RDPDFReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDPDFReaderView-prefix.pch"; sourceTree = ""; }; + 58E942DE9692E29D8CB63A8E7F0E6B2B /* RDEPUBNavigatorLayoutContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorLayoutContext.swift; sourceTree = ""; }; 5977986EDFE76D5EF96A6D95483B12F7 /* Pods-ReadViewDemo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ReadViewDemo-frameworks.sh"; sourceTree = ""; }; - 59FBE51D9C334D6C796944A37A36FA0B /* RDEPUBChapterLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLoader.swift; sourceTree = ""; }; - 5AAE327FF1505A989454CFB6BE8D5056 /* RDEPUBWebDecorationOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebDecorationOverlayView.swift; sourceTree = ""; }; - 5AC70C974C448660DF34C7FBA424FD78 /* RDEPUBTypesettingPipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTypesettingPipeline.swift; sourceTree = ""; }; - 5B394C9C9A51160FF8B06D89C3147EDF /* RDPDFReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderTheme.swift; sourceTree = ""; }; - 5D82EEDCF29F3E5B37BEA5191F49610E /* RDEPUBParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBParser.swift; sourceTree = ""; }; - 5D9886E67C654192303F817E356E9C60 /* RDEPUBTextAnchor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnchor.swift; sourceTree = ""; }; + 59A6E8D84753503A5324211BF6A88E64 /* RDEPUBReaderController+Trial.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+Trial.swift"; sourceTree = ""; }; + 59D34C7BD6896EBDB5BAFDCC8F420FB6 /* RDEPUBReaderChromeCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChromeCoordinator.swift; sourceTree = ""; }; + 59D55BC5643EA702EB48D478948DF83E /* RDEPUBChapterTailNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterTailNormalizer.swift; sourceTree = ""; }; + 59DC39EBD2707FF1010387665D60AB01 /* RDEPUBResourceURLSchemeHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceURLSchemeHandler.swift; sourceTree = ""; }; + 5A2ACEA23FA60F80BDEFD2EC71EB10F4 /* RDEPUBRenderRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderRequest.swift; sourceTree = ""; }; + 5B786661CF20BBDCE901A8609DACF061 /* RDEPUBJavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJavaScriptBridge.swift; sourceTree = ""; }; + 5D0B6C724E03707E527C7AB3C1214489 /* RDEPUBTextPageBoundaryValidator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageBoundaryValidator.swift; sourceTree = ""; }; 5E247027425CC2ADC73F05F25DC0B857 /* DTColorFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTColorFunctions.h; path = Core/Source/DTColorFunctions.h; sourceTree = ""; }; 5EA0602B933CD0C98C4AEEE449A8D048 /* DTBlockFunctions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTBlockFunctions.h; path = Core/Source/DTBlockFunctions.h; sourceTree = ""; }; - 5EC177D3B91E8E624750D11D7E09F3B6 /* RDPDFReaderViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderViewController.swift; sourceTree = ""; }; - 5ECBBE5C440153A7C6B87D92B16289B0 /* wxread-dark.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-dark.css"; path = "EPUBCore/Resources/wxread-dark.css"; sourceTree = ""; }; - 5F2315273E8A0E225152D3BBBD8441AA /* RDEPUBTextRendererSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRendererSupport.swift; sourceTree = ""; }; + 5EEE1249C915939654A5609D3CFC2064 /* RDEPUBReaderSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettingsViewController.swift; sourceTree = ""; }; 60052288EBFD0DEA0CD594641192FB5C /* UIScreen+DTFoundation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIScreen+DTFoundation.h"; path = "Core/Source/iOS/UIScreen+DTFoundation.h"; sourceTree = ""; }; + 603CE31AD8934F870E35F7074D1EFDE0 /* RDEPUBTextAnnotationOverlay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnnotationOverlay.swift; sourceTree = ""; }; 60599FA355FBC31A4ED1E2EE5A09A312 /* NSAttributedStringRunDelegates.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = NSAttributedStringRunDelegates.h; path = Core/Source/NSAttributedStringRunDelegates.h; sourceTree = ""; }; - 60BD829978DA910F152D499A1BA7E04B /* RDEPUBReaderChromeCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChromeCoordinator.swift; sourceTree = ""; }; - 6101F66C96A97F01A48A9214DEE40D02 /* RDEPUBBuildDiagnosticsReporter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBuildDiagnosticsReporter.swift; sourceTree = ""; }; + 60EC254E73980C2F0AA36B2A4ABA4E04 /* RDEPUBAttachmentNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentNormalizer.swift; sourceTree = ""; }; 617D0CB55C260D48CC4ED2FF0A3A1051 /* DTFoundationConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTFoundationConstants.h; path = Core/Source/DTFoundationConstants.h; sourceTree = ""; }; - 61FEB7BE16889FD8532441C936C01304 /* RDEPUBTextIndexTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextIndexTable.swift; sourceTree = ""; }; - 63482DC4A15D66980EFBAA222D2D6CA8 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; - 636AF7DBBCB7320FC883EAFE197EF923 /* RDPDFReaderImageTextRecognizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderImageTextRecognizer.swift; sourceTree = ""; }; + 6245AD148BF98574A18D998B11830A21 /* RDEPUBAttachmentTooltipView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipView.swift; sourceTree = ""; }; + 62AF8846B36B51075E3D04481932FAB0 /* RDEPUBParser+Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Archive.swift"; sourceTree = ""; }; + 62BAED47209069B1F1E56A1DBC2892B1 /* RDEPUBCFIPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIPath.swift; sourceTree = ""; }; + 62F3A858FD7165A3AEBBCA78E105DB73 /* RDAINaturalLanguageSemanticScorer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAINaturalLanguageSemanticScorer.swift; path = NaturalLanguage/RDAINaturalLanguageSemanticScorer.swift; sourceTree = ""; }; + 6393730DA75DF6B53CCC8AC325591C5D /* RDEpubReaderViewProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderViewProtocols.swift; sourceTree = ""; }; 63A43AFE4C6D7EBA5A25A5B514F473AF /* DTAttributedTextContentView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextContentView.h; path = Core/Source/DTAttributedTextContentView.h; sourceTree = ""; }; 63DC0159C85524BC0348523335677809 /* DTCoreTextFontDescriptor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontDescriptor.m; path = Core/Source/DTCoreTextFontDescriptor.m; sourceTree = ""; }; - 64394008B6544FFDF5097612472AEE24 /* RDEpubReaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderView.swift; sourceTree = ""; }; - 64DE54DECA8006B6CC936B6A5271D1ED /* RDEPUBReaderRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderRuntime.swift; sourceTree = ""; }; + 63F79A4C9316E507B47DF63F26FC3263 /* RDEpubReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderContentCell.swift; sourceTree = ""; }; + 63FD3DEF59551312E8EEB77A7CDEC93A /* RDEPUBReaderViewportMonitor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderViewportMonitor.swift; sourceTree = ""; }; + 64527A3F0F755D0173A048667A23AEA3 /* RDEPUBAttachmentTooltipOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipOverlayView.swift; sourceTree = ""; }; 64ECE2655E3EFB266C23544D1149B39F /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Sources/ConstraintMakerExtendable.swift; sourceTree = ""; }; + 65080B22CDF63551E7650AAF4499BDD7 /* RDEPUBTextLayouter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayouter.swift; sourceTree = ""; }; + 657A0B0DD4402A509DF0BF6AA9360DF5 /* RDMOBIParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDMOBIParser.swift; sourceTree = ""; }; 65806394BC872987207CCB0FB587E3B1 /* DTHTMLParser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLParser.m; path = Core/Source/DTHTMLParser/DTHTMLParser.m; sourceTree = ""; }; + 65F72183F6B8013C5A520595006A2B5F /* RDEPUBReaderAssemblyCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAssemblyCoordinator.swift; sourceTree = ""; }; + 669FBCF95F7506CD004BB09639AC8CF4 /* RDEPUBCFIMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMarkerInjector.swift; sourceTree = ""; }; 66D4CB745F2AE3B89089A68CF287C279 /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; sourceTree = ""; }; - 671C2212E0B20B47CA0A56D7138411B1 /* RDPDFReaderView+ToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDPDFReaderView+ToolView.swift"; sourceTree = ""; }; + 67A9EB086407E39FDB221874CE6CB9DA /* RDEPUBTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookBuilder.swift; sourceTree = ""; }; 67C4B1FD4CAF8FFB009FF39F501B2650 /* Archive+BackingConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+BackingConfiguration.swift"; path = "Sources/ZIPFoundation/Archive+BackingConfiguration.swift"; sourceTree = ""; }; - 67CE7F078B6F280727666D10430B4FBD /* RDEPUBNoteDetector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteDetector.swift; sourceTree = ""; }; + 67CBB4275FFEB0FDD4DB8C4BB881BDBA /* RDSpeechReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDSpeechReaderView-prefix.pch"; sourceTree = ""; }; 68302D3003412D32673539BAF3A71FFD /* DTCoreGraphicsUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreGraphicsUtils.h; path = Core/Source/DTCoreGraphicsUtils.h; sourceTree = ""; }; - 69252E848F3036D84BCE5A09B0544390 /* RDEpubReaderPagingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderPagingController.swift; sourceTree = ""; }; + 6975E8E0C8246911E8F8318E762672D9 /* RDEPUBReaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDelegate.swift; sourceTree = ""; }; 6A21D84422DA0E64EA29D0155532671F /* DTHorizontalRuleHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHorizontalRuleHTMLElement.m; path = Core/Source/DTHorizontalRuleHTMLElement.m; sourceTree = ""; }; - 6B56088831DB283C0FCC800A365BA5B2 /* RDEPUBChapterRuntimeStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterRuntimeStore.swift; sourceTree = ""; }; + 6B75BE4C4CB6B906D8F81B37938F0A46 /* RDEPUBReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderController.swift; sourceTree = ""; }; 6B839E12858DFC58AF91990D8B6D27A3 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/ZIPFoundation/Resources/PrivacyInfo.xcprivacy; sourceTree = ""; }; 6BE6B072BF746163179BDF80F8CDBE1D /* NSScanner+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSScanner+HTML.h"; path = "Core/Source/NSScanner+HTML.h"; sourceTree = ""; }; - 6C877F262E89255B3135DE1E935D3246 /* RDEpubReaderView+CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+CollectionView.swift"; sourceTree = ""; }; + 6C9532C775F9C0F2DDE745981A3E5BD2 /* RDPDFReaderHighlightOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderHighlightOverlayView.swift; sourceTree = ""; }; + 6CB45D03588F166B581A0965E7D18D6A /* RDPDFReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDPDFReaderView-Info.plist"; sourceTree = ""; }; + 6D11123394F7F2EE6463FE977F3DABD9 /* RDEPUBCoreTextPageFrameFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCoreTextPageFrameFactory.swift; sourceTree = ""; }; 6D211ACA62A5B241A668A682054310DE /* DTFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "DTFoundation-dummy.m"; sourceTree = ""; }; + 6D3D1B3F2E5D775108B74D6574B91DCE /* RDEPUBReaderController+AttachmentTooltip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+AttachmentTooltip.swift"; sourceTree = ""; }; 6DA7955406639DE39E1FD953D882301E /* NSURL+DTAppLinks.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTAppLinks.m"; path = "Core/Source/iOS/NSURL+DTAppLinks.m"; sourceTree = ""; }; 6DB99CF9B07AE8928ACEE9F5A107809D /* NSCoder+DTCompatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCoder+DTCompatibility.m"; path = "Core/Source/NSCoder+DTCompatibility.m"; sourceTree = ""; }; - 6E58C1EF4EC5E0B8E2B38CA2270B93E9 /* RDReaderDocumentFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderDocumentFormat.swift; sourceTree = ""; }; + 6E56D97F139ADBF3D0E3DD57E5765A5A /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + 6E6F004273EE4B1DA2F3B6E496AF475E /* RDEPUBResourceDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceDataProvider.swift; sourceTree = ""; }; 6E87093B88AB6F2B6A8E775DB61D7F9B /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; 6EDBB29D0A60FEB56FCC489DC10F37BB /* NSDictionary+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTCoreText.m"; path = "Core/Source/NSDictionary+DTCoreText.m"; sourceTree = ""; }; - 6EF4435215EDB7548944507506D0A4C9 /* RDEPUBNotePopupViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupViewController.swift; sourceTree = ""; }; - 6F37E867DE563EFD505DBB674F4FDDF6 /* RDEPUBAssetRepository.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAssetRepository.swift; sourceTree = ""; }; 6F38E01209C5238001BD7CD009ED3E88 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Sources/ConstraintItem.swift; sourceTree = ""; }; + 6F805E226F3C1AA7053AA6606DA26CE1 /* RDEPUBFixedLayoutTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFixedLayoutTemplate.swift; sourceTree = ""; }; 6F97367EBFF425820B717CAC4FAF59F2 /* DTImageTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTImageTextAttachment.m; path = Core/Source/DTImageTextAttachment.m; sourceTree = ""; }; - 6FCABB4D698319B7BD34E6F1984C6C81 /* RDEPUBFontNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontNormalizer.swift; sourceTree = ""; }; 702AB4F450076D82E264C7AF93A45F14 /* DTActivityTitleView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTActivityTitleView.m; path = Core/Source/iOS/DTActivityTitleView.m; sourceTree = ""; }; 708CF8B218058AAAA710BB7ADFC504FE /* DTVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVersion.h; path = Core/Source/DTVersion.h; sourceTree = ""; }; - 71751F490BDBE080BDE46E24BD09DC25 /* cssInjector.js */ = {isa = PBXFileReference; includeInIndex = 1; name = cssInjector.js; path = EPUBCore/Resources/cssInjector.js; sourceTree = ""; }; - 7340AFD453A481A52CFFC7C7D8C50B87 /* RDEPUBPageResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageResolver.swift; sourceTree = ""; }; + 70A8F9DB706EC2E2FCFBAD1E695BB805 /* RDEPUBJumpSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJumpSession.swift; sourceTree = ""; }; + 712CB0166C21E677902495FEC814327A /* RDAIReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDAIReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 719CCC5081F72A4CF289A77C6A10B8D6 /* RDAIReaderView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDAIReaderView-prefix.pch"; sourceTree = ""; }; + 73A8DB7823ED0CC52F6BCB9D87F5D8E9 /* RDEPUBTypesettingPipeline.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTypesettingPipeline.swift; sourceTree = ""; }; 73DCE046F4B55AE88A81C9E68400E93C /* NSArray+DTError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSArray+DTError.h"; path = "Core/Source/NSArray+DTError.h"; sourceTree = ""; }; 73FD0605520377843F2F940947AFE16C /* Archive+Progress.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Progress.swift"; path = "Sources/ZIPFoundation/Archive+Progress.swift"; sourceTree = ""; }; 7440BEAF1F0CA8CE70C073FFEAF637F5 /* DTExtendedFileAttributes.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTExtendedFileAttributes.m; path = Core/Source/DTExtendedFileAttributes.m; sourceTree = ""; }; 74B2884E9214B5B38193587D773554BA /* DTCoreTextLayoutFrameAccessibilityElementGenerator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayoutFrameAccessibilityElementGenerator.m; path = Core/Source/DTCoreTextLayoutFrameAccessibilityElementGenerator.m; sourceTree = ""; }; 74ECEF7602380F21B87522961E550A7E /* NSURL+DTComparing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTComparing.h"; path = "Core/Source/NSURL+DTComparing.h"; sourceTree = ""; }; 74F621BADD77F0A22003EDCA6F92D153 /* NSAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+HTML.m"; path = "Core/Source/NSAttributedString+HTML.m"; sourceTree = ""; }; - 76244BD19BB5CB592A5EB99402C94A45 /* RDEPUBReaderController+RuntimeBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RuntimeBridge.swift"; sourceTree = ""; }; - 767016761BF5B8D57595E288BC501BF7 /* RDEPUBAttachmentTooltipView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentTooltipView.swift; sourceTree = ""; }; + 75AA5BC3865826B2B32B3305A8CC578B /* RDEPUBWebView+Reflowable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Reflowable.swift"; sourceTree = ""; }; + 75F5A849E82ECED8710DBA54B127186F /* RDAIReaderAssistantViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAIReaderAssistantViewController.swift; path = UI/RDAIReaderAssistantViewController.swift; sourceTree = ""; }; + 75FC55A17D1CCC4C4BEB88B146B790D8 /* RDPDFReaderDrawingToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDrawingToolbar.swift; sourceTree = ""; }; 7698F9998B2922CC8875BDD7849ED710 /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Sources/ConstraintDSL.swift; sourceTree = ""; }; + 76D2244BDA6024551727F35AA3454980 /* RDEPUBNotePopupViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupViewController.swift; sourceTree = ""; }; 773601B72FDE742724A1FE66115AC185 /* DTLazyImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLazyImageView.h; path = Core/Source/DTLazyImageView.h; sourceTree = ""; }; + 7777AD7DDECA33F4050E77507F113B22 /* RDEpubPlainTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubPlainTextBookBuilder.swift; sourceTree = ""; }; + 77CA12D475208B07BC520525A4E79C3C /* wxread-replace.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace.css"; path = "EPUBCore/Resources/wxread-replace.css"; sourceTree = ""; }; + 788B69585E28B6A19F3D82E03FB17437 /* RDEPUBTextPositionConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPositionConverter.swift; sourceTree = ""; }; 78AA6CC1C34A3A64CED4C314B1FAE2F1 /* default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = default.css; path = Core/Source/default.css; sourceTree = ""; }; - 78B720430DB36E3E3D207599DC78CCF1 /* RDEPUBBackgroundTrace.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundTrace.swift; sourceTree = ""; }; 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-ReadViewDemo"; path = Pods_ReadViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 790E97E55D348C4AAE5B90CE6447CD7E /* DTAnchorHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnchorHTMLElement.h; path = Core/Source/DTAnchorHTMLElement.h; sourceTree = ""; }; - 795CACF19C9BC6269156E3E87CAC5A4A /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; - 79D6E6B825D0F311663E6A9EFA5D2A7F /* RDEPUBReaderController+Trial.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+Trial.swift"; sourceTree = ""; }; - 79D75F4A7A02692556E18AC3A388A190 /* RDEPUBModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBModels.swift; sourceTree = ""; }; + 7A158C1456B0A6C5E3C11F6F598B688D /* RDEPUBReaderController+LocationResolution.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+LocationResolution.swift"; sourceTree = ""; }; + 7A98FCBF217CA913BD506DAEBAE03449 /* rangy-core.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-core.js"; path = "EPUBCore/Resources/rangy-core.js"; sourceTree = ""; }; + 7AA4DBF07DDCE87ABC0B78A2FF3FB813 /* UIColor+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUB.swift"; sourceTree = ""; }; 7AEDBB0324469C4ECD8D10A6355A2A09 /* DTVideoTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTVideoTextAttachment.h; path = Core/Source/DTVideoTextAttachment.h; sourceTree = ""; }; 7B8CEFAE5E33709E3C9AABF89FFF29BC /* DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreText.h; path = Core/Source/DTCoreText.h; sourceTree = ""; }; 7BB20F608D8D3B80F2688014A5F661FC /* DTHTMLWriter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTHTMLWriter.m; path = Core/Source/DTHTMLWriter.m; sourceTree = ""; }; 7C1C6E107AA4540639C1ED1E7741CF07 /* DTSmartPagingScrollView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTSmartPagingScrollView.m; path = Core/Source/iOS/DTSmartPagingScrollView.m; sourceTree = ""; }; 7C5C85EAAD91F1E22CC5986EF9B5D218 /* DTCSSStylesheet.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCSSStylesheet.m; path = Core/Source/DTCSSStylesheet.m; sourceTree = ""; }; - 7CCE92FD9E1B88BD2FE582C98A4AE8EC /* RDEPUBMetadataParseWorker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseWorker.swift; sourceTree = ""; }; - 7CE5B910E4B90BDD78B2747C7184C745 /* RDEPUBReaderSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettings.swift; sourceTree = ""; }; - 7D41D5F7E42BDEF71C2CD08D7E019C1D /* RDEPUBTextPageVerticalJustifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageVerticalJustifier.swift; sourceTree = ""; }; 7DCFEFDD6D693AD5967568E86920AB08 /* DTColor+Compatibility.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTColor+Compatibility.m"; path = "Core/Source/DTColor+Compatibility.m"; sourceTree = ""; }; - 7F00C52E49C78CE7F63C155C5C74AFBE /* RDEPUBReaderAnnotationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAnnotationCoordinator.swift; sourceTree = ""; }; + 7E8C2259B135B2F86D6250BD6B09178A /* RDEPUBBackgroundCoverageStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundCoverageStore.swift; sourceTree = ""; }; + 7E9BFD9290BCB2009DB319A63935EF99 /* RDPDFReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderTheme.swift; sourceTree = ""; }; 7F533E14DBE841E334D44FEDC9132726 /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Sources/ConstraintOffsetTarget.swift; sourceTree = ""; }; - 80EF554F6662D1148455292C4F03A585 /* RDEpubReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDEpubReaderView.debug.xcconfig; sourceTree = ""; }; - 81032F879C858B2A45DF02DCF7ED8E6A /* RDEPUBChapterPageCounter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterPageCounter.swift; sourceTree = ""; }; + 80A410954172DEFFD72C06139798345A /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 81120E66C1F56C6F0FAC98FE155554BE /* RDEPUBReaderBottomToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderBottomToolView.swift; sourceTree = ""; }; + 81313A5C1BC97CDA5BE30763C8F014F9 /* RDPDFAIContentProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDPDFAIContentProvider.swift; path = AI/RDPDFAIContentProvider.swift; sourceTree = ""; }; + 81A94C98005A2AE1285F725F27D64D82 /* RDEPUBTextBuildPipelineInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBuildPipelineInterfaces.swift; sourceTree = ""; }; 81B4314CBEDA71647A929517B936613F /* DTCustomColoredAccessory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCustomColoredAccessory.h; path = Core/Source/iOS/DTCustomColoredAccessory.h; sourceTree = ""; }; 81E4757842563D7D3DAB82C8B693B313 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Sources/ConstraintViewDSL.swift; sourceTree = ""; }; 81FB8EF1A1E911A5BA351013BE2BDDA3 /* DTIframeTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTIframeTextAttachment.m; path = Core/Source/DTIframeTextAttachment.m; sourceTree = ""; }; - 82C4B8E3666736C72FD8AA9774095CD5 /* RDEPUBReaderToolViewProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolViewProtocols.swift; sourceTree = ""; }; - 830E2FF68050B3931209AF2581249082 /* RDPDFKitPageProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFKitPageProvider.swift; sourceTree = ""; }; + 8240722CAA937E143E861EF85889D881 /* RDEPUBWebViewDebug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebViewDebug.swift; sourceTree = ""; }; + 830CF8D5AB992FBCBD12AEDC987704BF /* RDEPUBCFI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFI.swift; sourceTree = ""; }; 8442D87941EF389213FFB9992DEF5D64 /* Archive+ReadingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+ReadingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+ReadingDeprecated.swift"; sourceTree = ""; }; - 84B6EFF1EBD266465C28091AEDD73E0B /* RDPDFReaderDrawingCanvasView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDrawingCanvasView.swift; sourceTree = ""; }; + 8451167CAD54879A8C6C68669A8CE1B1 /* RDPDFReaderView+CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDPDFReaderView+CollectionView.swift"; sourceTree = ""; }; 84BDFD9872BDDC8D8E292A987C833142 /* NSString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+HTML.m"; path = "Core/Source/NSString+HTML.m"; sourceTree = ""; }; 84F38B3CAD708AE9333A29A9AB921FA4 /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Sources/LayoutConstraint.swift; sourceTree = ""; }; 856FED9E82D238C3694CC665594928A4 /* DTFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "DTFoundation-Info.plist"; sourceTree = ""; }; 86255994A7212A40F60FBEE69C526FF9 /* DTDictationPlaceholderView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderView.h; path = Core/Source/DTDictationPlaceholderView.h; sourceTree = ""; }; - 87A369FECC06D50D3068A665BCD42179 /* RDPDFReaderSettingsPanelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderSettingsPanelViewController.swift; sourceTree = ""; }; + 87855F530B15477A1936F953D0A86A63 /* RDEPUBReaderSearchCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchCoordinator.swift; sourceTree = ""; }; + 87893187F5137BA27FE812E2F9346B30 /* RDEPUBNotePopupCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupCoordinator.swift; sourceTree = ""; }; + 87D001927426A4D5E9E90B7899A00372 /* RDEPUBParser+ReadingProfile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+ReadingProfile.swift"; sourceTree = ""; }; 88A74F7BF47C6E3B2026A80DC4783F1A /* DTCSSStylesheet.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSStylesheet.h; path = Core/Source/DTCSSStylesheet.h; sourceTree = ""; }; - 88FCFBF2D7F2A0C26D1FBF5161035517 /* RDEPUBCFIResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIResolver.swift; sourceTree = ""; }; + 8911E1CAA6638CF6E14939CE71B77C19 /* RDEPUBCFIGenerator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIGenerator.swift; sourceTree = ""; }; 8961D7BA81FEA0F2525F9E82F156426A /* DTStylesheetHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTStylesheetHTMLElement.h; path = Core/Source/DTStylesheetHTMLElement.h; sourceTree = ""; }; - 898D56C24CC6E71662D88243FD4A030E /* RDEPUBPageMapReconciliationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageMapReconciliationCoordinator.swift; sourceTree = ""; }; - 89DEA6EF4DB86448B595CCB2ACC06C97 /* RDEPUBNavigatorLayoutContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNavigatorLayoutContext.swift; sourceTree = ""; }; 8A15541928DAA1303B6219C49CCE42C9 /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Sources/ConstraintLayoutGuide.swift; sourceTree = ""; }; + 8A41D37F86EFC816F7478316843069DA /* RDPDFZoomablePageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFZoomablePageView.swift; sourceTree = ""; }; 8A54C0C47B44A133E0CFF71526B88FAF /* DTAttributedTextCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextCell.m; path = Core/Source/DTAttributedTextCell.m; sourceTree = ""; }; 8B10FCCF1F8CF05D36F5B65963EB1F41 /* DTHTMLAttributedStringBuilder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLAttributedStringBuilder.h; path = Core/Source/DTHTMLAttributedStringBuilder.h; sourceTree = ""; }; - 8B1B27CD14A9E7FB6895C4F6F2E70179 /* RDEPUBReaderController+DataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+DataSource.swift"; sourceTree = ""; }; 8B35D0622F339A5B8A864FAA0C9EAE47 /* Pods-ReadViewDemo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ReadViewDemo-acknowledgements.plist"; sourceTree = ""; }; + 8B363F80F3DBB1AAC48B8524B8025C79 /* RDEPUBReaderToolViewProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderToolViewProtocols.swift; sourceTree = ""; }; + 8B5C7E08046DF09C290F5F2222B1E64C /* RDEpubReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDEpubReaderView-Info.plist"; sourceTree = ""; }; 8B666BD6A6C560D47BBC2E29BAF25836 /* ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; sourceTree = ""; }; - 8B6EC13F25BB402502F307A53001F7D4 /* RDEPUBReaderLoadCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLoadCoordinator.swift; sourceTree = ""; }; - 8B808EF921BB59C1A78691D36ECC666B /* RDEPUBParser+TOC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+TOC.swift"; sourceTree = ""; }; + 8B84C004C6CD0C7094EBA83BF3E42DD0 /* RDEPUBReaderAnnotationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAnnotationCoordinator.swift; sourceTree = ""; }; + 8C0E6A164C2508A21E017A697D6A4C80 /* RDEPUBReaderController+ExternalLinks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ExternalLinks.swift"; sourceTree = ""; }; + 8C14D80995798D4961531CAAC7AE3D01 /* RDEPUBReaderTopToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTopToolView.swift; sourceTree = ""; }; + 8C59FCD684EB9341B04A358F9BAF4DC4 /* RDEPUBReaderUIState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderUIState.swift; sourceTree = ""; }; + 8C637C4B48A62EF0502BDEF1DE9D0E15 /* RDAISQLiteIndexStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAISQLiteIndexStore.swift; path = Core/RDAISQLiteIndexStore.swift; sourceTree = ""; }; + 8C80B76361E9EE71ACFCB82163017066 /* RDEPUBTextPageVerticalJustifier.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageVerticalJustifier.swift; sourceTree = ""; }; 8D071D3F1AC2022BBB40C82D2DC2DFE3 /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Sources/ConstraintMakerRelatable.swift; sourceTree = ""; }; - 8D1DCB390ECBFC669909F9181A3FE8B0 /* RDEPUBCFI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFI.swift; sourceTree = ""; }; 8E16B563D3E20D4C0FB3C36350F2A330 /* NSURL+DTAppLinks.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURL+DTAppLinks.h"; path = "Core/Source/iOS/NSURL+DTAppLinks.h"; sourceTree = ""; }; 8E2E349ABD550C367772430F49937F3B /* SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapKit-Info.plist"; sourceTree = ""; }; - 8E5DEEA6A9CEFC805D050932E03E1A21 /* RDEPUBReaderController+RenderSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+RenderSupport.swift"; sourceTree = ""; }; - 8F3756D5F4282ABEF00423938EAF6DE2 /* RDEPUBTextPageDecorationView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageDecorationView.swift; sourceTree = ""; }; - 8F533FF48C81C0B1684CA895D72C646F /* RDEPUBBackgroundCoverageStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundCoverageStore.swift; sourceTree = ""; }; - 8F65D6C8950F76034AD414199E8D4C2E /* RDEPUBReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTheme.swift; sourceTree = ""; }; - 90FED6AA55769B0F41A57155366E801D /* RDEPUBPaginator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginator.swift; sourceTree = ""; }; - 916630DBF02CC978ECEBBFD77F10FB65 /* RDEPUBTextPositionConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPositionConverter.swift; sourceTree = ""; }; + 8E85471307D55F36163C3495688467A3 /* RDEPUBTextAnchor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextAnchor.swift; sourceTree = ""; }; + 8E937FB7E0D9A3DEF0742A18E455FF54 /* RDEPUBCFIRecoveryEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRecoveryEngine.swift; sourceTree = ""; }; + 8F24C368CBF5CCF60B01598682C6C07F /* RDEPUBSelectionState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionState.swift; sourceTree = ""; }; + 920EAB87BCF859EE5CB851833D8C7410 /* RDEPUBSelectionOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionOverlayView.swift; sourceTree = ""; }; 9213525F01D9956B799C00C0D4A56558 /* DTAttributedTextContentView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedTextContentView.m; path = Core/Source/DTAttributedTextContentView.m; sourceTree = ""; }; - 924A837FC3890B67B17DF9246FB39A4C /* RDEPUBReadingLocationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingLocationModels.swift; sourceTree = ""; }; - 926FC58A23312DD1B9B06F1C52993208 /* RDEPUBReaderViewportMonitor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderViewportMonitor.swift; sourceTree = ""; }; - 92790B32EB81BDF75E8ACD8E3C4BBE10 /* RDEPUBWebView+JavaScriptBridge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+JavaScriptBridge.swift"; sourceTree = ""; }; - 92AA4E9E3B871C30A1C7BF9141CD9770 /* RDEPUBReaderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderConfiguration.swift; sourceTree = ""; }; - 930C3411505409ABE11F153B7A416991 /* RDEPUBChapterData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterData.swift; sourceTree = ""; }; - 932004ABE6C86E9E2ED0030B979ED9FF /* RDEPUBDTCoreTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDTCoreTextRenderer.swift; sourceTree = ""; }; - 933404827F6B057EB29BBDD6125374E4 /* RDEpubPlainTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubPlainTextBookBuilder.swift; sourceTree = ""; }; + 921EA5C03E5608583DE9F4C2FC49704B /* RDEPUBReaderDependencies.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDependencies.swift; sourceTree = ""; }; + 93231E903E802072F56185B464DDFAD4 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/MediaPlayer.framework; sourceTree = DEVELOPER_DIR; }; 93D34826E445B4E08B0CEC27C6EB4DF3 /* Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Archive.swift; path = Sources/ZIPFoundation/Archive.swift; sourceTree = ""; }; - 94885CDA3F48C7BEEDD826129955D4D2 /* RDEpubReaderView+PageCurl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+PageCurl.swift"; sourceTree = ""; }; + 943A86A9A49BFCE017A6E927A5227BF2 /* RDPDFReaderPagingController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPagingController.swift; sourceTree = ""; }; 958D7F12C237A34C059F4E43474BDFAF /* NSAttributedString+SmallCaps.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+SmallCaps.m"; path = "Core/Source/NSAttributedString+SmallCaps.m"; sourceTree = ""; }; 9678265F1949A0F038F13D422F2B55FD /* DTPieProgressIndicator.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTPieProgressIndicator.h; path = Core/Source/iOS/DTPieProgressIndicator.h; sourceTree = ""; }; + 968484A28FBB84723F621DB66ECA3347 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; 971623801171F2368ECD657BD0C2937F /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Sources/ConstraintMultiplierTarget.swift; sourceTree = ""; }; 9719394B24A0CB3CCE6CCA87A0A70D08 /* NSFileWrapper+DTCopying.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSFileWrapper+DTCopying.h"; path = "Core/Source/NSFileWrapper+DTCopying.h"; sourceTree = ""; }; 973C2C363B09BC1E49983C6826A623E2 /* DTPieProgressIndicator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTPieProgressIndicator.m; path = Core/Source/iOS/DTPieProgressIndicator.m; sourceTree = ""; }; 9761870FC405B984D09A304261C3CB25 /* DTCoreGraphicsUtils.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreGraphicsUtils.m; path = Core/Source/DTCoreGraphicsUtils.m; sourceTree = ""; }; 979486118B3E90C08386079D57962701 /* SnapKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SnapKit; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 9862A154F02C241514009AD44CC3567B /* RDEPUBReaderController+AttachmentTooltip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+AttachmentTooltip.swift"; sourceTree = ""; }; - 98A73A4E2FE3A04E24598C615F097708 /* RDEPUBTextBookBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookBuilder.swift; sourceTree = ""; }; + 9A2D50243BC80E38A54308D1350127D1 /* RDAIReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDAIReaderView-Info.plist"; sourceTree = ""; }; + 9A3467BB5CFDBA4B48A9830D47CED454 /* RDSpeechReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDSpeechReaderView.modulemap; sourceTree = ""; }; 9A381F075AF6CD9AFBB86130B39E20B4 /* DTFolderMonitor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFolderMonitor.m; path = Core/Source/DTFolderMonitor.m; sourceTree = ""; }; - 9C5C5D2EF233B42FA8D3BCF06713DF42 /* RDEPUBReaderChapterListController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChapterListController.swift; sourceTree = ""; }; 9C66F715840302F2CF4DA6C8558A09BD /* DTAnimatedGIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnimatedGIF.m; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.m; sourceTree = ""; }; - 9CC380EF32AB6FB2395CF0B9E62F3317 /* RDEPUBResourceDataProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBResourceDataProvider.swift; sourceTree = ""; }; + 9C9E8FA478D23AC4494D5120C081C48B /* CryptoKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CryptoKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CryptoKit.framework; sourceTree = DEVELOPER_DIR; }; + 9D87DBCF57F23239B520B73B9C238F64 /* RDPDFReaderPanelPresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPanelPresentation.swift; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9DD53D37218AA3C7D5C7756F00FA21E9 /* RDEPUBChapterOffsetMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterOffsetMap.swift; sourceTree = ""; }; + 9E0BE4A0D727AF11C82F9FAD7EAF28AC /* RDEpubReaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderFlowLayout.swift; sourceTree = ""; }; 9E4731BA187C02CDA816054F1F2BE70D /* UIScreen+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIScreen+DTFoundation.m"; path = "Core/Source/iOS/UIScreen+DTFoundation.m"; sourceTree = ""; }; - 9EC5B30703AA81763AA7A3A2A5A1C9CA /* RDEPUBSelectionOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSelectionOverlayView.swift; sourceTree = ""; }; 9F02C3AC85C88DDA0DB8A9EECF07DC35 /* DTFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-prefix.pch"; sourceTree = ""; }; - 9F3DE5DDD4D63B6FB5FEADA0E292CB33 /* Vision.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Vision.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Vision.framework; sourceTree = DEVELOPER_DIR; }; + 9F25AA42AB430C73FED1DE82FA2DF2DC /* RDEPUBReaderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderConfiguration.swift; sourceTree = ""; }; + 9F772869AF68874D248A1C55227A74BB /* RDEPUBViewportTypes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBViewportTypes.swift; sourceTree = ""; }; 9FD1F6CDF944640D5F1E2A81A5494657 /* DTObjectTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTObjectTextAttachment.h; path = Core/Source/DTObjectTextAttachment.h; sourceTree = ""; }; 9FE24D923BB63C2BD4397C37352A6204 /* NSString+Paragraphs.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+Paragraphs.h"; path = "Core/Source/NSString+Paragraphs.h"; sourceTree = ""; }; 9FECEDE17B4E87274DD2E9EBFD584ABF /* DTImageTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTImageTextAttachment.h; path = Core/Source/DTImageTextAttachment.h; sourceTree = ""; }; - A00A7D3C70A06A1D06B0EF2D25AA3DC8 /* String+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+RDEPUB.swift"; sourceTree = ""; }; A0BD46122D186FBB226483F8DB80E6CE /* ConstraintDirectionalInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsets.swift; path = Sources/ConstraintDirectionalInsets.swift; sourceTree = ""; }; A1A3A81081A2422058887BCEEAA78C9D /* UIView+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+DTFoundation.m"; path = "Core/Source/iOS/UIView+DTFoundation.m"; sourceTree = ""; }; - A2046F1B0D719EC5C1291C1714DF0751 /* RDEPUBReaderPaginationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPaginationCoordinator.swift; sourceTree = ""; }; - A24CED4F43EC2C2F55A6512A761B97B9 /* UIColor+RDEPUBHex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUBHex.swift"; sourceTree = ""; }; A319B0AD0B5F014BB090153D3020DBA5 /* DTAnimatedGIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAnimatedGIF.h; path = Core/Source/iOS/DTAnimatedGIF/DTAnimatedGIF.h; sourceTree = ""; }; - A5AAA2346B2236EB367432D8CD2FB317 /* RDPDFReaderKitView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderKitView.swift; sourceTree = ""; }; + A3942F6A75FD45095352344EAEA29F8B /* RDPDFReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDPDFReaderView.release.xcconfig; sourceTree = ""; }; + A3D8597FAB9BFFF6551C75F9A23E95F1 /* RDEPUBWebDecorationOverlayView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebDecorationOverlayView.swift; sourceTree = ""; }; + A45FEEA048A5AF7D46CAA3CDF72414CA /* ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist"; sourceTree = ""; }; + A51CF84AF3FB536008E31CBC800E12B8 /* RDPDFReaderContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderContainerView.swift; sourceTree = ""; }; + A58ABF7B052C2FEEC1FF9F105FD80470 /* RDEPUBReaderChapterListController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderChapterListController.swift; sourceTree = ""; }; + A5F66A96961A944FE192D39888B026E6 /* RDEPUBAnnotationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAnnotationModels.swift; sourceTree = ""; }; + A66549A3484418848E50313759E8FCFB /* RDEPUBPaginationCacheCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationCacheCoordinator.swift; sourceTree = ""; }; A672DF142E75858C34A342B2BB2AC891 /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; A67FB1DCECBDAA36B9B755606AC42C17 /* NSString+DTUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTUtilities.m"; path = "Core/Source/NSString+DTUtilities.m"; sourceTree = ""; }; - A6D09BDBD02839781AC66D29F3611E41 /* RDEPUBPaginationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationModels.swift; sourceTree = ""; }; - A76FEE9775014055776105D8698AE74E /* RDEpubReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderContentCell.swift; sourceTree = ""; }; + A6C3FFDC5714D18BE0534AF20F6C07CA /* RDSpeechReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDSpeechReaderView-dummy.m"; sourceTree = ""; }; + A722D0A8A8664F86E0905654992FA360 /* RDEPUBParser+TOC.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+TOC.swift"; sourceTree = ""; }; + A746B9DD2EDF2950A3F314EA3D5B2EF5 /* RDPDFReaderContentCell.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderContentCell.swift; sourceTree = ""; }; A7EDC6B8243A9B7E465C24C3E3032923 /* DTCoreTextConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextConstants.h; path = Core/Source/DTCoreTextConstants.h; sourceTree = ""; }; A7FD67CE75631597FF6EE0F345C77B9D /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Sources/ConstraintPriorityTarget.swift; sourceTree = ""; }; + A83ECB8E69E2047D86F4EA6D987E0B8A /* RDEPUBTextSelectionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSelectionController.swift; sourceTree = ""; }; + A8A2AD9A0A7E27EC46F2AD598250ED2C /* RDEPUBChapterDataCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterDataCache.swift; sourceTree = ""; }; + A8C14962F04ECA1A8B77093B8EF5E23B /* RDPDFReaderView+ToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDPDFReaderView+ToolView.swift"; sourceTree = ""; }; + A8D7E62479EFF470F47755931FC2BFA4 /* RDEPUBReaderSettings.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettings.swift; sourceTree = ""; }; AA0811310099A4BCB3D52683B70DB3D1 /* Pods-ReadViewDemo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ReadViewDemo-dummy.m"; sourceTree = ""; }; AA5EA82ABC61B0B974592D4CA89ACF8C /* ZIPFoundation-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ZIPFoundation-prefix.pch"; sourceTree = ""; }; AABB72617A844FF5405C727A0A23D568 /* NSMutableAttributedString+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableAttributedString+HTML.m"; path = "Core/Source/NSMutableAttributedString+HTML.m"; sourceTree = ""; }; + AADAFB1246D8B4F7930DFDE508B2271A /* RDEPUBChapterCacheKey.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterCacheKey.swift; sourceTree = ""; }; AC22C3CB82EEE746663403422F344116 /* DTAccessibilityViewProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAccessibilityViewProxy.m; path = Core/Source/DTAccessibilityViewProxy.m; sourceTree = ""; }; AC925B7832B651D3B1C84393FF2F9573 /* DTCoreTextGlyphRun.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextGlyphRun.h; path = Core/Source/DTCoreTextGlyphRun.h; sourceTree = ""; }; ACD3CB33E5A4E915E5F4C09F4684FFF2 /* NSAttributedString+SmallCaps.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+SmallCaps.h"; path = "Core/Source/NSAttributedString+SmallCaps.h"; sourceTree = ""; }; - AE3CFAC2C855F60E5A3BFC2F3861BA1C /* RDEPUBReaderLocationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderLocationCoordinator.swift; sourceTree = ""; }; + ADC5802DC43F329301B626F990A0D308 /* wxread-dark.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-dark.css"; path = "EPUBCore/Resources/wxread-dark.css"; sourceTree = ""; }; + AE2565A3B94D5C14329E580ABC077884 /* RDEPUBPageBreakPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageBreakPolicy.swift; sourceTree = ""; }; + AE29D77AF696BBB755DED2A768C03D64 /* RDEPUBReaderController+TableOfContents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+TableOfContents.swift"; sourceTree = ""; }; AE51B89744E67BA9CF7E4E2C6DB4DA05 /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Sources/ConstraintRelation.swift; sourceTree = ""; }; - AED29B787D83E9C4459430CDE0DB612A /* epub-fixed-layout.html */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-fixed-layout.html"; path = "EPUBCore/Resources/epub-fixed-layout.html"; sourceTree = ""; }; + AEDD0F8FBE7C14A783C94B709F23A4DB /* RDEPUBModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBModels.swift; sourceTree = ""; }; AF41F6780E56AB0F76C46A75363DA697 /* NSDictionary+DTError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSDictionary+DTError.m"; path = "Core/Source/NSDictionary+DTError.m"; sourceTree = ""; }; AFBB8005939E9A85DD9BDAEAA3002E57 /* DTHTMLWriter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLWriter.h; path = Core/Source/DTHTMLWriter.h; sourceTree = ""; }; AFFD40FFE61C73861D47FD66561E7E93 /* DTIframeTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTIframeTextAttachment.h; path = Core/Source/DTIframeTextAttachment.h; sourceTree = ""; }; - B0AC91254785C4B0B73D391B603ADE47 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; - B15FA2EA6F88DB9AE0FB9356EC5B515C /* RDEPUBChapterSummaryDiskCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterSummaryDiskCache.swift; sourceTree = ""; }; + B03E48EA4685C3F0EC2C0C5A2714C60F /* RDSpeechReaderView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RDSpeechReaderView; path = RDSpeechReaderView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B1A0367B13040EC2A557AA275A2D16D0 /* RDEPUBCFICompatibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFICompatibility.swift; sourceTree = ""; }; B1D682E70FAFEEF08569FCA32E219FD1 /* ZIPFoundation.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.debug.xcconfig; sourceTree = ""; }; - B1F0955DB654E4B3265622218E9CF71A /* RDPDFReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDPDFReaderView-umbrella.h"; sourceTree = ""; }; B2542127DF3D3CEF3D1EB999F8576341 /* NSFileWrapper+DTCopying.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSFileWrapper+DTCopying.m"; path = "Core/Source/NSFileWrapper+DTCopying.m"; sourceTree = ""; }; - B36A4B649DD5CA1C5D4DAFC54E0E13DC /* RDEPUBSemanticMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSemanticMarkerInjector.swift; sourceTree = ""; }; + B39D4ED1F553815AA8DA4B6C47C7269B /* RDEPUBCFIDOMPathBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIDOMPathBuilder.swift; sourceTree = ""; }; B3C67AF64AACAFBCB1D6D909BF030731 /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Sources/LayoutConstraintItem.swift; sourceTree = ""; }; - B3F4461DF9B7620283F97023A78C08D8 /* epub-bridge.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "epub-bridge.js"; path = "EPUBCore/Resources/epub-bridge.js"; sourceTree = ""; }; - B3FC196B05ACAB99474CEA476B0CD195 /* RDPDFReaderImageTextLayerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderImageTextLayerView.swift; sourceTree = ""; }; B44119BC710BFFD4549A1B83FBF80CF8 /* DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCompatibility.h; path = Core/Source/DTCompatibility.h; sourceTree = ""; }; + B454B7709E93E1E886E4FA533B06802D /* RDEpubReaderView+PageCurl.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+PageCurl.swift"; sourceTree = ""; }; B466C1278D8245B512592A07C1965D32 /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Sources/ConstraintConstantTarget.swift; sourceTree = ""; }; - B4B83042E21707CE00778B566E8CB805 /* RDEPUBDarkImageAdjuster.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDarkImageAdjuster.swift; sourceTree = ""; }; + B46D01D4D15C2295F678A21C84B825ED /* NaturalLanguage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NaturalLanguage.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/NaturalLanguage.framework; sourceTree = DEVELOPER_DIR; }; B53424287733C45D387175CE9132AFBD /* DTCoreTextFontCollection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextFontCollection.m; path = Core/Source/DTCoreTextFontCollection.m; sourceTree = ""; }; - B59F66F549E44C57A256286385891551 /* RDEPUBTextPerformanceSampler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPerformanceSampler.swift; sourceTree = ""; }; + B58293AB5053B6AA340D1D55A7FD0312 /* RDEPUBTextLayoutFrame.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayoutFrame.swift; sourceTree = ""; }; B5E7F56675C029BC561A7EFB55EF0041 /* UIImage+DTFoundation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+DTFoundation.m"; path = "Core/Source/iOS/UIImage+DTFoundation.m"; sourceTree = ""; }; B616B1E339BA326837E6325F3F291E51 /* NSAttributedString+DTDebug.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+DTDebug.m"; path = "Core/Source/NSAttributedString+DTDebug.m"; sourceTree = ""; }; B646DEE91A4E62F132C54E702B8BDF18 /* DTAttributedTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextView.h; path = Core/Source/DTAttributedTextView.h; sourceTree = ""; }; - B6677A5CD728A7E722DC3075C374CDF4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - B6BC7F1D23C7996F1D9C176B3EB7F0A6 /* RDPDFReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDPDFReaderView-Info.plist"; sourceTree = ""; }; - B6FC740435D649A1BF4303E48F85889C /* RDEPUBReaderController+LocationResolution.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+LocationResolution.swift"; sourceTree = ""; }; + B662AF2609AEAE5D2B6488E6FBEBDC3B /* RDEPUBNoteResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteResolver.swift; sourceTree = ""; }; + B6A8CFFD406BC9FB4C712614283CE66C /* RDEpubReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDEpubReaderView.modulemap; sourceTree = ""; }; B71BC62246AFEBD517D3175813789310 /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Sources/Debugging.swift; sourceTree = ""; }; B72E60DFC15F208F1BA00518E64F79B5 /* CTLineUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CTLineUtils.h; path = Core/Source/CTLineUtils.h; sourceTree = ""; }; - B7B712780654B2698F0379C758B2613E /* RDPDFReaderPersistenceStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPersistenceStore.swift; sourceTree = ""; }; - B81D503CA2CCE9D4172B5D9BB346ED30 /* RDEPUBPaginationCacheCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPaginationCacheCoordinator.swift; sourceTree = ""; }; + B75141FED04E4EEC380F0173E5DEBCA7 /* RDAIReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDAIReaderView.release.xcconfig; sourceTree = ""; }; + B85CCDCC8D0342F8925CA9263B57A3AE /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; B8CC7968142149B581329E3460D35484 /* NSCoder+DTCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCoder+DTCompatibility.h"; path = "Core/Source/NSCoder+DTCompatibility.h"; sourceTree = ""; }; - B977B258211F447182E6FA36952EA842 /* RDEPUBImageViewerCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewerCoordinator.swift; sourceTree = ""; }; B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SnapKit-SnapKit_Privacy"; path = SnapKit_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - B9E2296EBB237D8071B8280E81601AE2 /* RDEPUBBookPageMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBookPageMap.swift; sourceTree = ""; }; BA83941397AFE127903C2DA0EE626295 /* NSScanner+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSScanner+HTML.m"; path = "Core/Source/NSScanner+HTML.m"; sourceTree = ""; }; BAC3BCDBDD88D30A3F51094944FB70FC /* DTSmartPagingScrollView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTSmartPagingScrollView.h; path = Core/Source/iOS/DTSmartPagingScrollView.h; sourceTree = ""; }; BADC1A043414D84FBAFBF86CAC8F5399 /* DTCoreTextLayoutFrame+Cursor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTCoreTextLayoutFrame+Cursor.m"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.m"; sourceTree = ""; }; BB2A34C872861E98642DDE455E8E3A72 /* DTAttributedTextCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedTextCell.h; path = Core/Source/DTAttributedTextCell.h; sourceTree = ""; }; + BB559C50CCDA34EDD0525268B980948E /* RDEPUBSafeArea.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSafeArea.swift; sourceTree = ""; }; BB7271637D32095C0F526965851E2E06 /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Sources/ConstraintLayoutSupportDSL.swift; sourceTree = ""; }; - BBD91BDB14FD6C89E095E237DC0F37A7 /* RDEPUBReaderBottomToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderBottomToolView.swift; sourceTree = ""; }; - BC923AF5182183071C8C905DCFD0C5DC /* RDPDFReaderAnnotationEditorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderAnnotationEditorViewController.swift; sourceTree = ""; }; + BB7C3A637594FCD8D6F09237F5103A39 /* RDPDFReaderChromeViews.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderChromeViews.swift; sourceTree = ""; }; + BBED33030719998F00A5173D3C466BD8 /* RDPDFReaderKitView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderKitView.swift; sourceTree = ""; }; + BC0B0BF8324AE3EE918E0885D68E209D /* RDPDFReaderView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = RDPDFReaderView.modulemap; sourceTree = ""; }; + BC7700A9EB3EB33F6095CC49EA54E6C1 /* RDEPUBBuildDiagnosticsReporter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBuildDiagnosticsReporter.swift; sourceTree = ""; }; + BCBD48F4256CF6916C32ACC00CA15E31 /* RDAIReaderContracts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAIReaderContracts.swift; path = Core/RDAIReaderContracts.swift; sourceTree = ""; }; + BCEC432BB6F19EF8C918567EDAE34801 /* RDEpubReaderPreloadController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderPreloadController.swift; sourceTree = ""; }; BCF9B3BF987216CF1766D80FED04CF72 /* FileManager+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "FileManager+ZIP.swift"; path = "Sources/ZIPFoundation/FileManager+ZIP.swift"; sourceTree = ""; }; + BD16456E8ACD41D8A266CD43400B6374 /* RDEPUBReaderPersistence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderPersistence.swift; sourceTree = ""; }; + BD629E1D77971203EB1E5EE5C5BA2BAC /* RDEPUBTextRendererSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRendererSupport.swift; sourceTree = ""; }; + BD727D8D750906C2FCA03FA988C99329 /* RDAIReaderView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RDAIReaderView; path = RDAIReaderView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BD929E02D9C56EC44BBB74C1999F9892 /* DTHTMLElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLElement.h; path = Core/Source/DTHTMLElement.h; sourceTree = ""; }; + BDC92A937FE8D7CA37ED82CCEDBCC6E5 /* RDEPUBTextContentInteractionCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextContentInteractionCoordinator.swift; sourceTree = ""; }; BDDC3A2D20818C31909CC4C3F4BB4F96 /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Sources/Typealiases.swift; sourceTree = ""; }; BDFD7D9A4BFFBB2603B10E3A432551B6 /* NSString+DTPaths.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTPaths.h"; path = "Core/Source/NSString+DTPaths.h"; sourceTree = ""; }; - BDFF6A065216B0DB4C460DB8E30D43AB /* RDPDFReaderDebugViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDebugViewController.swift; sourceTree = ""; }; - BE2A00DBD5096609160A1EBB511C0CF0 /* RDEPUBNoteModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteModels.swift; sourceTree = ""; }; - BE9EC25AFCAE91B4EA5A1DDD5FE564DD /* wxread-replace-latin.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace-latin.css"; path = "EPUBCore/Resources/wxread-replace-latin.css"; sourceTree = ""; }; - BEAE3FA90F67CCE6CFC228B56189BD20 /* RDEPUBJumpSession.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBJumpSession.swift; sourceTree = ""; }; - BEC7D701A0361A9C2BB93906A4A7DFDD /* RDEPUBTextBookCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBookCache.swift; sourceTree = ""; }; - BECF37BB61D57665E8B2439D3B326503 /* RDEPUBTextPageRenderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageRenderView.swift; sourceTree = ""; }; - BFB4A8DFD2E0EE6D2285B69A5BEA0CBE /* RDEPUBPageCountCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageCountCache.swift; sourceTree = ""; }; - BFCB5D51A2FE9AE00599C8B10A728AC7 /* RDEPUBWebView+Search.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Search.swift"; sourceTree = ""; }; BFD69C3CC4E96BBD5634E64370DBDA98 /* DTDictationPlaceholderView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTDictationPlaceholderView.m; path = Core/Source/DTDictationPlaceholderView.m; sourceTree = ""; }; + C001AE419BF0DC7FC7836C5BDCD9CF76 /* RDEPUBReaderRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderRuntime.swift; sourceTree = ""; }; C06D2A51375DCB872C5A41004E287C0D /* SnapKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapKit-dummy.m"; sourceTree = ""; }; C171DA66E3550E5F4492D2964AB04FB2 /* DTImage+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "DTImage+HTML.m"; path = "Core/Source/DTImage+HTML.m"; sourceTree = ""; }; - C24DC0DF11DB45CDC92395B3EA2689B5 /* RDEPUBStyleSheetBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetBuilder.swift; sourceTree = ""; }; - C26F63F750A573082295256163B7B3F7 /* RDEPUBCFIParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIParser.swift; sourceTree = ""; }; + C1B094ABE0685E65E249C93BF2B135A9 /* RDAIReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDAIReaderView-umbrella.h"; sourceTree = ""; }; + C26B30F895FEA65F0D322407234375F0 /* RDEPUBReaderTheme.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTheme.swift; sourceTree = ""; }; C3096FD2B7053B4AF08D2B6156C7CA1A /* DTTextHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextHTMLElement.m; path = Core/Source/DTTextHTMLElement.m; sourceTree = ""; }; - C351D0643D777D8082434A64A04B7312 /* RDEPUBCFITextAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFITextAssertion.swift; sourceTree = ""; }; - C3BA5BC80827B5E54253367E574D3623 /* RDEPUBFixedLayoutTemplate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFixedLayoutTemplate.swift; sourceTree = ""; }; - C4701A7F7E553E7824903F43562AFC19 /* wxread-replace.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace.css"; path = "EPUBCore/Resources/wxread-replace.css"; sourceTree = ""; }; - C48F11FB4EFE57B4DED13881F78ED4A8 /* rangy-core.js */ = {isa = PBXFileReference; includeInIndex = 1; name = "rangy-core.js"; path = "EPUBCore/Resources/rangy-core.js"; sourceTree = ""; }; - C4E616B199145721C28A90BE0D21C98B /* RDEPUBImageViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewController.swift; sourceTree = ""; }; - C5090C56303AB966C51846110FF05A64 /* RDPDFReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDPDFReaderView.debug.xcconfig; sourceTree = ""; }; + C357AC8D7A6E01440AC68979B529B2F7 /* RDSpeechReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDSpeechReaderView.debug.xcconfig; sourceTree = ""; }; + C3D2DECDF3F1951B4030402CDC6F89E8 /* PDFKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PDFKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/PDFKit.framework; sourceTree = DEVELOPER_DIR; }; + C42BB280740ACCEAD29B912A1D47F29B /* RDEPUBParser+Package.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Package.swift"; sourceTree = ""; }; C56EB0E701347B766F12260495801CE1 /* DTCoreTextFontDescriptor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextFontDescriptor.h; path = Core/Source/DTCoreTextFontDescriptor.h; sourceTree = ""; }; - C5F29D53A7FD825F0CEAB345B46B3FC6 /* RDPDFReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDPDFReaderView-dummy.m"; sourceTree = ""; }; C6303D6C8B50248F87D70D77E2CA66B7 /* DTCSSListStyle.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCSSListStyle.m; path = Core/Source/DTCSSListStyle.m; sourceTree = ""; }; - C6954E717DF2A17466B5D30D25C12666 /* RDPDFReaderAnnotationListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderAnnotationListViewController.swift; sourceTree = ""; }; - C6B4FC527668E1E4A43F77E5D5B034EF /* RDEPUBAttachmentNormalizer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAttachmentNormalizer.swift; sourceTree = ""; }; - C70BC146F77AE5CE624A06A7946C1703 /* RDEPUBCFIMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMarkerInjector.swift; sourceTree = ""; }; - C764F1B6E5567DB91D1ABE809D25AB99 /* RDEpubReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderPageChildViewController.swift; sourceTree = ""; }; + C6414219D018ADCECF6E5804C284BED7 /* RDEPUBCFIError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIError.swift; sourceTree = ""; }; C7EDB07502C56DF3D4F6E90F93880B28 /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Sources/ConstraintConfig.swift; sourceTree = ""; }; - C7FC439421769A5FC6884F5135ABAF08 /* RDEPUBFragmentMarkerInjector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFragmentMarkerInjector.swift; sourceTree = ""; }; C80235C2E1DB28406F275E23F0ADDE9B /* ConstraintMakerRelatable+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintMakerRelatable+Extensions.swift"; path = "Sources/ConstraintMakerRelatable+Extensions.swift"; sourceTree = ""; }; C808AC5A8C55E7E56EF916C622B6091A /* NSString+DTURLEncoding.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTURLEncoding.h"; path = "Core/Source/NSString+DTURLEncoding.h"; sourceTree = ""; }; C862AF3C9768AEC3AF792217547BE47D /* NSString+DTPaths.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTPaths.m"; path = "Core/Source/NSString+DTPaths.m"; sourceTree = ""; }; + C8857C84AAC2099B1037C035B8AFF5AF /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + C8A3FE7990354EF1819DAB32FB09040F /* RDEPUBReaderController+ContentDelegates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ContentDelegates.swift"; sourceTree = ""; }; C8A6E90AB5E26049710E2C2404C28B9A /* RDEpubReaderView-RDEpubReaderViewAssets */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "RDEpubReaderView-RDEpubReaderViewAssets"; path = RDEpubReaderViewAssets.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; C911EE625C8CD488E8B66FA8BA2B5C8F /* DTTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTextAttachment.h; path = Core/Source/DTTextAttachment.h; sourceTree = ""; }; + C91AB03142606446D515451D75613853 /* RDPDFReaderAnnotationEditorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderAnnotationEditorViewController.swift; sourceTree = ""; }; C920C702702D03C98A6A6ADDE53C9E78 /* DTCoreTextLayoutFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextLayoutFrame.h; path = Core/Source/DTCoreTextLayoutFrame.h; sourceTree = ""; }; - C9D1B125AA5600F835F9AB456100B5BC /* RDEPUBReaderController+TableOfContents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+TableOfContents.swift"; sourceTree = ""; }; + C97A2E9C7E5DFF37C06187E6AFBB3CC8 /* RDEPUBRenderDiagnosticsCollector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderDiagnosticsCollector.swift; sourceTree = ""; }; + C9B7588747FF74836493105F6698CC00 /* RDEPUBNoteModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNoteModels.swift; sourceTree = ""; }; CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "ZIPFoundation-ZIPFoundation_Privacy"; path = ZIPFoundation_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - CA7B6B7B55D1E706B41644DDA956D2CA /* RDEPUBSearchModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchModels.swift; sourceTree = ""; }; CAED9812FF45FFA82A7B68F7B2B656D4 /* DTCSSListStyle.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCSSListStyle.h; path = Core/Source/DTCSSListStyle.h; sourceTree = ""; }; - CB6B2A6C61E6FB95968A8366924DE033 /* RDEPUBReaderHighlightsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderHighlightsViewController.swift; sourceTree = ""; }; - CB985E900E9F34170BD44A81E7FD1C83 /* RDEPUBRenderDiagnosticsCollector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderDiagnosticsCollector.swift; sourceTree = ""; }; + CB33A3E20E2517AE2775CBBD4FB0642D /* UIColor+RDEPUBHex.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUBHex.swift"; sourceTree = ""; }; CBD58858F74B286AB42B1D9C0E299BC0 /* Archive+MemoryFile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+MemoryFile.swift"; path = "Sources/ZIPFoundation/Archive+MemoryFile.swift"; sourceTree = ""; }; - CC13BF0AF43ECCBA7F956B059633C358 /* RDEPUBReaderState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderState.swift; sourceTree = ""; }; + CC507AA13E507E6197F6E4B3BB70F899 /* RDEPUBReaderEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderEnvironment.swift; sourceTree = ""; }; + CD49AF7F1AEB81E28CF54BDF4BEB7343 /* RDEPUBAIContentProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDEPUBAIContentProvider.swift; path = AI/RDEPUBAIContentProvider.swift; sourceTree = ""; }; + CD5495829095E37CEDC515A639F9A9E4 /* RDEPUBReaderContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderContext.swift; sourceTree = ""; }; CD770BD6314F1E02A05DC9744C65B5A4 /* SnapKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.debug.xcconfig; sourceTree = ""; }; - CD9D544D3DF2CDAE5B6EECFF892BD9F5 /* RDEPUBReaderController+PublicAPI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+PublicAPI.swift"; sourceTree = ""; }; CDDC623AB1701601A907DA67C2F8F283 /* DTAnchorHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAnchorHTMLElement.m; path = Core/Source/DTAnchorHTMLElement.m; sourceTree = ""; }; + CE1FA1663AC56607EB2C5556FB73813E /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; CE669FB235F0A79C31606AC2D531E6C7 /* DTCoreTextLayoutFrame+Cursor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "DTCoreTextLayoutFrame+Cursor.h"; path = "Core/Source/DTCoreTextLayoutFrame+Cursor.h"; sourceTree = ""; }; + CE673C095E86DC64BE73E53BA8C59702 /* RDPDFSpeechContentProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDPDFSpeechContentProvider.swift; path = Speech/RDPDFSpeechContentProvider.swift; sourceTree = ""; }; + CEDDBBF79781F69878880132910803DD /* RDEPUBTextSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextSearchEngine.swift; sourceTree = ""; }; + CEFCC148B58604D0C5A3C240C51B45FD /* RDPDFReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDPDFReaderView-dummy.m"; sourceTree = ""; }; + CF159AB510600EA0CD9EAE58F29A6582 /* RDPDFReaderNavigationPanelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderNavigationPanelViewController.swift; sourceTree = ""; }; + CF4F453E8FCDC0F85D36928C5390D77A /* RDEPUBWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebView.swift; sourceTree = ""; }; CFF70C90945A3410647B87CF1F107605 /* NSCharacterSet+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSCharacterSet+HTML.h"; path = "Core/Source/NSCharacterSet+HTML.h"; sourceTree = ""; }; - D1057324B30CCD038ABC27688B0DC6A3 /* RDPDFReaderPageChildViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPageChildViewController.swift; sourceTree = ""; }; - D18CE46766B67622CBA19146529FE7AD /* RDEPUBReaderSettingsViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSettingsViewController.swift; sourceTree = ""; }; + D098B6BDF458996B5B3A757722DF5C3B /* RDEPUBPageInteractionController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPageInteractionController.swift; sourceTree = ""; }; + D0F55A232678D2676458E413833B0C17 /* RDEPUBAnnotationEditorViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBAnnotationEditorViewController.swift; sourceTree = ""; }; D1E89A31867FF1FB44B4B999988F1B82 /* DTFoundation */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DTFoundation; path = DTFoundation.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D1F34DCA2B1BAA4FC1470138FC11B494 /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Sources/ConstraintInsetTarget.swift; sourceTree = ""; }; - D241F2043503DC1C01B6FBDE8C08DD1B /* RDEPUBReaderAssemblyCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderAssemblyCoordinator.swift; sourceTree = ""; }; - D24510AD02ED2650316ED6246FD926EE /* RDEPUBReaderUIState.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderUIState.swift; sourceTree = ""; }; D245D04D70A4D36DC86741D0833AA95A /* NSMutableArray+DTMoving.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSMutableArray+DTMoving.m"; path = "Core/Source/NSMutableArray+DTMoving.m"; sourceTree = ""; }; - D27A3BD8D86D036B86A90C4384EF483A /* RDEPUBTextLayouter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextLayouter.swift; sourceTree = ""; }; - D2B596E0DC8B043ECE5DAEFEF7DD2EBC /* RDPDFReaderDrawingLayersView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDrawingLayersView.swift; sourceTree = ""; }; D362CCA87B017930E7481AFE2E73FB74 /* DTExtendedFileAttributes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTExtendedFileAttributes.h; path = Core/Source/DTExtendedFileAttributes.h; sourceTree = ""; }; D3A4BA792340D151ECB734018B2FD3EF /* DTCustomColoredAccessory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCustomColoredAccessory.m; path = Core/Source/iOS/DTCustomColoredAccessory.m; sourceTree = ""; }; D3C2F16A4F9F4BEAA317715C1F17C81F /* DTCoreTextMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTCoreTextMacros.h; path = Core/Source/DTCoreTextMacros.h; sourceTree = ""; }; - D3CE152E896CA22C59944E4E3BBBF760 /* RDPDFReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDPDFReaderView.release.xcconfig; sourceTree = ""; }; - D436946B4DC3D4F40E7B50F9F3A77DF6 /* RDEPUBTextBuildPipelineInterfaces.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextBuildPipelineInterfaces.swift; sourceTree = ""; }; + D3FE3107482A464FFADCB685658099F9 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; + D475ACC199E6D23FD275CCF5D187243B /* RDEpubReaderView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDEpubReaderView.debug.xcconfig; sourceTree = ""; }; D4A82B2715640986D3701AF889DBD599 /* UIFont+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIFont+DTCoreText.h"; path = "Core/Source/UIFont+DTCoreText.h"; sourceTree = ""; }; - D4ABEB07AC55D55BE9BCECAA2B25D794 /* RDEpubReaderView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RDEpubReaderView-dummy.m"; sourceTree = ""; }; + D50156C4B53F70228DCAC0501DB9226C /* RDEPUBStyleSheetBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBStyleSheetBuilder.swift; sourceTree = ""; }; + D52E6C5D8864C2E11D3F6143638FFA82 /* RDEPUBRuntimeChapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimeChapter.swift; sourceTree = ""; }; D53EC1D66653102E077AA44906338EB5 /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Sources/ConstraintRelatableTarget.swift; sourceTree = ""; }; D557DED28FA9EA85219AF05C93296C6D /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = ""; }; - D5657837156EA19733E55FE7DE6403C6 /* RDEpubReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDEpubReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - D597E864BC3B6215B502FC3B05C13364 /* RDEPUBNotePopupCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBNotePopupCoordinator.swift; sourceTree = ""; }; + D597E4B20DB22DA3D2C43EAE0285EFB5 /* RDEPUBCFISerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFISerializer.swift; sourceTree = ""; }; D5D2445B4619EC0C62C7560649DD2204 /* ZIPFoundation-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ZIPFoundation-dummy.m"; sourceTree = ""; }; - D6A2D1BF70F1C6B7354AC88C3DC52656 /* RDEPUBChapterLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLocation.swift; sourceTree = ""; }; - D730579455F74FB03C7E8A4E50484823 /* RDEPUBReaderController+ExternalLinks.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBReaderController+ExternalLinks.swift"; sourceTree = ""; }; - D752B202581818FDFBB68CDD7FA75213 /* RDEPUBWebView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBWebView.swift; sourceTree = ""; }; D7826602DA2629A5A1DD5912ADCAF5B8 /* ZIPFoundation.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ZIPFoundation.release.xcconfig; sourceTree = ""; }; D7B730A14FDA23EC9BB3ED876FBD5BA4 /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintView+Extensions.swift"; path = "Sources/ConstraintView+Extensions.swift"; sourceTree = ""; }; - D7D294019CB6322021FE87237FA56DA3 /* RDEPUBReaderTableOfContentsItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTableOfContentsItem.swift; sourceTree = ""; }; D7D4385F08260E348B370DC79366E6CD /* DTCoreTextConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextConstants.m; path = Core/Source/DTCoreTextConstants.m; sourceTree = ""; }; - D815A3BEB1A8F3959502A4B87558549C /* RDEPUBParser+Archive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBParser+Archive.swift"; sourceTree = ""; }; D816721347D943A1D204E1507FFA5019 /* DTAccessibilityElement.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAccessibilityElement.h; path = Core/Source/DTAccessibilityElement.h; sourceTree = ""; }; - D86146C71353D766AED457B0B59F13E3 /* RDEPUBReaderTopToolView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTopToolView.swift; sourceTree = ""; }; D89968532D9F2672C6B6D01C290AE466 /* DTDictationPlaceholderTextAttachment.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTDictationPlaceholderTextAttachment.h; path = Core/Source/DTDictationPlaceholderTextAttachment.h; sourceTree = ""; }; - D8CD636112E10AA865F164AA3D168C00 /* RDEPUBReaderEnvironment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderEnvironment.swift; sourceTree = ""; }; - D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; D8D859DA88367D318DA839A12B29A149 /* NSAttributedString+DTCoreText.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSAttributedString+DTCoreText.h"; path = "Core/Source/NSAttributedString+DTCoreText.h"; sourceTree = ""; }; D92D7AF796DC45709FBBF4BBCBF47095 /* DTColorFunctions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTColorFunctions.m; path = Core/Source/DTColorFunctions.m; sourceTree = ""; }; + D94A0293C1A11AB0BF793F0804AF01BA /* RDSpeechReaderView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RDSpeechReaderView-umbrella.h"; sourceTree = ""; }; D97A43F1E6018B92E85B58BB6549F7CB /* NSData+DTCrypto.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+DTCrypto.h"; path = "Core/Source/NSData+DTCrypto.h"; sourceTree = ""; }; - D984CA4AF47D4219E0FB6506CD7D2C27 /* RDEPUBCFISerializer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFISerializer.swift; sourceTree = ""; }; - D9FE68DE46E8F50DDA44B5EF63ABC67A /* RDEPUBWebView+Reflowable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Reflowable.swift"; sourceTree = ""; }; + D9B368C95FB7C2727A7CA452242CB904 /* RDPDFReaderPersistenceStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPersistenceStore.swift; sourceTree = ""; }; + DA1B0A108E49438640DBDD0A70FD293A /* RDEPUBParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBParser.swift; sourceTree = ""; }; DA93674B4C34DA54D242189AEEAF99FE /* DTFoundation.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = DTFoundation.modulemap; sourceTree = ""; }; DAAA91CA607516E42FAA5C2245D6E0C2 /* Data+CompressionDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+CompressionDeprecated.swift"; path = "Sources/ZIPFoundation/Data+CompressionDeprecated.swift"; sourceTree = ""; }; DBAEA965F9F262BB8BF17C77B01C0956 /* Archive+Writing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Writing.swift"; path = "Sources/ZIPFoundation/Archive+Writing.swift"; sourceTree = ""; }; - DC04C30BD0D2F6408EB5B8054F36B4F2 /* RDEPUBCFIPath.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIPath.swift; sourceTree = ""; }; - DC7EF3FC064B375733390FA3799A617B /* RDEPUBRenderRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRenderRequest.swift; sourceTree = ""; }; - DD002812D1D11866A93FEFB5024D5DA0 /* RDPDFReaderView+CollectionView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDPDFReaderView+CollectionView.swift"; sourceTree = ""; }; + DD4C2E0881354D1B1CF3ADF0A8A3E552 /* RDReaderDocumentFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDReaderDocumentFormat.swift; sourceTree = ""; }; DE5387758E4F1C4128BE4A1E8D68A9BD /* NSString+DTURLEncoding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+DTURLEncoding.m"; path = "Core/Source/NSString+DTURLEncoding.m"; sourceTree = ""; }; - DE5B47B33D7F759C3CD6BEDA1A69185D /* UIColor+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+RDEPUB.swift"; sourceTree = ""; }; - E02FC3DBD9707CA1A2C087E36DEBDFF8 /* RDEPUBDecryptingImageAttachment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDecryptingImageAttachment.swift; sourceTree = ""; }; - E0E0892DD8B09BBF7E0234F6E258D6B5 /* RDMOBIParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDMOBIParser.swift; sourceTree = ""; }; - E1308D476F85ACCA10D54AF2ED9B34BE /* RDEPUBChapterDisplayContentCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterDisplayContentCache.swift; sourceTree = ""; }; + DFBBED2FC1668912DBF7592720CC14A4 /* RDPDFReaderDrawingLayersView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderDrawingLayersView.swift; sourceTree = ""; }; + E0CAA288D149C9793B45AC10F40DABE4 /* RDEpubReaderView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderView.swift; sourceTree = ""; }; + E0F8B1A04DAD3F227758BEB6D5D4D5E9 /* RDEPUBCFIMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMap.swift; sourceTree = ""; }; E15930CD8D9ED2F990B87E8F78DD5A32 /* DTStylesheetHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTStylesheetHTMLElement.m; path = Core/Source/DTStylesheetHTMLElement.m; sourceTree = ""; }; + E1BB480EA8E2ED1FEEC70C334BA00FD5 /* RDEPUBPublication.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPublication.swift; sourceTree = ""; }; E1D1532D1876B11C0E08D8B7D4FA131B /* Data+Serialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Data+Serialization.swift"; path = "Sources/ZIPFoundation/Data+Serialization.swift"; sourceTree = ""; }; E209D74CEC1626A09885E55370AEFA53 /* Date+ZIP.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Date+ZIP.swift"; path = "Sources/ZIPFoundation/Date+ZIP.swift"; sourceTree = ""; }; - E242368DFEDB6BD27EDA8C0E5915D6F5 /* RDEPUBReaderDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderDelegate.swift; sourceTree = ""; }; + E263E2A2BC1CFE65C51095296C21D4EE /* RDEPUBTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRenderer.swift; sourceTree = ""; }; E26546A9CD322544BEF648DFE2B26D7D /* NSCharacterSet+HTML.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSCharacterSet+HTML.m"; path = "Core/Source/NSCharacterSet+HTML.m"; sourceTree = ""; }; E2993B5AF554E26603DFF0DE92D89C92 /* DTTextAttachmentHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTTextAttachmentHTMLElement.m; path = Core/Source/DTTextAttachmentHTMLElement.m; sourceTree = ""; }; - E3BF1AFD43CD35EDA59ED119955FAC96 /* RDPDFReaderView+Paging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDPDFReaderView+Paging.swift"; sourceTree = ""; }; - E5C393B65BEDBCD67A7B2BD0FD26B869 /* RDEPUBReaderContext.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderContext.swift; sourceTree = ""; }; + E307745D06FCCA8EE3825E00C050479F /* RDEpubReaderView+ContentAccess.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEpubReaderView+ContentAccess.swift"; sourceTree = ""; }; + E3AC0D799821BAB2769DC35260D98143 /* RDAISpeechContentProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RDAISpeechContentProvider.swift; path = AIBridge/RDAISpeechContentProvider.swift; sourceTree = ""; }; + E47128B5AD65D4FA9BA728CDF73C47E5 /* RDEPUBReadingLocationModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReadingLocationModels.swift; sourceTree = ""; }; + E645DF57426CBB76570142F9D580209F /* wxread-default.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-default.css"; path = "EPUBCore/Resources/wxread-default.css"; sourceTree = ""; }; E64ED14B8FB7C0060C3BAA215AC25363 /* Entry+ZIP64.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Entry+ZIP64.swift"; path = "Sources/ZIPFoundation/Entry+ZIP64.swift"; sourceTree = ""; }; E6AD45B90D08BACAF3AF76AE40BBCC10 /* DTFoundation-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTFoundation-umbrella.h"; sourceTree = ""; }; - E6BD7E7A08332F631D063AEBB4DD8F7C /* RDEPUBTextPageBoundaryValidator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPageBoundaryValidator.swift; sourceTree = ""; }; - E6F0CF779FBA5FFD0E72068E1F714942 /* RDEpubReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDEpubReaderView-Info.plist"; sourceTree = ""; }; - E74C786C11A2410677CDAEBF7DD1B4AD /* RDEpubReaderGestureController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderGestureController.swift; sourceTree = ""; }; + E7112D0C2BB66532AB032E85DB736D16 /* RDSpeechReaderView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "RDSpeechReaderView-Info.plist"; sourceTree = ""; }; E757F9EEC3FE914CD8CFDFF7173A5D6E /* DTLazyImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTLazyImageView.m; path = Core/Source/DTLazyImageView.m; sourceTree = ""; }; E7890CD33BD10753D1D971AD2FE20A74 /* DTLinkButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTLinkButton.h; path = Core/Source/DTLinkButton.h; sourceTree = ""; }; + E7B65425D5E15E4D005158BE86FAB4EA /* RDEPUBCFIResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIResolver.swift; sourceTree = ""; }; + E908B49F91AB4BAC14DB2AA9E94526D9 /* RDEPUBReaderTableOfContentsItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderTableOfContentsItem.swift; sourceTree = ""; }; + E91A6DF5577800E7F0CB647061DB03E5 /* RDPDFReaderAnnotationListViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderAnnotationListViewController.swift; sourceTree = ""; }; E9A09B9A70653ED4FB65C8A3934E3937 /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Sources/ConstraintMakerFinalizable.swift; sourceTree = ""; }; + E9A0DEE786314BFAABED15DCE9A483F3 /* RDEpubURLReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubURLReaderController.swift; sourceTree = ""; }; + EA44E461F73A280FD2649C38E2A66E15 /* RDEPUBBackgroundTrace.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundTrace.swift; sourceTree = ""; }; + EA573F944A7ECEBBA9EC81D72F804D7E /* RDEPUBWebView+Search.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "RDEPUBWebView+Search.swift"; sourceTree = ""; }; + EA82E36367E127E1D5C8F2EDC2F60797 /* RDEPUBChapterLocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterLocation.swift; sourceTree = ""; }; EB434D5D2C4FC39DB37D676ABB6B7C68 /* ConstraintMaker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMaker.swift; path = Sources/ConstraintMaker.swift; sourceTree = ""; }; EBA0272559B0F7FAD8AC670AC7431188 /* Pods-ReadViewDemo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ReadViewDemo-umbrella.h"; sourceTree = ""; }; + EBAF09D94C8796C21CF84B062626E152 /* RDEpubReaderView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RDEpubReaderView.release.xcconfig; sourceTree = ""; }; EBD26CED79D9BC8B6093FB7163627198 /* ConstraintMakerPrioritizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPrioritizable.swift; path = Sources/ConstraintMakerPrioritizable.swift; sourceTree = ""; }; - ECBD2FB74FE0B1966256CD0C39BF1F83 /* RDEPUBSearchEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchEngine.swift; sourceTree = ""; }; + EBEC460977B864A29421BD4ACD4849C1 /* RDEPUBCFITextAssertion.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFITextAssertion.swift; sourceTree = ""; }; EDA6D5D7D0A04878EE78FAAE94F65068 /* DTCoreText */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = DTCoreText; path = DTCoreText.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EE10390ED67255ABE5E4D1A1B1EF07F5 /* RDPDFReaderView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RDPDFReaderView; path = RDPDFReaderView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EE1DF7A60F88EAB6D70C3170A6F021AA /* RDEPUBImageViewerCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBImageViewerCoordinator.swift; sourceTree = ""; }; EE4506392D83069D836221FAB813E8D6 /* DTCoreText-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "DTCoreText-prefix.pch"; sourceTree = ""; }; - EE5872817E44E6DDC2CF80A8297E5A47 /* RDPDFReaderChromeViews.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderChromeViews.swift; sourceTree = ""; }; - EE8ABB198220CF4FE67049FE2349947A /* RDEPUBMemoryProbe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMemoryProbe.swift; sourceTree = ""; }; + EE5C053C6616645F9162F47DB3102BE3 /* RDEpubReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDEpubReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + EEC733B8EFDBB50E364A83D73F03DACB /* RDEPUBCSSCompatibilityLayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCSSCompatibilityLayer.swift; sourceTree = ""; }; EEF0985CE02F3B586A1C5DA6503103C3 /* DTBreakHTMLElement.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBreakHTMLElement.m; path = Core/Source/DTBreakHTMLElement.m; sourceTree = ""; }; EF82EDCB0C8172FAF3847EAAD873E096 /* NSURL+DTComparing.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTComparing.m"; path = "Core/Source/NSURL+DTComparing.m"; sourceTree = ""; }; - EFEB0AF1FD346F25E44C810A469B78E1 /* RDEPUBTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextRenderer.swift; sourceTree = ""; }; - F09DDC12AA1A0CD529F310E5CE0F99A1 /* RDEPUBCFIRecoveryEngine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRecoveryEngine.swift; sourceTree = ""; }; + F01A20D999E550EFA3C472C3A20E6A90 /* RDPDFReaderContracts.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderContracts.swift; sourceTree = ""; }; + F0AD8B4549561584DFE21463CC4045E6 /* RDEpubReaderSpreadResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderSpreadResolver.swift; sourceTree = ""; }; F0D5A0F7E62D88B94912634DC9AD339D /* DTCoreTextLayouter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTCoreTextLayouter.m; path = Core/Source/DTCoreTextLayouter.m; sourceTree = ""; }; F0F90ED4AECC246EA5CD643490677AA9 /* DTAttributedLabel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTAttributedLabel.h; path = Core/Source/DTAttributedLabel.h; sourceTree = ""; }; - F3440F352D2E851EAA150592C9292D9F /* RDCBZReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDCBZReaderController.swift; sourceTree = ""; }; + F11B87D1193658365521B72B44502D73 /* RDEPUBSearchModels.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSearchModels.swift; sourceTree = ""; }; + F1B84BFB1ACB4057989E6AE9A039B3AC /* RDPDFReaderSettingsPanelViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderSettingsPanelViewController.swift; sourceTree = ""; }; + F2176E21CE60C17099C4437D1566786C /* RDSpeechReaderView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = RDSpeechReaderView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; F3ABB3278539E3E13585120647F01258 /* DTBase64Coding.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTBase64Coding.m; path = Core/Source/DTBase64Coding.m; sourceTree = ""; }; - F3CF1BCEE24E319CEA749FF14F5C9D7E /* RDEpubReaderFlowLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderFlowLayout.swift; sourceTree = ""; }; F3D00D37E3CB914B9957CBEC6F302A0B /* SnapKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.release.xcconfig; sourceTree = ""; }; + F4081F7CA1FC93EE97276F3D05A333ED /* AVFAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFAudio.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/AVFAudio.framework; sourceTree = DEVELOPER_DIR; }; F43B7563256C964F3030A6C9BED2EA16 /* DTWeakSupport.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTWeakSupport.h; path = Core/Source/DTWeakSupport.h; sourceTree = ""; }; F4C4EC50C6DC93761BB6C825CE1C4ECD /* NSString+DTFormatNumbers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTFormatNumbers.h"; path = "Core/Source/NSString+DTFormatNumbers.h"; sourceTree = ""; }; F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "DTCoreText-Resources"; path = Resources.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - F51399FB07DB540E97ED404FAB685C31 /* RDEPUBPresentationRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPresentationRuntime.swift; sourceTree = ""; }; - F53A99F5B071BEA755E7344615C5D4FD /* RDEPUBRuntimeChapter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimeChapter.swift; sourceTree = ""; }; - F57ADB5984DCA56EDF32CDB6B4A983DD /* RDPDFReaderPanelPresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderPanelPresentation.swift; sourceTree = ""; }; + F59EBCDA77446DD33CEECEDE5378967F /* RDEPUBReaderSearchBarView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBReaderSearchBarView.swift; sourceTree = ""; }; F5A53C3033C8DE1724D37DA6323CF1D7 /* NSString+CSS.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+CSS.h"; path = "Core/Source/NSString+CSS.h"; sourceTree = ""; }; + F5F6803E56DE9E7EA1CCF0388E607674 /* RDEPUBTextIndexTable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextIndexTable.swift; sourceTree = ""; }; F610362838046514D87BF38DAC3B7829 /* NSAttributedString+DTCoreText.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSAttributedString+DTCoreText.m"; path = "Core/Source/NSAttributedString+DTCoreText.m"; sourceTree = ""; }; + F65A581119EB07B606117CEBB02F900F /* RDEPUBTextPerformanceSampler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBTextPerformanceSampler.swift; sourceTree = ""; }; + F692867A6534E6C9D48E91AB70413D33 /* RDEPUBPresentationRuntime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBPresentationRuntime.swift; sourceTree = ""; }; + F7069C523A7006ED0AA03E0046C2736A /* RDEPUBDTCoreTextRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBDTCoreTextRenderer.swift; sourceTree = ""; }; F7382BDDD61B00469E398482B8AA31F3 /* Archive+WritingDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+WritingDeprecated.swift"; path = "Sources/ZIPFoundation/Archive+WritingDeprecated.swift"; sourceTree = ""; }; - F766A861EB3484C3C519700E104BF91B /* RDEPUBSafeArea.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBSafeArea.swift; sourceTree = ""; }; F78033C34E8C1FAD3B27FFC4F959A611 /* DTHTMLParser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParser.h; path = Core/Source/DTHTMLParser/DTHTMLParser.h; sourceTree = ""; }; - F7AAEDE9AFDB7C593B3B29F05A8A9702 /* RDEPUBRuntimePageCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBRuntimePageCount.swift; sourceTree = ""; }; + F7CB58976A61DDAE85B44D4B6CB30A02 /* String+RDEPUB.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+RDEPUB.swift"; sourceTree = ""; }; + F7DFA2F1E1C67837F7C4B4363EF16949 /* RDEPUBBackgroundPriorityPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBBackgroundPriorityPolicy.swift; sourceTree = ""; }; + F7F679F301CC740E180D3E0ABA038EF7 /* RDEPUBMetadataParseWorker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMetadataParseWorker.swift; sourceTree = ""; }; + F8233CAA669CAC56C7B0EEE700B53A23 /* RDEPUBMemoryProbe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBMemoryProbe.swift; sourceTree = ""; }; F8569A5FF03BA54C0F4080D3EE5539D5 /* NSNumber+RomanNumerals.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+RomanNumerals.h"; path = "Core/Source/NSNumber+RomanNumerals.h"; sourceTree = ""; }; - F88EAEAB89867B1405011D65F95E4F64 /* RDEpubURLReaderController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubURLReaderController.swift; sourceTree = ""; }; F8F398A3D1144707216F9A20BEDF911E /* DTAttributedLabel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTAttributedLabel.m; path = Core/Source/DTAttributedLabel.m; sourceTree = ""; }; + F939D46D9D49EF5FCAFCB16F1E35E23E /* RDPDFReaderSettingsView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDPDFReaderSettingsView.swift; sourceTree = ""; }; F9C223BB14280E813122F7F44DDD64F3 /* DTTiledLayerWithoutFade.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTTiledLayerWithoutFade.h; path = Core/Source/iOS/DTTiledLayerWithoutFade.h; sourceTree = ""; }; F9C4993C8ED63C0215BEC38128F6EC5D /* ZIPFoundation-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ZIPFoundation-Info.plist"; sourceTree = ""; }; + FA2A95481CF034C4689E42B263042872 /* wxread-replace-latin.css */ = {isa = PBXFileReference; includeInIndex = 1; name = "wxread-replace-latin.css"; path = "EPUBCore/Resources/wxread-replace-latin.css"; sourceTree = ""; }; FAA140AF73738B23155578D0AA734FE3 /* NSMutableAttributedString+HTML.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSMutableAttributedString+HTML.h"; path = "Core/Source/NSMutableAttributedString+HTML.h"; sourceTree = ""; }; - FB1FB4D69D71D0D1B4C5749FE44F4DA8 /* RDEPUBFontFallbackResolver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBFontFallbackResolver.swift; sourceTree = ""; }; + FC1A01FE2774E0FA1BCE14C678E8B70E /* CoreImage.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreImage.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CoreImage.framework; sourceTree = DEVELOPER_DIR; }; FC467FD187B387BBBF0D10B192925B53 /* NSString+DTUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+DTUtilities.h"; path = "Core/Source/NSString+DTUtilities.h"; sourceTree = ""; }; - FCEAC930B7FAD0BFD2BF58A81C1B82C6 /* RDEPUBCFIRange.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIRange.swift; sourceTree = ""; }; - FD69D7E6008EE4ABAB3B5DC7AA868A15 /* RDEPUBCFIMap.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBCFIMap.swift; sourceTree = ""; }; + FCBECD199A5AB2E046BC593AC6FE63C7 /* RDEpubReaderGestureController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEpubReaderGestureController.swift; sourceTree = ""; }; FE2F750872F6BAE0ACB02ADF23011AF8 /* DTHTMLParserNode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = DTHTMLParserNode.h; path = Core/Source/DTHTMLParserNode.h; sourceTree = ""; }; FE699719E4C619A2AE868EA35DBCE64E /* DTFoundationConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTFoundationConstants.m; path = Core/Source/DTFoundationConstants.m; sourceTree = ""; }; FEA9F91758013B23B0EEA71DA22E7475 /* Pods-ReadViewDemo-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ReadViewDemo-Info.plist"; sourceTree = ""; }; FEB04D144E7A35904D2906AC517EC870 /* NSURL+DTUnshorten.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURL+DTUnshorten.m"; path = "Core/Source/NSURL+DTUnshorten.m"; sourceTree = ""; }; FECD0A9F46F7D0CBF7FE9797EA63845E /* DTObjectTextAttachment.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = DTObjectTextAttachment.m; path = Core/Source/DTObjectTextAttachment.m; sourceTree = ""; }; - FF56076797358B800EE1C35C5FB6360B /* RDEPUBChapterDataCache.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = RDEPUBChapterDataCache.swift; sourceTree = ""; }; + FF4F4DF69DE3402A658BF53389C1E29F /* WeReadApi.js */ = {isa = PBXFileReference; includeInIndex = 1; name = WeReadApi.js; path = EPUBCore/Resources/WeReadApi.js; sourceTree = ""; }; FF8481A9468E2620C3170C28BC17691E /* Archive+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Archive+Deprecated.swift"; path = "Sources/ZIPFoundation/Archive+Deprecated.swift"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 15323E0F5ED66EFBC4FF8FB7937A4614 /* Frameworks */ = { + 15EFC3631BB58E1F211F61EC3577AE01 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FBDCB75409A2FFE5BCB880D0A8C4CBBD /* Foundation.framework in Frameworks */, + F74BE2C0D8345DF5EDE41CF6141A44BF /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 254A9D21D857AA584C5D2ADC600A6710 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 74E04D9FFB1157F3BB13694DAF9A1190 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2E6AAED7E5F728BE4AD1030966E99673 /* Frameworks */ = { + 258A70A95FD06C42A74DA2A5E7D0DADD /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 4898DBD55913F2B54919C55D71F7EF07 /* Frameworks */ = { + 26559404D2377015324B9F6CF2335247 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 572FEB02353F89A14C0C06D3CAD01317 /* Frameworks */ = { + 60EDC33B688AC55B5698518B2AD0DB0D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - D97E374FEF0C11AE2CF9911A474BB864 /* Foundation.framework in Frameworks */, + 4371AF1A25318F3F3797741057CD23FF /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1263,43 +1380,74 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 74DA18DBECE4D8CB854F846D9F357396 /* Frameworks */ = { + 838BAC16F8EB3094BE7BC270BBFA1DE1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DDAD8BD9E54E6BFE5D39A29BF6217750 /* Foundation.framework in Frameworks */, - D2C6FE518520667288530D6983D2BE91 /* ImageIO.framework in Frameworks */, - 08A306C9384471B8D7F3E748E57AEA96 /* QuartzCore.framework in Frameworks */, + 6E5DFE7C1EEB11AD1986C41B2FFBCE65 /* Foundation.framework in Frameworks */, + EA4996975C152651AE1A1F33C1B22663 /* ImageIO.framework in Frameworks */, + 337FEBAB6EC0B4E4C7C3F83B1A74F290 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 841175627F988EF292F0FDC3FB0EF011 /* Frameworks */ = { + 8C8F2B1F5A2E36E3AE95EAEAAE03F780 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - EDC52AF71F363B14DCA6DD6F90242E5B /* CoreImage.framework in Frameworks */, - 872E2091594BCB3529FD1AD9FEEDD24F /* Foundation.framework in Frameworks */, - 19C8677572874927A3364FF627870BBE /* PDFKit.framework in Frameworks */, - 5DE66A256BFD2ABBD1F05DB20AA70E2F /* Vision.framework in Frameworks */, + 01E94FCF0AC80F5B5B3D6B7D7551F2D2 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - AE82FD7DE740122C0E1F3ACA79D8D325 /* Frameworks */ = { + AD01177C0DB22F1BCA0F7F6A96C00062 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 65E553FCED2BBA7B9B15A94AB3B50098 /* AVFAudio.framework in Frameworks */, + B913466B4CC75BE55777A0FC4A881C5A /* Foundation.framework in Frameworks */, + 5957FC1D1BA1EFB4BECB72F04EE3CD55 /* MediaPlayer.framework in Frameworks */, + 291EC7B4A19AC0C5068EA15FEA02E358 /* NaturalLanguage.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B3344B1196C556EC6C893EF8620F9CC7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C6089F43887B33500393FA1B1A90467D /* CoreImage.framework in Frameworks */, + 80251A1EAF798D1DA0E8B6943015E263 /* Foundation.framework in Frameworks */, + 484D3D3F85A886BE6364CEEE333C7045 /* PDFKit.framework in Frameworks */, + C3722B9CB3A2CBC3C14B6E289B60C71A /* Vision.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CD7FBA45DB00ADF722E01E0AE3779E02 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 08DD8BC85A59A1552E0BF4FB6B6CFD80 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E1DF268260BBDB79581F1102271D0AE4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - BB775B7E3898A645CA9A57B93ED9668D /* Frameworks */ = { + EBBF08881D4C8BD2BF8B87ED2DFA511B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C52ACA043C901B7925AD97DD33CA7D8F /* Foundation.framework in Frameworks */, + 2F1FA27C68F3FF94F477C89F92BE0871 /* CryptoKit.framework in Frameworks */, + ADD97A31560B4C7FF2F82E28BAB7B0F9 /* Foundation.framework in Frameworks */, + EECD42D65B2937FE7AE9D633B7DFB154 /* FoundationModels.framework in Frameworks */, + E20BB1A8047FC36AD4EC46426BAB5494 /* NaturalLanguage.framework in Frameworks */, + 127914591EE3F5145BC14A25A0A57D08 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - F1A20C66D5D753698A0580C836197161 /* Frameworks */ = { + F695CAAA20414789F09BB8CC4D5DABE4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -1317,21 +1465,45 @@ name = Resources; sourceTree = ""; }; - 0656CE04288357F0748AB498835BA03E /* Frameworks */ = { + 0480A1B39E951F8E5171145FC19BE283 /* Typesetter */ = { isa = PBXGroup; children = ( - DAC1DE7BF5C2D9CBABA8F20B8B79EAE1 /* iOS */, + 60EC254E73980C2F0AA36B2A4ABA4E04 /* RDEPUBAttachmentNormalizer.swift */, + 669FBCF95F7506CD004BB09639AC8CF4 /* RDEPUBCFIMarkerInjector.swift */, + 57512CC2A1488E761B4B2A6F02CB55F0 /* RDEPUBDecryptingImageAttachment.swift */, + 413CD373B452DEFC31CD6761AF17E8F6 /* RDEPUBFontNormalizer.swift */, + 0744250A850EDAD2D67851F9AE9322C2 /* RDEPUBFragmentMarkerInjector.swift */, + 137546C9BE2CA543D6BAA25522E046A6 /* RDEPUBHTMLNormalizer.swift */, + C97A2E9C7E5DFF37C06187E6AFBB3CC8 /* RDEPUBRenderDiagnosticsCollector.swift */, + 4914EC4B82CC6AA3736968D86B805228 /* RDEPUBSemanticMarkerInjector.swift */, + 430DCC402F55D7293EDA440903D400BC /* RDEPUBStyleSheetComposer.swift */, + BD629E1D77971203EB1E5EE5C5BA2BAC /* RDEPUBTextRendererSupport.swift */, + 73A8DB7823ED0CC52F6BCB9D87F5D8E9 /* RDEPUBTypesettingPipeline.swift */, + 2D33AED70D241A37EF6E4E272B0B9958 /* Compatibility */, ); - name = Frameworks; + name = Typesetter; + path = Typesetter; sourceTree = ""; }; - 0BBAC52764CEAE2020B3D2FD7E8CA22F /* Development Pods */ = { + 0865045148005FBCE541CC3C8B179490 /* iOS */ = { isa = PBXGroup; children = ( - ACE9EC81EC6D670D075A6387E895F1EC /* RDEpubReaderView */, - 92ABBF90628E715301E38B1FE0110CC9 /* RDPDFReaderView */, + F4081F7CA1FC93EE97276F3D05A333ED /* AVFAudio.framework */, + 968484A28FBB84723F621DB66ECA3347 /* CoreGraphics.framework */, + FC1A01FE2774E0FA1BCE14C678E8B70E /* CoreImage.framework */, + 4F4320A57A5573831CD151F06C5420C5 /* CoreText.framework */, + 9C9E8FA478D23AC4494D5120C081C48B /* CryptoKit.framework */, + 3F2C29FC8214CF950CEB4D34A6EF73DC /* Foundation.framework */, + 17EE920782F4B0CF61192C04ABF5DF6C /* FoundationModels.framework */, + D3FE3107482A464FFADCB685658099F9 /* ImageIO.framework */, + 93231E903E802072F56185B464DDFAD4 /* MediaPlayer.framework */, + B46D01D4D15C2295F678A21C84B825ED /* NaturalLanguage.framework */, + C3D2DECDF3F1951B4030402CDC6F89E8 /* PDFKit.framework */, + 80A410954172DEFFD72C06139798345A /* QuartzCore.framework */, + C8857C84AAC2099B1037C035B8AFF5AF /* UIKit.framework */, + 3B255A2C4C31A02ED6FC13D5D2DE27DC /* Vision.framework */, ); - name = "Development Pods"; + name = iOS; sourceTree = ""; }; 0D4A349829D1C0DC0E69C0A64B9A4139 /* Pods-ReadViewDemo */ = { @@ -1351,11 +1523,82 @@ path = "Target Support Files/Pods-ReadViewDemo"; sourceTree = ""; }; - 12AA3A987A0426F2462A865D2B48B81A /* Pod */ = { + 106B5ED13691DE46F20215799B9B3AD0 /* CFI */ = { isa = PBXGroup; children = ( - D5657837156EA19733E55FE7DE6403C6 /* RDEpubReaderView.podspec */, - 795CACF19C9BC6269156E3E87CAC5A4A /* README.md */, + 830CF8D5AB992FBCBD12AEDC987704BF /* RDEPUBCFI.swift */, + B1A0367B13040EC2A557AA275A2D16D0 /* RDEPUBCFICompatibility.swift */, + B39D4ED1F553815AA8DA4B6C47C7269B /* RDEPUBCFIDOMPathBuilder.swift */, + C6414219D018ADCECF6E5804C284BED7 /* RDEPUBCFIError.swift */, + 8911E1CAA6638CF6E14939CE71B77C19 /* RDEPUBCFIGenerator.swift */, + E0F8B1A04DAD3F227758BEB6D5D4D5E9 /* RDEPUBCFIMap.swift */, + 4EC7EE7406D5F141BFDB10F21D1B98D8 /* RDEPUBCFIParser.swift */, + 62BAED47209069B1F1E56A1DBC2892B1 /* RDEPUBCFIPath.swift */, + 0C746469E04CD2685727B7CAC5DF72BD /* RDEPUBCFIRange.swift */, + 8E937FB7E0D9A3DEF0742A18E455FF54 /* RDEPUBCFIRecoveryEngine.swift */, + E7B65425D5E15E4D005158BE86FAB4EA /* RDEPUBCFIResolver.swift */, + D597E4B20DB22DA3D2C43EAE0285EFB5 /* RDEPUBCFISerializer.swift */, + EBEC460977B864A29421BD4ACD4849C1 /* RDEPUBCFITextAssertion.swift */, + 1929AF2396E5AFD5D38E0BA75065368B /* RDEPUBCFIUtilities.swift */, + ); + name = CFI; + path = CFI; + sourceTree = ""; + }; + 123767FEFDC40642DB92A22C404F93C3 /* EPUBTextRendering */ = { + isa = PBXGroup; + children = ( + 367C998948D9897CF825A08E51AF013D /* RDEPUBChapterData.swift */, + F7069C523A7006ED0AA03E0046C2736A /* RDEPUBDTCoreTextRenderer.swift */, + 7777AD7DDECA33F4050E77507F113B22 /* RDEpubPlainTextBookBuilder.swift */, + F5F6803E56DE9E7EA1CCF0388E607674 /* RDEPUBTextIndexTable.swift */, + 788B69585E28B6A19F3D82E03FB17437 /* RDEPUBTextPositionConverter.swift */, + E263E2A2BC1CFE65C51095296C21D4EE /* RDEPUBTextRenderer.swift */, + CEDDBBF79781F69878880132910803DD /* RDEPUBTextSearchEngine.swift */, + 127B02F9F3CD16354BD01751F0E11483 /* BuildPipeline */, + 70177910880913566BCC28F93F7596F0 /* Pagination */, + 0480A1B39E951F8E5171145FC19BE283 /* Typesetter */, + ); + name = EPUBTextRendering; + path = EPUBTextRendering; + sourceTree = ""; + }; + 12526BFA2BF5BCFD26AF994558197D0D /* RDSpeechReaderView */ = { + isa = PBXGroup; + children = ( + 02108A241C993AAC297AF4F8245FD443 /* RDSpeechReaderContracts.swift */, + 2FBAA88C8DBE0129E51AD73F7D1AB4BD /* RDSpeechReaderController.swift */, + 21F9B093162E445308F49662C7C35DA6 /* RDSpeechReaderControlView.swift */, + 08203CC2BC14FB8B3BA0CAA3EC92789C /* RDSpeechTextPreprocessor.swift */, + 91E48AE3E44D87BABBD3206B031A771E /* AI */, + 1311AB5B17D6867C642822FA935A0210 /* Pod */, + A35D92C45ED9784FF33310E20959877B /* Support Files */, + ); + name = RDSpeechReaderView; + path = ../../Sources/RDSpeechReaderView; + sourceTree = ""; + }; + 127B02F9F3CD16354BD01751F0E11483 /* BuildPipeline */ = { + isa = PBXGroup; + children = ( + BC7700A9EB3EB33F6095CC49EA54E6C1 /* RDEPUBBuildDiagnosticsReporter.swift */, + 59D55BC5643EA702EB48D478948DF83E /* RDEPUBChapterTailNormalizer.swift */, + A66549A3484418848E50313759E8FCFB /* RDEPUBPaginationCacheCoordinator.swift */, + 67A9EB086407E39FDB221874CE6CB9DA /* RDEPUBTextBookBuilder.swift */, + 06E8F756DFAEAA9E8FA4B7D472000B2E /* RDEPUBTextBookCache.swift */, + 28B57DDE8DD7718C17E02D8B7001DC6F /* RDEPUBTextBookModels.swift */, + 81A94C98005A2AE1285F725F27D64D82 /* RDEPUBTextBuildPipelineInterfaces.swift */, + F65A581119EB07B606117CEBB02F900F /* RDEPUBTextPerformanceSampler.swift */, + ); + name = BuildPipeline; + path = BuildPipeline; + sourceTree = ""; + }; + 1311AB5B17D6867C642822FA935A0210 /* Pod */ = { + isa = PBXGroup; + children = ( + F2176E21CE60C17099C4437D1566786C /* RDSpeechReaderView.podspec */, + CE1FA1663AC56607EB2C5556FB73813E /* README.md */, ); name = Pod; sourceTree = ""; @@ -1368,6 +1611,20 @@ name = Resources; sourceTree = ""; }; + 18E044FA60A4142CAEBBA1BA8B351AF0 /* ReaderView */ = { + isa = PBXGroup; + children = ( + A746B9DD2EDF2950A3F314EA3D5B2EF5 /* RDPDFReaderContentCell.swift */, + 34FC1DCF56B5AEFDF71CEC0334776D7A /* RDPDFReaderPageChildViewController.swift */, + 8451167CAD54879A8C6C68669A8CE1B1 /* RDPDFReaderView+CollectionView.swift */, + 29B76ED37710AEC809FAF71EC4C1F215 /* RDPDFReaderView+Paging.swift */, + A8C14962F04ECA1A8B77093B8EF5E23B /* RDPDFReaderView+ToolView.swift */, + 5DBC1A890B7F43DE8EB006F92D10F623 /* Paging */, + ); + name = ReaderView; + path = ReaderView; + sourceTree = ""; + }; 1B8A7F414F6156F16578F6723EB260FE /* Core */ = { isa = PBXGroup; children = ( @@ -1375,15 +1632,29 @@ name = Core; sourceTree = ""; }; - 283A5FB1D5F251D92061976EF101E7A4 /* Notes */ = { + 23EEF1F245171001FD8C637D33393E98 /* Pod */ = { isa = PBXGroup; children = ( - 67CE7F078B6F280727666D10430B4FBD /* RDEPUBNoteDetector.swift */, - BE2A00DBD5096609160A1EBB511C0CF0 /* RDEPUBNoteModels.swift */, - 45019AE00B85C161910232F35A46E260 /* RDEPUBNoteResolver.swift */, + 352416B880C0869535D5187772C16D21 /* RDPDFReaderView.podspec */, + B85CCDCC8D0342F8925CA9263B57A3AE /* README.md */, ); - name = Notes; - path = Notes; + name = Pod; + sourceTree = ""; + }; + 27144090BF6F40420D3D72782EE757BA /* Support Files */ = { + isa = PBXGroup; + children = ( + B6A8CFFD406BC9FB4C712614283CE66C /* RDEpubReaderView.modulemap */, + 35BA5E0859FB7D83208D401FA4126575 /* RDEpubReaderView-dummy.m */, + 8B5C7E08046DF09C290F5F2222B1E64C /* RDEpubReaderView-Info.plist */, + 13D0BE27CC53417EBD0C5F28F1C54E38 /* RDEpubReaderView-prefix.pch */, + 02BE103F11BACB69B3478BA07AE1A2A5 /* RDEpubReaderView-umbrella.h */, + D475ACC199E6D23FD275CCF5D187243B /* RDEpubReaderView.debug.xcconfig */, + EBAF09D94C8796C21CF84B062626E152 /* RDEpubReaderView.release.xcconfig */, + A45FEEA048A5AF7D46CAA3CDF72414CA /* ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist */, + ); + name = "Support Files"; + path = "../../ReadViewDemo/Pods/Target Support Files/RDEpubReaderView"; sourceTree = ""; }; 2CA280394B77BE3923FC19933C026113 /* ZIPFoundation */ = { @@ -1417,6 +1688,78 @@ path = ZIPFoundation; sourceTree = ""; }; + 2D33AED70D241A37EF6E4E272B0B9958 /* Compatibility */ = { + isa = PBXGroup; + children = ( + EEC733B8EFDBB50E364A83D73F03DACB /* RDEPUBCSSCompatibilityLayer.swift */, + 1A26CF4FC3A56FE642CDCAE6E644AC27 /* RDEPUBFontFallbackResolver.swift */, + 563D7B75744B17E859D3990CEE414AB0 /* RDEPUBStyleCompatibilityModels.swift */, + ); + name = Compatibility; + path = Compatibility; + sourceTree = ""; + }; + 2E71C74833555A56189647311CA1041E /* EPUBUI */ = { + isa = PBXGroup; + children = ( + D0F55A232678D2676458E413833B0C17 /* RDEPUBAnnotationEditorViewController.swift */, + 64527A3F0F755D0173A048667A23AEA3 /* RDEPUBAttachmentTooltipOverlayView.swift */, + 6245AD148BF98574A18D998B11830A21 /* RDEPUBAttachmentTooltipView.swift */, + 089BC1322F491BEB59F94895FDB65109 /* RDEPUBImageViewController.swift */, + EE1DF7A60F88EAB6D70C3170A6F021AA /* RDEPUBImageViewerCoordinator.swift */, + 81120E66C1F56C6F0FAC98FE155554BE /* RDEPUBReaderBottomToolView.swift */, + A58ABF7B052C2FEEC1FF9F105FD80470 /* RDEPUBReaderChapterListController.swift */, + 6B75BE4C4CB6B906D8F81B37938F0A46 /* RDEPUBReaderController.swift */, + 6D3D1B3F2E5D775108B74D6574B91DCE /* RDEPUBReaderController+AttachmentTooltip.swift */, + C8A3FE7990354EF1819DAB32FB09040F /* RDEPUBReaderController+ContentDelegates.swift */, + 4B9D828EF15B8A7E80CA8DA3C770E4D1 /* RDEPUBReaderController+DataSource.swift */, + 8C0E6A164C2508A21E017A697D6A4C80 /* RDEPUBReaderController+ExternalLinks.swift */, + 7A158C1456B0A6C5E3C11F6F598B688D /* RDEPUBReaderController+LocationResolution.swift */, + 224F6889428B8D51E00F57EB6904B3B1 /* RDEPUBReaderController+Orientation.swift */, + 32038A3480CA43711F902B42126D03E6 /* RDEPUBReaderController+PublicAPI.swift */, + 28C6EB4B2B6DC691D28EEBC2BDB4D2F3 /* RDEPUBReaderController+RenderSupport.swift */, + 2856AF81B14F4FE03A4968F3E239DAD6 /* RDEPUBReaderController+RuntimeBridge.swift */, + AE29D77AF696BBB755DED2A768C03D64 /* RDEPUBReaderController+TableOfContents.swift */, + 59A6E8D84753503A5324211BF6A88E64 /* RDEPUBReaderController+Trial.swift */, + 6975E8E0C8246911E8F8318E762672D9 /* RDEPUBReaderDelegate.swift */, + 1B28B43AB4CD054B30DD8EE676642E70 /* RDEPUBReaderHighlightsViewController.swift */, + BD16456E8ACD41D8A266CD43400B6374 /* RDEPUBReaderPersistence.swift */, + F59EBCDA77446DD33CEECEDE5378967F /* RDEPUBReaderSearchBarView.swift */, + E908B49F91AB4BAC14DB2AA9E94526D9 /* RDEPUBReaderTableOfContentsItem.swift */, + 4D6C143C0EAE0DA948204F9912FE193D /* RDEPUBReaderToolView.swift */, + 8B363F80F3DBB1AAC48B8524B8025C79 /* RDEPUBReaderToolViewProtocols.swift */, + 8C14D80995798D4961531CAAC7AE3D01 /* RDEPUBReaderTopToolView.swift */, + 10F7EBC0047B5FAFD86F2BE940E3C100 /* RDEPUBSettingsFlipAutomation.swift */, + E9A0DEE786314BFAABED15DCE9A483F3 /* RDEpubURLReaderController.swift */, + 9F772869AF68874D248A1C55227A74BB /* RDEPUBViewportTypes.swift */, + 2D0BA256721E4BAFE43E91891A606A06 /* RDEPUBWebContentView.swift */, + A3D8597FAB9BFFF6551C75F9A23E95F1 /* RDEPUBWebDecorationOverlayView.swift */, + F7CB58976A61DDAE85B44D4B6CB30A02 /* String+RDEPUB.swift */, + 7AA4DBF07DDCE87ABC0B78A2FF3FB813 /* UIColor+RDEPUB.swift */, + CB33A3E20E2517AE2775CBBD4FB0642D /* UIColor+RDEPUBHex.swift */, + B35FB170F5C2298D1935E081C045E183 /* Notes */, + A13BFB9F3832E148BEFF4F2E2500B7CC /* ReaderController */, + 58FF23D0B3CBA21F8B568310A3F77ADA /* Settings */, + 547F1F2F44D528238BAF447433E7A48C /* TextPage */, + ); + name = EPUBUI; + path = EPUBUI; + sourceTree = ""; + }; + 390A90EDAE212CD241A8BE5BA1738497 /* RDAIReaderView */ = { + isa = PBXGroup; + children = ( + 77CEE3EADF5D3703EAFFDED6F4394F74 /* Core */, + FCA201DAA29B65124F3AD5D2A6291B0F /* FoundationModels */, + E0FC55DB56DA89CE8132DB26EFAD6331 /* NaturalLanguage */, + 8EF89AD6276F57F6D4CC74CDC760D410 /* Pod */, + 53A5E1AA710E875BA96CCD372501AAEF /* Support Files */, + B7437DB97F277F7C1807DAB99C765913 /* UI */, + ); + name = RDAIReaderView; + path = ../../Sources/RDAIReaderView; + sourceTree = ""; + }; 39F098AC9A768AAE466253753D71E3E2 /* Support Files */ = { isa = PBXGroup; children = ( @@ -1433,15 +1776,19 @@ path = "../Target Support Files/SnapKit"; sourceTree = ""; }; - 4B02D3227E5D9E7F70981E0648FAAF3B /* Models */ = { + 3D6BCAC12147FE8B0B02B30D3A5C3F54 /* Support Files */ = { isa = PBXGroup; children = ( - 34112F3165802F124416A83D4B7B15AA /* RDEPUBAnnotationModels.swift */, - A6D09BDBD02839781AC66D29F3611E41 /* RDEPUBPaginationModels.swift */, - 924A837FC3890B67B17DF9246FB39A4C /* RDEPUBReadingLocationModels.swift */, + BC0B0BF8324AE3EE918E0885D68E209D /* RDPDFReaderView.modulemap */, + CEFCC148B58604D0C5A3C240C51B45FD /* RDPDFReaderView-dummy.m */, + 6CB45D03588F166B581A0965E7D18D6A /* RDPDFReaderView-Info.plist */, + 57C055B2516B90417D158D4D31CF4A11 /* RDPDFReaderView-prefix.pch */, + 507D9D8B9C2FF474F3C6BE68C6EF6C50 /* RDPDFReaderView-umbrella.h */, + 517D2A78DA380DB287A13785F250D543 /* RDPDFReaderView.debug.xcconfig */, + A3942F6A75FD45095352344EAEA29F8B /* RDPDFReaderView.release.xcconfig */, ); - name = Models; - path = Models; + name = "Support Files"; + path = "../../ReadViewDemo/Pods/Target Support Files/RDPDFReaderView"; sourceTree = ""; }; 4B674E3B8239984DCF70FD510FCFF709 /* SnapKit */ = { @@ -1502,32 +1849,83 @@ name = Pods; sourceTree = ""; }; - 4E5FF130AC100E8943729466CF529221 /* Pagination */ = { + 53A5E1AA710E875BA96CCD372501AAEF /* Support Files */ = { isa = PBXGroup; children = ( - 81032F879C858B2A45DF02DCF7ED8E6A /* RDEPUBChapterPageCounter.swift */, - 54F7EED7DF4D198244A6D06C00CC3F00 /* RDEPUBCoreTextPageFrameFactory.swift */, - 359E871CA4A99767E938A99718B48F88 /* RDEPUBPageBreakPolicy.swift */, - D27A3BD8D86D036B86A90C4384EF483A /* RDEPUBTextLayouter.swift */, - 2185E45C320FFD388943A87A125FB42D /* RDEPUBTextLayoutFrame.swift */, - 508BA727504170CFC09B46B584079A86 /* RDEPUBTextPaginationInterfaces.swift */, - 1178601791D03F742CB349BE582223E2 /* RDEPUBTextPaginationSupport.swift */, + 44BB65037344EA640BD291D831FE5585 /* RDAIReaderView.modulemap */, + 299AED4539FF5F16ACFC414AF2BDFCF3 /* RDAIReaderView-dummy.m */, + 9A2D50243BC80E38A54308D1350127D1 /* RDAIReaderView-Info.plist */, + 719CCC5081F72A4CF289A77C6A10B8D6 /* RDAIReaderView-prefix.pch */, + C1B094ABE0685E65E249C93BF2B135A9 /* RDAIReaderView-umbrella.h */, + 2042A956F6ADB5E2CF8DB889FA6F7652 /* RDAIReaderView.debug.xcconfig */, + B75141FED04E4EEC380F0173E5DEBCA7 /* RDAIReaderView.release.xcconfig */, ); - name = Pagination; - path = Pagination; + name = "Support Files"; + path = "../../ReadViewDemo/Pods/Target Support Files/RDAIReaderView"; sourceTree = ""; }; - 5CF51AAF204A51E43EC2F5A0358FE4D9 /* DocumentFormats */ = { + 547F1F2F44D528238BAF447433E7A48C /* TextPage */ = { isa = PBXGroup; children = ( - F3440F352D2E851EAA150592C9292D9F /* RDCBZReaderController.swift */, - E0E0892DD8B09BBF7E0234F6E258D6B5 /* RDMOBIParser.swift */, - 6E58C1EF4EC5E0B8E2B38CA2270B93E9 /* RDReaderDocumentFormat.swift */, + 069D7EE5E989A9F963E518365DDB0301 /* RDEPUBChapterDisplayContentCache.swift */, + 31802A30449913CF424CD3B666B895CF /* RDEPUBDarkImageAdjuster.swift */, + D098B6BDF458996B5B3A757722DF5C3B /* RDEPUBPageInteractionController.swift */, + 01476F47406E7CD8C4420B82B73E642F /* RDEPUBPageLayoutSnapshot.swift */, + 112BB2DF4A650E511F8E5988973D1199 /* RDEPUBSelectionLoupeView.swift */, + 920EAB87BCF859EE5CB851833D8C7410 /* RDEPUBSelectionOverlayView.swift */, + 603CE31AD8934F870E35F7074D1EFDE0 /* RDEPUBTextAnnotationOverlay.swift */, + BDC92A937FE8D7CA37ED82CCEDBCC6E5 /* RDEPUBTextContentInteractionCoordinator.swift */, + 03A3F3DC28A03FECBBC8A4FD8E5EBD8B /* RDEPUBTextContentView.swift */, + 5D0B6C724E03707E527C7AB3C1214489 /* RDEPUBTextPageBoundaryValidator.swift */, + 4AF4B41DABF7397AEBDB574FEA007451 /* RDEPUBTextPageDecorationView.swift */, + 0E0CFBF5E5E5B369336E6E7E8FDCD5F5 /* RDEPUBTextPageRenderView.swift */, + 8C80B76361E9EE71ACFCB82163017066 /* RDEPUBTextPageVerticalJustifier.swift */, + A83ECB8E69E2047D86F4EA6D987E0B8A /* RDEPUBTextSelectionController.swift */, + ); + name = TextPage; + path = TextPage; + sourceTree = ""; + }; + 5788D3728DAFD201F8BDC34C43323168 /* Speech */ = { + isa = PBXGroup; + children = ( + CE673C095E86DC64BE73E53BA8C59702 /* RDPDFSpeechContentProvider.swift */, + 064F689D0045852491C10A092AF5E30D /* RDPDFSpeechSession.swift */, + ); + name = Speech; + sourceTree = ""; + }; + 583B03C7D57B9CAE691754AAC26103FD /* Speech */ = { + isa = PBXGroup; + children = ( + 1CF5CFD0948675E862FF54F7A5D73412 /* RDEPUBSpeechContentProvider.swift */, + ); + name = Speech; + sourceTree = ""; + }; + 583E3668A1AB420C1C7E1EE7D4606DBA /* DocumentFormats */ = { + isa = PBXGroup; + children = ( + 10207D5C5DF3B33C322957B6325ECA5D /* RDCBZReaderController.swift */, + 657A0B0DD4402A509DF0BF6AA9360DF5 /* RDMOBIParser.swift */, + DD4C2E0881354D1B1CF3ADF0A8A3E552 /* RDReaderDocumentFormat.swift */, ); name = DocumentFormats; path = DocumentFormats; sourceTree = ""; }; + 58FF23D0B3CBA21F8B568310A3F77ADA /* Settings */ = { + isa = PBXGroup; + children = ( + 9F25AA42AB430C73FED1DE82FA2DF2DC /* RDEPUBReaderConfiguration.swift */, + A8D7E62479EFF470F47755931FC2BFA4 /* RDEPUBReaderSettings.swift */, + 5EEE1249C915939654A5609D3CFC2064 /* RDEPUBReaderSettingsViewController.swift */, + C26B30F895FEA65F0D322407234375F0 /* RDEPUBReaderTheme.swift */, + ); + name = Settings; + path = Settings; + sourceTree = ""; + }; 5D84EFCD32A12A50AB9692ACEF5C88EE /* DTFoundation */ = { isa = PBXGroup; children = ( @@ -1541,10 +1939,22 @@ path = DTFoundation; sourceTree = ""; }; - 67B330C87C949111FBD9B86FA4108CCA /* Paging */ = { + 5DBC1A890B7F43DE8EB006F92D10F623 /* Paging */ = { isa = PBXGroup; children = ( - 3DB723617A3D02BEBFBC7DD8E83D47E6 /* RDPDFReaderPagingController.swift */, + 943A86A9A49BFCE017A6E927A5227BF2 /* RDPDFReaderPagingController.swift */, + ); + name = Paging; + path = Paging; + sourceTree = ""; + }; + 5E5636BC61968045454E451729360F65 /* Paging */ = { + isa = PBXGroup; + children = ( + 10A21533669EF5F6B433ACF6570084B4 /* RDEpubReaderPagingController.swift */, + BCEC432BB6F19EF8C918567EDAE34801 /* RDEpubReaderPreloadController.swift */, + F0AD8B4549561584DFE21463CC4045E6 /* RDEpubReaderSpreadResolver.swift */, + 3ED45EEF428135AE43AF524CE0492924 /* RDEpubReaderTapRegionHandler.swift */, ); name = Paging; path = Paging; @@ -1558,75 +1968,121 @@ name = Resources; sourceTree = ""; }; - 6AF68E04F5BCA966976C43F4B4A1FE63 /* Sources */ = { + 6F24FD18658D908AAD2750BA7E21AC0E /* ReaderView */ = { isa = PBXGroup; children = ( - 830E2FF68050B3931209AF2581249082 /* RDPDFKitPageProvider.swift */, - BC923AF5182183071C8C905DCFD0C5DC /* RDPDFReaderAnnotationEditorViewController.swift */, - C6954E717DF2A17466B5D30D25C12666 /* RDPDFReaderAnnotationListViewController.swift */, - EE5872817E44E6DDC2CF80A8297E5A47 /* RDPDFReaderChromeViews.swift */, - 2EDE0B4A3EB73E17912FEC91AECADBD6 /* RDPDFReaderContainerView.swift */, - 4AF75964868B86A27B63709439E9AF91 /* RDPDFReaderContracts.swift */, - BDFF6A065216B0DB4C460DB8E30D43AB /* RDPDFReaderDebugViewController.swift */, - 84B6EFF1EBD266465C28091AEDD73E0B /* RDPDFReaderDrawingCanvasView.swift */, - D2B596E0DC8B043ECE5DAEFEF7DD2EBC /* RDPDFReaderDrawingLayersView.swift */, - 1FDE32176816BC0A42D4B28D78235370 /* RDPDFReaderDrawingToolbar.swift */, - 034F5FDCBB44D08C5A68F8AB2B4777F1 /* RDPDFReaderHighlightOverlayView.swift */, - B3FC196B05ACAB99474CEA476B0CD195 /* RDPDFReaderImageTextLayerView.swift */, - 636AF7DBBCB7320FC883EAFE197EF923 /* RDPDFReaderImageTextRecognizer.swift */, - A5AAA2346B2236EB367432D8CD2FB317 /* RDPDFReaderKitView.swift */, - 5563F7DA776199803E76170B264676BE /* RDPDFReaderNavigationPanelViewController.swift */, - 4F61B106422AACE26C3C7B05C5293DCC /* RDPDFReaderNavigationView.swift */, - 4516C344651B4BAB7D3B3676952563AC /* RDPDFReaderPageView.swift */, - F57ADB5984DCA56EDF32CDB6B4A983DD /* RDPDFReaderPanelPresentation.swift */, - B7B712780654B2698F0379C758B2613E /* RDPDFReaderPersistenceStore.swift */, - 87A369FECC06D50D3068A665BCD42179 /* RDPDFReaderSettingsPanelViewController.swift */, - 1DE4839D4FBE796B7FDD121170DAD53A /* RDPDFReaderSettingsView.swift */, - 5B394C9C9A51160FF8B06D89C3147EDF /* RDPDFReaderTheme.swift */, - 5EC177D3B91E8E624750D11D7E09F3B6 /* RDPDFReaderViewController.swift */, - 47A01EEE1789F4E1A109C1B49D125E3F /* RDPDFZoomablePageView.swift */, - ); - name = Sources; - path = Sources; - sourceTree = ""; - }; - 6F4044234426984401A57CF2DB1C7C47 /* Products */ = { - isa = PBXGroup; - children = ( - EDA6D5D7D0A04878EE78FAAE94F65068 /* DTCoreText */, - F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */, - D1E89A31867FF1FB44B4B999988F1B82 /* DTFoundation */, - 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */, - 01DCD1B42D40839F1C8DBBDB11EF09BA /* RDEpubReaderView */, - C8A6E90AB5E26049710E2C2404C28B9A /* RDEpubReaderView-RDEpubReaderViewAssets */, - EE10390ED67255ABE5E4D1A1B1EF07F5 /* RDPDFReaderView */, - 979486118B3E90C08386079D57962701 /* SnapKit */, - B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */, - 48A4A6EDC08C8AC933D0DCD507E9D173 /* ZIPFoundation */, - CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */, - ); - name = Products; - sourceTree = ""; - }; - 77642874661547D9559633730603385E /* ReaderView */ = { - isa = PBXGroup; - children = ( - A76FEE9775014055776105D8698AE74E /* RDEpubReaderContentCell.swift */, - F3CF1BCEE24E319CEA749FF14F5C9D7E /* RDEpubReaderFlowLayout.swift */, - E74C786C11A2410677CDAEBF7DD1B4AD /* RDEpubReaderGestureController.swift */, - C764F1B6E5567DB91D1ABE809D25AB99 /* RDEpubReaderPageChildViewController.swift */, - 64394008B6544FFDF5097612472AEE24 /* RDEpubReaderView.swift */, - 6C877F262E89255B3135DE1E935D3246 /* RDEpubReaderView+CollectionView.swift */, - 2701BC5B247F7F1B1AF269EE0B553ED8 /* RDEpubReaderView+ContentAccess.swift */, - 94885CDA3F48C7BEEDD826129955D4D2 /* RDEpubReaderView+PageCurl.swift */, - 40F8654BEEBD1B51A4079D96899C140D /* RDEpubReaderView+ToolView.swift */, - 5088A729186A207F65C88E148F0392F4 /* RDEpubReaderViewProtocols.swift */, - BAC1AA0B57FFD6E0CEB4D6DE0C8E2EEA /* Paging */, + 63F79A4C9316E507B47DF63F26FC3263 /* RDEpubReaderContentCell.swift */, + 9E0BE4A0D727AF11C82F9FAD7EAF28AC /* RDEpubReaderFlowLayout.swift */, + FCBECD199A5AB2E046BC593AC6FE63C7 /* RDEpubReaderGestureController.swift */, + 44F6F4C9B8DC26B67956A489EB5E2E39 /* RDEpubReaderPageChildViewController.swift */, + E0CAA288D149C9793B45AC10F40DABE4 /* RDEpubReaderView.swift */, + 3410BDB001A65A79622F3980646A4AAE /* RDEpubReaderView+CollectionView.swift */, + E307745D06FCCA8EE3825E00C050479F /* RDEpubReaderView+ContentAccess.swift */, + B454B7709E93E1E886E4FA533B06802D /* RDEpubReaderView+PageCurl.swift */, + 4323646E9B345F4FADB630E17C777858 /* RDEpubReaderView+ToolView.swift */, + 6393730DA75DF6B53CCC8AC325591C5D /* RDEpubReaderViewProtocols.swift */, + 5E5636BC61968045454E451729360F65 /* Paging */, ); name = ReaderView; path = ReaderView; sourceTree = ""; }; + 70177910880913566BCC28F93F7596F0 /* Pagination */ = { + isa = PBXGroup; + children = ( + 0EEE779A1CEC15EBD959AE8FB87C5E20 /* RDEPUBChapterPageCounter.swift */, + 6D11123394F7F2EE6463FE977F3DABD9 /* RDEPUBCoreTextPageFrameFactory.swift */, + AE2565A3B94D5C14329E580ABC077884 /* RDEPUBPageBreakPolicy.swift */, + 65080B22CDF63551E7650AAF4499BDD7 /* RDEPUBTextLayouter.swift */, + B58293AB5053B6AA340D1D55A7FD0312 /* RDEPUBTextLayoutFrame.swift */, + 237DCFF0194564E19C33BED372E1EA72 /* RDEPUBTextPaginationInterfaces.swift */, + 35A48CFD97F259DB677ECBF3A5AB8B60 /* RDEPUBTextPaginationSupport.swift */, + ); + name = Pagination; + path = Pagination; + sourceTree = ""; + }; + 705B0B3615494EB9A0FEE9A4AA560C7C /* RDEpubReaderView */ = { + isa = PBXGroup; + children = ( + 4DAF2D9747F0021F074180A0C76F0788 /* cssInjector.js */, + 20DD66672C9FCA7C604D8034702101EF /* epub-bridge.js */, + 22226730313C0F24542669F12C5C4FB1 /* epub-fixed-layout.html */, + 7A98FCBF217CA913BD506DAEBAE03449 /* rangy-core.js */, + 2B49BEF738A6B60FB6A64671ACA9091B /* rangy-serializer.js */, + FF4F4DF69DE3402A658BF53389C1E29F /* WeReadApi.js */, + ADC5802DC43F329301B626F990A0D308 /* wxread-dark.css */, + E645DF57426CBB76570142F9D580209F /* wxread-default.css */, + 77CA12D475208B07BC520525A4E79C3C /* wxread-replace.css */, + FA2A95481CF034C4689E42B263042872 /* wxread-replace-latin.css */, + 954310FB3650F986B3B28B3C53EAEE28 /* AI */, + 583E3668A1AB420C1C7E1EE7D4606DBA /* DocumentFormats */, + 76ACED102B645106A60255A5231A0AFC /* EPUBCore */, + 123767FEFDC40642DB92A22C404F93C3 /* EPUBTextRendering */, + 2E71C74833555A56189647311CA1041E /* EPUBUI */, + E34A5243D06FA39B0B56462DAC551747 /* Pod */, + 6F24FD18658D908AAD2750BA7E21AC0E /* ReaderView */, + 583B03C7D57B9CAE691754AAC26103FD /* Speech */, + 27144090BF6F40420D3D72782EE757BA /* Support Files */, + ); + name = RDEpubReaderView; + path = ../../Sources/RDEpubReaderView; + sourceTree = ""; + }; + 76ACED102B645106A60255A5231A0AFC /* EPUBCore */ = { + isa = PBXGroup; + children = ( + 01E5F8CCBFB0567360782BD2FF0589A9 /* RDEPUBAssetRepository.swift */, + 6F805E226F3C1AA7053AA6606DA26CE1 /* RDEPUBFixedLayoutTemplate.swift */, + 5B786661CF20BBDCE901A8609DACF061 /* RDEPUBJavaScriptBridge.swift */, + AEDD0F8FBE7C14A783C94B709F23A4DB /* RDEPUBModels.swift */, + 58E942DE9692E29D8CB63A8E7F0E6B2B /* RDEPUBNavigatorLayoutContext.swift */, + 519BA5E115705E308601172F3785D87E /* RDEPUBPaginator.swift */, + DA1B0A108E49438640DBDD0A70FD293A /* RDEPUBParser.swift */, + 62AF8846B36B51075E3D04481932FAB0 /* RDEPUBParser+Archive.swift */, + C42BB280740ACCEAD29B912A1D47F29B /* RDEPUBParser+Package.swift */, + 87D001927426A4D5E9E90B7899A00372 /* RDEPUBParser+ReadingProfile.swift */, + 4DFD0C2AACBA8A400F346FFA5AAA6C77 /* RDEPUBParser+Resources.swift */, + A722D0A8A8664F86E0905654992FA360 /* RDEPUBParser+TOC.swift */, + 52481F3BA048F07B97DAC750A397270E /* RDEPUBPreferences.swift */, + E1BB480EA8E2ED1FEEC70C334BA00FD5 /* RDEPUBPublication.swift */, + 55ECB9EB83BDA7CDF3E67366AAA25C22 /* RDEPUBReadingSession.swift */, + 5A2ACEA23FA60F80BDEFD2EC71EB10F4 /* RDEPUBRenderRequest.swift */, + 6E6F004273EE4B1DA2F3B6E496AF475E /* RDEPUBResourceDataProvider.swift */, + 51DCB48325A7E7DDC907587B7B9425F6 /* RDEPUBResourceResolver.swift */, + 59DC39EBD2707FF1010387665D60AB01 /* RDEPUBResourceURLSchemeHandler.swift */, + BB559C50CCDA34EDD0525268B980948E /* RDEPUBSafeArea.swift */, + 127678B93D3CEB6EC2C7F3E5DD81860B /* RDEPUBSearchEngine.swift */, + F11B87D1193658365521B72B44502D73 /* RDEPUBSearchModels.swift */, + D50156C4B53F70228DCAC0501DB9226C /* RDEPUBStyleSheetBuilder.swift */, + 8E85471307D55F36163C3495688467A3 /* RDEPUBTextAnchor.swift */, + CF4F453E8FCDC0F85D36928C5390D77A /* RDEPUBWebView.swift */, + 132F26882A679D32261325CC0E7B460A /* RDEPUBWebView+Configuration.swift */, + 3839A199E78DBF80DB5CF945DCE6C62B /* RDEPUBWebView+FixedLayout.swift */, + 289F977B8DD2ABF03CE0CCED0A8F5671 /* RDEPUBWebView+JavaScriptBridge.swift */, + 75AA5BC3865826B2B32B3305A8CC578B /* RDEPUBWebView+Reflowable.swift */, + EA573F944A7ECEBBA9EC81D72F804D7E /* RDEPUBWebView+Search.swift */, + 8240722CAA937E143E861EF85889D881 /* RDEPUBWebViewDebug.swift */, + 106B5ED13691DE46F20215799B9B3AD0 /* CFI */, + EE28F04957DCFD119C7ECC62C7762527 /* Models */, + C9B9EAB8B8EB5DEA570AC63A127D439A /* Notes */, + ); + name = EPUBCore; + path = EPUBCore; + sourceTree = ""; + }; + 77CEE3EADF5D3703EAFFDED6F4394F74 /* Core */ = { + isa = PBXGroup; + children = ( + 291A21D778336F982A7197655BD501D5 /* RDAIDiagnostics.swift */, + 45F37BFCD74928584B57F92A89DC4573 /* RDAIIndexService.swift */, + 4C90DC3AA09B301621526C8BCC0AD9D9 /* RDAILocatorBuilder.swift */, + BCBD48F4256CF6916C32ACC00CA15E31 /* RDAIReaderContracts.swift */, + 8C637C4B48A62EF0502BDEF1DE9D0E15 /* RDAISQLiteIndexStore.swift */, + ); + name = Core; + sourceTree = ""; + }; 7CA1F6C8239220E05E9A390877954050 /* DTAnimatedGIF */ = { isa = PBXGroup; children = ( @@ -1636,6 +2092,17 @@ name = DTAnimatedGIF; sourceTree = ""; }; + 89B543FBD83F25016955F4C6944803DD /* Development Pods */ = { + isa = PBXGroup; + children = ( + 390A90EDAE212CD241A8BE5BA1738497 /* RDAIReaderView */, + 705B0B3615494EB9A0FEE9A4AA560C7C /* RDEpubReaderView */, + F6622CD8178FE552BA5A2D887FCCA98D /* RDPDFReaderView */, + 12526BFA2BF5BCFD26AF994558197D0D /* RDSpeechReaderView */, + ); + name = "Development Pods"; + sourceTree = ""; + }; 8ABEF91894658D3904F0DB438C040928 /* Support Files */ = { isa = PBXGroup; children = ( @@ -1652,34 +2119,29 @@ path = "../Target Support Files/DTCoreText"; sourceTree = ""; }; - 92ABBF90628E715301E38B1FE0110CC9 /* RDPDFReaderView */ = { + 8EF89AD6276F57F6D4CC74CDC760D410 /* Pod */ = { isa = PBXGroup; children = ( - CDF44A36D7B12F11BD1411607DDF4E7C /* Pod */, - E04622974B1D25E1074FBDC80FEC41F0 /* ReaderView */, - 6AF68E04F5BCA966976C43F4B4A1FE63 /* Sources */, - FE435C6EC3B8B0869661E7503001D153 /* Support Files */, + 712CB0166C21E677902495FEC814327A /* RDAIReaderView.podspec */, + 6E56D97F139ADBF3D0E3DD57E5765A5A /* README.md */, ); - name = RDPDFReaderView; - path = ../../Sources/RDPDFReaderView; + name = Pod; sourceTree = ""; }; - 94E9D80E89F979CA2006199F3D17F066 /* EPUBTextRendering */ = { + 91E48AE3E44D87BABBD3206B031A771E /* AI */ = { isa = PBXGroup; children = ( - 930C3411505409ABE11F153B7A416991 /* RDEPUBChapterData.swift */, - 932004ABE6C86E9E2ED0030B979ED9FF /* RDEPUBDTCoreTextRenderer.swift */, - 933404827F6B057EB29BBDD6125374E4 /* RDEpubPlainTextBookBuilder.swift */, - 61FEB7BE16889FD8532441C936C01304 /* RDEPUBTextIndexTable.swift */, - 916630DBF02CC978ECEBBFD77F10FB65 /* RDEPUBTextPositionConverter.swift */, - EFEB0AF1FD346F25E44C810A469B78E1 /* RDEPUBTextRenderer.swift */, - 089966C3069A2468CA1E889EB69E74A7 /* RDEPUBTextSearchEngine.swift */, - F4ABFCA5463D9D2536BD19ADE48A0E9D /* BuildPipeline */, - 4E5FF130AC100E8943729466CF529221 /* Pagination */, - AE3EBB65F97E2C9FE94518C1A088601B /* Typesetter */, + E3AC0D799821BAB2769DC35260D98143 /* RDAISpeechContentProvider.swift */, ); - name = EPUBTextRendering; - path = EPUBTextRendering; + name = AI; + sourceTree = ""; + }; + 954310FB3650F986B3B28B3C53EAEE28 /* AI */ = { + isa = PBXGroup; + children = ( + CD49AF7F1AEB81E28CF54BDF4BEB7343 /* RDEPUBAIContentProvider.swift */, + ); + name = AI; sourceTree = ""; }; 994C39A644C0722C7A9E97AB46DB8965 /* Targets Support Files */ = { @@ -1690,69 +2152,72 @@ name = "Targets Support Files"; sourceTree = ""; }; - 9CECC4167508D16F7FB1F7E19349BA76 /* TextPage */ = { + A13BFB9F3832E148BEFF4F2E2500B7CC /* ReaderController */ = { isa = PBXGroup; children = ( - E1308D476F85ACCA10D54AF2ED9B34BE /* RDEPUBChapterDisplayContentCache.swift */, - B4B83042E21707CE00778B566E8CB805 /* RDEPUBDarkImageAdjuster.swift */, - 257E3A6D94EB339AF710CBA1515719DC /* RDEPUBPageInteractionController.swift */, - 318A173BC4548B559258A9FE99D42742 /* RDEPUBPageLayoutSnapshot.swift */, - 53AF19D77192D711E50E669495472086 /* RDEPUBSelectionLoupeView.swift */, - 9EC5B30703AA81763AA7A3A2A5A1C9CA /* RDEPUBSelectionOverlayView.swift */, - 2FF34F8FF314B2B52DA562E7160E9AFD /* RDEPUBTextAnnotationOverlay.swift */, - 3A59ED3F13A984E625FF8F6639060AC0 /* RDEPUBTextContentInteractionCoordinator.swift */, - 06D8D0804A9C685D066179823080D2E5 /* RDEPUBTextContentView.swift */, - E6BD7E7A08332F631D063AEBB4DD8F7C /* RDEPUBTextPageBoundaryValidator.swift */, - 8F3756D5F4282ABEF00423938EAF6DE2 /* RDEPUBTextPageDecorationView.swift */, - BECF37BB61D57665E8B2439D3B326503 /* RDEPUBTextPageRenderView.swift */, - 7D41D5F7E42BDEF71C2CD08D7E019C1D /* RDEPUBTextPageVerticalJustifier.swift */, - 296DC86D94CA633F2A0697072F76F90D /* RDEPUBTextSelectionController.swift */, + 7E8C2259B135B2F86D6250BD6B09178A /* RDEPUBBackgroundCoverageStore.swift */, + F7DFA2F1E1C67837F7C4B4363EF16949 /* RDEPUBBackgroundPriorityPolicy.swift */, + 70A8F9DB706EC2E2FCFBAD1E695BB805 /* RDEPUBJumpSession.swift */, + F8233CAA669CAC56C7B0EEE700B53A23 /* RDEPUBMemoryProbe.swift */, + 01BF453B34821E315E0E3B1A1363A538 /* RDEPUBMetadataParseCancellationController.swift */, + F7F679F301CC740E180D3E0ABA038EF7 /* RDEPUBMetadataParseWorker.swift */, + 1AE141846409815273DEBF1DF496BBF6 /* RDEPUBPageMapReconciliationCoordinator.swift */, + F692867A6534E6C9D48E91AB70413D33 /* RDEPUBPresentationRuntime.swift */, + 8B84C004C6CD0C7094EBA83BF3E42DD0 /* RDEPUBReaderAnnotationCoordinator.swift */, + 65F72183F6B8013C5A520595006A2B5F /* RDEPUBReaderAssemblyCoordinator.swift */, + 59D34C7BD6896EBDB5BAFDCC8F420FB6 /* RDEPUBReaderChromeCoordinator.swift */, + CD5495829095E37CEDC515A639F9A9E4 /* RDEPUBReaderContext.swift */, + 921EA5C03E5608583DE9F4C2FC49704B /* RDEPUBReaderDependencies.swift */, + CC507AA13E507E6197F6E4B3BB70F899 /* RDEPUBReaderEnvironment.swift */, + 38B47FDF2463F124FDC2B6154F98E987 /* RDEPUBReaderLoadCoordinator.swift */, + 4C19196DA0724F0BF7BAF7DF59C04D8E /* RDEPUBReaderLocationCoordinator.swift */, + 485961C2B2BC82A4B098F920F901DE24 /* RDEPUBReaderPaginationCoordinator.swift */, + C001AE419BF0DC7FC7836C5BDCD9CF76 /* RDEPUBReaderRuntime.swift */, + 87855F530B15477A1936F953D0A86A63 /* RDEPUBReaderSearchCoordinator.swift */, + 3D56EC508FD85074993AAB6580F72631 /* RDEPUBReaderServices.swift */, + 1061342BC0338CF0BB657142899D83BA /* RDEPUBReaderState.swift */, + 8C59FCD684EB9341B04A358F9BAF4DC4 /* RDEPUBReaderUIState.swift */, + 63FD3DEF59551312E8EEB77A7CDEC93A /* RDEPUBReaderViewportMonitor.swift */, + 8F24C368CBF5CCF60B01598682C6C07F /* RDEPUBSelectionState.swift */, + FEC29D84F2496ED6C394DD3BC97F163E /* ChapterRuntime */, ); - name = TextPage; - path = TextPage; + name = ReaderController; + path = ReaderController; sourceTree = ""; }; - 9D970EBA1BA40EC64171E66F3B136F81 /* Notes */ = { + A35D92C45ED9784FF33310E20959877B /* Support Files */ = { isa = PBXGroup; children = ( - D597E864BC3B6215B502FC3B05C13364 /* RDEPUBNotePopupCoordinator.swift */, - 6EF4435215EDB7548944507506D0A4C9 /* RDEPUBNotePopupViewController.swift */, + 9A3467BB5CFDBA4B48A9830D47CED454 /* RDSpeechReaderView.modulemap */, + A6C3FFDC5714D18BE0534AF20F6C07CA /* RDSpeechReaderView-dummy.m */, + E7112D0C2BB66532AB032E85DB736D16 /* RDSpeechReaderView-Info.plist */, + 67CBB4275FFEB0FDD4DB8C4BB881BDBA /* RDSpeechReaderView-prefix.pch */, + D94A0293C1A11AB0BF793F0804AF01BA /* RDSpeechReaderView-umbrella.h */, + C357AC8D7A6E01440AC68979B529B2F7 /* RDSpeechReaderView.debug.xcconfig */, + 03D925237ACBF4382D1CF970BC943B0D /* RDSpeechReaderView.release.xcconfig */, ); - name = Notes; - path = Notes; + name = "Support Files"; + path = "../../ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView"; sourceTree = ""; }; - A1F674084BE06F873B68AA9765E155DE /* Compatibility */ = { + A60C9476C4F4CB970063579359A474EC /* Products */ = { isa = PBXGroup; children = ( - 0594E39D9568D488378ADCB812715321 /* RDEPUBCSSCompatibilityLayer.swift */, - FB1FB4D69D71D0D1B4C5749FE44F4DA8 /* RDEPUBFontFallbackResolver.swift */, - 3E2EA68BCB5C16362AF8A87E6BED539C /* RDEPUBStyleCompatibilityModels.swift */, + EDA6D5D7D0A04878EE78FAAE94F65068 /* DTCoreText */, + F4E2B1AC73977F10254628C0B7EBE38F /* DTCoreText-Resources */, + D1E89A31867FF1FB44B4B999988F1B82 /* DTFoundation */, + 78EA0DF405F8465A86BFD3DDFD2EC295 /* Pods-ReadViewDemo */, + BD727D8D750906C2FCA03FA988C99329 /* RDAIReaderView */, + 01DCD1B42D40839F1C8DBBDB11EF09BA /* RDEpubReaderView */, + C8A6E90AB5E26049710E2C2404C28B9A /* RDEpubReaderView-RDEpubReaderViewAssets */, + EE10390ED67255ABE5E4D1A1B1EF07F5 /* RDPDFReaderView */, + B03E48EA4685C3F0EC2C0C5A2714C60F /* RDSpeechReaderView */, + 979486118B3E90C08386079D57962701 /* SnapKit */, + B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */, + 48A4A6EDC08C8AC933D0DCD507E9D173 /* ZIPFoundation */, + CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */, ); - name = Compatibility; - path = Compatibility; - sourceTree = ""; - }; - A49CE1BC027ECB5B0D06251AC9EC97A6 /* CFI */ = { - isa = PBXGroup; - children = ( - 8D1DCB390ECBFC669909F9181A3FE8B0 /* RDEPUBCFI.swift */, - 49BEE692A99D3F6541F6A273A49A865D /* RDEPUBCFICompatibility.swift */, - 579B4F428B2ACA84D95B05569FE72F1A /* RDEPUBCFIDOMPathBuilder.swift */, - 49F4B0888234A678C5FF3E5866E73021 /* RDEPUBCFIError.swift */, - 1E7DF84037D55273D99B5284EDE7F7FC /* RDEPUBCFIGenerator.swift */, - FD69D7E6008EE4ABAB3B5DC7AA868A15 /* RDEPUBCFIMap.swift */, - C26F63F750A573082295256163B7B3F7 /* RDEPUBCFIParser.swift */, - DC04C30BD0D2F6408EB5B8054F36B4F2 /* RDEPUBCFIPath.swift */, - FCEAC930B7FAD0BFD2BF58A81C1B82C6 /* RDEPUBCFIRange.swift */, - F09DDC12AA1A0CD529F310E5CE0F99A1 /* RDEPUBCFIRecoveryEngine.swift */, - 88FCFBF2D7F2A0C26D1FBF5161035517 /* RDEPUBCFIResolver.swift */, - D984CA4AF47D4219E0FB6506CD7D2C27 /* RDEPUBCFISerializer.swift */, - C351D0643D777D8082434A64A04B7312 /* RDEPUBCFITextAssertion.swift */, - 244A0250D275B067EFA790D022396B24 /* RDEPUBCFIUtilities.swift */, - ); - name = CFI; - path = CFI; + name = Products; sourceTree = ""; }; A621C86DBEEBABB5DCCB206A343F5945 /* DTCoreText */ = { @@ -1892,49 +2357,22 @@ path = DTCoreText; sourceTree = ""; }; - ACE9EC81EC6D670D075A6387E895F1EC /* RDEpubReaderView */ = { + B329946AD586BB80865C46BC7ADAF9A9 /* AI */ = { isa = PBXGroup; children = ( - 71751F490BDBE080BDE46E24BD09DC25 /* cssInjector.js */, - B3F4461DF9B7620283F97023A78C08D8 /* epub-bridge.js */, - AED29B787D83E9C4459430CDE0DB612A /* epub-fixed-layout.html */, - C48F11FB4EFE57B4DED13881F78ED4A8 /* rangy-core.js */, - 2F23F0E002BEE47B1E786821D96067E4 /* rangy-serializer.js */, - 14BBECB3A6235FDD72CE46FBCD08FE3C /* WeReadApi.js */, - 5ECBBE5C440153A7C6B87D92B16289B0 /* wxread-dark.css */, - 1D7343E0F0547D801BC11E2D708AA33A /* wxread-default.css */, - C4701A7F7E553E7824903F43562AFC19 /* wxread-replace.css */, - BE9EC25AFCAE91B4EA5A1DDD5FE564DD /* wxread-replace-latin.css */, - 5CF51AAF204A51E43EC2F5A0358FE4D9 /* DocumentFormats */, - C48850EA7D5AA97D7433CC6AC925D959 /* EPUBCore */, - 94E9D80E89F979CA2006199F3D17F066 /* EPUBTextRendering */, - C1C8C1213789AAA7171C30160874422B /* EPUBUI */, - 12AA3A987A0426F2462A865D2B48B81A /* Pod */, - 77642874661547D9559633730603385E /* ReaderView */, - F20A30A149F873CE03DAAB1A694007CD /* Support Files */, + 81313A5C1BC97CDA5BE30763C8F014F9 /* RDPDFAIContentProvider.swift */, ); - name = RDEpubReaderView; - path = ../../Sources/RDEpubReaderView; + name = AI; sourceTree = ""; }; - AE3EBB65F97E2C9FE94518C1A088601B /* Typesetter */ = { + B35FB170F5C2298D1935E081C045E183 /* Notes */ = { isa = PBXGroup; children = ( - C6B4FC527668E1E4A43F77E5D5B034EF /* RDEPUBAttachmentNormalizer.swift */, - C70BC146F77AE5CE624A06A7946C1703 /* RDEPUBCFIMarkerInjector.swift */, - E02FC3DBD9707CA1A2C087E36DEBDFF8 /* RDEPUBDecryptingImageAttachment.swift */, - 6FCABB4D698319B7BD34E6F1984C6C81 /* RDEPUBFontNormalizer.swift */, - C7FC439421769A5FC6884F5135ABAF08 /* RDEPUBFragmentMarkerInjector.swift */, - 54B4C37E4A452238A2B3D65A483FF624 /* RDEPUBHTMLNormalizer.swift */, - CB985E900E9F34170BD44A81E7FD1C83 /* RDEPUBRenderDiagnosticsCollector.swift */, - B36A4B649DD5CA1C5D4DAFC54E0E13DC /* RDEPUBSemanticMarkerInjector.swift */, - 2ADB2BD72FA5B1DA4D59440FFC04DE2C /* RDEPUBStyleSheetComposer.swift */, - 5F2315273E8A0E225152D3BBBD8441AA /* RDEPUBTextRendererSupport.swift */, - 5AC70C974C448660DF34C7FBA424FD78 /* RDEPUBTypesettingPipeline.swift */, - A1F674084BE06F873B68AA9765E155DE /* Compatibility */, + 87893187F5137BA27FE812E2F9346B30 /* RDEPUBNotePopupCoordinator.swift */, + 76D2244BDA6024551727F35AA3454980 /* RDEPUBNotePopupViewController.swift */, ); - name = Typesetter; - path = Typesetter; + name = Notes; + path = Notes; sourceTree = ""; }; B463807D92B5853C009524A41B5F7B6D /* Core */ = { @@ -1984,50 +2422,12 @@ name = Core; sourceTree = ""; }; - B693261E4FA6A82FD11B40B7E7BD4958 /* Settings */ = { + B7437DB97F277F7C1807DAB99C765913 /* UI */ = { isa = PBXGroup; children = ( - 92AA4E9E3B871C30A1C7BF9141CD9770 /* RDEPUBReaderConfiguration.swift */, - 7CE5B910E4B90BDD78B2747C7184C745 /* RDEPUBReaderSettings.swift */, - D18CE46766B67622CBA19146529FE7AD /* RDEPUBReaderSettingsViewController.swift */, - 8F65D6C8950F76034AD414199E8D4C2E /* RDEPUBReaderTheme.swift */, + 75F5A849E82ECED8710DBA54B127186F /* RDAIReaderAssistantViewController.swift */, ); - name = Settings; - path = Settings; - sourceTree = ""; - }; - BAC1AA0B57FFD6E0CEB4D6DE0C8E2EEA /* Paging */ = { - isa = PBXGroup; - children = ( - 69252E848F3036D84BCE5A09B0544390 /* RDEpubReaderPagingController.swift */, - 101E8704978C7417FCD99D18764F42B6 /* RDEpubReaderPreloadController.swift */, - 53BD308DABD26A8A8B9CC272486D6EB0 /* RDEpubReaderSpreadResolver.swift */, - 05A48723D29BFECCDE51DE4E1CABDD67 /* RDEpubReaderTapRegionHandler.swift */, - ); - name = Paging; - path = Paging; - sourceTree = ""; - }; - BB63F9A378E1403079A93D9C2C038091 /* ChapterRuntime */ = { - isa = PBXGroup; - children = ( - 78B720430DB36E3E3D207599DC78CCF1 /* RDEPUBBackgroundTrace.swift */, - B9E2296EBB237D8071B8280E81601AE2 /* RDEPUBBookPageMap.swift */, - 37946E93F2D5F5FF5392FCC3BF0F9424 /* RDEPUBChapterCacheKey.swift */, - FF56076797358B800EE1C35C5FB6360B /* RDEPUBChapterDataCache.swift */, - 59FBE51D9C334D6C796944A37A36FA0B /* RDEPUBChapterLoader.swift */, - D6A2D1BF70F1C6B7354AC88C3DC52656 /* RDEPUBChapterLocation.swift */, - 557386F3232CE41AD7A21D1D0C412FC0 /* RDEPUBChapterOffsetMap.swift */, - 6B56088831DB283C0FCC800A365BA5B2 /* RDEPUBChapterRuntimeStore.swift */, - B15FA2EA6F88DB9AE0FB9356EC5B515C /* RDEPUBChapterSummaryDiskCache.swift */, - 4977ECD606F12A1293FCF0EF36934E5E /* RDEPUBChapterWarmupOrchestrator.swift */, - BFB4A8DFD2E0EE6D2285B69A5BEA0CBE /* RDEPUBPageCountCache.swift */, - 7340AFD453A481A52CFFC7C7D8C50B87 /* RDEPUBPageResolver.swift */, - F53A99F5B071BEA755E7344615C5D4FD /* RDEPUBRuntimeChapter.swift */, - F7AAEDE9AFDB7C593B3B29F05A8A9702 /* RDEPUBRuntimePageCount.swift */, - ); - name = ChapterRuntime; - path = ChapterRuntime; + name = UI; sourceTree = ""; }; BC94BBA575D65BD789B3BBC38F35DA38 /* Support Files */ = { @@ -2046,102 +2446,15 @@ path = "../Target Support Files/ZIPFoundation"; sourceTree = ""; }; - C1C8C1213789AAA7171C30160874422B /* EPUBUI */ = { + C9B9EAB8B8EB5DEA570AC63A127D439A /* Notes */ = { isa = PBXGroup; children = ( - 3FE0B907BC40F5886B5D8761C8E1C984 /* RDEPUBAnnotationEditorViewController.swift */, - 298E057B5F44628E4EE593F1513E95A6 /* RDEPUBAttachmentTooltipOverlayView.swift */, - 767016761BF5B8D57595E288BC501BF7 /* RDEPUBAttachmentTooltipView.swift */, - C4E616B199145721C28A90BE0D21C98B /* RDEPUBImageViewController.swift */, - B977B258211F447182E6FA36952EA842 /* RDEPUBImageViewerCoordinator.swift */, - BBD91BDB14FD6C89E095E237DC0F37A7 /* RDEPUBReaderBottomToolView.swift */, - 9C5C5D2EF233B42FA8D3BCF06713DF42 /* RDEPUBReaderChapterListController.swift */, - 1697531DEC18EA6F9B99D0146C015338 /* RDEPUBReaderController.swift */, - 9862A154F02C241514009AD44CC3567B /* RDEPUBReaderController+AttachmentTooltip.swift */, - 57F1B61908D2C1EBC6471CC6E9B90A4C /* RDEPUBReaderController+ContentDelegates.swift */, - 8B1B27CD14A9E7FB6895C4F6F2E70179 /* RDEPUBReaderController+DataSource.swift */, - D730579455F74FB03C7E8A4E50484823 /* RDEPUBReaderController+ExternalLinks.swift */, - B6FC740435D649A1BF4303E48F85889C /* RDEPUBReaderController+LocationResolution.swift */, - 4D4D4F7D2C3A548F609164CC506388BE /* RDEPUBReaderController+Orientation.swift */, - CD9D544D3DF2CDAE5B6EECFF892BD9F5 /* RDEPUBReaderController+PublicAPI.swift */, - 8E5DEEA6A9CEFC805D050932E03E1A21 /* RDEPUBReaderController+RenderSupport.swift */, - 76244BD19BB5CB592A5EB99402C94A45 /* RDEPUBReaderController+RuntimeBridge.swift */, - C9D1B125AA5600F835F9AB456100B5BC /* RDEPUBReaderController+TableOfContents.swift */, - 79D6E6B825D0F311663E6A9EFA5D2A7F /* RDEPUBReaderController+Trial.swift */, - E242368DFEDB6BD27EDA8C0E5915D6F5 /* RDEPUBReaderDelegate.swift */, - CB6B2A6C61E6FB95968A8366924DE033 /* RDEPUBReaderHighlightsViewController.swift */, - 3085A431A30E4E2DC3F5E4CAFBA83B5D /* RDEPUBReaderPersistence.swift */, - 197D0C3E827B624F40FB510F3BD8A906 /* RDEPUBReaderSearchBarView.swift */, - D7D294019CB6322021FE87237FA56DA3 /* RDEPUBReaderTableOfContentsItem.swift */, - 499B927AB070F064B0E8A012382003F1 /* RDEPUBReaderToolView.swift */, - 82C4B8E3666736C72FD8AA9774095CD5 /* RDEPUBReaderToolViewProtocols.swift */, - D86146C71353D766AED457B0B59F13E3 /* RDEPUBReaderTopToolView.swift */, - 0CABC6F6EBE38588FD08D8CDF4EAF88F /* RDEPUBSettingsFlipAutomation.swift */, - F88EAEAB89867B1405011D65F95E4F64 /* RDEpubURLReaderController.swift */, - 2CF7C6BEE1CB54D2546C94E58BEE0EC6 /* RDEPUBViewportTypes.swift */, - 34407B046ADF145B3DA08FE4C28609C6 /* RDEPUBWebContentView.swift */, - 5AAE327FF1505A989454CFB6BE8D5056 /* RDEPUBWebDecorationOverlayView.swift */, - A00A7D3C70A06A1D06B0EF2D25AA3DC8 /* String+RDEPUB.swift */, - DE5B47B33D7F759C3CD6BEDA1A69185D /* UIColor+RDEPUB.swift */, - A24CED4F43EC2C2F55A6512A761B97B9 /* UIColor+RDEPUBHex.swift */, - 9D970EBA1BA40EC64171E66F3B136F81 /* Notes */, - E07D4D63009D077C1166DC1CD5BB5FEB /* ReaderController */, - B693261E4FA6A82FD11B40B7E7BD4958 /* Settings */, - 9CECC4167508D16F7FB1F7E19349BA76 /* TextPage */, + 574844915C6A0BA87B43940426C8DA96 /* RDEPUBNoteDetector.swift */, + C9B7588747FF74836493105F6698CC00 /* RDEPUBNoteModels.swift */, + B662AF2609AEAE5D2B6488E6FBEBDC3B /* RDEPUBNoteResolver.swift */, ); - name = EPUBUI; - path = EPUBUI; - sourceTree = ""; - }; - C48850EA7D5AA97D7433CC6AC925D959 /* EPUBCore */ = { - isa = PBXGroup; - children = ( - 6F37E867DE563EFD505DBB674F4FDDF6 /* RDEPUBAssetRepository.swift */, - C3BA5BC80827B5E54253367E574D3623 /* RDEPUBFixedLayoutTemplate.swift */, - 47856474DDE696BF61255DF73D2D799D /* RDEPUBJavaScriptBridge.swift */, - 79D75F4A7A02692556E18AC3A388A190 /* RDEPUBModels.swift */, - 89DEA6EF4DB86448B595CCB2ACC06C97 /* RDEPUBNavigatorLayoutContext.swift */, - 90FED6AA55769B0F41A57155366E801D /* RDEPUBPaginator.swift */, - 5D82EEDCF29F3E5B37BEA5191F49610E /* RDEPUBParser.swift */, - D815A3BEB1A8F3959502A4B87558549C /* RDEPUBParser+Archive.swift */, - 1CC0B71EB8AFFDB330E0D8E99CFFCDD3 /* RDEPUBParser+Package.swift */, - 2C37E4DD39F7CDCFA4C0776B8CAB60A7 /* RDEPUBParser+ReadingProfile.swift */, - 4D4997C97BB58CF60B165D1BD0C31985 /* RDEPUBParser+Resources.swift */, - 8B808EF921BB59C1A78691D36ECC666B /* RDEPUBParser+TOC.swift */, - 016C4701210031B8CBC8C4C2D03DB357 /* RDEPUBPreferences.swift */, - 24818987BA7C833972E50A1921661271 /* RDEPUBPublication.swift */, - 422C9DACF0702754BAAA0A37E8A0D4F9 /* RDEPUBReadingSession.swift */, - DC7EF3FC064B375733390FA3799A617B /* RDEPUBRenderRequest.swift */, - 9CC380EF32AB6FB2395CF0B9E62F3317 /* RDEPUBResourceDataProvider.swift */, - 2193B99AFE9594D920D7CA76190FFC8E /* RDEPUBResourceResolver.swift */, - 3822FA364A35F16FFA9D2AAE31E22EF0 /* RDEPUBResourceURLSchemeHandler.swift */, - F766A861EB3484C3C519700E104BF91B /* RDEPUBSafeArea.swift */, - ECBD2FB74FE0B1966256CD0C39BF1F83 /* RDEPUBSearchEngine.swift */, - CA7B6B7B55D1E706B41644DDA956D2CA /* RDEPUBSearchModels.swift */, - C24DC0DF11DB45CDC92395B3EA2689B5 /* RDEPUBStyleSheetBuilder.swift */, - 5D9886E67C654192303F817E356E9C60 /* RDEPUBTextAnchor.swift */, - D752B202581818FDFBB68CDD7FA75213 /* RDEPUBWebView.swift */, - 13FF31007A05E5706CF26F9BC9DBD462 /* RDEPUBWebView+Configuration.swift */, - 54F55F21A6B7661A8D560DB1557E6B97 /* RDEPUBWebView+FixedLayout.swift */, - 92790B32EB81BDF75E8ACD8E3C4BBE10 /* RDEPUBWebView+JavaScriptBridge.swift */, - D9FE68DE46E8F50DDA44B5EF63ABC67A /* RDEPUBWebView+Reflowable.swift */, - BFCB5D51A2FE9AE00599C8B10A728AC7 /* RDEPUBWebView+Search.swift */, - 1E68AD352C43FD90827957D8073F835A /* RDEPUBWebViewDebug.swift */, - A49CE1BC027ECB5B0D06251AC9EC97A6 /* CFI */, - 4B02D3227E5D9E7F70981E0648FAAF3B /* Models */, - 283A5FB1D5F251D92061976EF101E7A4 /* Notes */, - ); - name = EPUBCore; - path = EPUBCore; - sourceTree = ""; - }; - CDF44A36D7B12F11BD1411607DDF4E7C /* Pod */ = { - isa = PBXGroup; - children = ( - 07206349472D73174829CAD2B189B5FF /* RDPDFReaderView.podspec */, - 4D468DB9B31EA67BD86A1A48BE74733A /* README.md */, - ); - name = Pod; + name = Notes; + path = Notes; sourceTree = ""; }; CE79C46AB83D5ADB696E51F586C0BD5B /* Support Files */ = { @@ -2163,75 +2476,38 @@ isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 0BBAC52764CEAE2020B3D2FD7E8CA22F /* Development Pods */, - 0656CE04288357F0748AB498835BA03E /* Frameworks */, + 89B543FBD83F25016955F4C6944803DD /* Development Pods */, + E5F5C55E92AC2AAD92797EE3CC9ED22C /* Frameworks */, 4DEB1352F0064F93A274DDB2378895FC /* Pods */, - 6F4044234426984401A57CF2DB1C7C47 /* Products */, + A60C9476C4F4CB970063579359A474EC /* Products */, 994C39A644C0722C7A9E97AB46DB8965 /* Targets Support Files */, ); sourceTree = ""; }; - DAC1DE7BF5C2D9CBABA8F20B8B79EAE1 /* iOS */ = { + E0FC55DB56DA89CE8132DB26EFAD6331 /* NaturalLanguage */ = { isa = PBXGroup; children = ( - B6677A5CD728A7E722DC3075C374CDF4 /* CoreGraphics.framework */, - 04DF49B738958596E47F57961FA3A69A /* CoreImage.framework */, - 63482DC4A15D66980EFBAA222D2D6CA8 /* CoreText.framework */, - D8CFFED8482DB33A1FCB300586CD3AFA /* Foundation.framework */, - B0AC91254785C4B0B73D391B603ADE47 /* ImageIO.framework */, - 3A71A099FDBC70A51AE773741C33A4AC /* MediaPlayer.framework */, - 232BAE44CA9BE28B729B402BC8B8FAD8 /* PDFKit.framework */, - 50AE5BE674D885BED9B796FE8D97FAF8 /* QuartzCore.framework */, - 9F3DE5DDD4D63B6FB5FEADA0E292CB33 /* Vision.framework */, + 4D908F35D94E51D89507601431AC05B9 /* RDAINaturalLanguageAnalyzer.swift */, + 62F3A858FD7165A3AEBBCA78E105DB73 /* RDAINaturalLanguageSemanticScorer.swift */, ); - name = iOS; + name = NaturalLanguage; sourceTree = ""; }; - E04622974B1D25E1074FBDC80FEC41F0 /* ReaderView */ = { + E34A5243D06FA39B0B56462DAC551747 /* Pod */ = { isa = PBXGroup; children = ( - 15FA72422C7B69BBA7D5B3CFF098CCE5 /* RDPDFReaderContentCell.swift */, - D1057324B30CCD038ABC27688B0DC6A3 /* RDPDFReaderPageChildViewController.swift */, - DD002812D1D11866A93FEFB5024D5DA0 /* RDPDFReaderView+CollectionView.swift */, - E3BF1AFD43CD35EDA59ED119955FAC96 /* RDPDFReaderView+Paging.swift */, - 671C2212E0B20B47CA0A56D7138411B1 /* RDPDFReaderView+ToolView.swift */, - 67B330C87C949111FBD9B86FA4108CCA /* Paging */, + EE5C053C6616645F9162F47DB3102BE3 /* RDEpubReaderView.podspec */, + 5282E8702FED953DC43F2FF5E61290C8 /* README.md */, ); - name = ReaderView; - path = ReaderView; + name = Pod; sourceTree = ""; }; - E07D4D63009D077C1166DC1CD5BB5FEB /* ReaderController */ = { + E5F5C55E92AC2AAD92797EE3CC9ED22C /* Frameworks */ = { isa = PBXGroup; children = ( - 8F533FF48C81C0B1684CA895D72C646F /* RDEPUBBackgroundCoverageStore.swift */, - 46D6BA3E651245BCC8808128EF553958 /* RDEPUBBackgroundPriorityPolicy.swift */, - BEAE3FA90F67CCE6CFC228B56189BD20 /* RDEPUBJumpSession.swift */, - EE8ABB198220CF4FE67049FE2349947A /* RDEPUBMemoryProbe.swift */, - 4A230A3524DED0923CEC303B4C54C833 /* RDEPUBMetadataParseCancellationController.swift */, - 7CCE92FD9E1B88BD2FE582C98A4AE8EC /* RDEPUBMetadataParseWorker.swift */, - 898D56C24CC6E71662D88243FD4A030E /* RDEPUBPageMapReconciliationCoordinator.swift */, - F51399FB07DB540E97ED404FAB685C31 /* RDEPUBPresentationRuntime.swift */, - 7F00C52E49C78CE7F63C155C5C74AFBE /* RDEPUBReaderAnnotationCoordinator.swift */, - D241F2043503DC1C01B6FBDE8C08DD1B /* RDEPUBReaderAssemblyCoordinator.swift */, - 60BD829978DA910F152D499A1BA7E04B /* RDEPUBReaderChromeCoordinator.swift */, - E5C393B65BEDBCD67A7B2BD0FD26B869 /* RDEPUBReaderContext.swift */, - 5465156489BA8D643EA9935146897329 /* RDEPUBReaderDependencies.swift */, - D8CD636112E10AA865F164AA3D168C00 /* RDEPUBReaderEnvironment.swift */, - 8B6EC13F25BB402502F307A53001F7D4 /* RDEPUBReaderLoadCoordinator.swift */, - AE3CFAC2C855F60E5A3BFC2F3861BA1C /* RDEPUBReaderLocationCoordinator.swift */, - A2046F1B0D719EC5C1291C1714DF0751 /* RDEPUBReaderPaginationCoordinator.swift */, - 64DE54DECA8006B6CC936B6A5271D1ED /* RDEPUBReaderRuntime.swift */, - 53E8A047531C39D6A6942EC72AF77ADD /* RDEPUBReaderSearchCoordinator.swift */, - 0EA1817F681CEC8A380F9824BD490E73 /* RDEPUBReaderServices.swift */, - CC13BF0AF43ECCBA7F956B059633C358 /* RDEPUBReaderState.swift */, - D24510AD02ED2650316ED6246FD926EE /* RDEPUBReaderUIState.swift */, - 926FC58A23312DD1B9B06F1C52993208 /* RDEPUBReaderViewportMonitor.swift */, - 3BEBF652FA65A9AB3D558E1A2A511051 /* RDEPUBSelectionState.swift */, - BB63F9A378E1403079A93D9C2C038091 /* ChapterRuntime */, + 0865045148005FBCE541CC3C8B179490 /* iOS */, ); - name = ReaderController; - path = ReaderController; + name = Frameworks; sourceTree = ""; }; EC1DF5C41F0676128C483B9B7B6368BB /* UIKit */ = { @@ -2261,6 +2537,17 @@ name = UIKit; sourceTree = ""; }; + EE28F04957DCFD119C7ECC62C7762527 /* Models */ = { + isa = PBXGroup; + children = ( + A5F66A96961A944FE192D39888B026E6 /* RDEPUBAnnotationModels.swift */, + 5620BF46CC66D177218F95274B0899FD /* RDEPUBPaginationModels.swift */, + E47128B5AD65D4FA9BA728CDF73C47E5 /* RDEPUBReadingLocationModels.swift */, + ); + name = Models; + path = Models; + sourceTree = ""; + }; F0B5602D4D4DEF32DA9FFEAE235178C9 /* DTHTMLParser */ = { isa = PBXGroup; children = ( @@ -2270,56 +2557,93 @@ name = DTHTMLParser; sourceTree = ""; }; - F20A30A149F873CE03DAAB1A694007CD /* Support Files */ = { + F6622CD8178FE552BA5A2D887FCCA98D /* RDPDFReaderView */ = { isa = PBXGroup; children = ( - 1FC7A51A9F6D730A23D6220001DF40BC /* RDEpubReaderView.modulemap */, - D4ABEB07AC55D55BE9BCECAA2B25D794 /* RDEpubReaderView-dummy.m */, - E6F0CF779FBA5FFD0E72068E1F714942 /* RDEpubReaderView-Info.plist */, - 40123F24B4E99825DEBE316FC14BE8F2 /* RDEpubReaderView-prefix.pch */, - 44765E4CAD77632F37A650F5ABDCDAD5 /* RDEpubReaderView-umbrella.h */, - 80EF554F6662D1148455292C4F03A585 /* RDEpubReaderView.debug.xcconfig */, - 543B7B3F4EEB0FAD86C96E5DCE0E22CC /* RDEpubReaderView.release.xcconfig */, - 183D5601B41EA616973AC94E459FA1AB /* ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist */, + B329946AD586BB80865C46BC7ADAF9A9 /* AI */, + 23EEF1F245171001FD8C637D33393E98 /* Pod */, + 18E044FA60A4142CAEBBA1BA8B351AF0 /* ReaderView */, + F6A7324D4ED1CF7A7EE71045C88E5B38 /* Sources */, + 5788D3728DAFD201F8BDC34C43323168 /* Speech */, + 3D6BCAC12147FE8B0B02B30D3A5C3F54 /* Support Files */, ); - name = "Support Files"; - path = "../../ReadViewDemo/Pods/Target Support Files/RDEpubReaderView"; + name = RDPDFReaderView; + path = ../../Sources/RDPDFReaderView; sourceTree = ""; }; - F4ABFCA5463D9D2536BD19ADE48A0E9D /* BuildPipeline */ = { + F6A7324D4ED1CF7A7EE71045C88E5B38 /* Sources */ = { isa = PBXGroup; children = ( - 6101F66C96A97F01A48A9214DEE40D02 /* RDEPUBBuildDiagnosticsReporter.swift */, - 1B05F3444C3A7680B4D1E4DE01B8A567 /* RDEPUBChapterTailNormalizer.swift */, - B81D503CA2CCE9D4172B5D9BB346ED30 /* RDEPUBPaginationCacheCoordinator.swift */, - 98A73A4E2FE3A04E24598C615F097708 /* RDEPUBTextBookBuilder.swift */, - BEC7D701A0361A9C2BB93906A4A7DFDD /* RDEPUBTextBookCache.swift */, - 5943DD019F4F6E9E8608E88D2420888C /* RDEPUBTextBookModels.swift */, - D436946B4DC3D4F40E7B50F9F3A77DF6 /* RDEPUBTextBuildPipelineInterfaces.swift */, - B59F66F549E44C57A256286385891551 /* RDEPUBTextPerformanceSampler.swift */, + 4419BC4EF1BB72BD430008215C2194B1 /* RDPDFKitPageProvider.swift */, + C91AB03142606446D515451D75613853 /* RDPDFReaderAnnotationEditorViewController.swift */, + E91A6DF5577800E7F0CB647061DB03E5 /* RDPDFReaderAnnotationListViewController.swift */, + BB7C3A637594FCD8D6F09237F5103A39 /* RDPDFReaderChromeViews.swift */, + A51CF84AF3FB536008E31CBC800E12B8 /* RDPDFReaderContainerView.swift */, + F01A20D999E550EFA3C472C3A20E6A90 /* RDPDFReaderContracts.swift */, + 16957235ACD001BED6FBC8A1D2CB5BA5 /* RDPDFReaderDebugViewController.swift */, + 0D15E11E01B7F344DD8863CBBC543A77 /* RDPDFReaderDrawingCanvasView.swift */, + DFBBED2FC1668912DBF7592720CC14A4 /* RDPDFReaderDrawingLayersView.swift */, + 75FC55A17D1CCC4C4BEB88B146B790D8 /* RDPDFReaderDrawingToolbar.swift */, + 6C9532C775F9C0F2DDE745981A3E5BD2 /* RDPDFReaderHighlightOverlayView.swift */, + 48D4FB95327A55188B4EE105C47E7090 /* RDPDFReaderImageTextLayerView.swift */, + 1A4F73DDFA534B5DDC38C9044FF275E0 /* RDPDFReaderImageTextRecognizer.swift */, + BBED33030719998F00A5173D3C466BD8 /* RDPDFReaderKitView.swift */, + CF159AB510600EA0CD9EAE58F29A6582 /* RDPDFReaderNavigationPanelViewController.swift */, + 4B3397616AD34F6B89948DEBE139C7C5 /* RDPDFReaderNavigationView.swift */, + 54F2C8B38BF0106D946BEE9F7E854D08 /* RDPDFReaderPageView.swift */, + 9D87DBCF57F23239B520B73B9C238F64 /* RDPDFReaderPanelPresentation.swift */, + D9B368C95FB7C2727A7CA452242CB904 /* RDPDFReaderPersistenceStore.swift */, + F1B84BFB1ACB4057989E6AE9A039B3AC /* RDPDFReaderSettingsPanelViewController.swift */, + F939D46D9D49EF5FCAFCB16F1E35E23E /* RDPDFReaderSettingsView.swift */, + 7E9BFD9290BCB2009DB319A63935EF99 /* RDPDFReaderTheme.swift */, + 4F654C6659A3FDE4C3E08BBDD2C01CCF /* RDPDFReaderViewController.swift */, + 8A41D37F86EFC816F7478316843069DA /* RDPDFZoomablePageView.swift */, ); - name = BuildPipeline; - path = BuildPipeline; + name = Sources; + path = Sources; sourceTree = ""; }; - FE435C6EC3B8B0869661E7503001D153 /* Support Files */ = { + FCA201DAA29B65124F3AD5D2A6291B0F /* FoundationModels */ = { isa = PBXGroup; children = ( - 21AE24836ACB2BC812E9FF5C0F4302FE /* RDPDFReaderView.modulemap */, - C5F29D53A7FD825F0CEAB345B46B3FC6 /* RDPDFReaderView-dummy.m */, - B6BC7F1D23C7996F1D9C176B3EB7F0A6 /* RDPDFReaderView-Info.plist */, - 021E6F2E185A56B66D1B92DDB9FE8DE7 /* RDPDFReaderView-prefix.pch */, - B1F0955DB654E4B3265622218E9CF71A /* RDPDFReaderView-umbrella.h */, - C5090C56303AB966C51846110FF05A64 /* RDPDFReaderView.debug.xcconfig */, - D3CE152E896CA22C59944E4E3BBBF760 /* RDPDFReaderView.release.xcconfig */, + 27F4AF07E5CBA7B0CC54553D55983D1F /* RDAIAppleFoundationModelsProvider.swift */, ); - name = "Support Files"; - path = "../../ReadViewDemo/Pods/Target Support Files/RDPDFReaderView"; + name = FoundationModels; + sourceTree = ""; + }; + FEC29D84F2496ED6C394DD3BC97F163E /* ChapterRuntime */ = { + isa = PBXGroup; + children = ( + EA44E461F73A280FD2649C38E2A66E15 /* RDEPUBBackgroundTrace.swift */, + 51339BC494F76D8DB8C1A4968689C617 /* RDEPUBBookPageMap.swift */, + AADAFB1246D8B4F7930DFDE508B2271A /* RDEPUBChapterCacheKey.swift */, + A8A2AD9A0A7E27EC46F2AD598250ED2C /* RDEPUBChapterDataCache.swift */, + 1EE7ABC1E00E2AD5CD17521B799DDABF /* RDEPUBChapterLoader.swift */, + EA82E36367E127E1D5C8F2EDC2F60797 /* RDEPUBChapterLocation.swift */, + 9DD53D37218AA3C7D5C7756F00FA21E9 /* RDEPUBChapterOffsetMap.swift */, + 1AA811488B6B1DCC5A5F916EF08D7E0E /* RDEPUBChapterRuntimeStore.swift */, + 18BA62D664A5A8EED63F1B9AE279B4EB /* RDEPUBChapterSummaryDiskCache.swift */, + 3C2ECAEF31AA6DC14F2C3A19A03F050F /* RDEPUBChapterWarmupOrchestrator.swift */, + 0A70E0ECB35D874C1E9699C1CD0F6261 /* RDEPUBPageCountCache.swift */, + 41EC12208AD1A079C60779F6DD30DAC4 /* RDEPUBPageResolver.swift */, + D52E6C5D8864C2E11D3F6143638FFA82 /* RDEPUBRuntimeChapter.swift */, + 510888775BFD893D3C1A93984E31FE11 /* RDEPUBRuntimePageCount.swift */, + ); + name = ChapterRuntime; + path = ChapterRuntime; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 086C172114011A6C77C8DD003CD7E7C8 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + E78EF60735A6686F6DF424C052875F62 /* SnapKit-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 29CB77F5EC62298B8E19FEFFD791AEAD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -2393,84 +2717,92 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 324DB0B5683AE6E6046BCF3447217A36 /* Headers */ = { + 44C1420C6D84F4B642A502E7BFDA3E99 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - C3FFF1454F3F3A1AA592268E7C43AEEA /* Pods-ReadViewDemo-umbrella.h in Headers */, + 0030FDF2E834088639D9C73A89669CC1 /* RDPDFReaderView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 3CB54C2BD3C748472316E55EA21956B4 /* Headers */ = { + 7B62A2629B260921A757EB5A184ED2AA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 6FE5AF431C87317881376957C2CF69A9 /* DTActivityTitleView.h in Headers */, - 4EE1DE32B6F53040034BD25CD6546805 /* DTAnimatedGIF.h in Headers */, - 00FD74A9CCE1BD7C92EF92B3051C7EAC /* DTBase64Coding.h in Headers */, - D5635DF62FAB378BEF97BBF8F8809DF5 /* DTBlockFunctions.h in Headers */, - 87A781E3D8E62CD7CEB6119E868AA323 /* DTCompatibility.h in Headers */, - 1018B5174E5013C9C38391BB507C4F8B /* DTCoreGraphicsUtils.h in Headers */, - 0B5BA9A15467D36EB54F7CFF8036AB85 /* DTCustomColoredAccessory.h in Headers */, - 2D9ED50265434753B6D9C1B50A21FCED /* DTExtendedFileAttributes.h in Headers */, - 9310666E5DB97AB7D7BA35A9FF70488E /* DTFolderMonitor.h in Headers */, - 03290D0EDE675175B8346B3BBA253DE0 /* DTFoundation-umbrella.h in Headers */, - 8A6C2CB8AE2F41661DB70FE4262F7058 /* DTFoundationConstants.h in Headers */, - 228E6814C78EEBFEE8E9EA4802016FC0 /* DTHTMLParser.h in Headers */, - 987AC28BE0204F311650F5193918CFA0 /* DTLog.h in Headers */, - 694BD20B3540D7F581D1A2A619B0CA30 /* DTPieProgressIndicator.h in Headers */, - 0092B10CEF9FA5B003A243F20E685AC0 /* DTSmartPagingScrollView.h in Headers */, - D484255D55B2E6965411F26256BB39A4 /* DTTiledLayerWithoutFade.h in Headers */, - 3D8AC6AA5DA1B5B430DBC4A2DE86C977 /* DTVersion.h in Headers */, - 47377798BC8063B8C0BF24DB9E7A6410 /* DTWeakSupport.h in Headers */, - 1F811F480AA892090B887D50BF1FB361 /* NSArray+DTError.h in Headers */, - 8ADB863F8874EB8B39500114164F30CF /* NSData+DTCrypto.h in Headers */, - CCBDC2E4ABEBFB94C69CD31C1062F52B /* NSDictionary+DTError.h in Headers */, - 167B3023D4C7C6FEB312E907C356283E /* NSFileWrapper+DTCopying.h in Headers */, - 2474F7E6FA6B8473C121C81B6FCDCCF3 /* NSMutableArray+DTMoving.h in Headers */, - 105FAC578AB664388C1943FF0F6F84ED /* NSString+DTFormatNumbers.h in Headers */, - 75963BFC9C773BEC204A40DBD9FCB60F /* NSString+DTPaths.h in Headers */, - E344F26F1775C03DF2F885AC51CF5424 /* NSString+DTURLEncoding.h in Headers */, - FCCDEDD358B1CE7CB1A11A1CB1BEDFD8 /* NSString+DTUtilities.h in Headers */, - 7D6F73E1161FF39B9A117AAEB0A962D9 /* NSURL+DTAppLinks.h in Headers */, - 7F155CDA8CE804815318D2E26C97EFA9 /* NSURL+DTComparing.h in Headers */, - 63FD358173BBF197BDB59F4B6696C3F0 /* NSURL+DTUnshorten.h in Headers */, - 629BBA5268F2ABA1AAB10761703FD219 /* UIApplication+DTNetworkActivity.h in Headers */, - 4C098A754CDDF19F161D09EB3C31AA91 /* UIImage+DTFoundation.h in Headers */, - 72C6CEBCA38D27D9135CD1A48699315B /* UIScreen+DTFoundation.h in Headers */, - A2582EBC9C4BF15AB10F62F5C2F70654 /* UIView+DTFoundation.h in Headers */, + A42CE42ADF162F25E1B2EDE4220B7B51 /* RDSpeechReaderView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 4C1684944E3ADD50FE3310550898BBAB /* Headers */ = { + 7F63C2276BE0AF157A39507DEA12294D /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 9AFFCA108C94C7B57BA13D014B19659B /* SnapKit-umbrella.h in Headers */, + 5980E58B9A264939FA5CBE838154F066 /* DTActivityTitleView.h in Headers */, + 5CE19D28BB2108D3D10A2D8150AE1CB1 /* DTAnimatedGIF.h in Headers */, + 14D05471258FA4D33B016F47CBD4686F /* DTBase64Coding.h in Headers */, + 1C7C1FDE094C83066C87B015B477B63D /* DTBlockFunctions.h in Headers */, + 21716775545B74C62A2BC9D1F5399267 /* DTCompatibility.h in Headers */, + ED66F09AF6E592211C9A021A11503721 /* DTCoreGraphicsUtils.h in Headers */, + 414209E3808FAACFE4C679EBFA8965B2 /* DTCustomColoredAccessory.h in Headers */, + A15EC52278A2D619B7780AAB8D88554A /* DTExtendedFileAttributes.h in Headers */, + 5D5071CE8770A20C085423D3421BEDCD /* DTFolderMonitor.h in Headers */, + 6993659598D8EC4FAA57E264AFE676CD /* DTFoundation-umbrella.h in Headers */, + 1CC6284347B8897DE0D4AC7BE196EB03 /* DTFoundationConstants.h in Headers */, + DAB89786137F704B7DD8334EF21E58CD /* DTHTMLParser.h in Headers */, + 48897F07CD74DA89D61337A3832233BE /* DTLog.h in Headers */, + 3D9793416203988F167E189744A50298 /* DTPieProgressIndicator.h in Headers */, + 3AED3330F76DB3D002DABE13B11DDFD2 /* DTSmartPagingScrollView.h in Headers */, + BF9032BC8A43F1AA4C4D575BD937115E /* DTTiledLayerWithoutFade.h in Headers */, + 8A9B2F5A2151EE12E662F33343C04458 /* DTVersion.h in Headers */, + 1FD0A2E78909C51ABC12325319144E33 /* DTWeakSupport.h in Headers */, + 9226F99BDF2BC648729B97FAD08A5F70 /* NSArray+DTError.h in Headers */, + 0A0A9938628FC39F96C5FC206CC3CE26 /* NSData+DTCrypto.h in Headers */, + BF076B89A32E454133942582B00EC922 /* NSDictionary+DTError.h in Headers */, + 014249F0755B88BB23D3DCE2B412EEE7 /* NSFileWrapper+DTCopying.h in Headers */, + 6C87E6144D0723E917B879E3834B7972 /* NSMutableArray+DTMoving.h in Headers */, + 1BCB2EB28C3C067487EF3FEB7AB2C3F8 /* NSString+DTFormatNumbers.h in Headers */, + 53066BC799D5536B28341C163C201842 /* NSString+DTPaths.h in Headers */, + 30C76262557529A72A679968DF501160 /* NSString+DTURLEncoding.h in Headers */, + 1B09F42416EFE5283FC7330972AC0C76 /* NSString+DTUtilities.h in Headers */, + 357B7E80FF2F9CE5FDFBDFBB5A492305 /* NSURL+DTAppLinks.h in Headers */, + 8E63D42E7CE0C90FD93AD0F874DA94BE /* NSURL+DTComparing.h in Headers */, + BF4D756EA447B0B50D44D42718F26482 /* NSURL+DTUnshorten.h in Headers */, + 8C358267F5C859D9DC55A46DBBC0F2A8 /* UIApplication+DTNetworkActivity.h in Headers */, + 4213BB00548C581AD1EBCCC1F4787A88 /* UIImage+DTFoundation.h in Headers */, + 21F1E8FEECFB4CE5A7138DE50CF7E7C0 /* UIScreen+DTFoundation.h in Headers */, + F6AFE52A2B53004FFB27B8B3A3030452 /* UIView+DTFoundation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 53ECB19DC74817B07016A027204C241A /* Headers */ = { + 88893EF6AD0938D0EB36A32169D0DC58 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 684586D0E8F908278BC13DC47C845A4B /* ZIPFoundation-umbrella.h in Headers */, + B4886245B032CAA636E059E4A829FB6C /* Pods-ReadViewDemo-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 8CF10C3020A3847E1C40BC768EA687E0 /* Headers */ = { + B5FA500E4B4E4111AF93349D7FBE9225 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 726811A34F893A622DB858800E67775F /* RDEpubReaderView-umbrella.h in Headers */, + EF4A58B335C39B19EF4DFE059345BAA2 /* RDAIReaderView-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - B581C780943F1A5388188F4104D41129 /* Headers */ = { + C517EEDF0F05B0A38297AD23F0DAB394 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - BD2F4AE3043328378219197D0CE5F804 /* RDPDFReaderView-umbrella.h in Headers */, + 3A3CB29C0A090DA053B50CD7FD0E2C3D /* RDEpubReaderView-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EFEA00C005C75E9D36153726B7D1D10F /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 52912BFCB288B0906F8F9E9D3BD03E1F /* ZIPFoundation-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2479,11 +2811,11 @@ /* Begin PBXNativeTarget section */ 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */ = { isa = PBXNativeTarget; - buildConfigurationList = CAE5795EE48AE1205511CFBA8E272E8E /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */; + buildConfigurationList = 0360A2CBBE7F40DDCF7BD6D9346200E7 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */; buildPhases = ( - D8A10A612E7BD6B832AFCA8097CEAE8F /* Sources */, - 4898DBD55913F2B54919C55D71F7EF07 /* Frameworks */, - B4AFABD9FC33F90FA9F8C6178ABE1A34 /* Resources */, + 6B3153A3D95687C42CAD370470F6ADCC /* Sources */, + 26559404D2377015324B9F6CF2335247 /* Frameworks */, + C722EB716465B715A9A7D284CB086324 /* Resources */, ); buildRules = ( ); @@ -2496,36 +2828,56 @@ }; 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */ = { isa = PBXNativeTarget; - buildConfigurationList = 2F57F2EF53B056EC18070F8A87684FD3 /* Build configuration list for PBXNativeTarget "SnapKit" */; + buildConfigurationList = 64E3CBFB2E3259592BD29A3038A44B1F /* Build configuration list for PBXNativeTarget "SnapKit" */; buildPhases = ( - 4C1684944E3ADD50FE3310550898BBAB /* Headers */, - 79B3E3F214EE4E4CBE7114FA2591FE52 /* Sources */, - 254A9D21D857AA584C5D2ADC600A6710 /* Frameworks */, - 6029058CB5172491FE327CFBD715DE9F /* Resources */, + 086C172114011A6C77C8DD003CD7E7C8 /* Headers */, + DBF30937F1B27AE4D83AC1939FCFB01F /* Sources */, + 60EDC33B688AC55B5698518B2AD0DB0D /* Frameworks */, + 331D7E5E1CF034CB1D52196532C07DD1 /* Resources */, ); buildRules = ( ); dependencies = ( - 816D08A1CE30E219E8187F8D929C6027 /* PBXTargetDependency */, + F2B0C0753DA799589EE86F0FBA1565DC /* PBXTargetDependency */, ); name = SnapKit; productName = SnapKit; productReference = 979486118B3E90C08386079D57962701 /* SnapKit */; productType = "com.apple.product-type.framework"; }; - 352EC96AFAEE0EDF74FD76A958827133 /* RDPDFReaderView */ = { + 1F1B6899710AE3E4BD213BE01489E557 /* RDAIReaderView */ = { isa = PBXNativeTarget; - buildConfigurationList = 42BAB7FC9D396091287DDED59DDA4E5B /* Build configuration list for PBXNativeTarget "RDPDFReaderView" */; + buildConfigurationList = B39F74DCB4F025606C8D0038AE8522D9 /* Build configuration list for PBXNativeTarget "RDAIReaderView" */; buildPhases = ( - B581C780943F1A5388188F4104D41129 /* Headers */, - 4811A347041CD3123495E41396D145CD /* Sources */, - 841175627F988EF292F0FDC3FB0EF011 /* Frameworks */, - BF894CA4954DFA18B93C7E624AA09ABC /* Resources */, + B5FA500E4B4E4111AF93349D7FBE9225 /* Headers */, + FDA7CA3B5D824C6440575FD64AB02520 /* Sources */, + EBBF08881D4C8BD2BF8B87ED2DFA511B /* Frameworks */, + 173C7CFE3F55DD87AFDBE1EC5B9901AF /* Resources */, ); buildRules = ( ); dependencies = ( - BE6CB9FE5495066560BCDA1BFF40A557 /* PBXTargetDependency */, + ); + name = RDAIReaderView; + productName = RDAIReaderView; + productReference = BD727D8D750906C2FCA03FA988C99329 /* RDAIReaderView */; + productType = "com.apple.product-type.framework"; + }; + 352EC96AFAEE0EDF74FD76A958827133 /* RDPDFReaderView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7A3DCEA78F09A537F1401A969F58D46A /* Build configuration list for PBXNativeTarget "RDPDFReaderView" */; + buildPhases = ( + 44C1420C6D84F4B642A502E7BFDA3E99 /* Headers */, + 315C3E209269EF9DCC01F9A09A749BA9 /* Sources */, + B3344B1196C556EC6C893EF8620F9CC7 /* Frameworks */, + 1EA154A90696133BD237B7843D460A2D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + F9191E83D3358FBA266553022C856B47 /* PBXTargetDependency */, + E7694395F54F46F8381C2C1EE948D916 /* PBXTargetDependency */, + B4478053F9E8036E2C99208643561D5F /* PBXTargetDependency */, ); name = RDPDFReaderView; productName = RDPDFReaderView; @@ -2534,22 +2886,24 @@ }; 87E2B8A29E8A66B9205D8A41F66E4927 /* Pods-ReadViewDemo */ = { isa = PBXNativeTarget; - buildConfigurationList = 15EFE8075D525F6648EAC81CAD1D38FE /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */; + buildConfigurationList = E75535D74C1EF460F963375B59850559 /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */; buildPhases = ( - 324DB0B5683AE6E6046BCF3447217A36 /* Headers */, - 7909F23385853857D999A55DF2E7CAEF /* Sources */, - 15323E0F5ED66EFBC4FF8FB7937A4614 /* Frameworks */, - 31D2A1120407DB7E564DA34F21B5B7E3 /* Resources */, + 88893EF6AD0938D0EB36A32169D0DC58 /* Headers */, + 7F0E1E43783433272F33954F422787AB /* Sources */, + 15EFC3631BB58E1F211F61EC3577AE01 /* Frameworks */, + A1FC8CB05F1E98A37F4AE7A224D7FBAC /* Resources */, ); buildRules = ( ); dependencies = ( - B8FE988ECDB2D8B87605057DA0A0204D /* PBXTargetDependency */, - 2DD972CA169E151AAEAABB373D497F01 /* PBXTargetDependency */, - 2F84AD8A95F9891FF10615622C18AEC4 /* PBXTargetDependency */, - 1CB1483421357596C395A4C72082EEFB /* PBXTargetDependency */, - 9288E43C082AE6E0A34C7F9E8D7DA38E /* PBXTargetDependency */, - FF40085F4184C2B90AAC6F7AE1041CAF /* PBXTargetDependency */, + 0F381A4930501641E8F6760587BBA2C2 /* PBXTargetDependency */, + D578A051EF503FB8EDBCC5CD1B609545 /* PBXTargetDependency */, + 024C591CE25B444779EAE0907CC1375D /* PBXTargetDependency */, + E94EB867FB3FB5780F50629A54149FC0 /* PBXTargetDependency */, + DE04E5B678B6CA201E24C786B3D69573 /* PBXTargetDependency */, + 248D14A413D4F8109E81E876B6C7269D /* PBXTargetDependency */, + F8C9B690D26DCCC4C8B18837001B7536 /* PBXTargetDependency */, + 19A4C847AB807C66B93F53A7F4DD49CC /* PBXTargetDependency */, ); name = "Pods-ReadViewDemo"; productName = Pods_ReadViewDemo; @@ -2558,11 +2912,11 @@ }; 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */ = { isa = PBXNativeTarget; - buildConfigurationList = 33B8E6F12A2866899330113FB5CA8694 /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */; + buildConfigurationList = 3C795AC9AB79C38D7D5ABE25002B4333 /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */; buildPhases = ( - E1ACC866735994FB5DDF16E332392DAE /* Sources */, - F1A20C66D5D753698A0580C836197161 /* Frameworks */, - CC3C0F03A4CE38153145F509B24D51EA /* Resources */, + 9022983CC7159FD41F9E607B69B3B279 /* Sources */, + E1DF268260BBDB79581F1102271D0AE4 /* Frameworks */, + 5D43C1BDB8785C2615ADF29ED88FF51A /* Resources */, ); buildRules = ( ); @@ -2575,12 +2929,12 @@ }; 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */ = { isa = PBXNativeTarget; - buildConfigurationList = AFB5B4291A9F31B14509185C00540A6F /* Build configuration list for PBXNativeTarget "DTFoundation" */; + buildConfigurationList = A8A434CCAF88ED38465F12E695799F3B /* Build configuration list for PBXNativeTarget "DTFoundation" */; buildPhases = ( - 3CB54C2BD3C748472316E55EA21956B4 /* Headers */, - 02F95287884B445A0622E6AAF18B2DB2 /* Sources */, - 74DA18DBECE4D8CB854F846D9F357396 /* Frameworks */, - 9D9F044BC2FC640D4A1F374F23ED26F1 /* Resources */, + 7F63C2276BE0AF157A39507DEA12294D /* Headers */, + B5AB1C401FEE34A79826B450C2C3B9C1 /* Sources */, + 838BAC16F8EB3094BE7BC270BBFA1DE1 /* Frameworks */, + FC44BCAB84BE97BF8E377294C766FD45 /* Resources */, ); buildRules = ( ); @@ -2593,17 +2947,17 @@ }; AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */ = { isa = PBXNativeTarget; - buildConfigurationList = E0C21A08F8F342F93C78BE4579478379 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */; + buildConfigurationList = 50CD9D0637599E6F746E458297CF9D17 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */; buildPhases = ( - 53ECB19DC74817B07016A027204C241A /* Headers */, - 78858E76A13C1C769450576FA6328029 /* Sources */, - 572FEB02353F89A14C0C06D3CAD01317 /* Frameworks */, - A976A8E8CD539371320FAE3C68A33868 /* Resources */, + EFEA00C005C75E9D36153726B7D1D10F /* Headers */, + A5F59A74AAB0EC27108240C01270BEB5 /* Sources */, + CD7FBA45DB00ADF722E01E0AE3779E02 /* Frameworks */, + 3C292E01AED8BA362BE1C8429EC0FBF4 /* Resources */, ); buildRules = ( ); dependencies = ( - 5F130D3703CF962F4D3CB2C627477170 /* PBXTargetDependency */, + 4B210AD5861A1A96A332E1DB585A46C3 /* PBXTargetDependency */, ); name = ZIPFoundation; productName = ZIPFoundation; @@ -2622,8 +2976,8 @@ buildRules = ( ); dependencies = ( - 09C917BF14A53A5A6B7D0AB0F28BDE87 /* PBXTargetDependency */, - 5AF53B4F6DFEA88AB7C850609586CA7B /* PBXTargetDependency */, + 2572918456CF71DA3F29818A05ABD216 /* PBXTargetDependency */, + AD243A82A9C0AEC6847FF66C8840E6E2 /* PBXTargetDependency */, ); name = DTCoreText; productName = DTCoreText; @@ -2632,11 +2986,11 @@ }; C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */ = { isa = PBXNativeTarget; - buildConfigurationList = 290D8DA6C68E22E3AC02AEEC679F9AB1 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */; + buildConfigurationList = 630E67E726745F8F7EBBB15A664D09F2 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */; buildPhases = ( - 5E93E448B68A840FDF8BFC9C495D6398 /* Sources */, - 2E6AAED7E5F728BE4AD1030966E99673 /* Frameworks */, - 290357E480D37476A3F2E69B2397E939 /* Resources */, + EDA3C8C069C08CDAA81EB2528164720E /* Sources */, + 258A70A95FD06C42A74DA2A5E7D0DADD /* Frameworks */, + AC5354D719BF48B145B1C1E134FD76B3 /* Resources */, ); buildRules = ( ); @@ -2647,13 +3001,32 @@ productReference = CA4A114775B98CEA4A566C18123B145F /* ZIPFoundation-ZIPFoundation_Privacy */; productType = "com.apple.product-type.bundle"; }; + CC23E8498E4F0DDEB3C1A2AA05B8ACF2 /* RDSpeechReaderView */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5B44221983F052B7553F6B2779CC8345 /* Build configuration list for PBXNativeTarget "RDSpeechReaderView" */; + buildPhases = ( + 7B62A2629B260921A757EB5A184ED2AA /* Headers */, + 8A8859A21B8E2957FA7F6940AF5B520E /* Sources */, + AD01177C0DB22F1BCA0F7F6A96C00062 /* Frameworks */, + 3D8C647E8CE1FA0A8E01D75C8F9FAF35 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1462C34F341D1B4C735128082B1D106B /* PBXTargetDependency */, + ); + name = RDSpeechReaderView; + productName = RDSpeechReaderView; + productReference = B03E48EA4685C3F0EC2C0C5A2714C60F /* RDSpeechReaderView */; + productType = "com.apple.product-type.framework"; + }; E07DDD766DCBF90486BCE6C2EA671E5E /* RDEpubReaderView-RDEpubReaderViewAssets */ = { isa = PBXNativeTarget; - buildConfigurationList = E612880EB9499755AABD2CA212042C88 /* Build configuration list for PBXNativeTarget "RDEpubReaderView-RDEpubReaderViewAssets" */; + buildConfigurationList = A6097DEBED8762FC0CF17FBE5E9F3F86 /* Build configuration list for PBXNativeTarget "RDEpubReaderView-RDEpubReaderViewAssets" */; buildPhases = ( - 1D39B32170C86F95C041002A5CAD64EB /* Sources */, - AE82FD7DE740122C0E1F3ACA79D8D325 /* Frameworks */, - 1BCCF165CF55A95A43EF6E0B84CA1F58 /* Resources */, + A2D4C2E481D04B9CAD59D196FFED0CB2 /* Sources */, + F695CAAA20414789F09BB8CC4D5DABE4 /* Frameworks */, + AB278AB10AC4ED63CEF83DC7A86F3C84 /* Resources */, ); buildRules = ( ); @@ -2666,20 +3039,22 @@ }; FBCB57A3AEAAA3449B3F365930BC0977 /* RDEpubReaderView */ = { isa = PBXNativeTarget; - buildConfigurationList = CFB9BBE2424D1D36CA1904E73FE1D1DD /* Build configuration list for PBXNativeTarget "RDEpubReaderView" */; + buildConfigurationList = 27C3BF37191BEC7B232544E76D4A3A84 /* Build configuration list for PBXNativeTarget "RDEpubReaderView" */; buildPhases = ( - 8CF10C3020A3847E1C40BC768EA687E0 /* Headers */, - 555C73618585AE6A4CFC6E68CAD9BC9F /* Sources */, - BB775B7E3898A645CA9A57B93ED9668D /* Frameworks */, - FE6CF7CAB15D62BC7D0F1F287AA2C73B /* Resources */, + C517EEDF0F05B0A38297AD23F0DAB394 /* Headers */, + 0891830A933D15255C31E430B71B8A49 /* Sources */, + 8C8F2B1F5A2E36E3AE95EAEAAE03F780 /* Frameworks */, + 9902021A002CAFBD7F850297D2BAB1A5 /* Resources */, ); buildRules = ( ); dependencies = ( - B3EFFAD8C8F5A4687F9BE26C20400EB4 /* PBXTargetDependency */, - 5C84F363AB364AC2256A20768F4D4F63 /* PBXTargetDependency */, - EB391B439FA4DA9B9CD9393C265500E0 /* PBXTargetDependency */, - 7934BEA3095F46B97A03F7A60B8F1E6A /* PBXTargetDependency */, + E484BE24A2FE86EA9C9A3524401B8192 /* PBXTargetDependency */, + 88BCAFF12D3803A063766F4D5C30667E /* PBXTargetDependency */, + C09951035419916D448EA490B5A655D4 /* PBXTargetDependency */, + 6623C980109567118E7F3702DCC999C0 /* PBXTargetDependency */, + 28C1AC837072796CCABD3BD21996776D /* PBXTargetDependency */, + BA1B18C040E4323B9F5771A5BCFD85D4 /* PBXTargetDependency */, ); name = RDEpubReaderView; productName = RDEpubReaderView; @@ -2706,7 +3081,7 @@ mainGroup = CF1408CF629C7361332E53B88F7BD30C; minimizedProjectReferenceProxies = 0; preferredProjectObjectVersion = 77; - productRefGroup = 6F4044234426984401A57CF2DB1C7C47 /* Products */; + productRefGroup = A60C9476C4F4CB970063579359A474EC /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( @@ -2714,9 +3089,11 @@ 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */, 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */, 87E2B8A29E8A66B9205D8A41F66E4927 /* Pods-ReadViewDemo */, + 1F1B6899710AE3E4BD213BE01489E557 /* RDAIReaderView */, FBCB57A3AEAAA3449B3F365930BC0977 /* RDEpubReaderView */, E07DDD766DCBF90486BCE6C2EA671E5E /* RDEpubReaderView-RDEpubReaderViewAssets */, 352EC96AFAEE0EDF74FD76A958827133 /* RDPDFReaderView */, + CC23E8498E4F0DDEB3C1A2AA05B8ACF2 /* RDSpeechReaderView */, 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */, 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */, AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */, @@ -2726,35 +3103,25 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 1BCCF165CF55A95A43EF6E0B84CA1F58 /* Resources */ = { + 173C7CFE3F55DD87AFDBE1EC5B9901AF /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 086F18593CE2300734027A8BD396A28F /* cssInjector.js in Resources */, - AD5854B028EAE75971250523F24E7AC0 /* epub-bridge.js in Resources */, - 50B113FC2E2AEB996202A5F72411754A /* epub-fixed-layout.html in Resources */, - 4D2C32204598EEB25DE02652DA3A4517 /* rangy-core.js in Resources */, - 1EAE1F26CFFAAE7BA3EED4A895A65283 /* rangy-serializer.js in Resources */, - 3F8E5BF8A103AFF70E8EF1BEF40C80A3 /* WeReadApi.js in Resources */, - 3D29E3866F13EFDCD0F969C068317E99 /* wxread-dark.css in Resources */, - 09C5D40EBC95C1DF08980AB315CEC608 /* wxread-default.css in Resources */, - 98CC3155061E818ECC5294ADD7BD39A9 /* wxread-replace.css in Resources */, - CD0642736D05FF86A5AAEB0A8298257E /* wxread-replace-latin.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 290357E480D37476A3F2E69B2397E939 /* Resources */ = { + 1EA154A90696133BD237B7843D460A2D /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - E1B45048654ED73F34DD7100669F3A6E /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 31D2A1120407DB7E564DA34F21B5B7E3 /* Resources */ = { + 331D7E5E1CF034CB1D52196532C07DD1 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C949788FC080B9F92411CBFFD82AEB81 /* SnapKit-SnapKit_Privacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2766,449 +3133,491 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 6029058CB5172491FE327CFBD715DE9F /* Resources */ = { + 3C292E01AED8BA362BE1C8429EC0FBF4 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C4048BBBD3ED54C527E258693E0E6895 /* SnapKit-SnapKit_Privacy in Resources */, + AD94FDA8965EA1EBBD5E0438C640409D /* ZIPFoundation-ZIPFoundation_Privacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 9D9F044BC2FC640D4A1F374F23ED26F1 /* Resources */ = { + 3D8C647E8CE1FA0A8E01D75C8F9FAF35 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - A976A8E8CD539371320FAE3C68A33868 /* Resources */ = { + 5D43C1BDB8785C2615ADF29ED88FF51A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8218AC044246907D694EB1E6E3111F0B /* ZIPFoundation-ZIPFoundation_Privacy in Resources */, + 91E518F947290E08163684BB1A0AD7BB /* PrivacyInfo.xcprivacy in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - B4AFABD9FC33F90FA9F8C6178ABE1A34 /* Resources */ = { + 9902021A002CAFBD7F850297D2BAB1A5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4C146C2C2DD2C526CBFC04352ADF45F8 /* default.css in Resources */, + 5E520D912C064B9781FD02FF703B11A4 /* RDEpubReaderView-RDEpubReaderViewAssets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - BF894CA4954DFA18B93C7E624AA09ABC /* Resources */ = { + A1FC8CB05F1E98A37F4AE7A224D7FBAC /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - CC3C0F03A4CE38153145F509B24D51EA /* Resources */ = { + AB278AB10AC4ED63CEF83DC7A86F3C84 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 83A114ACB998BF93F4D4E76EBB01D8B4 /* PrivacyInfo.xcprivacy in Resources */, + 7C7998DA70BCD963312E72F3F76EB360 /* cssInjector.js in Resources */, + A50366094D551204E6CB771F053467AA /* epub-bridge.js in Resources */, + A32524C3BBFC8361B5A77404293349A1 /* epub-fixed-layout.html in Resources */, + 2D81B7C446C9C00B2C516E6996D9457D /* rangy-core.js in Resources */, + 76844664CDB792B3186A4759C1A6C443 /* rangy-serializer.js in Resources */, + 2E1221BBB32678DFDA675FFF50391819 /* WeReadApi.js in Resources */, + 7DDDADD3A75BF8651607CB47BA00B647 /* wxread-dark.css in Resources */, + BF44EE27CAAA95BC66ECC24A572D720E /* wxread-default.css in Resources */, + D1328689F916D7DE0F2396E2F8973CEC /* wxread-replace.css in Resources */, + 36C1DEB5DF32B53B2903DFE887443AE0 /* wxread-replace-latin.css in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; - FE6CF7CAB15D62BC7D0F1F287AA2C73B /* Resources */ = { + AC5354D719BF48B145B1C1E134FD76B3 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9A100F613599FC91999C704C0A1F1BEC /* PrivacyInfo.xcprivacy in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C722EB716465B715A9A7D284CB086324 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DB81526E21D5929E1B1648FE1E0075EE /* default.css in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + FC44BCAB84BE97BF8E377294C766FD45 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - E1DA99F683B479E7514F59584F010D77 /* RDEpubReaderView-RDEpubReaderViewAssets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 02F95287884B445A0622E6AAF18B2DB2 /* Sources */ = { + 0891830A933D15255C31E430B71B8A49 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8EE605D9B102DD1A41A4718F9555F6C4 /* DTActivityTitleView.m in Sources */, - 24BC5333E523715A7F230CBF3E2C073F /* DTAnimatedGIF.m in Sources */, - 812272B922627EF9643A9CDBC9AA2EFB /* DTBase64Coding.m in Sources */, - ED18AB764B6B2D7D51BA3BB30C77BC6D /* DTBlockFunctions.m in Sources */, - CF713B6B05119D72EF91307795B1AEDC /* DTCoreGraphicsUtils.m in Sources */, - 9A16F390AAAAC68FD7859C578B4054CB /* DTCustomColoredAccessory.m in Sources */, - 14D5FEB30629D96E8DA566B49D770031 /* DTExtendedFileAttributes.m in Sources */, - 1ECBE1E3E48F3BEB91DA496842A61CE8 /* DTFolderMonitor.m in Sources */, - 6A053B2EC45ADD509497F2909AD4DBFD /* DTFoundation-dummy.m in Sources */, - 5B7CC211EBF1F22C9429B66CD4D31973 /* DTFoundationConstants.m in Sources */, - A4E1CAF494796BA32FFC884698C85729 /* DTHTMLParser.m in Sources */, - D3CF74B30A5AB5E67F433079376E830C /* DTLog.m in Sources */, - 984F604C1818609B7836604F85ADEEDE /* DTPieProgressIndicator.m in Sources */, - 17B9F651C4E7C21338A2AB04DAB3121D /* DTSmartPagingScrollView.m in Sources */, - DB06FAC271AAEE1B3CD5C1ED97225398 /* DTTiledLayerWithoutFade.m in Sources */, - A1D1E55062DC72F0193C86A29A02234D /* DTVersion.m in Sources */, - 5F8F35C67B84F3985373B76354706C23 /* NSArray+DTError.m in Sources */, - 2CEB3C712A0253686046DF022AFAA816 /* NSData+DTCrypto.m in Sources */, - E7426FD3F56158482B494AB93FF6388F /* NSDictionary+DTError.m in Sources */, - F8633FA6F73C45BEA8BD04DEA57CEDA8 /* NSFileWrapper+DTCopying.m in Sources */, - 1B5052AC71482489C571B9C473DE3ED4 /* NSMutableArray+DTMoving.m in Sources */, - B388AF7C09885B72DF0DE4327A3B149B /* NSString+DTFormatNumbers.m in Sources */, - 1A53A0E3B617A60D8ADC80B68EEE35A1 /* NSString+DTPaths.m in Sources */, - 5D523DAF9BFA543904E32342D0EEFC0D /* NSString+DTURLEncoding.m in Sources */, - 55BD44A705AA661A7950A255165D15F9 /* NSString+DTUtilities.m in Sources */, - B24F819D98E4DF194465D63CC6C30F26 /* NSURL+DTAppLinks.m in Sources */, - A4E98600889A26605AFDBEFEF99763C8 /* NSURL+DTComparing.m in Sources */, - 737152818FBA3502222A2E161A88A145 /* NSURL+DTUnshorten.m in Sources */, - F6EBFF6B774713E2F798201913C3F5E0 /* UIApplication+DTNetworkActivity.m in Sources */, - 04ADF9469A9C4CE55FA682EA65EB5DF5 /* UIImage+DTFoundation.m in Sources */, - 74A86C4AB3ED0481830E8D1D5A2AB8B2 /* UIScreen+DTFoundation.m in Sources */, - 84C67060BE07E8581665985F83F31B02 /* UIView+DTFoundation.m in Sources */, + 22485CB22E048DEB02531E40C36B78DD /* RDCBZReaderController.swift in Sources */, + 0E8556C840877C1148B5D096999F0A35 /* RDEPUBAIContentProvider.swift in Sources */, + C8CF1F5610D78DA49FEB9FB2D5CFA4E2 /* RDEPUBAnnotationEditorViewController.swift in Sources */, + 26B43D124F927B5A192121E2DAFEBCBA /* RDEPUBAnnotationModels.swift in Sources */, + 1B6351C2682D454F363D37CC64CE6F03 /* RDEPUBAssetRepository.swift in Sources */, + 06870EC1863AADE7D8B2C9763F177876 /* RDEPUBAttachmentNormalizer.swift in Sources */, + CB28C33F300061D6B8CC5DEDED5E6E81 /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */, + 73C6E934E7FE5FE2D1A75BD158D5A486 /* RDEPUBAttachmentTooltipView.swift in Sources */, + 3813C43484C6A1175B47BE62E5A37AEA /* RDEPUBBackgroundCoverageStore.swift in Sources */, + CC311A5C6FD382E2E7B0ACBC160FEBE3 /* RDEPUBBackgroundPriorityPolicy.swift in Sources */, + B30FE8B7FE2DC01D2A6399BA24B46EE4 /* RDEPUBBackgroundTrace.swift in Sources */, + 1D53FB2F09A7E9704EBD84ED30B0B1CE /* RDEPUBBookPageMap.swift in Sources */, + 3F92A8FBCF50F172D4CB30137CE10F35 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */, + 982A4A2A2E9436CF9C57A3D77ED731A0 /* RDEPUBCFI.swift in Sources */, + 17337E40B13F3CFCEDA9BE1AF9C73EC7 /* RDEPUBCFICompatibility.swift in Sources */, + B4345AD562848E534F48169C04BFF890 /* RDEPUBCFIDOMPathBuilder.swift in Sources */, + 9A5DFEC1E2E005ED02C8246C92CB4605 /* RDEPUBCFIError.swift in Sources */, + FFBF3C8099E65280270A5369095790B2 /* RDEPUBCFIGenerator.swift in Sources */, + C6A1AF89F95D87FD679366B8A1588D66 /* RDEPUBCFIMap.swift in Sources */, + 783B3E117FED874BD3A8456FF8AA41A5 /* RDEPUBCFIMarkerInjector.swift in Sources */, + AA6A82E91F16300F8B7A4BF71784B911 /* RDEPUBCFIParser.swift in Sources */, + 2E14605A6460335AB12B31B3A329F52B /* RDEPUBCFIPath.swift in Sources */, + 79585A90E8D123CFEEA49D216E027E00 /* RDEPUBCFIRange.swift in Sources */, + 719EC088BB401166907C358B25061959 /* RDEPUBCFIRecoveryEngine.swift in Sources */, + 8EDFE061B6EADFEFD075D45814490FC8 /* RDEPUBCFIResolver.swift in Sources */, + 895D1E1E1A62F977D75D4DBB5ABD97E7 /* RDEPUBCFISerializer.swift in Sources */, + B1909D0BE6FF808617D7FABF13F34D42 /* RDEPUBCFITextAssertion.swift in Sources */, + 5CBDA7783934999491663AB204B5A064 /* RDEPUBCFIUtilities.swift in Sources */, + DADBC15D6C15D83B2106F110DF7B1356 /* RDEPUBChapterCacheKey.swift in Sources */, + 30BEF39A9B359BE62E758B3677D6B84C /* RDEPUBChapterData.swift in Sources */, + 7A14BEF93EBE86A497CA99BB39CCDAC8 /* RDEPUBChapterDataCache.swift in Sources */, + 1548259806AC2F2B1C7E8391DAA23341 /* RDEPUBChapterDisplayContentCache.swift in Sources */, + 0605C6A0977CAF4D7FD6546BBDB108C1 /* RDEPUBChapterLoader.swift in Sources */, + E0DF6958C36F9AC1C6CF5CB0E33EB7C4 /* RDEPUBChapterLocation.swift in Sources */, + 015030FB0BE3DB44A72B84FA3F80DFF0 /* RDEPUBChapterOffsetMap.swift in Sources */, + 504FA151E73E60DCA3FF4B5EE8CD3934 /* RDEPUBChapterPageCounter.swift in Sources */, + 7F9455A2C1074288090AB69680B596AD /* RDEPUBChapterRuntimeStore.swift in Sources */, + BAEA3B45EDDBE2BAB65178B41B93CD1F /* RDEPUBChapterSummaryDiskCache.swift in Sources */, + 2B8511EDF7A3E8E53D235087910D9CB5 /* RDEPUBChapterTailNormalizer.swift in Sources */, + C3552B6602F4064DAF4C44832B83993D /* RDEPUBChapterWarmupOrchestrator.swift in Sources */, + 9C6ECACF377F5276D76DB9DC47BC173A /* RDEPUBCoreTextPageFrameFactory.swift in Sources */, + 944C7E54F78139E21144CE503ACBA3EF /* RDEPUBCSSCompatibilityLayer.swift in Sources */, + 60A37D279ACFAF6C62A16016309CE762 /* RDEPUBDarkImageAdjuster.swift in Sources */, + 561D7DED747942143368E79909C9061A /* RDEPUBDecryptingImageAttachment.swift in Sources */, + F76246F3FCBCCABA28EF06D3018C610B /* RDEPUBDTCoreTextRenderer.swift in Sources */, + 83B6B5367E1D465C3E6428BD0B369AD4 /* RDEPUBFixedLayoutTemplate.swift in Sources */, + FAF3AF65CC90E56FF4C46FDB9F773017 /* RDEPUBFontFallbackResolver.swift in Sources */, + F393DC307AD6BED2DE8083FF12B8AAE1 /* RDEPUBFontNormalizer.swift in Sources */, + BDE19A6478FC06A5F965BF6C465C0EE8 /* RDEPUBFragmentMarkerInjector.swift in Sources */, + F767C2861699E671762169C9F347291C /* RDEPUBHTMLNormalizer.swift in Sources */, + 241586B93762F9D98786D76EC098B7D9 /* RDEPUBImageViewController.swift in Sources */, + 9AE7B03D33A2C889C9B0100DD2AA632B /* RDEPUBImageViewerCoordinator.swift in Sources */, + 28D89515B1F7B8051B6C8959D72C9366 /* RDEPUBJavaScriptBridge.swift in Sources */, + 7DB3CCA3839351CB377770E5870E69A9 /* RDEPUBJumpSession.swift in Sources */, + 51D6A2884ADB8102F2CDFD0F4FC4284D /* RDEPUBMemoryProbe.swift in Sources */, + 735EE64EDAD773096F1927E8213282A7 /* RDEPUBMetadataParseCancellationController.swift in Sources */, + CC4164935D8A9B4D93902AD737DD4BE5 /* RDEPUBMetadataParseWorker.swift in Sources */, + 94A66BC1215EFE0A73B37A373C0A3281 /* RDEPUBModels.swift in Sources */, + 64004A893517583C803AEAB3872022B6 /* RDEPUBNavigatorLayoutContext.swift in Sources */, + 06C626009858F55BA7AB71C715C99FF4 /* RDEPUBNoteDetector.swift in Sources */, + 2CFAFBA02504A70F5E2C4371534955E9 /* RDEPUBNoteModels.swift in Sources */, + 33410924D34E540BA70B8B5399EB5D4D /* RDEPUBNotePopupCoordinator.swift in Sources */, + 09BA8E7D20E0618BCF471289D6E7239A /* RDEPUBNotePopupViewController.swift in Sources */, + 2B0FB35E1C7A1961D824C5958EE56B6D /* RDEPUBNoteResolver.swift in Sources */, + 80C8117B653528732041FB531659CE87 /* RDEPUBPageBreakPolicy.swift in Sources */, + 296FF829157CD0B704761BD5C7DF0C3B /* RDEPUBPageCountCache.swift in Sources */, + 139798AD5B222F7C1B19899AF80B5CE7 /* RDEPUBPageInteractionController.swift in Sources */, + A75112BB97D2EFA12C7D55731B839ED5 /* RDEPUBPageLayoutSnapshot.swift in Sources */, + 6B132E2AD8BB1F2FB21D9F6F7D068C1A /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */, + 32DAF222F4D8F7D244F10A0CD3BE3BB2 /* RDEPUBPageResolver.swift in Sources */, + C43DF680887B38560CA7723511ABFCD6 /* RDEPUBPaginationCacheCoordinator.swift in Sources */, + 46C63092880297CC1FEA04268121642A /* RDEPUBPaginationModels.swift in Sources */, + F4DA93526D482CD7726856E4C2A2E9AA /* RDEPUBPaginator.swift in Sources */, + E87592F84B4E59ED5BD8CBBDF89FE88B /* RDEPUBParser.swift in Sources */, + F1502BB239BE78912B8EAE1419625EC3 /* RDEPUBParser+Archive.swift in Sources */, + F289E437878B685F00B6F9EC04194BDD /* RDEPUBParser+Package.swift in Sources */, + 3327189FE732B9F7C893297271C8E70E /* RDEPUBParser+ReadingProfile.swift in Sources */, + E5F7835B3C29F9A5C5D507D1B4666AF7 /* RDEPUBParser+Resources.swift in Sources */, + 97EBC8BCC30E3F1E0FAB723C9023353F /* RDEPUBParser+TOC.swift in Sources */, + 6C992E1A2FBD5D966690C03F54B81656 /* RDEpubPlainTextBookBuilder.swift in Sources */, + 449479B94F78893071A747CA22DEFB2A /* RDEPUBPreferences.swift in Sources */, + A871845DAB142E90B72451F579AC8727 /* RDEPUBPresentationRuntime.swift in Sources */, + F9BDB8FBA84964F4DB833D71BAE81634 /* RDEPUBPublication.swift in Sources */, + 8F7CFA48B393899FA35E17A67F683790 /* RDEPUBReaderAnnotationCoordinator.swift in Sources */, + 182E369F1A51C69E281F4A32F4C75A3B /* RDEPUBReaderAssemblyCoordinator.swift in Sources */, + 0CF0135E674D9001A4B648AECCB06957 /* RDEPUBReaderBottomToolView.swift in Sources */, + EECC41D9B7E2AF7BD1C555674FD9877F /* RDEPUBReaderChapterListController.swift in Sources */, + 6E070BD7200B70ABD28128435066780B /* RDEPUBReaderChromeCoordinator.swift in Sources */, + D1E2B4410F989D0985B80F5E12F992C3 /* RDEPUBReaderConfiguration.swift in Sources */, + 6650D31565F5BD0E11FEC0F514E700DB /* RDEpubReaderContentCell.swift in Sources */, + 9EA8EE799B5D9646DF6F68C316710251 /* RDEPUBReaderContext.swift in Sources */, + 67008C120F021B02D674C8957B3351DE /* RDEPUBReaderController.swift in Sources */, + 5DC8894BAE6FB562F51C90E96BEB5E60 /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */, + C9A313C280E6F05E82ADF54F90E7264D /* RDEPUBReaderController+ContentDelegates.swift in Sources */, + E4D14A78B339CD30F305B4DABF0F4F5E /* RDEPUBReaderController+DataSource.swift in Sources */, + AD31947EF7020717B2FFCB898C31DCAE /* RDEPUBReaderController+ExternalLinks.swift in Sources */, + 8877BDF2C129627BE7197343C727EAFA /* RDEPUBReaderController+LocationResolution.swift in Sources */, + E2E2499B133E906963BF99672FF269D4 /* RDEPUBReaderController+Orientation.swift in Sources */, + 29CD7DA003E4881406DD828AC2BEB203 /* RDEPUBReaderController+PublicAPI.swift in Sources */, + 1514F1D466B8422AE5089E7C9F23219C /* RDEPUBReaderController+RenderSupport.swift in Sources */, + 2A7A9E2D867D0F878B468725D814118B /* RDEPUBReaderController+RuntimeBridge.swift in Sources */, + 27691FDEF4012C72412E27C97A68431F /* RDEPUBReaderController+TableOfContents.swift in Sources */, + AFEF1073C525D47CB9911E73713176A5 /* RDEPUBReaderController+Trial.swift in Sources */, + 36EFE5DFB1FE7968EEFB9264FFF87CCD /* RDEPUBReaderDelegate.swift in Sources */, + 03B012C7959735A0A532A444902DBCF6 /* RDEPUBReaderDependencies.swift in Sources */, + 53EA9E7B4DEBBEE14B6B83FF7D5F0B2F /* RDEPUBReaderEnvironment.swift in Sources */, + 7C31D700E05A097A42458D49D2561DB4 /* RDEpubReaderFlowLayout.swift in Sources */, + E19C39D306A49A72BAAB6E8DA92FF005 /* RDEpubReaderGestureController.swift in Sources */, + AE74D8EAC25A8CB489174D28E193C232 /* RDEPUBReaderHighlightsViewController.swift in Sources */, + 4ED2E0F8F0C2889F3DC707D165024E10 /* RDEPUBReaderLoadCoordinator.swift in Sources */, + 68A504E33F4476A37D95AF974D9D198E /* RDEPUBReaderLocationCoordinator.swift in Sources */, + 77BB20EA9E7E317CEE37A69DD487CED6 /* RDEpubReaderPageChildViewController.swift in Sources */, + 2D90619922508AD78278F2D1D7169DC4 /* RDEPUBReaderPaginationCoordinator.swift in Sources */, + 40DEA7D35972343F41C629EE3AF5F7F0 /* RDEpubReaderPagingController.swift in Sources */, + 893B6523077FC73B80174909FA8EC091 /* RDEPUBReaderPersistence.swift in Sources */, + 3CF692B9C6EA33FD628CD3ECCDD9462E /* RDEpubReaderPreloadController.swift in Sources */, + F16A85F5C1C7AB77E3F59A180E4949FD /* RDEPUBReaderRuntime.swift in Sources */, + F7ADD6FA9A99420D022B5DACBCB65BAD /* RDEPUBReaderSearchBarView.swift in Sources */, + 202E57B1A71FF32D64CA97314E0C6C6D /* RDEPUBReaderSearchCoordinator.swift in Sources */, + 1165297CCE80FFFE9D1895606E803232 /* RDEPUBReaderServices.swift in Sources */, + 388E284D44A216A5ECCC0EC49AE89AF1 /* RDEPUBReaderSettings.swift in Sources */, + 65A0F8C6C162FDF2987C650A1E0313A5 /* RDEPUBReaderSettingsViewController.swift in Sources */, + B59DC0B1A729CFF0F76C1D4886121338 /* RDEpubReaderSpreadResolver.swift in Sources */, + C5743EE91CA41152F4D6D27B0BA51FBB /* RDEPUBReaderState.swift in Sources */, + DC9D763A7551AF127712DEE7218EB38A /* RDEPUBReaderTableOfContentsItem.swift in Sources */, + A6DD3A4EBF6A086D4CA796EB1BB0968B /* RDEpubReaderTapRegionHandler.swift in Sources */, + 34DAABEF8DA392B03437ED80143BB90B /* RDEPUBReaderTheme.swift in Sources */, + 8A61D5BFFF823B2DD5866C79F849A560 /* RDEPUBReaderToolView.swift in Sources */, + 9D9E6D8A9C102C9767A2778F3F550BCD /* RDEPUBReaderToolViewProtocols.swift in Sources */, + D9964CE3AF833DAD7B566E45AF472AF7 /* RDEPUBReaderTopToolView.swift in Sources */, + 6EC9EE335402510D6B2F48947BBDA57A /* RDEPUBReaderUIState.swift in Sources */, + A050FD451EB2C853335CA21A1CDAAAB0 /* RDEpubReaderView.swift in Sources */, + 03F49D0C58DE83CC45DF27596421D966 /* RDEpubReaderView+CollectionView.swift in Sources */, + C3D431A2853F6C2BEC1C8AB8468D6E69 /* RDEpubReaderView+ContentAccess.swift in Sources */, + 4538E556FB8600C7E6D29F769FC0EA47 /* RDEpubReaderView+PageCurl.swift in Sources */, + A8E71E692C58542B6E2A3DB75B6AE6E3 /* RDEpubReaderView+ToolView.swift in Sources */, + 979B6D730AAACF4B9B8331808C40BE90 /* RDEpubReaderView-dummy.m in Sources */, + AB68E2E00AED308DB0BC55025785F887 /* RDEPUBReaderViewportMonitor.swift in Sources */, + D08C9D3BB5023F0BDA105B524C0DC16F /* RDEpubReaderViewProtocols.swift in Sources */, + 09BE0B86A0FB9B8EF550CA3BABDF1792 /* RDEPUBReadingLocationModels.swift in Sources */, + 41191E0937C0FBA3176942094059817F /* RDEPUBReadingSession.swift in Sources */, + A6FCCA0867D6E90A04127122718A1A13 /* RDEPUBRenderDiagnosticsCollector.swift in Sources */, + 620D89AB6F1FC6B817F370E17A5FA9D2 /* RDEPUBRenderRequest.swift in Sources */, + 7BF87B0A4CAB6F698E7D84E676CFD1B1 /* RDEPUBResourceDataProvider.swift in Sources */, + B73FCEC25F0912CEEAE76F34B6E1A5BA /* RDEPUBResourceResolver.swift in Sources */, + E31A025A90465260938C6E05DF15413C /* RDEPUBResourceURLSchemeHandler.swift in Sources */, + B620DEA7F33E29DE56E1AD5C227D606D /* RDEPUBRuntimeChapter.swift in Sources */, + F299288008A9203353413B5B32747635 /* RDEPUBRuntimePageCount.swift in Sources */, + D0C254514E7704E4B665B5D6A25F16A8 /* RDEPUBSafeArea.swift in Sources */, + 9C775820BFD0F84151EE9D1D15AB5C5D /* RDEPUBSearchEngine.swift in Sources */, + B5F94F9ACAF7243E67C82FC8B0A3850F /* RDEPUBSearchModels.swift in Sources */, + 731BC686480474979C1C827F80525751 /* RDEPUBSelectionLoupeView.swift in Sources */, + 7BB6D47E678C847E2599D5A4CE1D17A4 /* RDEPUBSelectionOverlayView.swift in Sources */, + 364E816FBEEE0591DA21255B0C587D9B /* RDEPUBSelectionState.swift in Sources */, + 57D29D069EC196338B1E4DD238FD7FAB /* RDEPUBSemanticMarkerInjector.swift in Sources */, + 744D46169467D313783B7F9C4F80F29D /* RDEPUBSettingsFlipAutomation.swift in Sources */, + C77E8D9F72B2D3C068CB5AB850A7B667 /* RDEPUBSpeechContentProvider.swift in Sources */, + D3103B914810482ADEBA5608C1D6FA28 /* RDEPUBStyleCompatibilityModels.swift in Sources */, + 53EBDB54E3A562FEF8A6B1D1601E8CE6 /* RDEPUBStyleSheetBuilder.swift in Sources */, + E5A0F5964BBF1D2089B594A33EC559A0 /* RDEPUBStyleSheetComposer.swift in Sources */, + 1BA306604BC42737DC0D6BBFC784DC50 /* RDEPUBTextAnchor.swift in Sources */, + 8DDCA02D7175B2583E53778A4CD7457E /* RDEPUBTextAnnotationOverlay.swift in Sources */, + A5A9FE6FB03D2B84F0C684D58DEB1B76 /* RDEPUBTextBookBuilder.swift in Sources */, + 573128D7B1E3523C3355E57F0E012087 /* RDEPUBTextBookCache.swift in Sources */, + 83D6E7A893C2BA73189B3608E2EC9AC9 /* RDEPUBTextBookModels.swift in Sources */, + 7B2DB613A81AF14C101407A4C71D87B8 /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */, + 2495C0D30963F211D8127D8ABD02C4C7 /* RDEPUBTextContentInteractionCoordinator.swift in Sources */, + 4C8C31A67EF3C63F2DA59BC54F835395 /* RDEPUBTextContentView.swift in Sources */, + 1C3C237A9574F88C92E569D7FB3B424C /* RDEPUBTextIndexTable.swift in Sources */, + 82652769213A4505EB968F508444BFE4 /* RDEPUBTextLayouter.swift in Sources */, + CB436A32456377BFEF92C48A033D00AB /* RDEPUBTextLayoutFrame.swift in Sources */, + 2E18379B0655CC32BA358CB89F783141 /* RDEPUBTextPageBoundaryValidator.swift in Sources */, + D78C98D530318FAEB330C8810469F53B /* RDEPUBTextPageDecorationView.swift in Sources */, + 8258ED3AECC7D666D71A3CDD72336C9A /* RDEPUBTextPageRenderView.swift in Sources */, + 34D738F155D0D3CA16F3C6554B665A8E /* RDEPUBTextPageVerticalJustifier.swift in Sources */, + 58D149A0978D65A0E3100DAC8F64C2B8 /* RDEPUBTextPaginationInterfaces.swift in Sources */, + 02DB3F5CD60A80BC4A27F77EEE2C9372 /* RDEPUBTextPaginationSupport.swift in Sources */, + 5675678CC8AA593425AC50EC4B702208 /* RDEPUBTextPerformanceSampler.swift in Sources */, + BB353409E4E12CBD140D8558AFB0AE65 /* RDEPUBTextPositionConverter.swift in Sources */, + A04E8A79293210D73AB60D753F635DD9 /* RDEPUBTextRenderer.swift in Sources */, + 9147F2EC41915FDD83B8C8B44CB7E440 /* RDEPUBTextRendererSupport.swift in Sources */, + 9A42EACE6319937378BE969B5BE1F89A /* RDEPUBTextSearchEngine.swift in Sources */, + 5786077F5C93E7605EAF0E0C9D84BBFE /* RDEPUBTextSelectionController.swift in Sources */, + 8E44611C7FC61B0F6B197004149643E9 /* RDEPUBTypesettingPipeline.swift in Sources */, + A8558343E113346EF75EC327987A9B62 /* RDEpubURLReaderController.swift in Sources */, + 47CEF67F26AD47F9BA63D89C4F233667 /* RDEPUBViewportTypes.swift in Sources */, + 20C84711D379B1244D44F6AE4CA46ACA /* RDEPUBWebContentView.swift in Sources */, + 35DFE3F833A49E5F055087209FDA48A3 /* RDEPUBWebDecorationOverlayView.swift in Sources */, + 66EE3EB9F8CDD8E41EBB76F19EBAB512 /* RDEPUBWebView.swift in Sources */, + CD8EB96643407FE06E3FEDEE4C9F446A /* RDEPUBWebView+Configuration.swift in Sources */, + A59ECA1C79794D157BD9E87DC19F6D36 /* RDEPUBWebView+FixedLayout.swift in Sources */, + 923F3C01F3A8330053A33F77923983CC /* RDEPUBWebView+JavaScriptBridge.swift in Sources */, + 0FA3F4FEE3F9660657F0AA0117B95BD3 /* RDEPUBWebView+Reflowable.swift in Sources */, + 0C967A3A008695E1753456852CB381FB /* RDEPUBWebView+Search.swift in Sources */, + 256F2FBEA0BA50D272159F02D902F611 /* RDEPUBWebViewDebug.swift in Sources */, + 45D891EAA051DD40FF50DF6EF850A89F /* RDMOBIParser.swift in Sources */, + 0952462BA9D73DF2A199FCB7105FB349 /* RDReaderDocumentFormat.swift in Sources */, + 01BAD9DD97D25EDF620445B8876BD981 /* String+RDEPUB.swift in Sources */, + 580A03A83013B855159D405AF80EDBED /* UIColor+RDEPUB.swift in Sources */, + A4025F5A563E4B91B2D3468E6E435693 /* UIColor+RDEPUBHex.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 1D39B32170C86F95C041002A5CAD64EB /* Sources */ = { + 315C3E209269EF9DCC01F9A09A749BA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2F4AB3D711200DAB6B8B0E6D5E3E9774 /* RDPDFAIContentProvider.swift in Sources */, + 64155589E0B98A2A533AEADA4F0411F7 /* RDPDFKitPageProvider.swift in Sources */, + 4682824DA120D16A9C1E5A409449D660 /* RDPDFReaderAnnotationEditorViewController.swift in Sources */, + F5BEFA1ECA945559A096787DFC7B5A27 /* RDPDFReaderAnnotationListViewController.swift in Sources */, + 5456493C65094838AD0F2BC39FDC7B41 /* RDPDFReaderChromeViews.swift in Sources */, + 996015E5109268820CBFDBD0374A42FC /* RDPDFReaderContainerView.swift in Sources */, + 906561FBE3727743E5F81F793D5EE210 /* RDPDFReaderContentCell.swift in Sources */, + 0E6CC1B4E893EB6D9D76FCCDD125F3CD /* RDPDFReaderContracts.swift in Sources */, + B6FA3A9062517BAFEF468F04B78A1F8F /* RDPDFReaderDebugViewController.swift in Sources */, + F94F155B9E380CCB319468C07B135C97 /* RDPDFReaderDrawingCanvasView.swift in Sources */, + 5271325F17912AE731F1FAF8D3328F6C /* RDPDFReaderDrawingLayersView.swift in Sources */, + 8731E6DFBE1CC958CE8B122D5144B3CC /* RDPDFReaderDrawingToolbar.swift in Sources */, + E647E758B0AB51A6070EC90FA56356D0 /* RDPDFReaderHighlightOverlayView.swift in Sources */, + 8CF55379C440B62AD7DAA78629264DD4 /* RDPDFReaderImageTextLayerView.swift in Sources */, + D8EE68FA80CC14F8DB7B5649BEEEEB6D /* RDPDFReaderImageTextRecognizer.swift in Sources */, + 2272682D201A6AB03AC748D5EE1B4C9C /* RDPDFReaderKitView.swift in Sources */, + D80A0D7409D41B929CB5C5ADB2FA123C /* RDPDFReaderNavigationPanelViewController.swift in Sources */, + 361808AE6FE4B0AD47DB34C9D1290C5C /* RDPDFReaderNavigationView.swift in Sources */, + 085826A323C90FB16A9380AD88E1E394 /* RDPDFReaderPageChildViewController.swift in Sources */, + 0A9D1BAF9EE83FDBA8B4976EEA453EFA /* RDPDFReaderPageView.swift in Sources */, + 792D5CAEC030F37770DFC2DBC1BC3773 /* RDPDFReaderPagingController.swift in Sources */, + FDDA135AA139B6C5E93628504593542F /* RDPDFReaderPanelPresentation.swift in Sources */, + 73CB1C47A368FB5FD420680227696815 /* RDPDFReaderPersistenceStore.swift in Sources */, + AE9C15A64DC56172E16CAAB607A13E00 /* RDPDFReaderSettingsPanelViewController.swift in Sources */, + FBC42097F09EB9AD8717663C7CA9FE41 /* RDPDFReaderSettingsView.swift in Sources */, + 8137EBB59B68FE44A292FAF24DE6DE37 /* RDPDFReaderTheme.swift in Sources */, + 9AC98ED3942DDCC434580B020478CCC1 /* RDPDFReaderView+CollectionView.swift in Sources */, + B396528BBA2B2BABAEB8F1D5E2727B32 /* RDPDFReaderView+Paging.swift in Sources */, + 5FF4E86CD0381F96E2E2785DE8857966 /* RDPDFReaderView+ToolView.swift in Sources */, + 241EA2AA99E27D96E4468289A8B02F42 /* RDPDFReaderView-dummy.m in Sources */, + 44B420AB0963FB65CA7734418F1E80E1 /* RDPDFReaderViewController.swift in Sources */, + 2EB84DBB152379A800758656C572218C /* RDPDFSpeechContentProvider.swift in Sources */, + 7154F8895FC65582EE371B109D94B2B3 /* RDPDFSpeechSession.swift in Sources */, + 42C418BB820EE1B51E1BB966F7D4A59A /* RDPDFZoomablePageView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6B3153A3D95687C42CAD370470F6ADCC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 4811A347041CD3123495E41396D145CD /* Sources */ = { + 7F0E1E43783433272F33954F422787AB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 42E8C52579C378B702EFF01188E53CF7 /* RDPDFKitPageProvider.swift in Sources */, - FE60C8821EA6FDFFF15F22E2E7D77D8B /* RDPDFReaderAnnotationEditorViewController.swift in Sources */, - 8D3EB4BD6C7DFA99BF6D73893EA68A33 /* RDPDFReaderAnnotationListViewController.swift in Sources */, - E3003D23FF1F66710D96674FD3401AC9 /* RDPDFReaderChromeViews.swift in Sources */, - C52C6F329DFC3DFAD3C819385035E5BF /* RDPDFReaderContainerView.swift in Sources */, - 53CD7480D7A5DEA16105271B3A4A0EDA /* RDPDFReaderContentCell.swift in Sources */, - 3E43290CAF5CBB6952FA4429D0E59F7C /* RDPDFReaderContracts.swift in Sources */, - BD99B69B1FBE455C5C1D97E400CBA08A /* RDPDFReaderDebugViewController.swift in Sources */, - 01F9BDEBC2DAA860F9B415ABB5A66A64 /* RDPDFReaderDrawingCanvasView.swift in Sources */, - FB86725957F487474653A42C45AA42C9 /* RDPDFReaderDrawingLayersView.swift in Sources */, - F7A44934CBC37DA0C73DCE477BE239C4 /* RDPDFReaderDrawingToolbar.swift in Sources */, - 33C7582C73593E4E03EDFD4EC04C1FA9 /* RDPDFReaderHighlightOverlayView.swift in Sources */, - 4DE021908E4E1FD343F225D687828B6C /* RDPDFReaderImageTextLayerView.swift in Sources */, - 19FB4576BF3DC1B22EFE421249D4CE70 /* RDPDFReaderImageTextRecognizer.swift in Sources */, - 23BC290FF41AD9EFC3C9C0E9BB9F008C /* RDPDFReaderKitView.swift in Sources */, - 26315E878BB38BE50BD5DD77C00BBBED /* RDPDFReaderNavigationPanelViewController.swift in Sources */, - 1DB02C024072801E6C83196C6F4CD925 /* RDPDFReaderNavigationView.swift in Sources */, - E2A1C8666A6AA28DB866B92F5345A5CE /* RDPDFReaderPageChildViewController.swift in Sources */, - 9D2756A6EA62DC05464345D73FAD772F /* RDPDFReaderPageView.swift in Sources */, - 7168E1F9C232A71118B3DA2720556BF4 /* RDPDFReaderPagingController.swift in Sources */, - 85DC4667579FA4FB8F06DE10D79C1BDB /* RDPDFReaderPanelPresentation.swift in Sources */, - 38A91EB79CFAB78049BB83EB5305634A /* RDPDFReaderPersistenceStore.swift in Sources */, - 4FE3F57478AE12AF0762DB8B7F6658FF /* RDPDFReaderSettingsPanelViewController.swift in Sources */, - 396CC47765C52E169161945557D1E0AC /* RDPDFReaderSettingsView.swift in Sources */, - DEEF4E1E4B210B2DDC5F92CA5567CBD0 /* RDPDFReaderTheme.swift in Sources */, - 129D4B35C96A44FF51627D670168E256 /* RDPDFReaderView+CollectionView.swift in Sources */, - 23A689CCA9073CE674B1BD450629DECA /* RDPDFReaderView+Paging.swift in Sources */, - D0210B7499AF32A36B60CE3505882F5A /* RDPDFReaderView+ToolView.swift in Sources */, - E332413296CEEDC19C116F40479D29DB /* RDPDFReaderView-dummy.m in Sources */, - F3B8C6A7E543BD8E7CAE2E415B37F0D1 /* RDPDFReaderViewController.swift in Sources */, - 6718A9F16B4A4A16F013239280B88878 /* RDPDFZoomablePageView.swift in Sources */, + 22796A7363B805A1A3CFE22E9FEF53DA /* Pods-ReadViewDemo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 555C73618585AE6A4CFC6E68CAD9BC9F /* Sources */ = { + 8A8859A21B8E2957FA7F6940AF5B520E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E77445593DA7F38F2F26305070A40C4D /* RDCBZReaderController.swift in Sources */, - F8CC36A42110B1FA934258DCF4EB4762 /* RDEPUBAnnotationEditorViewController.swift in Sources */, - 10446CA423A9DBE2C3CE27C0C5BBE952 /* RDEPUBAnnotationModels.swift in Sources */, - A3E97A57562EF0233C951964D26DBBCA /* RDEPUBAssetRepository.swift in Sources */, - 09B49EFE6223F79FA3DBF2322ABEC3A1 /* RDEPUBAttachmentNormalizer.swift in Sources */, - 57FC7A6DE84141D6B2636B9ED8E0BE82 /* RDEPUBAttachmentTooltipOverlayView.swift in Sources */, - 792F6B7B1C3B9A3E43BD3041EB92C0EF /* RDEPUBAttachmentTooltipView.swift in Sources */, - CF77CBF45ED2550761E077F815485CC8 /* RDEPUBBackgroundCoverageStore.swift in Sources */, - 28E83C2B2DBF5887E15EA2F133800C2D /* RDEPUBBackgroundPriorityPolicy.swift in Sources */, - F27993F10ABA4CC86FD5C58FF39D5883 /* RDEPUBBackgroundTrace.swift in Sources */, - 817FA29F739BD7F8C5C1133184CF2746 /* RDEPUBBookPageMap.swift in Sources */, - E879F9B012873321CEC6EA825C6DFBF5 /* RDEPUBBuildDiagnosticsReporter.swift in Sources */, - 3ACD250804B9C734DEAF67E260F15920 /* RDEPUBCFI.swift in Sources */, - B62CB41227F697B35B476BF17EDFE501 /* RDEPUBCFICompatibility.swift in Sources */, - 683AFD98CF56982AB1C10BA80D822FA2 /* RDEPUBCFIDOMPathBuilder.swift in Sources */, - 8805A1F85260DC0DFCFDE413253C02FF /* RDEPUBCFIError.swift in Sources */, - 1E3CAFB57AC9CEDA5052E2B7C2862DFD /* RDEPUBCFIGenerator.swift in Sources */, - 706B056B4481A496B6A0B743A5597C07 /* RDEPUBCFIMap.swift in Sources */, - 0BB8E31E895FFFDDAB4CC41EEE1FB440 /* RDEPUBCFIMarkerInjector.swift in Sources */, - 49DFEB47397EBEBF0A18636FADB893BD /* RDEPUBCFIParser.swift in Sources */, - 5D05C7FABA8E6A777B3666515CC940B1 /* RDEPUBCFIPath.swift in Sources */, - 55C51A8032ED8F803ABD609382A716E1 /* RDEPUBCFIRange.swift in Sources */, - 90408C125712B1309AEA647C8804B199 /* RDEPUBCFIRecoveryEngine.swift in Sources */, - 27C488C467E166610F298953A8253BC2 /* RDEPUBCFIResolver.swift in Sources */, - 96AFFB9EB202E212B3EED5A173C4E9E3 /* RDEPUBCFISerializer.swift in Sources */, - 3DE492221688A9FD941CB0C4F83B3EEB /* RDEPUBCFITextAssertion.swift in Sources */, - B99880D5CC636DA9EA158C79AD0454A1 /* RDEPUBCFIUtilities.swift in Sources */, - FC910AA696FF18C84A6365DF9C9C424F /* RDEPUBChapterCacheKey.swift in Sources */, - 00BFF92A6EB62A825FC27C55B773FFB4 /* RDEPUBChapterData.swift in Sources */, - A0AD6102848CEFDC5FB444E65B956F6E /* RDEPUBChapterDataCache.swift in Sources */, - 72195EDF65B2BA88E55902F13FBDB5A4 /* RDEPUBChapterDisplayContentCache.swift in Sources */, - ABD0544F7103859B11D1DE040E2D516C /* RDEPUBChapterLoader.swift in Sources */, - B4349104AAB928C77DA7856B8078D9A6 /* RDEPUBChapterLocation.swift in Sources */, - 43B0CBD98713B6E86A6FB47D0C57A364 /* RDEPUBChapterOffsetMap.swift in Sources */, - 460DDC8FF9C5EE77B50366F64504C975 /* RDEPUBChapterPageCounter.swift in Sources */, - 78FF15D0FA9004E03E7ADE959EFFE565 /* RDEPUBChapterRuntimeStore.swift in Sources */, - 6C9845389C901217D168604D8F9E904E /* RDEPUBChapterSummaryDiskCache.swift in Sources */, - 2FA5C87F7EAAA97726C4CD9D9B059B6F /* RDEPUBChapterTailNormalizer.swift in Sources */, - 76FFC611487FEE9BB8BAC371752FDDE8 /* RDEPUBChapterWarmupOrchestrator.swift in Sources */, - 758FFAAF7DE564B5765C9F3BAEA2E202 /* RDEPUBCoreTextPageFrameFactory.swift in Sources */, - B8FA5ED7AFE0CBE95DC65A57AAA0273F /* RDEPUBCSSCompatibilityLayer.swift in Sources */, - D570C4EE6360476832BEE5BD97163074 /* RDEPUBDarkImageAdjuster.swift in Sources */, - A27AB28EB7B1A95485537F7493161E24 /* RDEPUBDecryptingImageAttachment.swift in Sources */, - 8CE7E564E4F1F50CEC10E13DAE1DB56D /* RDEPUBDTCoreTextRenderer.swift in Sources */, - 6E735A47E8E6CD48E6AB808F6296686B /* RDEPUBFixedLayoutTemplate.swift in Sources */, - ECFAA40DD992BE7A5EDE980982AD08DD /* RDEPUBFontFallbackResolver.swift in Sources */, - 363B602299B0E9D8B396DB307E881B45 /* RDEPUBFontNormalizer.swift in Sources */, - 67B6056A1C2233857A796A920A5C94D0 /* RDEPUBFragmentMarkerInjector.swift in Sources */, - B96DE08EB4CDFD7CE0250A3927A31B8F /* RDEPUBHTMLNormalizer.swift in Sources */, - C0214EF0F9B92329063CB89AD0B5880F /* RDEPUBImageViewController.swift in Sources */, - 7CBF1FB34C28C44DF64801D6DEB4F783 /* RDEPUBImageViewerCoordinator.swift in Sources */, - D189922DBB83C25BC8E8F59FF51BAF34 /* RDEPUBJavaScriptBridge.swift in Sources */, - 658095BA15CB2808046C9EB08F06CCED /* RDEPUBJumpSession.swift in Sources */, - 15E4A50ACA89EF7661AE074DBFFDF5B7 /* RDEPUBMemoryProbe.swift in Sources */, - 6F8DFEC4D6D635520E3156DEDB24B4FC /* RDEPUBMetadataParseCancellationController.swift in Sources */, - 7B38C10310A465531DE6ADCAC241E681 /* RDEPUBMetadataParseWorker.swift in Sources */, - 01AF419B0730918A46EF569E2391B967 /* RDEPUBModels.swift in Sources */, - 98A025951F12B433AD115CD3CEDDDBD8 /* RDEPUBNavigatorLayoutContext.swift in Sources */, - 307B51E3CC861F36EACCB6A40E68B9CD /* RDEPUBNoteDetector.swift in Sources */, - CC3DE77B844BEE95F78D0769BC4EBAF9 /* RDEPUBNoteModels.swift in Sources */, - A097F26C01A8A85039E5E2D19EABF24D /* RDEPUBNotePopupCoordinator.swift in Sources */, - 36DC8E915917725A9DB5CABDCB5015D4 /* RDEPUBNotePopupViewController.swift in Sources */, - 1E8BEAB75C40E2ED799CAA16BAC8807A /* RDEPUBNoteResolver.swift in Sources */, - 9C05C97A74E7281F25F2BB0245A9D715 /* RDEPUBPageBreakPolicy.swift in Sources */, - 8DB5CC8706F527BFB11525A6B73BB1B2 /* RDEPUBPageCountCache.swift in Sources */, - 2808691D62CA0901739A8462538139A5 /* RDEPUBPageInteractionController.swift in Sources */, - 5075124CA1638D3C269DEA00ECA3964D /* RDEPUBPageLayoutSnapshot.swift in Sources */, - E102A76415883B74C6C2A300C9094F0F /* RDEPUBPageMapReconciliationCoordinator.swift in Sources */, - FD9CC3756A7CBCC3040DD785487B0500 /* RDEPUBPageResolver.swift in Sources */, - 5836CA35B11F27537237D9A6E3E3C334 /* RDEPUBPaginationCacheCoordinator.swift in Sources */, - E999AE7BACD93F7AFDF04211C39AC35D /* RDEPUBPaginationModels.swift in Sources */, - 5587CEE3C0E5288818C3C5DD8562EF3D /* RDEPUBPaginator.swift in Sources */, - 0B16758571EB7BE5E544AE8896E74B36 /* RDEPUBParser.swift in Sources */, - 66B93253DE7FE999F8144CC939605F3A /* RDEPUBParser+Archive.swift in Sources */, - 1A4D4371A6D8086811CA461DC49BA33F /* RDEPUBParser+Package.swift in Sources */, - F85A22E53A91AC2EF0FBECA87103370C /* RDEPUBParser+ReadingProfile.swift in Sources */, - EA2491A494DAB37C07D615273AEC8DE5 /* RDEPUBParser+Resources.swift in Sources */, - 5F48422418D87D8794EB690F577D9D14 /* RDEPUBParser+TOC.swift in Sources */, - 3ED3D590470EB5D28E8E0A0F35DE1A23 /* RDEpubPlainTextBookBuilder.swift in Sources */, - 407E8286C3E02E9DCA0119C0D969FEF6 /* RDEPUBPreferences.swift in Sources */, - B71CA96B831364187FC460130EB25C8A /* RDEPUBPresentationRuntime.swift in Sources */, - 5363B2BC23909119FC8F9986DC3665F2 /* RDEPUBPublication.swift in Sources */, - 51340BC6E06C090CB50B286724831E7B /* RDEPUBReaderAnnotationCoordinator.swift in Sources */, - BE2B7071A08224DF4550AB00049D73F2 /* RDEPUBReaderAssemblyCoordinator.swift in Sources */, - CB5890C41FEAB82999C9A4DFFC425A5D /* RDEPUBReaderBottomToolView.swift in Sources */, - 54CC0E42773420964101E9C51F71E941 /* RDEPUBReaderChapterListController.swift in Sources */, - BF0E8909D0E84A8E6623208CB97C9CC4 /* RDEPUBReaderChromeCoordinator.swift in Sources */, - A06D0DF52FF6AE1F6C4482BBABD73C1F /* RDEPUBReaderConfiguration.swift in Sources */, - E9EB20207ED0C4F50D5A555F62CE845A /* RDEpubReaderContentCell.swift in Sources */, - 1989C9CC57E1100B8EDF3F5844C9DA6E /* RDEPUBReaderContext.swift in Sources */, - 51A0BEADEA665AE04BFEC268553C1249 /* RDEPUBReaderController.swift in Sources */, - E690D3041E8FF360ED48B6A3B1CF1AEB /* RDEPUBReaderController+AttachmentTooltip.swift in Sources */, - E31F16819C8D2E59CE9EC3EAF8E88C51 /* RDEPUBReaderController+ContentDelegates.swift in Sources */, - A53382EEF80D25E2E84B30BDF87D32CA /* RDEPUBReaderController+DataSource.swift in Sources */, - 69215D0CBD8EB9B7941A6E997428AB35 /* RDEPUBReaderController+ExternalLinks.swift in Sources */, - 739B2A424AACAA53C6F2A454C1147C51 /* RDEPUBReaderController+LocationResolution.swift in Sources */, - 0D165B3DF90CADA8EE5DCCCB44A9B2E1 /* RDEPUBReaderController+Orientation.swift in Sources */, - 9EAEDB014CE2E937A47B6BB37B59743A /* RDEPUBReaderController+PublicAPI.swift in Sources */, - 4995967B0C0F48A4437FBA42B1525685 /* RDEPUBReaderController+RenderSupport.swift in Sources */, - 58BD63B311E131A04D27C09E6A44DCAD /* RDEPUBReaderController+RuntimeBridge.swift in Sources */, - B9271BC5E425AD8ADD4C6D561B97D4C1 /* RDEPUBReaderController+TableOfContents.swift in Sources */, - 84DF69BDF1ABA4C534918FECEB4FC190 /* RDEPUBReaderController+Trial.swift in Sources */, - 56FF83A81EAAE4DF9074B3D93B447C60 /* RDEPUBReaderDelegate.swift in Sources */, - 13779EFC4B60766AA45F4C453EC5E89A /* RDEPUBReaderDependencies.swift in Sources */, - C93FDFB56432C0DBE56701FB01995625 /* RDEPUBReaderEnvironment.swift in Sources */, - 9D8DF57114A6CB59686EC2A5EF82720A /* RDEpubReaderFlowLayout.swift in Sources */, - 4C571730BAEA49B8E2B4AAB5FF4C6ABC /* RDEpubReaderGestureController.swift in Sources */, - 1B757164A8714741AEB51962CE84E0AF /* RDEPUBReaderHighlightsViewController.swift in Sources */, - 88739AD8ADFE0F01CCE72073E6B5EE29 /* RDEPUBReaderLoadCoordinator.swift in Sources */, - 757A9887DFF1AE4E5CA26E82C4129CA3 /* RDEPUBReaderLocationCoordinator.swift in Sources */, - A184446D12B20A2A45844257D9E09E1E /* RDEpubReaderPageChildViewController.swift in Sources */, - EAB24829872CF4EA95664E3FA0FD3A68 /* RDEPUBReaderPaginationCoordinator.swift in Sources */, - E00758E44CA106CFC4DC2A2137F62C68 /* RDEpubReaderPagingController.swift in Sources */, - FC5C5DF74B3755DADC1B85BC0B35FAF6 /* RDEPUBReaderPersistence.swift in Sources */, - CC2EF0E7EBB0C4F7D7F2B360DF7FE9B8 /* RDEpubReaderPreloadController.swift in Sources */, - 135E8C300067D3E03A313D518706EAA9 /* RDEPUBReaderRuntime.swift in Sources */, - A4E62D819CC311F109A2672A40906667 /* RDEPUBReaderSearchBarView.swift in Sources */, - F5CA27E5123B11C9A15C361F2D9DE8D8 /* RDEPUBReaderSearchCoordinator.swift in Sources */, - 5C91C49D7918D688CA79565E21001BF8 /* RDEPUBReaderServices.swift in Sources */, - ABF58E16D763E200F4199DCC20ADC6DF /* RDEPUBReaderSettings.swift in Sources */, - 287346F1E7822C038D95AAC869F8EE1A /* RDEPUBReaderSettingsViewController.swift in Sources */, - AB15CDEC956F4EA7131C036C892962B6 /* RDEpubReaderSpreadResolver.swift in Sources */, - C21EA46F0CB466BE3330A769D4E02E45 /* RDEPUBReaderState.swift in Sources */, - 88834B5C7C7321AE147C125A772EBD22 /* RDEPUBReaderTableOfContentsItem.swift in Sources */, - 9262E9FD58A8DF61BA8D1828AC78ECE0 /* RDEpubReaderTapRegionHandler.swift in Sources */, - 2B2B79EBE69FD69100988552BD920775 /* RDEPUBReaderTheme.swift in Sources */, - 4953AE4BD31D4185D3091ECC6CAC24F9 /* RDEPUBReaderToolView.swift in Sources */, - 051F47746E8330E1BB280C3A4A0EC510 /* RDEPUBReaderToolViewProtocols.swift in Sources */, - 5E9A7DB6BB90E0A62F1B7153EED46953 /* RDEPUBReaderTopToolView.swift in Sources */, - 598FECAC8A0A211A0CD1C4BFC4F5D17D /* RDEPUBReaderUIState.swift in Sources */, - 762B5E129DB0C0E55E2B15F0DE33A3D0 /* RDEpubReaderView.swift in Sources */, - C6E5F70AFE3C2B3D74A6555B3F96FC7B /* RDEpubReaderView+CollectionView.swift in Sources */, - DB6F4AB155823AFB16A8B6FAE732A062 /* RDEpubReaderView+ContentAccess.swift in Sources */, - 47823BDDB026FB3AA03789F952BADF09 /* RDEpubReaderView+PageCurl.swift in Sources */, - A7A84555DC1EFB6AA2A1CD92EF8E05EB /* RDEpubReaderView+ToolView.swift in Sources */, - B1209E507F02612272E977F7388C1CA6 /* RDEpubReaderView-dummy.m in Sources */, - 786E03AE79A040289810E23F3650798A /* RDEPUBReaderViewportMonitor.swift in Sources */, - AC493BA061950FEE835F5305A5C0EFED /* RDEpubReaderViewProtocols.swift in Sources */, - 58E895FB648D69922341F4D6FC7D223F /* RDEPUBReadingLocationModels.swift in Sources */, - 6A7B01BF9329C09B25AD50C51CB57400 /* RDEPUBReadingSession.swift in Sources */, - 1639ACF52DF98CEB9D0209EAD4CD6AA3 /* RDEPUBRenderDiagnosticsCollector.swift in Sources */, - 2C3E8B24AC8FD7CC8759287E1DA19180 /* RDEPUBRenderRequest.swift in Sources */, - 3EB9DCC1A22D23ECBA68D493F0EB8994 /* RDEPUBResourceDataProvider.swift in Sources */, - E0249E144B3E3276D4B97F9A63E87825 /* RDEPUBResourceResolver.swift in Sources */, - 6CCD41B742640A2FE9F2537378D53FE6 /* RDEPUBResourceURLSchemeHandler.swift in Sources */, - 8E74EF124593A0E8C42F05F34F18DF7D /* RDEPUBRuntimeChapter.swift in Sources */, - 61953AE6CF7B054825AF861A30F0E0D1 /* RDEPUBRuntimePageCount.swift in Sources */, - E676D40AA424AC6D817FEBFEBC17D6A8 /* RDEPUBSafeArea.swift in Sources */, - 17281C88AE75A26C730E43C15467E723 /* RDEPUBSearchEngine.swift in Sources */, - 9E7B8B9F265A36A8058BE39018E9E339 /* RDEPUBSearchModels.swift in Sources */, - D8445E15B15818CC32F0F5FEA3DB32C8 /* RDEPUBSelectionLoupeView.swift in Sources */, - 795AC979765E7A188006C6A44D1A5081 /* RDEPUBSelectionOverlayView.swift in Sources */, - B647D72A5A14CFD2C63C9E33B8A83B62 /* RDEPUBSelectionState.swift in Sources */, - 2285D8F6F8450CB71AAFC2398CA269EC /* RDEPUBSemanticMarkerInjector.swift in Sources */, - 6E8D5163A139D27A576ECFFF0EE0BF47 /* RDEPUBSettingsFlipAutomation.swift in Sources */, - EB6DDD12EA3D1E5E365E6A3C5D1A248C /* RDEPUBStyleCompatibilityModels.swift in Sources */, - 4D1DE840FE2BDF91A821B28921B9DA46 /* RDEPUBStyleSheetBuilder.swift in Sources */, - AD1E9FB8A3B05645F8805FB26F814DF4 /* RDEPUBStyleSheetComposer.swift in Sources */, - FD23980142BDA1955145B577739A2CD2 /* RDEPUBTextAnchor.swift in Sources */, - 99602A29E251C50BCC2EFD40D03716C8 /* RDEPUBTextAnnotationOverlay.swift in Sources */, - 6E3C87D8CA0283564A8FDCDCC44B2DC9 /* RDEPUBTextBookBuilder.swift in Sources */, - A5D15AF6A625AAEE7A68E724600DE2EE /* RDEPUBTextBookCache.swift in Sources */, - B56C0BC177945BD67D43DA9784709273 /* RDEPUBTextBookModels.swift in Sources */, - C2A74F19B4F40EBF0E94256A632E8EFD /* RDEPUBTextBuildPipelineInterfaces.swift in Sources */, - F6B6B5335297604654B91F9DB1B625CC /* RDEPUBTextContentInteractionCoordinator.swift in Sources */, - C0FA604044813AF3977DB6E38D086EAE /* RDEPUBTextContentView.swift in Sources */, - 3FE37FCED1213F0CCD4CE93FD10BD0E9 /* RDEPUBTextIndexTable.swift in Sources */, - 55BA631EFFCE67592653F9A6790490DB /* RDEPUBTextLayouter.swift in Sources */, - EFE6DECC787C462818A9B3C3E075E0E5 /* RDEPUBTextLayoutFrame.swift in Sources */, - 416183B9FBBC3C7623F0F97E2A0DEB09 /* RDEPUBTextPageBoundaryValidator.swift in Sources */, - 89B166C4B24D15FAA70EB6B52E89B572 /* RDEPUBTextPageDecorationView.swift in Sources */, - CF4B683FEB083614C57097E02204930B /* RDEPUBTextPageRenderView.swift in Sources */, - 460CEA9F3899BE4066AE872BCA931771 /* RDEPUBTextPageVerticalJustifier.swift in Sources */, - D2419445E59791BD0A58247BEC366E9F /* RDEPUBTextPaginationInterfaces.swift in Sources */, - 78115EEA858DA63B6836E385A8D3D7EB /* RDEPUBTextPaginationSupport.swift in Sources */, - D860F690E2BA824A33842A069D805612 /* RDEPUBTextPerformanceSampler.swift in Sources */, - D521D48B2138B46063941457702CCFBF /* RDEPUBTextPositionConverter.swift in Sources */, - E1E62EA38EAAA0B37F4C2B94AEABA717 /* RDEPUBTextRenderer.swift in Sources */, - F35FC5777D29A52C05955D9A33E191F3 /* RDEPUBTextRendererSupport.swift in Sources */, - AB3268891858D675485E80816DFA75C1 /* RDEPUBTextSearchEngine.swift in Sources */, - BCF514662DC610C45F4EBB4CDD4DB446 /* RDEPUBTextSelectionController.swift in Sources */, - F10C0868A69A442CA04FC421CBE6C1FC /* RDEPUBTypesettingPipeline.swift in Sources */, - 3C6F422428CE8B9F2AED56B60B2C9602 /* RDEpubURLReaderController.swift in Sources */, - 8003BE5D54D632D2DB96F39A97EA14BC /* RDEPUBViewportTypes.swift in Sources */, - 05D41C82695A154984AB656F29955C77 /* RDEPUBWebContentView.swift in Sources */, - 9CF3ED83D568246E7BCEA2A2C4D38473 /* RDEPUBWebDecorationOverlayView.swift in Sources */, - 89933A4738255CBB0CECFD0C4FCEC371 /* RDEPUBWebView.swift in Sources */, - 00A77DF1E3D88B9FB43E68863591E2E7 /* RDEPUBWebView+Configuration.swift in Sources */, - F67B03A6B84144C24A8727EBA9A85560 /* RDEPUBWebView+FixedLayout.swift in Sources */, - 4054EDC26E6972F014B40C6D58B1E348 /* RDEPUBWebView+JavaScriptBridge.swift in Sources */, - 7D1BC4BFD9942BC180D8B2F8AE1C1952 /* RDEPUBWebView+Reflowable.swift in Sources */, - 15ADFF2FC3055D22BE783942D1212A11 /* RDEPUBWebView+Search.swift in Sources */, - 294DF90539B944BF674F3C9C999D6F23 /* RDEPUBWebViewDebug.swift in Sources */, - 1B0202FF627E2F99AA09AD8D76A84AC9 /* RDMOBIParser.swift in Sources */, - 553D996359941996BCDF3F73F48CB96A /* RDReaderDocumentFormat.swift in Sources */, - 91DD2C713D72D75B59D2E5FD28733A8E /* String+RDEPUB.swift in Sources */, - FD31618D8F4420C75C745EDCFC38D9EB /* UIColor+RDEPUB.swift in Sources */, - 0580598854A03D4712CE0EE68716DBAD /* UIColor+RDEPUBHex.swift in Sources */, + DE6074564E19C27682C74A6C866602C3 /* RDAISpeechContentProvider.swift in Sources */, + C9CC84E07257BC1CFA58827C18666DEC /* RDSpeechReaderContracts.swift in Sources */, + B76AAD4CE3A876895D22B69BC7D8430C /* RDSpeechReaderController.swift in Sources */, + 34CEDD8C5C37205306E49A3D61CB6E9E /* RDSpeechReaderControlView.swift in Sources */, + 388E7E64B2A9CB4FE6BB4421CA66F65F /* RDSpeechReaderView-dummy.m in Sources */, + 1C7DB25B5090AEEFE61B7140803A213B /* RDSpeechTextPreprocessor.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 5E93E448B68A840FDF8BFC9C495D6398 /* Sources */ = { + 9022983CC7159FD41F9E607B69B3B279 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 78858E76A13C1C769450576FA6328029 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 10D2345D0BDAB0A1116848C3E6556168 /* Archive.swift in Sources */, - 9CE219EB6F092600CA33E15CE41CC38E /* Archive+BackingConfiguration.swift in Sources */, - 4EC2770415CD64F8EC90F4971FE01F2A /* Archive+Deprecated.swift in Sources */, - D0CEC4798C2DA9CDC93E3CC59BD03B79 /* Archive+Helpers.swift in Sources */, - 3AABEE7BEF895AE3EEC5DEA7743A4356 /* Archive+MemoryFile.swift in Sources */, - 2413A6C52542F45B1661CF6AC1FE2D65 /* Archive+Progress.swift in Sources */, - 222A251FA9F106A668FC4273EC4200FF /* Archive+Reading.swift in Sources */, - 62F77E2F83B486840605A84A8BFC670E /* Archive+ReadingDeprecated.swift in Sources */, - AF16ED52BCD49CCD7B7D19E5CC19F617 /* Archive+Writing.swift in Sources */, - F7C25175A4415DE466783A53BDBDBB9E /* Archive+WritingDeprecated.swift in Sources */, - 81E05D0BAEC9A1F7FC50DB906D83B4C0 /* Archive+ZIP64.swift in Sources */, - 1EE5DC3F2D93547DB6E397E8B963C7F6 /* Data+Compression.swift in Sources */, - DDCD814F4CFC21B9941982C85653DC65 /* Data+CompressionDeprecated.swift in Sources */, - B2905E16F0C9B8659C065FCFD4F8C04E /* Data+Serialization.swift in Sources */, - CD7BE6FF1D68DD425C945B2CE0247C5A /* Date+ZIP.swift in Sources */, - B6870FF977C2C853A5448FEBCB5023EA /* Entry.swift in Sources */, - B02F375B16AD7C7C33D916BC92AA6DD8 /* Entry+Serialization.swift in Sources */, - BF0BDBA82FA333DA21F02074DF249459 /* Entry+ZIP64.swift in Sources */, - 09B8D40F105A1239C137746B77D54A49 /* FileManager+ZIP.swift in Sources */, - FF538BF0A80A8D99B78743597C47334F /* FileManager+ZIPDeprecated.swift in Sources */, - 39B236CB7C9212BFAE8D3830C361B196 /* URL+ZIP.swift in Sources */, - 9BCC983EA5231C9D263FA645D58D0CC4 /* ZIPFoundation-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7909F23385853857D999A55DF2E7CAEF /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 04527DC803E0144AD715A2C7A06C1E3C /* Pods-ReadViewDemo-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 79B3E3F214EE4E4CBE7114FA2591FE52 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 96B287B7613D827030A3444C1F1016A3 /* Constraint.swift in Sources */, - BC4AE1B68D8554F1A9C71FEFC4FBCB31 /* ConstraintAttributes.swift in Sources */, - 5766BBAF238D43A234A9965D209D3456 /* ConstraintConfig.swift in Sources */, - 23BBE3B3573E7296084D8A61A1FA1AD4 /* ConstraintConstantTarget.swift in Sources */, - 2BD3DBBA503E1B2B2AB4AE1EED3612A4 /* ConstraintDescription.swift in Sources */, - 010659F20A2ABE308E90E1BBC242BD90 /* ConstraintDirectionalInsets.swift in Sources */, - D43F7557B00A156FE247DBE8E26E51B3 /* ConstraintDirectionalInsetTarget.swift in Sources */, - 92F000C7625CBA207F48EF95B9781D89 /* ConstraintDSL.swift in Sources */, - 96724FD78DA6E4B95E96A4260EBC7C0F /* ConstraintInsets.swift in Sources */, - 155F420C89324E92D8DE72847F1D7E64 /* ConstraintInsetTarget.swift in Sources */, - 44B308C0F464440B6DC02DA06AC0CEBE /* ConstraintItem.swift in Sources */, - 8F44CA30A7274B9035B30B0CEC895B47 /* ConstraintLayoutGuide.swift in Sources */, - 46759C5BEEA541B506D8364771C1762F /* ConstraintLayoutGuide+Extensions.swift in Sources */, - 13939482D36155060087CC4080166F49 /* ConstraintLayoutGuideDSL.swift in Sources */, - 7E47D5B14C16612DADE842BFAF3E6DF2 /* ConstraintLayoutSupport.swift in Sources */, - 24B7824198086E4C7FEA42755440DF60 /* ConstraintLayoutSupportDSL.swift in Sources */, - 05FCA262E9BFEA1114B209A4B7A369E1 /* ConstraintMaker.swift in Sources */, - 1ECD2540B27D5D2E20144AC08D55DC85 /* ConstraintMakerEditable.swift in Sources */, - 682437E668DB3D6C9E6B72FEB41D5FBF /* ConstraintMakerExtendable.swift in Sources */, - E0D06D790679C2908871D9A7C32D19CF /* ConstraintMakerFinalizable.swift in Sources */, - 41181309680AD350246E05D2FF51B3CE /* ConstraintMakerPrioritizable.swift in Sources */, - D72B9DD54B69A441232EB4675E9A396A /* ConstraintMakerRelatable.swift in Sources */, - 10639C21834EA03821258B750FF59966 /* ConstraintMakerRelatable+Extensions.swift in Sources */, - 954296DCFAC0A89B6ED281D0B88ED2B9 /* ConstraintMultiplierTarget.swift in Sources */, - 2636FEA811FE9EEEFEA940143DD17AB3 /* ConstraintOffsetTarget.swift in Sources */, - 3A6FC9CBAE2C39A84FF7ED27DA29CC5B /* ConstraintPriority.swift in Sources */, - 6071184E8ECB9E5DE7187A363FAE8C62 /* ConstraintPriorityTarget.swift in Sources */, - 1A2AED084871CA3A78226A16B2893A71 /* ConstraintRelatableTarget.swift in Sources */, - 786BF7747848520712F08044A0D02D80 /* ConstraintRelation.swift in Sources */, - 00533D00D0799587B6A77B4BAF852F16 /* ConstraintView.swift in Sources */, - 40E6FDFB6C87C3FACD94999F9007B22A /* ConstraintView+Extensions.swift in Sources */, - 90755EAACF679D579C32EB0775BEA867 /* ConstraintViewDSL.swift in Sources */, - D441C9BCE1EDEDF0C962A695D33E1C04 /* Debugging.swift in Sources */, - AAE4A96FB3FBC30E2F73F040437B8380 /* LayoutConstraint.swift in Sources */, - 05D03C10C306DD68133220014C15C963 /* LayoutConstraintItem.swift in Sources */, - 0961AAE9066CA5087BF43739577F66D1 /* SnapKit-dummy.m in Sources */, - D09EAE862E8BA3A7A5EC8028EC30DEB9 /* Typealiases.swift in Sources */, - 59B5E86ACB2ECBF2F44515967AF5C0F5 /* UILayoutSupport+Extensions.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D8A10A612E7BD6B832AFCA8097CEAE8F /* Sources */ = { + A2D4C2E481D04B9CAD59D196FFED0CB2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - E1ACC866735994FB5DDF16E332392DAE /* Sources */ = { + A5F59A74AAB0EC27108240C01270BEB5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 362B570C94340092A816356AD3284F79 /* Archive.swift in Sources */, + 11CF5494F84324BEB5016EFE7046E6A3 /* Archive+BackingConfiguration.swift in Sources */, + 38B7A8486011EE9E4C92AD7F43C67D6C /* Archive+Deprecated.swift in Sources */, + 1C58CE096885BE414C2A52164C5476D3 /* Archive+Helpers.swift in Sources */, + F9EFE047E2DE9BDBDE0774A77C6CC3AD /* Archive+MemoryFile.swift in Sources */, + 24E26EC4E2715E28AAAF2239556E5D08 /* Archive+Progress.swift in Sources */, + 22C3CE5D30DEA275C026014A7C6A8DE3 /* Archive+Reading.swift in Sources */, + 7AD8C965AACB1343366C029CA39920F1 /* Archive+ReadingDeprecated.swift in Sources */, + 38DEF213C89004432B18C427CE1FD830 /* Archive+Writing.swift in Sources */, + 3C067EBE2D4B7D28B8C196166C62F4C4 /* Archive+WritingDeprecated.swift in Sources */, + 910D5641EF4CF5D2A6F6A36AF50EE25A /* Archive+ZIP64.swift in Sources */, + 44FB7CAB227C63DB590DC3D61428F678 /* Data+Compression.swift in Sources */, + FB37977DD4625FAF7CAAE19E9CF13722 /* Data+CompressionDeprecated.swift in Sources */, + F8814DB2E7990E853C29249D4D5EA877 /* Data+Serialization.swift in Sources */, + 1D57100D8CB86A35A93EFBB76724F69F /* Date+ZIP.swift in Sources */, + 46D1C37BE8645232A7A3890D3B583E4A /* Entry.swift in Sources */, + 2D37038C0E73CEECA8A390B68F847FC1 /* Entry+Serialization.swift in Sources */, + 8B883B75A63415B216F01354B9B4F66D /* Entry+ZIP64.swift in Sources */, + 7B328F107199E9130E8E9453B9C19F8F /* FileManager+ZIP.swift in Sources */, + 54AB1CA8DC10415A933C420BF1E4FD0F /* FileManager+ZIPDeprecated.swift in Sources */, + 21D7ABAF802A959CC8813308649ED6AC /* URL+ZIP.swift in Sources */, + B0902747E74CD719F0583F848D5227A6 /* ZIPFoundation-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B5AB1C401FEE34A79826B450C2C3B9C1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5773E1761F14534E57C620E0ECE4D1DB /* DTActivityTitleView.m in Sources */, + 1A91DAF2EE1CBCEAFE3DCBA474A37B96 /* DTAnimatedGIF.m in Sources */, + 84EAE9CFBEAC03E4B95A321E78943365 /* DTBase64Coding.m in Sources */, + 680EF666B4832EF1412DD7112D40286F /* DTBlockFunctions.m in Sources */, + B91EFDBCAF74AED0882D670EF6C244F3 /* DTCoreGraphicsUtils.m in Sources */, + 4CD69F81A7F837750AE17A9DB48E9BDF /* DTCustomColoredAccessory.m in Sources */, + A374EB7564B9E0CCEBA566A30C5551BE /* DTExtendedFileAttributes.m in Sources */, + 3FDE28AE263B6D46649F6F76FDBC444F /* DTFolderMonitor.m in Sources */, + 14C1DE78043A17227D4672B8EFE3A241 /* DTFoundation-dummy.m in Sources */, + 5E4CB3BDAE2876F57FAF5F7707D339AB /* DTFoundationConstants.m in Sources */, + 45F0A220FCCA6BD09278BD4178381D63 /* DTHTMLParser.m in Sources */, + CFD97B727A0110D104BAA1971D2288E3 /* DTLog.m in Sources */, + AEB35A34B4BD9D563421951F788785DB /* DTPieProgressIndicator.m in Sources */, + FE14C52089C6E31DE5070C0BF47C0500 /* DTSmartPagingScrollView.m in Sources */, + 1AC7119C4E97CD39EACE1DCC42934B5D /* DTTiledLayerWithoutFade.m in Sources */, + 0FBD916D1B6E3B7093D734C8D0AFDB2E /* DTVersion.m in Sources */, + 8BD97441C51AF5BED8E01766EA2EC609 /* NSArray+DTError.m in Sources */, + 5075AB6E0A829656787F4F6AB63CE7F4 /* NSData+DTCrypto.m in Sources */, + B45A64277FD61F6FA0AF77DD793158AA /* NSDictionary+DTError.m in Sources */, + CADC06E386DEE523937B3B0DA5E74700 /* NSFileWrapper+DTCopying.m in Sources */, + A86F7A86BF53DAFD0D9F40771DE16753 /* NSMutableArray+DTMoving.m in Sources */, + E7D5A732459EEE8E882A91941BA328AE /* NSString+DTFormatNumbers.m in Sources */, + 11BF04E60C430795B9DC542B74412F50 /* NSString+DTPaths.m in Sources */, + EE77D0DB0E8AF90E594D0F6D2089B2AC /* NSString+DTURLEncoding.m in Sources */, + DB2B37770C59463ED4CA22D43CE84A05 /* NSString+DTUtilities.m in Sources */, + 38EB2BF870061DE650DA95053B69B87F /* NSURL+DTAppLinks.m in Sources */, + 01FF57F8E540F20A7FADEE33AA1C7A73 /* NSURL+DTComparing.m in Sources */, + D5E1FCC5EEF948E3EFDF9F02DAE1E813 /* NSURL+DTUnshorten.m in Sources */, + 7AF664366D4801DF3F4A8A68357644BB /* UIApplication+DTNetworkActivity.m in Sources */, + 3815E2C02F20BAB245D81A5930487778 /* UIImage+DTFoundation.m in Sources */, + 683D3404833FA173E581FADE53BA9B06 /* UIScreen+DTFoundation.m in Sources */, + 124EF6FA0D36BAD0D5B4810DB6345179 /* UIView+DTFoundation.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DBF30937F1B27AE4D83AC1939FCFB01F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BE529C270CEA2A2C6666E5BC46C50DD3 /* Constraint.swift in Sources */, + C1EA6CBF3E63093C2F930FFB0BD64E79 /* ConstraintAttributes.swift in Sources */, + 661647FBCA7F9F220857F8EFAA05A2B5 /* ConstraintConfig.swift in Sources */, + B03327FAC1F82FBF4DD1F1863A19C913 /* ConstraintConstantTarget.swift in Sources */, + 2977D8358E329AEA906D3E64910F451D /* ConstraintDescription.swift in Sources */, + 9FC1AEB682CD309FA7119A1FCCEBB708 /* ConstraintDirectionalInsets.swift in Sources */, + 6001AAEEAB0C6493A397350500BB4038 /* ConstraintDirectionalInsetTarget.swift in Sources */, + B76B293E2071B10641153379A411BB3A /* ConstraintDSL.swift in Sources */, + 6D8F3D282FEBDD51A7970E92330173DB /* ConstraintInsets.swift in Sources */, + 2CF882B1AD06F3EFE889465776F0E1AD /* ConstraintInsetTarget.swift in Sources */, + 64D22A0DC2A1210D1494E7FC4D191539 /* ConstraintItem.swift in Sources */, + 2EEA383365CCE1949C7C68B2EDD1904A /* ConstraintLayoutGuide.swift in Sources */, + EC88C9F006E7ADD40849EE093BD1E3FE /* ConstraintLayoutGuide+Extensions.swift in Sources */, + 0A9B84091398DE20C772FA9FA2803150 /* ConstraintLayoutGuideDSL.swift in Sources */, + FC0ECDDC20EE8676838BBED649D4EC54 /* ConstraintLayoutSupport.swift in Sources */, + A3D4E87CBD4C7BD9F47D0139E550CB3D /* ConstraintLayoutSupportDSL.swift in Sources */, + 9D12E0847751CF6ED879D7A2FD0AF7B6 /* ConstraintMaker.swift in Sources */, + 2724CBD89B0C9184F4968F5110B305DA /* ConstraintMakerEditable.swift in Sources */, + AF2BC336DB93234B6189EC2ACC144CAA /* ConstraintMakerExtendable.swift in Sources */, + 64B71533F97E195EB639209DBEE574E1 /* ConstraintMakerFinalizable.swift in Sources */, + 1B0DC9C853B5DEE751669FD4354DE805 /* ConstraintMakerPrioritizable.swift in Sources */, + BC07D89F2B6A97B9343F62F6DF8756D6 /* ConstraintMakerRelatable.swift in Sources */, + F4D8820227694D6D5F09CFA6E1465F87 /* ConstraintMakerRelatable+Extensions.swift in Sources */, + 7668961F2433BB151F1E4EE19AAE4579 /* ConstraintMultiplierTarget.swift in Sources */, + A1D8FCF9351374EAEAF9D53603EBEA91 /* ConstraintOffsetTarget.swift in Sources */, + CE4B31BC6513E87A9190C954571E385D /* ConstraintPriority.swift in Sources */, + D094FDAFB406B4894DF945B7164E97C1 /* ConstraintPriorityTarget.swift in Sources */, + 9C05B5CF2598BB4EFA6C8C6881E4E067 /* ConstraintRelatableTarget.swift in Sources */, + 00A4DA374441586757BAE1F167ABC0A0 /* ConstraintRelation.swift in Sources */, + 3A2E99A9D63EBA1AD6DEB88A58230346 /* ConstraintView.swift in Sources */, + 4B9FA34806EE1B678A99B1B8E105F768 /* ConstraintView+Extensions.swift in Sources */, + 27C86A56BD84C02BD3EDEE479F3E6E33 /* ConstraintViewDSL.swift in Sources */, + 45C22D05CEBD5AC9C520EDE9A860DED4 /* Debugging.swift in Sources */, + 8F12D85AADFB18FDF7A86CE2D1F29821 /* LayoutConstraint.swift in Sources */, + EA390D4166224687AE187999F107C44B /* LayoutConstraintItem.swift in Sources */, + F9028F050CFD6BABF3990E24D06731F1 /* SnapKit-dummy.m in Sources */, + 428790F145A922B7906C4EB7D5CB174B /* Typealiases.swift in Sources */, + DCD5EFBBA2F0E37E403263F70A6D4D88 /* UILayoutSupport+Extensions.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EDA3C8C069C08CDAA81EB2528164720E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -3284,182 +3693,198 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + FDA7CA3B5D824C6440575FD64AB02520 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + D6EFCA4E1BCB69F129636FF71B81DCD5 /* RDAIAppleFoundationModelsProvider.swift in Sources */, + 160890D3E69645A3EBE3E4A7D821BA7C /* RDAIDiagnostics.swift in Sources */, + 76787F2728FA3FED06C6481B555459C5 /* RDAIIndexService.swift in Sources */, + F32092E04F4488D14BA015CF6AD06155 /* RDAILocatorBuilder.swift in Sources */, + 28D8E43A60A58DA7961352C1F9CEE6B1 /* RDAINaturalLanguageAnalyzer.swift in Sources */, + 68003F1BF23E3222A141F945510D9AE4 /* RDAINaturalLanguageSemanticScorer.swift in Sources */, + 667E37483857C6BDEEE623A200BD94B5 /* RDAIReaderAssistantViewController.swift in Sources */, + 988EF04BC3904784A7F4B364AD31A75C /* RDAIReaderContracts.swift in Sources */, + 1667634A08E3C710A759A0E33C72F6EA /* RDAIReaderView-dummy.m in Sources */, + 6ADF048625373BC2C3B5BE61BA02D982 /* RDAISQLiteIndexStore.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 09C917BF14A53A5A6B7D0AB0F28BDE87 /* PBXTargetDependency */ = { + 024C591CE25B444779EAE0907CC1375D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDAIReaderView; + target = 1F1B6899710AE3E4BD213BE01489E557 /* RDAIReaderView */; + targetProxy = 17C3B49E3B391E5D6ED339176BA6EFB8 /* PBXContainerItemProxy */; + }; + 0F381A4930501641E8F6760587BBA2C2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTCoreText; + target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; + targetProxy = 36CA89A2E0EBD19706B0CDEC849CA8EF /* PBXContainerItemProxy */; + }; + 1462C34F341D1B4C735128082B1D106B /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDAIReaderView; + target = 1F1B6899710AE3E4BD213BE01489E557 /* RDAIReaderView */; + targetProxy = AB811AE81F514DC81EF4EAEB477D8FC6 /* PBXContainerItemProxy */; + }; + 19A4C847AB807C66B93F53A7F4DD49CC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ZIPFoundation; + target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; + targetProxy = F577E6647643B09D3AFC9D08E5266A66 /* PBXContainerItemProxy */; + }; + 248D14A413D4F8109E81E876B6C7269D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDSpeechReaderView; + target = CC23E8498E4F0DDEB3C1A2AA05B8ACF2 /* RDSpeechReaderView */; + targetProxy = 974B87AA811E6162BE45E7792A96E30B /* PBXContainerItemProxy */; + }; + 2572918456CF71DA3F29818A05ABD216 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "DTCoreText-Resources"; target = 0C24CB0E87A728A11AA1124CB360D6A1 /* DTCoreText-Resources */; - targetProxy = CA71454BC17E37142EA167FC0D497218 /* PBXContainerItemProxy */; + targetProxy = A1BCAED813EBD7868EACE64F704FEDFF /* PBXContainerItemProxy */; }; - 1CB1483421357596C395A4C72082EEFB /* PBXTargetDependency */ = { + 28C1AC837072796CCABD3BD21996776D /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = RDPDFReaderView; - target = 352EC96AFAEE0EDF74FD76A958827133 /* RDPDFReaderView */; - targetProxy = BA4028C24C0013B0A03CED17724094EF /* PBXContainerItemProxy */; + name = SnapKit; + target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; + targetProxy = 3197E6921AA84CC1B8C9056142396606 /* PBXContainerItemProxy */; }; - 2DD972CA169E151AAEAABB373D497F01 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTFoundation; - target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; - targetProxy = 5D53C2F5FD65E6CD8E8652A497BAA4B1 /* PBXContainerItemProxy */; - }; - 2F84AD8A95F9891FF10615622C18AEC4 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = RDEpubReaderView; - target = FBCB57A3AEAAA3449B3F365930BC0977 /* RDEpubReaderView */; - targetProxy = B6CD365D3C9BF96A2B0402B1084C7753 /* PBXContainerItemProxy */; - }; - 5AF53B4F6DFEA88AB7C850609586CA7B /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTFoundation; - target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; - targetProxy = E2F62FE95F2A46E4E30A3BB09AED49A3 /* PBXContainerItemProxy */; - }; - 5C84F363AB364AC2256A20768F4D4F63 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "RDEpubReaderView-RDEpubReaderViewAssets"; - target = E07DDD766DCBF90486BCE6C2EA671E5E /* RDEpubReaderView-RDEpubReaderViewAssets */; - targetProxy = DD19C0F32844A61F07F1ECB13D355A85 /* PBXContainerItemProxy */; - }; - 5F130D3703CF962F4D3CB2C627477170 /* PBXTargetDependency */ = { + 4B210AD5861A1A96A332E1DB585A46C3 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "ZIPFoundation-ZIPFoundation_Privacy"; target = C7A8D82E407CD3FDC3BA55CEE519B252 /* ZIPFoundation-ZIPFoundation_Privacy */; - targetProxy = 80504DFF5A5AD74D41D48A50675C2868 /* PBXContainerItemProxy */; + targetProxy = 50D575B5DAED2FB9BE1C5428C056DDA4 /* PBXContainerItemProxy */; }; - 7934BEA3095F46B97A03F7A60B8F1E6A /* PBXTargetDependency */ = { + 6623C980109567118E7F3702DCC999C0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDSpeechReaderView; + target = CC23E8498E4F0DDEB3C1A2AA05B8ACF2 /* RDSpeechReaderView */; + targetProxy = A5B1A067FDB1F0EB3824BD39DF45BAE5 /* PBXContainerItemProxy */; + }; + 88BCAFF12D3803A063766F4D5C30667E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDAIReaderView; + target = 1F1B6899710AE3E4BD213BE01489E557 /* RDAIReaderView */; + targetProxy = 2CB368EDA06484484C9239CFA8639DD2 /* PBXContainerItemProxy */; + }; + AD243A82A9C0AEC6847FF66C8840E6E2 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTFoundation; + target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; + targetProxy = 6CC53768D781202C205E9844C7F2D924 /* PBXContainerItemProxy */; + }; + B4478053F9E8036E2C99208643561D5F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = SnapKit; + target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; + targetProxy = 65A1725917E9E5A2B8917B90CECA7448 /* PBXContainerItemProxy */; + }; + BA1B18C040E4323B9F5771A5BCFD85D4 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ZIPFoundation; target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; - targetProxy = FF25772B8CDE34CEEA71AC7EF594EA0E /* PBXContainerItemProxy */; + targetProxy = 14272A2E48D9CD26B93FD523A154E373 /* PBXContainerItemProxy */; }; - 816D08A1CE30E219E8187F8D929C6027 /* PBXTargetDependency */ = { + C09951035419916D448EA490B5A655D4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "RDEpubReaderView-RDEpubReaderViewAssets"; + target = E07DDD766DCBF90486BCE6C2EA671E5E /* RDEpubReaderView-RDEpubReaderViewAssets */; + targetProxy = 54C8DAE6D3E517D5EC52DE42098FD67D /* PBXContainerItemProxy */; + }; + D578A051EF503FB8EDBCC5CD1B609545 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTFoundation; + target = 8F6E5A5BF72D62CDFD25F91A7CFA3309 /* DTFoundation */; + targetProxy = 23CDB939F8EBFEEE0D7CE925D5DDF1C1 /* PBXContainerItemProxy */; + }; + DE04E5B678B6CA201E24C786B3D69573 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDPDFReaderView; + target = 352EC96AFAEE0EDF74FD76A958827133 /* RDPDFReaderView */; + targetProxy = ACB386194F6C01184D3B9EC5867FFBD0 /* PBXContainerItemProxy */; + }; + E484BE24A2FE86EA9C9A3524401B8192 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = DTCoreText; + target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; + targetProxy = 7EFD564EA79AAB335CD2CFD94DAB66BA /* PBXContainerItemProxy */; + }; + E7694395F54F46F8381C2C1EE948D916 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDSpeechReaderView; + target = CC23E8498E4F0DDEB3C1A2AA05B8ACF2 /* RDSpeechReaderView */; + targetProxy = F592612B0B5945374062A600E49D8EF2 /* PBXContainerItemProxy */; + }; + E94EB867FB3FB5780F50629A54149FC0 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RDEpubReaderView; + target = FBCB57A3AEAAA3449B3F365930BC0977 /* RDEpubReaderView */; + targetProxy = 49127916BC5D5B5142FB676094C70903 /* PBXContainerItemProxy */; + }; + F2B0C0753DA799589EE86F0FBA1565DC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "SnapKit-SnapKit_Privacy"; target = 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */; - targetProxy = 4F9EBF9F2EC34F1D069E0B7A384ABDFF /* PBXContainerItemProxy */; + targetProxy = 16082FE383C0CCFFBA096AB8AA84D7C9 /* PBXContainerItemProxy */; }; - 9288E43C082AE6E0A34C7F9E8D7DA38E /* PBXTargetDependency */ = { + F8C9B690D26DCCC4C8B18837001B7536 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SnapKit; target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; - targetProxy = 2FA9DB204EBAB127A33BB8E4A75C753F /* PBXContainerItemProxy */; + targetProxy = 11876E077448C6CCB7A570D4369D3BD7 /* PBXContainerItemProxy */; }; - B3EFFAD8C8F5A4687F9BE26C20400EB4 /* PBXTargetDependency */ = { + F9191E83D3358FBA266553022C856B47 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = DTCoreText; - target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; - targetProxy = F01A5D40B4F3128453B6F24E1230C400 /* PBXContainerItemProxy */; - }; - B8FE988ECDB2D8B87605057DA0A0204D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = DTCoreText; - target = B88F4EA0695B6B3165C64594850D72C7 /* DTCoreText */; - targetProxy = 52A62E1544F8F1CB8A0841D9C035A446 /* PBXContainerItemProxy */; - }; - BE6CB9FE5495066560BCDA1BFF40A557 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SnapKit; - target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; - targetProxy = 90EA3F52B53B30D0599E44601689BAD6 /* PBXContainerItemProxy */; - }; - EB391B439FA4DA9B9CD9393C265500E0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SnapKit; - target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */; - targetProxy = F020CE938454AADA341AF610460A014D /* PBXContainerItemProxy */; - }; - FF40085F4184C2B90AAC6F7AE1041CAF /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = ZIPFoundation; - target = AA15C8469D67684160CC2A7098EB841C /* ZIPFoundation */; - targetProxy = D9527F41C7D96D531D5F1C5AE5AAC1F4 /* PBXContainerItemProxy */; + name = RDAIReaderView; + target = 1F1B6899710AE3E4BD213BE01489E557 /* RDAIReaderView */; + targetProxy = 481088C3908A20E60C0BA4FFF4251DD3 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 23019F36561142BD43D5CBD6706803DC /* Debug */ = { + 01F68F890F2620FE0BBB8E47082D586E /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2A39B1AC101FC87E52C5110F072FEA07 /* DTFoundation.debug.xcconfig */; + baseConfigurationReference = CD770BD6314F1E02A05DC9744C65B5A4 /* SnapKit.debug.xcconfig */; buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IBSC_MODULE = SnapKit; + INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; - PRODUCT_MODULE_NAME = DTFoundation; - PRODUCT_NAME = DTFoundation; + PRODUCT_NAME = SnapKit_Privacy; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + WRAPPER_EXTENSION = bundle; }; name = Debug; }; - 24A1D9E253C3AABB60323796DC99AA84 /* Release */ = { + 0B20D3D85903912845AF663B0E49AC6D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D3CE152E896CA22C59944E4E3BBBF760 /* RDPDFReaderView.release.xcconfig */; + baseConfigurationReference = 3FDE76F77A49B86E3A4499727321AC11 /* DTCoreText.release.xcconfig */; buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/RDPDFReaderView/RDPDFReaderView-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/RDPDFReaderView/RDPDFReaderView-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IBSC_MODULE = DTCoreText; + INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/RDPDFReaderView/RDPDFReaderView.modulemap"; - PRODUCT_MODULE_NAME = RDPDFReaderView; - PRODUCT_NAME = RDPDFReaderView; + PRODUCT_NAME = Resources; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.10; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; + WRAPPER_EXTENSION = bundle; }; name = Release; }; - 312D49A3D80184C28FB9AC227489FE3D /* Debug */ = { + 0CCAD0FFCBF6DEA721A71FDFEB58CB00 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 306477706BBB1E784F55BCF8EB1AD737 /* Pods-ReadViewDemo.debug.xcconfig */; buildSettings = { @@ -3498,9 +3923,9 @@ }; name = Debug; }; - 41849447990ECC3ECD217C57B1826838 /* Debug */ = { + 0FB065A42C91EEC5CD72DA4FA77E1BC6 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CD770BD6314F1E02A05DC9744C65B5A4 /* SnapKit.debug.xcconfig */; + baseConfigurationReference = 2042A956F6ADB5E2CF8DB889FA6F7652 /* RDAIReaderView.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3513,9 +3938,9 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/RDAIReaderView/RDAIReaderView-prefix.pch"; GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist"; + INFOPLIST_FILE = "Target Support Files/RDAIReaderView/RDAIReaderView-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -3523,9 +3948,66 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap"; - PRODUCT_MODULE_NAME = SnapKit; - PRODUCT_NAME = SnapKit; + MODULEMAP_FILE = "Target Support Files/RDAIReaderView/RDAIReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDAIReaderView; + PRODUCT_NAME = RDAIReaderView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.10; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 150BBB63F12BC4D9B3004CF340C11FE2 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B1D682E70FAFEEF08569FCA32E219FD1 /* ZIPFoundation.debug.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IBSC_MODULE = ZIPFoundation; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = ZIPFoundation_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Debug; + }; + 1FE90180987D3E4C6D6DB39231C19B0F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 2A39B1AC101FC87E52C5110F072FEA07 /* DTFoundation.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/DTFoundation/DTFoundation-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/DTFoundation/DTFoundation-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/DTFoundation/DTFoundation.modulemap"; + PRODUCT_MODULE_NAME = DTFoundation; + PRODUCT_NAME = DTFoundation; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -3537,6 +4019,122 @@ }; name = Debug; }; + 21BF661875BF84C1327A3EA55AA7CA30 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D7826602DA2629A5A1DD5912ADCAF5B8 /* ZIPFoundation.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; + PRODUCT_MODULE_NAME = ZIPFoundation; + PRODUCT_NAME = ZIPFoundation; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 221F14CC071C4E49C1E1399166F51C72 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A3942F6A75FD45095352344EAEA29F8B /* RDPDFReaderView.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/RDPDFReaderView/RDPDFReaderView-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/RDPDFReaderView/RDPDFReaderView-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/RDPDFReaderView/RDPDFReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDPDFReaderView; + PRODUCT_NAME = RDPDFReaderView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.10; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 37F98935CFE42AD22302FDAAA6171048 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EBAF09D94C8796C21CF84B062626E152 /* RDEpubReaderView.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDEpubReaderView"; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IBSC_MODULE = RDEpubReaderView; + INFOPLIST_FILE = "Target Support Files/RDEpubReaderView/ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = RDEpubReaderViewAssets; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; + 3B43520826A15E4625613E09CBCC0D68 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D7826602DA2629A5A1DD5912ADCAF5B8 /* ZIPFoundation.release.xcconfig */; + buildSettings = { + CODE_SIGNING_ALLOWED = NO; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + IBSC_MODULE = ZIPFoundation; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + PRODUCT_NAME = ZIPFoundation_Privacy; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = bundle; + }; + name = Release; + }; 44A4B2FB6211B90C1949A44A381F6D1F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3600,45 +4198,9 @@ }; name = Release; }; - 5262F3A67360B39002149BD6CB7C9830 /* Release */ = { + 57E088951A12170B52B7A1054C6487A7 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D7826602DA2629A5A1DD5912ADCAF5B8 /* ZIPFoundation.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = ZIPFoundation; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = ZIPFoundation_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 5E6FECA7E82E76277592B6F146CEC264 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 3FDE76F77A49B86E3A4499727321AC11 /* DTCoreText.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = DTCoreText; - INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = Resources; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; - 80297E59640305FED07C30F5A4987FFC /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 80EF554F6662D1148455292C4F03A585 /* RDEpubReaderView.debug.xcconfig */; + baseConfigurationReference = EBAF09D94C8796C21CF84B062626E152 /* RDEpubReaderView.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3670,32 +4232,15 @@ SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_VERSION = 5.10; TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; - 8DA4B6420F839F28DA697714309D5A65 /* Debug */ = { + 69A6B34F722DBC44AAEB0275F77AED27 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3FFE1E06FDE8D4BA1EE289A4D0E7D127 /* DTCoreText.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = DTCoreText; - INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = Resources; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 95A586A2DFC2B0EF9173D83088BD0863 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B1D682E70FAFEEF08569FCA32E219FD1 /* ZIPFoundation.debug.xcconfig */; + baseConfigurationReference = CD770BD6314F1E02A05DC9744C65B5A4 /* SnapKit.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3708,9 +4253,9 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch"; GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; + INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -3718,9 +4263,9 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; - PRODUCT_MODULE_NAME = ZIPFoundation; - PRODUCT_NAME = ZIPFoundation; + MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap"; + PRODUCT_MODULE_NAME = SnapKit; + PRODUCT_NAME = SnapKit; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -3732,23 +4277,63 @@ }; name = Debug; }; - 9CAA084411645A1BC17FDE93745EC5FB /* Debug */ = { + 8561A1F936D83B0C176DA51E09B4C4B0 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 80EF554F6662D1148455292C4F03A585 /* RDEpubReaderView.debug.xcconfig */; + baseConfigurationReference = 03D925237ACBF4382D1CF970BC943B0D /* RDSpeechReaderView.release.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/RDSpeechReaderView/RDSpeechReaderView-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/RDSpeechReaderView/RDSpeechReaderView-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/RDSpeechReaderView/RDSpeechReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDSpeechReaderView; + PRODUCT_NAME = RDSpeechReaderView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.10; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 929A640856AC2588D883FB7DD34A3DAF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F3D00D37E3CB914B9957CBEC6F302A0B /* SnapKit.release.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDEpubReaderView"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = RDEpubReaderView; - INFOPLIST_FILE = "Target Support Files/RDEpubReaderView/ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist"; + IBSC_MODULE = SnapKit; + INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = RDEpubReaderViewAssets; + PRODUCT_NAME = SnapKit_Privacy; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = bundle; }; - name = Debug; + name = Release; }; A0DC1C2C814704734F83EAB35BB20B21 /* Debug */ = { isa = XCBuildConfiguration; @@ -3817,46 +4402,6 @@ }; name = Debug; }; - A10FE9288AB5F874705DE2CBF9048F78 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1AD502A1FA6EB1E38200B5283F979504 /* Pods-ReadViewDemo.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - INFOPLIST_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; A1F5B44E8E7C59A962189D14989BCAFF /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 3FDE76F77A49B86E3A4499727321AC11 /* DTCoreText.release.xcconfig */; @@ -3936,7 +4481,125 @@ }; name = Debug; }; - A991F3A7DDED36BC3937B9891872B4B7 /* Release */ = { + B7CDE9995A60AE7262CC14391698821B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1AD502A1FA6EB1E38200B5283F979504 /* Pods-ReadViewDemo.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + INFOPLIST_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + BE1EE1133D55D0EE51AAC09CC6453A46 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C357AC8D7A6E01440AC68979B529B2F7 /* RDSpeechReaderView.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/RDSpeechReaderView/RDSpeechReaderView-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/RDSpeechReaderView/RDSpeechReaderView-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/RDSpeechReaderView/RDSpeechReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDSpeechReaderView; + PRODUCT_NAME = RDSpeechReaderView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.10; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C566CDFEC9B48B4CEA542959E79901B7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B1D682E70FAFEEF08569FCA32E219FD1 /* ZIPFoundation.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; + PRODUCT_MODULE_NAME = ZIPFoundation; + PRODUCT_NAME = ZIPFoundation; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + CF707113F5491DEC4EBF7085CB00EC4E /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 039B47D5CF4FDEA47C608CF07378D3DF /* DTFoundation.release.xcconfig */; buildSettings = { @@ -3976,9 +4639,9 @@ }; name = Release; }; - A9D38B8C9F8BA282B889A45E39CFAD84 /* Release */ = { + D02358DF7C9601E1ECDBAAE752AA369B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 543B7B3F4EEB0FAD86C96E5DCE0E22CC /* RDEpubReaderView.release.xcconfig */; + baseConfigurationReference = B75141FED04E4EEC380F0173E5DEBCA7 /* RDAIReaderView.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -3991,9 +4654,9 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_MODULE_VERIFIER = NO; ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/RDEpubReaderView/RDEpubReaderView-prefix.pch"; + GCC_PREFIX_HEADER = "Target Support Files/RDAIReaderView/RDAIReaderView-prefix.pch"; GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/RDEpubReaderView/RDEpubReaderView-Info.plist"; + INFOPLIST_FILE = "Target Support Files/RDAIReaderView/RDAIReaderView-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( @@ -4001,9 +4664,9 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MODULEMAP_FILE = "Target Support Files/RDEpubReaderView/RDEpubReaderView.modulemap"; - PRODUCT_MODULE_NAME = RDEpubReaderView; - PRODUCT_NAME = RDEpubReaderView; + MODULEMAP_FILE = "Target Support Files/RDAIReaderView/RDAIReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDAIReaderView; + PRODUCT_NAME = RDAIReaderView; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; @@ -4016,25 +4679,25 @@ }; name = Release; }; - B296E9583A64194A7D7A49E0958D1B8E /* Release */ = { + DE627312153A773BC57440D8FE3CA6CE /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = F3D00D37E3CB914B9957CBEC6F302A0B /* SnapKit.release.xcconfig */; + baseConfigurationReference = D475ACC199E6D23FD275CCF5D187243B /* RDEpubReaderView.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDEpubReaderView"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = SnapKit; - INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; + IBSC_MODULE = RDEpubReaderView; + INFOPLIST_FILE = "Target Support Files/RDEpubReaderView/ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = SnapKit_Privacy; + PRODUCT_NAME = RDEpubReaderViewAssets; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = bundle; }; - name = Release; + name = Debug; }; - C8824E39917FB7F331BA3460704A7E08 /* Release */ = { + EB763793A4BB04C8B8F6A6EDCD571F23 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = F3D00D37E3CB914B9957CBEC6F302A0B /* SnapKit.release.xcconfig */; buildSettings = { @@ -4074,27 +4737,66 @@ }; name = Release; }; - CD3962B11342915FA6AE2735806CC617 /* Release */ = { + F3CE254012949D6410E4C34930772FCC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 543B7B3F4EEB0FAD86C96E5DCE0E22CC /* RDEpubReaderView.release.xcconfig */; + baseConfigurationReference = 3FFE1E06FDE8D4BA1EE289A4D0E7D127 /* DTCoreText.debug.xcconfig */; buildSettings = { CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/RDEpubReaderView"; + CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/DTCoreText"; ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = RDEpubReaderView; - INFOPLIST_FILE = "Target Support Files/RDEpubReaderView/ResourceBundle-RDEpubReaderViewAssets-RDEpubReaderView-Info.plist"; + IBSC_MODULE = DTCoreText; + INFOPLIST_FILE = "Target Support Files/DTCoreText/ResourceBundle-Resources-DTCoreText-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = RDEpubReaderViewAssets; + PRODUCT_NAME = Resources; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = bundle; }; - name = Release; + name = Debug; }; - E3A72AD6CD18DF2C70B1BABFFA63F995 /* Debug */ = { + F89A5BEA70D1FAD91E9BCF15955F0492 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C5090C56303AB966C51846110FF05A64 /* RDPDFReaderView.debug.xcconfig */; + baseConfigurationReference = D475ACC199E6D23FD275CCF5D187243B /* RDEpubReaderView.debug.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = NO; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_PREFIX_HEADER = "Target Support Files/RDEpubReaderView/RDEpubReaderView-prefix.pch"; + GENERATE_INFOPLIST_FILE = NO; + INFOPLIST_FILE = "Target Support Files/RDEpubReaderView/RDEpubReaderView-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MODULEMAP_FILE = "Target Support Files/RDEpubReaderView/RDEpubReaderView.modulemap"; + PRODUCT_MODULE_NAME = RDEpubReaderView; + PRODUCT_NAME = RDEpubReaderView; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_INSTALL_OBJC_HEADER = YES; + SWIFT_VERSION = 5.10; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + FF4D798DA0305084DBBF74A386269F29 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 517D2A78DA380DB287A13785F250D543 /* RDPDFReaderView.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -4131,85 +4833,18 @@ }; name = Debug; }; - E6370E48B3BBEC1E10F258A29029A0A1 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CD770BD6314F1E02A05DC9744C65B5A4 /* SnapKit.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = SnapKit; - INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = SnapKit_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - F12C0B99ADBF153DE7481F3417CCB06B /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B1D682E70FAFEEF08569FCA32E219FD1 /* ZIPFoundation.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/ZIPFoundation"; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - IBSC_MODULE = ZIPFoundation; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ResourceBundle-ZIPFoundation_Privacy-ZIPFoundation-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - PRODUCT_NAME = ZIPFoundation_Privacy; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - FD2F00BDBBEEAB4AEE68DD9A52086608 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D7826602DA2629A5A1DD5912ADCAF5B8 /* ZIPFoundation.release.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_MODULE_VERIFIER = NO; - ENABLE_USER_SCRIPT_SANDBOXING = NO; - GCC_PREFIX_HEADER = "Target Support Files/ZIPFoundation/ZIPFoundation-prefix.pch"; - GENERATE_INFOPLIST_FILE = NO; - INFOPLIST_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/ZIPFoundation/ZIPFoundation.modulemap"; - PRODUCT_MODULE_NAME = ZIPFoundation; - PRODUCT_NAME = ZIPFoundation; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_INSTALL_OBJC_HEADER = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 0360A2CBBE7F40DDCF7BD6D9346200E7 /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F3CE254012949D6410E4C34930772FCC /* Debug */, + 0B20D3D85903912845AF663B0E49AC6D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 0C6B1944226D4396EB72162F792F7CD2 /* Build configuration list for PBXNativeTarget "DTCoreText" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -4219,47 +4854,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 15EFE8075D525F6648EAC81CAD1D38FE /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */ = { + 27C3BF37191BEC7B232544E76D4A3A84 /* Build configuration list for PBXNativeTarget "RDEpubReaderView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 312D49A3D80184C28FB9AC227489FE3D /* Debug */, - A10FE9288AB5F874705DE2CBF9048F78 /* Release */, + F89A5BEA70D1FAD91E9BCF15955F0492 /* Debug */, + 57E088951A12170B52B7A1054C6487A7 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 290D8DA6C68E22E3AC02AEEC679F9AB1 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */ = { + 3C795AC9AB79C38D7D5ABE25002B4333 /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */ = { isa = XCConfigurationList; buildConfigurations = ( - F12C0B99ADBF153DE7481F3417CCB06B /* Debug */, - 5262F3A67360B39002149BD6CB7C9830 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 2F57F2EF53B056EC18070F8A87684FD3 /* Build configuration list for PBXNativeTarget "SnapKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 41849447990ECC3ECD217C57B1826838 /* Debug */, - C8824E39917FB7F331BA3460704A7E08 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33B8E6F12A2866899330113FB5CA8694 /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E6370E48B3BBEC1E10F258A29029A0A1 /* Debug */, - B296E9583A64194A7D7A49E0958D1B8E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 42BAB7FC9D396091287DDED59DDA4E5B /* Build configuration list for PBXNativeTarget "RDPDFReaderView" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E3A72AD6CD18DF2C70B1BABFFA63F995 /* Debug */, - 24A1D9E253C3AABB60323796DC99AA84 /* Release */, + 01F68F890F2620FE0BBB8E47082D586E /* Debug */, + 929A640856AC2588D883FB7DD34A3DAF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -4273,47 +4881,83 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - AFB5B4291A9F31B14509185C00540A6F /* Build configuration list for PBXNativeTarget "DTFoundation" */ = { + 50CD9D0637599E6F746E458297CF9D17 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */ = { isa = XCConfigurationList; buildConfigurations = ( - 23019F36561142BD43D5CBD6706803DC /* Debug */, - A991F3A7DDED36BC3937B9891872B4B7 /* Release */, + C566CDFEC9B48B4CEA542959E79901B7 /* Debug */, + 21BF661875BF84C1327A3EA55AA7CA30 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CAE5795EE48AE1205511CFBA8E272E8E /* Build configuration list for PBXNativeTarget "DTCoreText-Resources" */ = { + 5B44221983F052B7553F6B2779CC8345 /* Build configuration list for PBXNativeTarget "RDSpeechReaderView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8DA4B6420F839F28DA697714309D5A65 /* Debug */, - 5E6FECA7E82E76277592B6F146CEC264 /* Release */, + BE1EE1133D55D0EE51AAC09CC6453A46 /* Debug */, + 8561A1F936D83B0C176DA51E09B4C4B0 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - CFB9BBE2424D1D36CA1904E73FE1D1DD /* Build configuration list for PBXNativeTarget "RDEpubReaderView" */ = { + 630E67E726745F8F7EBBB15A664D09F2 /* Build configuration list for PBXNativeTarget "ZIPFoundation-ZIPFoundation_Privacy" */ = { isa = XCConfigurationList; buildConfigurations = ( - 80297E59640305FED07C30F5A4987FFC /* Debug */, - A9D38B8C9F8BA282B889A45E39CFAD84 /* Release */, + 150BBB63F12BC4D9B3004CF340C11FE2 /* Debug */, + 3B43520826A15E4625613E09CBCC0D68 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E0C21A08F8F342F93C78BE4579478379 /* Build configuration list for PBXNativeTarget "ZIPFoundation" */ = { + 64E3CBFB2E3259592BD29A3038A44B1F /* Build configuration list for PBXNativeTarget "SnapKit" */ = { isa = XCConfigurationList; buildConfigurations = ( - 95A586A2DFC2B0EF9173D83088BD0863 /* Debug */, - FD2F00BDBBEEAB4AEE68DD9A52086608 /* Release */, + 69A6B34F722DBC44AAEB0275F77AED27 /* Debug */, + EB763793A4BB04C8B8F6A6EDCD571F23 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E612880EB9499755AABD2CA212042C88 /* Build configuration list for PBXNativeTarget "RDEpubReaderView-RDEpubReaderViewAssets" */ = { + 7A3DCEA78F09A537F1401A969F58D46A /* Build configuration list for PBXNativeTarget "RDPDFReaderView" */ = { isa = XCConfigurationList; buildConfigurations = ( - 9CAA084411645A1BC17FDE93745EC5FB /* Debug */, - CD3962B11342915FA6AE2735806CC617 /* Release */, + FF4D798DA0305084DBBF74A386269F29 /* Debug */, + 221F14CC071C4E49C1E1399166F51C72 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A6097DEBED8762FC0CF17FBE5E9F3F86 /* Build configuration list for PBXNativeTarget "RDEpubReaderView-RDEpubReaderViewAssets" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DE627312153A773BC57440D8FE3CA6CE /* Debug */, + 37F98935CFE42AD22302FDAAA6171048 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A8A434CCAF88ED38465F12E695799F3B /* Build configuration list for PBXNativeTarget "DTFoundation" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1FE90180987D3E4C6D6DB39231C19B0F /* Debug */, + CF707113F5491DEC4EBF7085CB00EC4E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B39F74DCB4F025606C8D0038AE8522D9 /* Build configuration list for PBXNativeTarget "RDAIReaderView" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0FB065A42C91EEC5CD72DA4FA77E1BC6 /* Debug */, + D02358DF7C9601E1ECDBAAE752AA369B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E75535D74C1EF460F963375B59850559 /* Build configuration list for PBXNativeTarget "Pods-ReadViewDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0CCAD0FFCBF6DEA721A71FDFEB58CB00 /* Debug */, + B7CDE9995A60AE7262CC14391698821B /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist index 71f4648..1ffa132 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-input-files.xcfilelist @@ -1,7 +1,9 @@ ${PODS_ROOT}/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh ${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework ${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework +${BUILT_PRODUCTS_DIR}/RDAIReaderView/RDAIReaderView.framework ${BUILT_PRODUCTS_DIR}/RDEpubReaderView/RDEpubReaderView.framework ${BUILT_PRODUCTS_DIR}/RDPDFReaderView/RDPDFReaderView.framework +${BUILT_PRODUCTS_DIR}/RDSpeechReaderView/RDSpeechReaderView.framework ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework ${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist index 48264c3..975443d 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Debug-output-files.xcfilelist @@ -1,6 +1,8 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTCoreText.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTFoundation.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDAIReaderView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDEpubReaderView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDPDFReaderView.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDSpeechReaderView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist index 71f4648..1ffa132 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-input-files.xcfilelist @@ -1,7 +1,9 @@ ${PODS_ROOT}/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh ${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework ${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework +${BUILT_PRODUCTS_DIR}/RDAIReaderView/RDAIReaderView.framework ${BUILT_PRODUCTS_DIR}/RDEpubReaderView/RDEpubReaderView.framework ${BUILT_PRODUCTS_DIR}/RDPDFReaderView/RDPDFReaderView.framework +${BUILT_PRODUCTS_DIR}/RDSpeechReaderView/RDSpeechReaderView.framework ${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework ${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist index 48264c3..975443d 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks-Release-output-files.xcfilelist @@ -1,6 +1,8 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTCoreText.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DTFoundation.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDAIReaderView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDEpubReaderView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDPDFReaderView.framework +${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RDSpeechReaderView.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ZIPFoundation.framework \ No newline at end of file diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh index c5ff8b4..d77db97 100755 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo-frameworks.sh @@ -178,16 +178,20 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework" install_framework "${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework" + install_framework "${BUILT_PRODUCTS_DIR}/RDAIReaderView/RDAIReaderView.framework" install_framework "${BUILT_PRODUCTS_DIR}/RDEpubReaderView/RDEpubReaderView.framework" install_framework "${BUILT_PRODUCTS_DIR}/RDPDFReaderView/RDPDFReaderView.framework" + install_framework "${BUILT_PRODUCTS_DIR}/RDSpeechReaderView/RDSpeechReaderView.framework" install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework" install_framework "${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/DTCoreText/DTCoreText.framework" install_framework "${BUILT_PRODUCTS_DIR}/DTFoundation/DTFoundation.framework" + install_framework "${BUILT_PRODUCTS_DIR}/RDAIReaderView/RDAIReaderView.framework" install_framework "${BUILT_PRODUCTS_DIR}/RDEpubReaderView/RDEpubReaderView.framework" install_framework "${BUILT_PRODUCTS_DIR}/RDPDFReaderView/RDPDFReaderView.framework" + install_framework "${BUILT_PRODUCTS_DIR}/RDSpeechReaderView/RDSpeechReaderView.framework" install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework" install_framework "${BUILT_PRODUCTS_DIR}/ZIPFoundation/ZIPFoundation.framework" fi diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig index 890f798..7eae0ed 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView/RDEpubReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView/RDPDFReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView/RDAIReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView/RDEpubReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView/RDPDFReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView/RDSpeechReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -l"xml2" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreText" -framework "DTCoreText" -framework "DTFoundation" -framework "ImageIO" -framework "MediaPlayer" -framework "PDFKit" -framework "QuartzCore" -framework "RDEpubReaderView" -framework "RDPDFReaderView" -framework "SnapKit" -framework "Vision" -framework "ZIPFoundation" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +OTHER_LDFLAGS = $(inherited) -l"sqlite3" -l"swiftCoreGraphics" -l"xml2" -framework "AVFAudio" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreText" -framework "CryptoKit" -framework "DTCoreText" -framework "DTFoundation" -framework "FoundationModels" -framework "ImageIO" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "PDFKit" -framework "QuartzCore" -framework "RDAIReaderView" -framework "RDEpubReaderView" -framework "RDPDFReaderView" -framework "RDSpeechReaderView" -framework "SnapKit" -framework "UIKit" -framework "Vision" -framework "ZIPFoundation" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig index 890f798..7eae0ed 100644 --- a/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView/RDEpubReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView/RDPDFReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText/DTCoreText.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation/DTFoundation.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView/RDAIReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView/RDEpubReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView/RDPDFReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView/RDSpeechReaderView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation/ZIPFoundation.framework/Headers" "$(SDKROOT)/usr/include/libxml2" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift -OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics" -l"xml2" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreText" -framework "DTCoreText" -framework "DTFoundation" -framework "ImageIO" -framework "MediaPlayer" -framework "PDFKit" -framework "QuartzCore" -framework "RDEpubReaderView" -framework "RDPDFReaderView" -framework "SnapKit" -framework "Vision" -framework "ZIPFoundation" -OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +OTHER_LDFLAGS = $(inherited) -l"sqlite3" -l"swiftCoreGraphics" -l"xml2" -framework "AVFAudio" -framework "CoreGraphics" -framework "CoreImage" -framework "CoreText" -framework "CryptoKit" -framework "DTCoreText" -framework "DTFoundation" -framework "FoundationModels" -framework "ImageIO" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "PDFKit" -framework "QuartzCore" -framework "RDAIReaderView" -framework "RDEpubReaderView" -framework "RDPDFReaderView" -framework "RDSpeechReaderView" -framework "SnapKit" -framework "UIKit" -framework "Vision" -framework "ZIPFoundation" +OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "-F${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-Info.plist b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-Info.plist new file mode 100644 index 0000000..434e06a --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-dummy.m b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-dummy.m new file mode 100644 index 0000000..cd6bcde --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_RDAIReaderView : NSObject +@end +@implementation PodsDummy_RDAIReaderView +@end diff --git a/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-prefix.pch b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-umbrella.h b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-umbrella.h new file mode 100644 index 0000000..8a79cad --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double RDAIReaderViewVersionNumber; +FOUNDATION_EXPORT const unsigned char RDAIReaderViewVersionString[]; + diff --git a/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.debug.xcconfig new file mode 100644 index 0000000..2e03aac --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.debug.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"sqlite3" -framework "CryptoKit" -framework "FoundationModels" -framework "NaturalLanguage" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../Sources/RDAIReaderView +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.modulemap b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.modulemap new file mode 100644 index 0000000..f88a5d1 --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.modulemap @@ -0,0 +1,6 @@ +framework module RDAIReaderView { + umbrella header "RDAIReaderView-umbrella.h" + + export * + module * { export * } +} diff --git a/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.release.xcconfig new file mode 100644 index 0000000..2e03aac --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDAIReaderView/RDAIReaderView.release.xcconfig @@ -0,0 +1,15 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -l"sqlite3" -framework "CryptoKit" -framework "FoundationModels" -framework "NaturalLanguage" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../Sources/RDAIReaderView +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.debug.xcconfig index 554a46a..d0533da 100644 --- a/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.debug.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.debug.xcconfig @@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "SnapKit" -framework "ZIPFoundation" +OTHER_LDFLAGS = $(inherited) -framework "AVFAudio" -framework "CoreGraphics" -framework "CoreText" -framework "CryptoKit" -framework "DTCoreText" -framework "FoundationModels" -framework "ImageIO" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "QuartzCore" -framework "RDAIReaderView" -framework "RDSpeechReaderView" -framework "SnapKit" -framework "UIKit" -framework "ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.release.xcconfig index 554a46a..d0533da 100644 --- a/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.release.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/RDEpubReaderView/RDEpubReaderView.release.xcconfig @@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDEpubReaderView -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/DTCoreText" "${PODS_CONFIGURATION_BUILD_DIR}/DTFoundation" "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/ZIPFoundation" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "CoreGraphics" -framework "CoreText" -framework "DTCoreText" -framework "ImageIO" -framework "MediaPlayer" -framework "QuartzCore" -framework "SnapKit" -framework "ZIPFoundation" +OTHER_LDFLAGS = $(inherited) -framework "AVFAudio" -framework "CoreGraphics" -framework "CoreText" -framework "CryptoKit" -framework "DTCoreText" -framework "FoundationModels" -framework "ImageIO" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "QuartzCore" -framework "RDAIReaderView" -framework "RDSpeechReaderView" -framework "SnapKit" -framework "UIKit" -framework "ZIPFoundation" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.debug.xcconfig index 17ca4fb..495c0a1 100644 --- a/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.debug.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.debug.xcconfig @@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "CoreImage" -framework "PDFKit" -framework "SnapKit" -framework "Vision" +OTHER_LDFLAGS = $(inherited) -framework "AVFAudio" -framework "CoreImage" -framework "CryptoKit" -framework "FoundationModels" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "PDFKit" -framework "RDAIReaderView" -framework "RDSpeechReaderView" -framework "SnapKit" -framework "UIKit" -framework "Vision" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.release.xcconfig index 17ca4fb..495c0a1 100644 --- a/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.release.xcconfig +++ b/ReadViewDemo/Pods/Target Support Files/RDPDFReaderView/RDPDFReaderView.release.xcconfig @@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDPDFReaderView -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_LDFLAGS = $(inherited) -framework "CoreImage" -framework "PDFKit" -framework "SnapKit" -framework "Vision" +OTHER_LDFLAGS = $(inherited) -framework "AVFAudio" -framework "CoreImage" -framework "CryptoKit" -framework "FoundationModels" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "PDFKit" -framework "RDAIReaderView" -framework "RDSpeechReaderView" -framework "SnapKit" -framework "UIKit" -framework "Vision" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-Info.plist b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-Info.plist new file mode 100644 index 0000000..434e06a --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + ${PODS_DEVELOPMENT_LANGUAGE} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-dummy.m b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-dummy.m new file mode 100644 index 0000000..364be9b --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_RDSpeechReaderView : NSObject +@end +@implementation PodsDummy_RDSpeechReaderView +@end diff --git a/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-prefix.pch b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-umbrella.h b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-umbrella.h new file mode 100644 index 0000000..1862428 --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double RDSpeechReaderViewVersionNumber; +FOUNDATION_EXPORT const unsigned char RDSpeechReaderViewVersionString[]; + diff --git a/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.debug.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.debug.xcconfig new file mode 100644 index 0000000..50df8d7 --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.debug.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "AVFAudio" -framework "CryptoKit" -framework "FoundationModels" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "RDAIReaderView" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../Sources/RDSpeechReaderView +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.modulemap b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.modulemap new file mode 100644 index 0000000..e1fb286 --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.modulemap @@ -0,0 +1,6 @@ +framework module RDSpeechReaderView { + umbrella header "RDSpeechReaderView-umbrella.h" + + export * + module * { export * } +} diff --git a/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.release.xcconfig b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.release.xcconfig new file mode 100644 index 0000000..50df8d7 --- /dev/null +++ b/ReadViewDemo/Pods/Target Support Files/RDSpeechReaderView/RDSpeechReaderView.release.xcconfig @@ -0,0 +1,16 @@ +CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/RDSpeechReaderView +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/RDAIReaderView" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift +OTHER_LDFLAGS = $(inherited) -framework "AVFAudio" -framework "CryptoKit" -framework "FoundationModels" -framework "MediaPlayer" -framework "NaturalLanguage" -framework "RDAIReaderView" -framework "UIKit" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../Sources/RDSpeechReaderView +PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj b/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj index da25cda..0da53f8 100644 --- a/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj +++ b/ReadViewDemo/ReadViewDemo.xcodeproj/project.pbxproj @@ -22,16 +22,6 @@ 1A2B3C4D00000030AABBCC01 /* FixedLayoutRotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A2B3C4D00000031AABBCC01 /* FixedLayoutRotationTests.swift */; }; 1A2B3C4D00000033AABBCC01 /* PDFDrawingModeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A2B3C4D00000032AABBCC01 /* PDFDrawingModeTests.swift */; }; 23BB1155EA379786DAA10A89 /* DisplayTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB49AFCCBC2BE04C82B8F286 /* DisplayTypeTests.swift */; }; - 369C9658D870DCAFC17EB7F7 /* SearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE01DBDCB8D790832A4DE3F /* SearchTests.swift */; }; - 3BC5C96D7A0ACF35F2192CC7 /* XCUIApplication+Launch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B4C44287820D68ED6570F8 /* XCUIApplication+Launch.swift */; }; - 4509ED928F228F43888E063D /* ReaderToolbarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BADF0A18AD034B74A482A4C1 /* ReaderToolbarTests.swift */; }; - 52A6A0C9941A4B5F9B88C6B0 /* ReaderAnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20BD15E5D8F04E7E9A239E14 /* ReaderAnnotationTests.swift */; }; - 63B2852E59996922386A3111 /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F495E17B90CCF1C7FE8C27 /* AccessibilityIdentifiers.swift */; }; - 9AAFB855EC7AC09D1E0B6742 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 697A5BCF0D93DBEC18E21A09 /* Foundation.framework */; }; - A1C5E34F6B7192D400A1B234 /* PDFAnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C5E34F6B7192D400A1B235 /* PDFAnnotationTests.swift */; }; - C08FF8D030048DC5147729E9 /* ReaderOpenCloseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDF066BA12974E6CFBE519F /* ReaderOpenCloseTests.swift */; }; - DE1437A969DA1C5F0CBB047D /* Pods_ReadViewDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 792DF85CE4A3DD80D67843C7 /* Pods_ReadViewDemo.framework */; }; - FEDB5937CEB858CB06E38E2D /* SettingsPanelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201C2B482287866487EFAE66 /* SettingsPanelTests.swift */; }; 2B3C4D5E00000001AABBCC01 /* BookmarkChromeStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3C4D5E00000001AABBCC02 /* BookmarkChromeStateTests.swift */; }; 2B3C4D5E00000002AABBCC01 /* BookmarkManagementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3C4D5E00000002AABBCC02 /* BookmarkManagementTests.swift */; }; 2B3C4D5E00000003AABBCC01 /* ErrorAndEdgeCaseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3C4D5E00000003AABBCC02 /* ErrorAndEdgeCaseTests.swift */; }; @@ -44,6 +34,16 @@ 2B3C4D5E0000000AAABBCC01 /* SettingsEffectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3C4D5E0000000AAABBCC02 /* SettingsEffectTests.swift */; }; 2B3C4D5E0000000BAABBCC01 /* TOCInteractionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3C4D5E0000000BAABBCC02 /* TOCInteractionTests.swift */; }; 2B3C4D5E0000000CAABBCC01 /* ToolbarStateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B3C4D5E0000000CAABBCC02 /* ToolbarStateTests.swift */; }; + 369C9658D870DCAFC17EB7F7 /* SearchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE01DBDCB8D790832A4DE3F /* SearchTests.swift */; }; + 3BC5C96D7A0ACF35F2192CC7 /* XCUIApplication+Launch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74B4C44287820D68ED6570F8 /* XCUIApplication+Launch.swift */; }; + 4509ED928F228F43888E063D /* ReaderToolbarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BADF0A18AD034B74A482A4C1 /* ReaderToolbarTests.swift */; }; + 52A6A0C9941A4B5F9B88C6B0 /* ReaderAnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20BD15E5D8F04E7E9A239E14 /* ReaderAnnotationTests.swift */; }; + 63B2852E59996922386A3111 /* AccessibilityIdentifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00F495E17B90CCF1C7FE8C27 /* AccessibilityIdentifiers.swift */; }; + 9AAFB855EC7AC09D1E0B6742 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 697A5BCF0D93DBEC18E21A09 /* Foundation.framework */; }; + A1C5E34F6B7192D400A1B234 /* PDFAnnotationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C5E34F6B7192D400A1B235 /* PDFAnnotationTests.swift */; }; + C08FF8D030048DC5147729E9 /* ReaderOpenCloseTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDF066BA12974E6CFBE519F /* ReaderOpenCloseTests.swift */; }; + DE1437A969DA1C5F0CBB047D /* Pods_ReadViewDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 792DF85CE4A3DD80D67843C7 /* Pods_ReadViewDemo.framework */; }; + FEDB5937CEB858CB06E38E2D /* SettingsPanelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201C2B482287866487EFAE66 /* SettingsPanelTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -74,18 +74,6 @@ 1A2B3C4D00000032AABBCC01 /* PDFDrawingModeTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PDFDrawingModeTests.swift; sourceTree = ""; }; 201C2B482287866487EFAE66 /* SettingsPanelTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SettingsPanelTests.swift; sourceTree = ""; }; 20BD15E5D8F04E7E9A239E14 /* ReaderAnnotationTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReaderAnnotationTests.swift; sourceTree = ""; }; - 3A43AED288BFCA3ADBA97DD7 /* Pods-ReadViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReadViewDemo.release.xcconfig"; path = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig"; sourceTree = ""; }; - 423988C9F7F09A1B78D97CC1 /* Pods-ReadViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReadViewDemo.debug.xcconfig"; path = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig"; sourceTree = ""; }; - 697A5BCF0D93DBEC18E21A09 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 74B4C44287820D68ED6570F8 /* XCUIApplication+Launch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIApplication+Launch.swift"; sourceTree = ""; }; - 792DF85CE4A3DD80D67843C7 /* Pods_ReadViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ReadViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8FFD606A5A1CBDCC3CA87F1C /* ReadViewDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReadViewDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 9EDF066BA12974E6CFBE519F /* ReaderOpenCloseTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReaderOpenCloseTests.swift; sourceTree = ""; }; - A1C5E34F6B7192D400A1B235 /* PDFAnnotationTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PDFAnnotationTests.swift; sourceTree = ""; }; - BADF0A18AD034B74A482A4C1 /* ReaderToolbarTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReaderToolbarTests.swift; sourceTree = ""; }; - CFE01DBDCB8D790832A4DE3F /* SearchTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SearchTests.swift; sourceTree = ""; }; - DE070C1D2FBF0CC900ED065F /* ReadViewDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReadViewDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - FB49AFCCBC2BE04C82B8F286 /* DisplayTypeTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DisplayTypeTests.swift; sourceTree = ""; }; 2B3C4D5E00000001AABBCC02 /* BookmarkChromeStateTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BookmarkChromeStateTests.swift; sourceTree = ""; }; 2B3C4D5E00000002AABBCC02 /* BookmarkManagementTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BookmarkManagementTests.swift; sourceTree = ""; }; 2B3C4D5E00000003AABBCC02 /* ErrorAndEdgeCaseTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ErrorAndEdgeCaseTests.swift; sourceTree = ""; }; @@ -98,6 +86,18 @@ 2B3C4D5E0000000AAABBCC02 /* SettingsEffectTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SettingsEffectTests.swift; sourceTree = ""; }; 2B3C4D5E0000000BAABBCC02 /* TOCInteractionTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TOCInteractionTests.swift; sourceTree = ""; }; 2B3C4D5E0000000CAABBCC02 /* ToolbarStateTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ToolbarStateTests.swift; sourceTree = ""; }; + 3A43AED288BFCA3ADBA97DD7 /* Pods-ReadViewDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReadViewDemo.release.xcconfig"; path = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.release.xcconfig"; sourceTree = ""; }; + 423988C9F7F09A1B78D97CC1 /* Pods-ReadViewDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ReadViewDemo.debug.xcconfig"; path = "Target Support Files/Pods-ReadViewDemo/Pods-ReadViewDemo.debug.xcconfig"; sourceTree = ""; }; + 697A5BCF0D93DBEC18E21A09 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 74B4C44287820D68ED6570F8 /* XCUIApplication+Launch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "XCUIApplication+Launch.swift"; sourceTree = ""; }; + 792DF85CE4A3DD80D67843C7 /* Pods_ReadViewDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ReadViewDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8FFD606A5A1CBDCC3CA87F1C /* ReadViewDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReadViewDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 9EDF066BA12974E6CFBE519F /* ReaderOpenCloseTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReaderOpenCloseTests.swift; sourceTree = ""; }; + A1C5E34F6B7192D400A1B235 /* PDFAnnotationTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PDFAnnotationTests.swift; sourceTree = ""; }; + BADF0A18AD034B74A482A4C1 /* ReaderToolbarTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ReaderToolbarTests.swift; sourceTree = ""; }; + CFE01DBDCB8D790832A4DE3F /* SearchTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SearchTests.swift; sourceTree = ""; }; + DE070C1D2FBF0CC900ED065F /* ReadViewDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ReadViewDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FB49AFCCBC2BE04C82B8F286 /* DisplayTypeTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DisplayTypeTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ diff --git a/ReadViewDemo/ReadViewDemo/Info.plist b/ReadViewDemo/ReadViewDemo/Info.plist index dd3c9af..a685752 100644 --- a/ReadViewDemo/ReadViewDemo/Info.plist +++ b/ReadViewDemo/ReadViewDemo/Info.plist @@ -2,6 +2,10 @@ + UIBackgroundModes + + audio + UIApplicationSceneManifest UIApplicationSupportsMultipleScenes diff --git a/ReadViewDemo/ReadViewDemo/PDFDemoReaderViewController.swift b/ReadViewDemo/ReadViewDemo/PDFDemoReaderViewController.swift index 2124821..1097632 100644 --- a/ReadViewDemo/ReadViewDemo/PDFDemoReaderViewController.swift +++ b/ReadViewDemo/ReadViewDemo/PDFDemoReaderViewController.swift @@ -2,6 +2,8 @@ import UIKit import PDFKit import CryptoKit import RDPDFReaderView +import RDAIReaderView +import RDSpeechReaderView /// Demo 仅选择文字来源;正式宿主通常直接提供 PDF 解析结果或不提供以启用 OCR。 enum PDFDemoImageTextSource: String { @@ -151,6 +153,15 @@ private final class PDFDemoPageProvider: RDPDFReaderPageProvider, RDPDFReaderOut final class PDFDemoReaderViewController: UIViewController, RDPDFReaderViewControllerDelegate { private static let annotationStorageFolderName = "RDPDFImageReaderAnnotations" private let reader: RDPDFReaderViewController + private lazy var speechSession: RDPDFSpeechSession = { + let session = reader.makeSpeechSession() + session.onStateChange = { [weak self] state in + guard let self else { return } + self.speechControls.update(state: state, rate: self.speechSession.controller.configuration.rate) + } + return session + }() + private let speechControls = RDSpeechReaderControlView() private var navigationBarHiddenBeforeReader: Bool? private var display = "pagecurl" private var lastPageIndex = 0 @@ -213,6 +224,15 @@ final class PDFDemoReaderViewController: UIViewController, RDPDFReaderViewContro reader.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] view.addSubview(reader.view) reader.didMove(toParent: self) + configureSpeechControls() + let assistantButton = UIButton(type: .system) + assistantButton.setTitle("AI", for: .normal) + assistantButton.titleLabel?.font = .preferredFont(forTextStyle: .headline) + assistantButton.addTarget(self, action: #selector(presentAIAssistant), for: .touchUpInside) + assistantButton.accessibilityLabel = "打开阅读助手" + view.addSubview(assistantButton) + assistantButton.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([assistantButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 12), assistantButton.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor), assistantButton.widthAnchor.constraint(greaterThanOrEqualToConstant: 44), assistantButton.heightAnchor.constraint(equalToConstant: 44)]) stateLabel.translatesAutoresizingMaskIntoConstraints = false view.addSubview(stateLabel) NSLayoutConstraint.activate([stateLabel.widthAnchor.constraint(equalToConstant: 1), stateLabel.heightAnchor.constraint(equalToConstant: 1), stateLabel.topAnchor.constraint(equalTo: view.topAnchor), stateLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor)]) @@ -235,6 +255,14 @@ final class PDFDemoReaderViewController: UIViewController, RDPDFReaderViewContro display = type == .pageCurl ? "pagecurl" : (type == .verticalScroll ? "verticalscroll" : "horizontalscroll") updateState(page: 0) } + + @objc private func presentAIAssistant() { + if #available(iOS 26.0, *) { + present(reader.makeAIReaderAssistant(scope: reader.aiCurrentReadScope(), generativeProvider: RDAIAppleFoundationModelsProvider()), animated: true) + } else { + present(reader.makeAIReaderAssistant(), animated: true) + } + } func goToDemoPage(_ pageNumber: Int) { reader.goToPage(max(pageNumber - 1, 0)) } func pdfReaderViewControllerDidRequestClose(_ controller: RDPDFReaderViewController) { @@ -268,6 +296,57 @@ final class PDFDemoReaderViewController: UIViewController, RDPDFReaderViewContro stateLabel.text = state } + private func configureSpeechControls() { + speechControls.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(speechControls) + NSLayoutConstraint.activate([ + speechControls.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -16), + speechControls.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -18), + speechControls.heightAnchor.constraint(equalToConstant: 48) + ]) + speechControls.onTogglePlayback = { [weak self] in self?.toggleSpeechPlayback() } + speechControls.onPreviousSentence = { [weak self] in self?.speechSession.controller.skipToPreviousSentence() } + speechControls.onNextSentence = { [weak self] in self?.speechSession.controller.skipToNextSentence() } + speechControls.onStop = { [weak self] in self?.speechSession.stop() } + speechControls.onChangeRate = { [weak self] in self?.cycleSpeechRate() } + } + + private func toggleSpeechPlayback() { + switch speechSession.controller.state { + case .speaking: + speechSession.pause() + case .paused: + speechSession.resume() + case .preparing: + break + case .idle, .finished, .failed: + let pageIndex = max(lastPageIndex, 0) + Task { [weak self] in + guard let self else { return } + do { + try await self.speechSession.start(from: pageIndex) + } catch { + self.presentSpeechError(error) + } + } + } + } + + private func cycleSpeechRate() { + let rates: [Float] = [0.38, 0.48, 0.58, 0.68] + let currentRate = speechSession.controller.configuration.rate + let nextIndex = (rates.firstIndex(where: { abs($0 - currentRate) < 0.01 }).map { ($0 + 1) % rates.count }) ?? 0 + speechSession.controller.updateRate(rates[nextIndex]) + speechControls.update(state: speechSession.controller.state, rate: rates[nextIndex]) + } + + private func presentSpeechError(_ error: Error) { + guard presentedViewController == nil else { return } + let alert = UIAlertController(title: "无法开始朗读", message: error.localizedDescription, preferredStyle: .alert) + alert.addAction(.init(title: "知道了", style: .default)) + present(alert, animated: true) + } + private static func annotationStorageURL(for bookIdentifier: String, legacyBookURL: URL) -> URL { let root = annotationStorageRoot() let hash = SHA256.hash(data: bookIdentifier.data(using: .utf8) ?? Data()).map { String(format: "%02x", $0) }.joined() diff --git a/Sources/RDAIReaderView/Core/RDAIDiagnostics.swift b/Sources/RDAIReaderView/Core/RDAIDiagnostics.swift new file mode 100644 index 0000000..352d791 --- /dev/null +++ b/Sources/RDAIReaderView/Core/RDAIDiagnostics.swift @@ -0,0 +1,23 @@ +import Foundation + +public enum RDAIDiagnosticStage: String, Codable, Sendable { case indexing, retrieval, generation, storage } + +public struct RDAIDiagnosticEvent: Codable, Sendable { + public let documentHash: String + public let stage: RDAIDiagnosticStage + public let durationMilliseconds: Int + public let errorCode: String? + public let count: Int + public let createdAt: Date + public init(documentHash: String, stage: RDAIDiagnosticStage, durationMilliseconds: Int, errorCode: String? = nil, count: Int = 0, createdAt: Date = .init()) { self.documentHash = documentHash; self.stage = stage; self.durationMilliseconds = durationMilliseconds; self.errorCode = errorCode; self.count = count; self.createdAt = createdAt } +} + +public protocol RDAIDiagnosticsRecording: Sendable { func record(_ event: RDAIDiagnosticEvent) async } + +public actor RDAIInMemoryDiagnosticsRecorder: RDAIDiagnosticsRecording { + private var values: [RDAIDiagnosticEvent] = [] + public init() {} + public func record(_ event: RDAIDiagnosticEvent) { values.append(event) } + public func events() -> [RDAIDiagnosticEvent] { values } + public func removeAll() { values.removeAll() } +} diff --git a/Sources/RDAIReaderView/Core/RDAIIndexService.swift b/Sources/RDAIReaderView/Core/RDAIIndexService.swift new file mode 100644 index 0000000..4941bb0 --- /dev/null +++ b/Sources/RDAIReaderView/Core/RDAIIndexService.swift @@ -0,0 +1,528 @@ +import CryptoKit +import Foundation + +public struct RDAIIndexOptions: Sendable { + public var scope: RDAIReadScope + public var priorityResource: RDAIResourceIdentifier? + + public init(scope: RDAIReadScope, priorityResource: RDAIResourceIdentifier? = nil) { + self.scope = scope + self.priorityResource = priorityResource + } +} + +public enum RDAIIndexState: Equatable, Sendable { + case notStarted + case indexing(completedResources: Int, totalResources: Int) + case paused(completedResources: Int, totalResources: Int) + case ready + case failed(RDAIError) +} + +public struct RDAIRetrievalOptions: Sendable { + public var maximumResults: Int + public var scope: RDAIReadScope + public var minimumScore: Double + + public init(maximumResults: Int = 4, scope: RDAIReadScope, minimumScore: Double = 0.01) { + self.maximumResults = max(1, maximumResults) + self.scope = scope + self.minimumScore = min(max(minimumScore, 0), 1) + } +} + +public struct RDAIRetrievalMatch: Sendable, Identifiable { + public let id: String + public let passage: RDAIPassage + public let score: Double + public let lexicalScore: Double + public let semanticScore: Double? + + public init(passage: RDAIPassage, score: Double, lexicalScore: Double, semanticScore: Double? = nil) { + id = passage.id + self.passage = passage + self.score = score + self.lexicalScore = lexicalScore + self.semanticScore = semanticScore + } +} + +public enum RDAIContentHasher { + public static func hash(_ text: String) -> String { + SHA256.hash(data: Data(text.utf8)).map { String(format: "%02x", $0) }.joined() + } +} + +public actor RDAIInMemoryIndexStore { + private var resources: [RDAIDocumentIdentifier: [RDAIResourceDescriptor]] = [:] + private var passages: [RDAIDocumentIdentifier: [RDAIPassage]] = [:] + private var entities: [RDAIDocumentIdentifier: [RDAIEntityMention]] = [:] + + public init() {} + + public func replace( + document: RDAIDocumentDescriptor, + resource: RDAIResourceDescriptor, + analysis: RDAIAnalysisResult + ) { + var documentResources = resources[document.identifier] ?? [] + documentResources.removeAll { $0.identifier == resource.identifier } + documentResources.append(resource) + resources[document.identifier] = documentResources.sorted { $0.order < $1.order } + + var documentPassages = passages[document.identifier] ?? [] + documentPassages.removeAll { $0.resourceIdentifier == resource.identifier } + documentPassages.append(contentsOf: analysis.passages) + passages[document.identifier] = documentPassages + + var documentEntities = entities[document.identifier] ?? [] + documentEntities.removeAll { $0.locator.resourceIdentifier == resource.identifier } + documentEntities.append(contentsOf: analysis.entityMentions) + entities[document.identifier] = documentEntities + } + + public func passages(for documentIdentifier: RDAIDocumentIdentifier) -> [RDAIPassage] { + passages[documentIdentifier] ?? [] + } + + public func entities(for documentIdentifier: RDAIDocumentIdentifier) -> [RDAIEntityMention] { + entities[documentIdentifier] ?? [] + } + + public func resourceOrder( + for identifier: RDAIResourceIdentifier, + documentIdentifier: RDAIDocumentIdentifier + ) -> Int? { + resources[documentIdentifier]?.first { $0.identifier == identifier }?.order + } + + public func remove(documentIdentifier: RDAIDocumentIdentifier) { + resources.removeValue(forKey: documentIdentifier) + passages.removeValue(forKey: documentIdentifier) + entities.removeValue(forKey: documentIdentifier) + } +} + +/// First implementation of the local indexing pipeline. Storage is deliberately +/// injectable so a SQLite-backed store can replace it without changing adapters. +@MainActor +public final class RDAIReaderService { + public private(set) var state: RDAIIndexState = .notStarted { + didSet { stateContinuations.values.forEach { $0.yield(state) } } + } + + private let contentProvider: RDAIContentProvider + private let analyzer: any RDAIAnalyzing + private let store: RDAIInMemoryIndexStore + private let persistentStore: RDAISQLiteIndexStore? + private let generativeProvider: (any RDAIGenerativeProvider)? + private let semanticScorer: (any RDAISemanticScoring)? + private let configuration: RDAIReaderConfiguration + private let diagnostics: (any RDAIDiagnosticsRecording)? + private var stateContinuations: [UUID: AsyncStream.Continuation] = [:] + private var pauseRequested = false + private var resumeContinuation: CheckedContinuation? + + public init( + contentProvider: RDAIContentProvider, + analyzer: some RDAIAnalyzing, + semanticScorer: (any RDAISemanticScoring)? = nil, + store: RDAIInMemoryIndexStore = .init(), + persistentStore: RDAISQLiteIndexStore? = nil, + generativeProvider: (any RDAIGenerativeProvider)? = nil, + configuration: RDAIReaderConfiguration = .default, + diagnostics: (any RDAIDiagnosticsRecording)? = nil + ) { + self.contentProvider = contentProvider + self.analyzer = analyzer + self.semanticScorer = semanticScorer + self.store = store + self.persistentStore = persistentStore + self.generativeProvider = generativeProvider + self.configuration = configuration + self.diagnostics = diagnostics + } + + public func stateUpdates() -> AsyncStream { + let identifier = UUID() + return AsyncStream { [weak self] continuation in + guard let self else { + continuation.finish() + return + } + continuation.yield(self.state) + self.stateContinuations[identifier] = continuation + continuation.onTermination = { [weak self] _ in + Task { @MainActor in self?.stateContinuations.removeValue(forKey: identifier) } + } + } + } + + public func prepareIndex(options: RDAIIndexOptions) async throws { + guard configuration.isAIEnabled else { throw RDAIError.disabled } + let startedAt = Date() + let document = contentProvider.aiDocumentDescriptor() + var resources = try await contentProvider.aiResources().sorted { $0.order < $1.order } + resources = prioritized(resources, preferred: options.priorityResource) + let scopedResources = try await resourcesAllowed(by: options.scope, document: document, resources: resources) + state = .indexing(completedResources: 0, totalResources: scopedResources.count) + + do { + for (index, resource) in scopedResources.enumerated() { + try Task.checkCancellation() + await waitIfPaused(completed: index, total: scopedResources.count) + try Task.checkCancellation() + let sourceSnapshot = try await contentProvider.aiResourceSnapshot(for: resource.identifier) + let snapshot = limited(sourceSnapshot, by: options.scope) + guard !snapshot.sourceText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { + state = .indexing(completedResources: index + 1, totalResources: scopedResources.count) + continue + } + if let persistentStore, + try await persistentStore.resourceHash(documentID: document.identifier, resourceID: resource.identifier) == snapshot.sourceHash { + try await persistentStore.saveCheckpoint(documentID: document.identifier, resourceOrder: resource.order) + state = .indexing(completedResources: index + 1, totalResources: scopedResources.count) + continue + } + let analysis = await analyzer.analyze(document: document, snapshot: snapshot) + if let persistentStore { + try await persistentStore.replace(document: document, resource: resource, analysis: analysis, sourceHash: snapshot.sourceHash) + try await persistentStore.saveCheckpoint(documentID: document.identifier, resourceOrder: resource.order) + } else { + await store.replace(document: document, resource: resource, analysis: analysis) + } + state = .indexing(completedResources: index + 1, totalResources: scopedResources.count) + } + state = .ready + await record(stage: .indexing, startedAt: startedAt, count: scopedResources.count) + } catch is CancellationError { + state = .notStarted + throw RDAIError.cancelled + } catch let error as RDAIError { + state = .failed(error) + await record(stage: .indexing, startedAt: startedAt, errorCode: "rdai-error") + throw error + } catch { + // Public errors must not expose paths, OCR text or SQLite details. + let wrapped = RDAIError.indexingFailed("unexpected") + state = .failed(wrapped) + await record(stage: .indexing, startedAt: startedAt, errorCode: "indexing-failed") + throw wrapped + } + } + + public func retrieve(query: String, options: RDAIRetrievalOptions) async -> [RDAIRetrievalMatch] { + let document = contentProvider.aiDocumentDescriptor() + let allPassages = await storedPassages(for: document.identifier) + let filtered = await filter(allPassages, scope: options.scope, documentIdentifier: document.identifier) + var matches: [RDAIRetrievalMatch] = [] + for passage in filtered { + let score = lexicalScore(query: query, text: passage.text) + let semantic = await semanticScorer?.score(query: query, text: passage.text, languageCode: passage.languageCode) + let finalScore = semantic.map { 0.6 * score + 0.4 * $0 } ?? score + guard finalScore >= options.minimumScore else { continue } + matches.append(RDAIRetrievalMatch(passage: passage, score: finalScore, lexicalScore: score, semanticScore: semantic)) + } + return matches.sorted { + if $0.score == $1.score { return $0.passage.order < $1.passage.order } + return $0.score > $1.score + } + .prefix(options.maximumResults) + .map { $0 } + } + + public func removeIndex() async { + if let persistentStore { try? await persistentStore.remove(documentID: contentProvider.aiDocumentDescriptor().identifier) } + else { await store.remove(documentIdentifier: contentProvider.aiDocumentDescriptor().identifier) } + state = .notStarted + } + + public func pauseIndexing() { + pauseRequested = true + } + + public func resumeIndexing() { + pauseRequested = false + resumeContinuation?.resume() + resumeContinuation = nil + } + + public func removeAllAIData() async { + if let persistentStore { try? await persistentStore.removeAll() } + else { await store.remove(documentIdentifier: contentProvider.aiDocumentDescriptor().identifier) } + state = .notStarted + } + + public func storageBytes() async -> Int64 { + await persistentStore?.storageBytes() ?? 0 + } + + public func showCitation(_ citation: RDAICitation) async throws { + try await contentProvider.aiShowCitationHighlight(citation) + } + + public func clearCitationHighlight() { + contentProvider.aiClearCitationHighlight() + } + + public func availability(for capability: RDAICapability, locale: Locale = .current) async -> RDAICapabilityAvailability { + guard configuration.isAIEnabled else { return .unavailable(reason: .providerNotInstalled) } + switch capability { + case .languageAnalysis, .entityExtraction, .lexicalSearch: return .available + case .semanticSearch: + return semanticScorer == nil ? .degraded(reason: .embeddingAssetsUnavailable) : .available + case .summarization, .questionAnswering, .characterRelationships: + guard let generativeProvider else { return .degraded(reason: .providerNotInstalled) } + return await generativeProvider.availability(for: capability, locale: locale) + } + } + + public func summarize(scope: RDAIReadScope, length: RDAISummaryLength) async throws -> RDAISummary { + guard configuration.isAIEnabled else { throw RDAIError.disabled } + let document = contentProvider.aiDocumentDescriptor() + let cacheKey = artifactKey(document: document, scope: scope, suffix: "summary|\(length.rawValue)") + if configuration.storesGeneratedArtifacts, + let persistentStore, + let data = try? await persistentStore.artifact(documentID: document.identifier, key: cacheKey), + let cached = try? JSONDecoder().decode(RDAISummary.self, from: data) { return cached } + let passages = try await passages(for: scope, limit: length == .brief ? 2 : (length == .standard ? 4 : 6)) + let metadata = generationMetadata(provider: generativeProvider?.identifier ?? "extractive") + if let generativeProvider, + case .available = await generativeProvider.availability(for: .summarization, locale: .current), + case let .summary(overview, statements) = try await generativeProvider.generate(.init(task: .summary(length), passages: passages, scope: scope)) { + let validated = validatedStatements(statements, passages: passages) + guard !validated.isEmpty else { throw RDAIError.insufficientEvidence } + let result = RDAISummary(title: document.title, overview: overview, keyPoints: validated, citations: citations(for: passages), metadata: metadata) + try? await saveArtifact(result, document: document, key: cacheKey) + return result + } + let statements = passages.map { RDAISourcedStatement(text: $0.text, citationIdentifiers: [$0.id]) } + let result = RDAISummary(title: document.title, overview: passages.first?.text ?? "暂无可总结的已读内容。", keyPoints: statements, citations: citations(for: passages), metadata: metadata) + try? await saveArtifact(result, document: document, key: cacheKey) + return result + } + + public func answer(question: String, scope: RDAIReadScope) async throws -> RDAIAnswer { + guard configuration.isAIEnabled else { throw RDAIError.disabled } + let document = contentProvider.aiDocumentDescriptor() + let cacheKey = artifactKey(document: document, scope: scope, suffix: "answer|\(RDAIContentHasher.hash(question))") + if configuration.storesGeneratedArtifacts, + let persistentStore, + let data = try? await persistentStore.artifact(documentID: document.identifier, key: cacheKey), + let cached = try? JSONDecoder().decode(RDAIAnswer.self, from: data) { return cached } + let matches = await retrieve(query: question, options: .init(maximumResults: configuration.maximumRetrievedPassages, scope: scope)) + let passages = matches.map(\.passage) + let metadata = generationMetadata(provider: generativeProvider?.identifier ?? "extractive") + guard !passages.isEmpty else { return RDAIAnswer(status: .insufficientEvidence, text: "在当前阅读范围内未找到足够证据。", statements: [], citations: [], metadata: metadata) } + if let generativeProvider, + case .available = await generativeProvider.availability(for: .questionAnswering, locale: .current), + case let .answer(text, statements) = try await generativeProvider.generate(.init(task: .answer, userText: question, passages: passages, scope: scope)) { + let validated = validatedStatements(statements, passages: passages) + guard !validated.isEmpty else { return RDAIAnswer(status: .insufficientEvidence, text: "模型结果缺少可验证的原文证据。", statements: [], citations: [], metadata: metadata) } + let result = RDAIAnswer(status: .answered, text: text, statements: validated, citations: citations(for: passages), metadata: metadata) + try? await saveArtifact(result, document: document, key: cacheKey) + return result + } + let statements = passages.map { RDAISourcedStatement(text: $0.text, citationIdentifiers: [$0.id]) } + let result = RDAIAnswer(status: .answered, text: "以下内容与问题最相关:", statements: statements, citations: citations(for: passages), metadata: metadata) + try? await saveArtifact(result, document: document, key: cacheKey) + return result + } + + public func characters(scope: RDAIReadScope) async -> [RDAICharacter] { + let document = contentProvider.aiDocumentDescriptor() + let mentions = (await storedEntities(for: document.identifier)).filter { $0.kind == .person } + let grouped = Dictionary(grouping: mentions, by: { canonicalCharacterName($0.normalizedName) }) + return grouped.compactMap { (name, values) -> RDAICharacter? in + guard let first = values.first else { return nil } + let evidence = values.prefix(3).map { mention in + RDAICitation(passageIdentifier: mention.id, quote: mention.surfaceText, locator: mention.locator) + } + return RDAICharacter(id: RDAIContentHasher.hash(name), displayName: first.surfaceText, aliases: Array(Set(values.map(\.surfaceText))).sorted(), description: "在已读内容中出现 \(values.count) 次。", firstAppearance: evidence.first, evidence: evidence) + }.sorted { $0.displayName < $1.displayName } + } + + /// Conservative local relationship extraction: entities must co-occur in + /// one allowed passage. It never promotes co-occurrence to a fact. + public func relationships(scope: RDAIReadScope) async -> [RDAIRelationship] { + let document = contentProvider.aiDocumentDescriptor() + let passages = await filter(await storedPassages(for: document.identifier), scope: scope, documentIdentifier: document.identifier) + let mentions = (await storedEntities(for: document.identifier)).filter { $0.kind == .person } + var evidenceByPair: [String: [RDAICitation]] = [:] + for passage in passages { + let names = Array(Set(mentions.filter { + $0.locator.resourceIdentifier == passage.resourceIdentifier && $0.locator.textRange.intersects(passage.locator.textRange) + }.map { canonicalCharacterName($0.normalizedName) })).sorted() + guard names.count > 1 else { continue } + for left in names.indices { + for right in names.indices where right > left { + let key = "\(names[left])|\(names[right])" + evidenceByPair[key, default: []].append(citation(for: passage)) + } + } + } + return evidenceByPair.compactMap { key, evidence in + let names = key.split(separator: "|", maxSplits: 1).map(String.init) + guard names.count == 2, !evidence.isEmpty else { return nil } + return RDAIRelationship(id: RDAIContentHasher.hash(key), sourceCharacterIdentifier: RDAIContentHasher.hash(names[0]), targetCharacterIdentifier: RDAIContentHasher.hash(names[1]), label: "共同出现", status: .possible, evidence: Array(evidence.prefix(3))) + }.sorted { $0.id < $1.id } + } + + private func passages(for scope: RDAIReadScope, limit: Int) async throws -> [RDAIPassage] { + let document = contentProvider.aiDocumentDescriptor() + let stored = await storedPassages(for: document.identifier) + let all = await filter(stored, scope: scope, documentIdentifier: document.identifier) + guard !all.isEmpty else { throw RDAIError.insufficientEvidence } + return Array(all.sorted { $0.order < $1.order }.prefix(limit)) + } + + private func citations(for passages: [RDAIPassage]) -> [RDAICitation] { passages.map(citation(for:)) } + private func citation(for passage: RDAIPassage) -> RDAICitation { RDAICitation(passageIdentifier: passage.id, quote: passage.text, locator: passage.locator) } + private func validatedStatements(_ statements: [RDAISourcedStatement], passages: [RDAIPassage]) -> [RDAISourcedStatement] { + let identifiers = Set(passages.map(\.id)) + return statements.compactMap { statement in + let citations = statement.citationIdentifiers.filter { identifiers.contains($0) } + guard !citations.isEmpty, !statement.text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return nil } + return RDAISourcedStatement(id: statement.id, text: statement.text, citationIdentifiers: citations) + } + } + private func canonicalCharacterName(_ value: String) -> String { + let compact = value.unicodeScalars.filter { CharacterSet.alphanumerics.contains($0) || (0x4E00...0x9FFF).contains($0.value) } + var name = String(String.UnicodeScalarView(compact)).lowercased() + // Only remove explicit honorific suffixes; ambiguous aliases remain + // distinct so the UI does not silently merge two people. + for suffix in ["先生", "女士", "小姐", "老师", "教授", "博士", "将军"] where name.hasSuffix(suffix) && name.count > suffix.count { + name.removeLast(suffix.count) + break + } + return name + } + private func generationMetadata(provider: String) -> RDAIGenerationMetadata { .init(providerIdentifier: provider, promptIdentifier: "rdai.evidence.v1", promptVersion: 1, scopeHash: RDAIContentHasher.hash(contentProvider.aiDocumentDescriptor().identifier.rawValue)) } + private func artifactKey(document: RDAIDocumentDescriptor, scope: RDAIReadScope, suffix: String) -> String { + let scopeData = (try? JSONEncoder().encode(scope)).map { String(data: $0, encoding: .utf8) } ?? "" + return RDAIContentHasher.hash("\(document.contentRevision)|\(scopeData)|rdai.evidence.v1|\(generativeProvider?.identifier ?? "extractive")|\(suffix)") + } + private func saveArtifact(_ value: T, document: RDAIDocumentDescriptor, key: String) async throws { + guard configuration.storesGeneratedArtifacts, let persistentStore else { return } + try await persistentStore.saveArtifact(documentID: document.identifier, key: key, payload: JSONEncoder().encode(value)) + } + private func record(stage: RDAIDiagnosticStage, startedAt: Date, errorCode: String? = nil, count: Int = 0) async { + guard configuration.diagnosticsLevel != .disabled, let diagnostics else { return } + await diagnostics.record(.init(documentHash: RDAIContentHasher.hash(contentProvider.aiDocumentDescriptor().identifier.rawValue), stage: stage, durationMilliseconds: Int(Date().timeIntervalSince(startedAt) * 1_000), errorCode: errorCode, count: count)) + } + + private func prioritized( + _ resources: [RDAIResourceDescriptor], + preferred: RDAIResourceIdentifier? + ) -> [RDAIResourceDescriptor] { + guard let preferred else { return resources } + return resources.sorted { lhs, rhs in + if lhs.identifier == preferred { return true } + if rhs.identifier == preferred { return false } + return lhs.order < rhs.order + } + } + + private func waitIfPaused(completed: Int, total: Int) async { + guard pauseRequested else { return } + state = .paused(completedResources: completed, totalResources: total) + await withTaskCancellationHandler(operation: { + await withCheckedContinuation { continuation in + resumeContinuation = continuation + } + }, onCancel: { [weak self] in + Task { @MainActor in self?.resumeIndexing() } + }) + state = .indexing(completedResources: completed, totalResources: total) + } + + private func resourcesAllowed( + by scope: RDAIReadScope, + document: RDAIDocumentDescriptor, + resources: [RDAIResourceDescriptor] + ) async throws -> [RDAIResourceDescriptor] { + guard !scope.includesWholeDocument else { return resources } + guard let upperBound = scope.upperBound, + upperBound.documentIdentifier == document.identifier, + let boundary = resources.first(where: { $0.identifier == upperBound.resourceIdentifier }) else { + return [] + } + return resources.filter { $0.order <= boundary.order } + } + + private func limited(_ snapshot: RDAIResourceSnapshot, by scope: RDAIReadScope) -> RDAIResourceSnapshot { + guard !scope.includesWholeDocument, + let upperBound = scope.upperBound, + upperBound.resourceIdentifier == snapshot.descriptor.identifier else { + return snapshot + } + let length = min(max(upperBound.textRange.upperBound, 0), snapshot.sourceText.utf16.count) + let source = (snapshot.sourceText as NSString).substring(to: length) + let availableRange = RDAITextRange(location: 0, length: length) + let runs = snapshot.locatorRuns.filter { $0.textRange.intersects(availableRange) } + return RDAIResourceSnapshot( + descriptor: snapshot.descriptor, + sourceText: source, + sourceHash: RDAIContentHasher.hash(source), + locatorRuns: runs + ) + } + + private func filter( + _ passages: [RDAIPassage], + scope: RDAIReadScope, + documentIdentifier: RDAIDocumentIdentifier + ) async -> [RDAIPassage] { + guard !scope.includesWholeDocument else { return passages } + guard let upperBound = scope.upperBound, + upperBound.documentIdentifier == documentIdentifier, + let boundaryOrder = await resourceOrder(for: upperBound.resourceIdentifier, documentIdentifier: documentIdentifier) else { + return [] + } + return await withTaskGroup(of: (RDAIPassage, Int?).self) { group in + for passage in passages { + group.addTask { [store] in + let order = await self.resourceOrder(for: passage.resourceIdentifier, documentIdentifier: documentIdentifier) + return (passage, order) + } + } + var allowed: [RDAIPassage] = [] + for await (passage, order) in group { + guard let order, order <= boundaryOrder else { continue } + if passage.resourceIdentifier == upperBound.resourceIdentifier, + passage.locator.textRange.location >= upperBound.textRange.upperBound { + continue + } + allowed.append(passage) + } + return allowed + } + } + + private func resourceOrder(for identifier: RDAIResourceIdentifier, documentIdentifier: RDAIDocumentIdentifier) async -> Int? { + if let persistentStore { return try? await persistentStore.resourceOrder(documentID: documentIdentifier, resourceID: identifier) } + return await store.resourceOrder(for: identifier, documentIdentifier: documentIdentifier) + } + + private func storedPassages(for identifier: RDAIDocumentIdentifier) async -> [RDAIPassage] { + if let persistentStore { return (try? await persistentStore.passages(documentID: identifier)) ?? [] } + return await store.passages(for: identifier) + } + + private func storedEntities(for identifier: RDAIDocumentIdentifier) async -> [RDAIEntityMention] { + if let persistentStore { return (try? await persistentStore.entities(documentID: identifier)) ?? [] } + return await store.entities(for: identifier) + } + + private func lexicalScore(query: String, text: String) -> Double { + let trimmed = query.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return 0 } + let normalizedText = text.folding(options: [.caseInsensitive, .diacriticInsensitive], locale: .current) + let normalizedQuery = trimmed.folding(options: [.caseInsensitive, .diacriticInsensitive], locale: .current) + if normalizedText.localizedCaseInsensitiveContains(normalizedQuery) { return 1 } + let terms = normalizedQuery.split(whereSeparator: { $0.isWhitespace || $0.isNewline }).map(String.init) + guard !terms.isEmpty else { return 0 } + let matches = terms.filter { normalizedText.localizedCaseInsensitiveContains($0) }.count + return Double(matches) / Double(terms.count) + } +} diff --git a/Sources/RDAIReaderView/Core/RDAILocatorBuilder.swift b/Sources/RDAIReaderView/Core/RDAILocatorBuilder.swift new file mode 100644 index 0000000..a9024f1 --- /dev/null +++ b/Sources/RDAIReaderView/Core/RDAILocatorBuilder.swift @@ -0,0 +1,44 @@ +import Foundation + +enum RDAILocatorBuilder { + static func makeLocator( + document: RDAIDocumentDescriptor, + snapshot: RDAIResourceSnapshot, + range: RDAITextRange + ) -> RDAILocator? { + let matchingRuns = snapshot.locatorRuns.filter { $0.textRange.intersects(range) } + guard let first = matchingRuns.first else { return nil } + let anchor = mergedAnchor(matchingRuns) ?? first.anchor + return RDAILocator( + documentIdentifier: document.identifier, + resourceIdentifier: snapshot.descriptor.identifier, + textRange: range, + anchor: anchor, + sourceHash: snapshot.sourceHash + ) + } + + private static func mergedAnchor(_ runs: [RDAILocatorRun]) -> RDAIAnchor? { + guard !runs.isEmpty else { return nil } + let anchors = runs.compactMap { run -> RDAIPDFAnchor? in + if case .pdf(let anchor) = run.anchor { return anchor } + return nil + } + guard anchors.count == runs.count, + let first = anchors.first, + anchors.allSatisfy({ $0.pageIndex == first.pageIndex && $0.textSource == first.textSource }) else { + return nil + } + var rects: [RDAINormalizedRect] = [] + for rect in anchors.flatMap(\.rects) where !rects.contains(rect) { + rects.append(rect) + } + let readingOrder = anchors.compactMap(\.readingOrder).min() + return .pdf(RDAIPDFAnchor( + pageIndex: first.pageIndex, + rects: rects, + textSource: first.textSource, + readingOrder: readingOrder + )) + } +} diff --git a/Sources/RDAIReaderView/Core/RDAIReaderContracts.swift b/Sources/RDAIReaderView/Core/RDAIReaderContracts.swift new file mode 100644 index 0000000..d374c13 --- /dev/null +++ b/Sources/RDAIReaderView/Core/RDAIReaderContracts.swift @@ -0,0 +1,448 @@ +import Foundation + +public struct RDAIDocumentIdentifier: RawRepresentable, Codable, Hashable, Sendable { + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} + +public struct RDAIResourceIdentifier: RawRepresentable, Codable, Hashable, Sendable { + public let rawValue: String + + public init(rawValue: String) { + self.rawValue = rawValue + } +} + +/// UTF-16 offsets are shared by PDF text runs, EPUB search and speech progress. +public struct RDAITextRange: Codable, Hashable, Sendable { + public var location: Int + public var length: Int + + public init(location: Int, length: Int) { + self.location = max(0, location) + self.length = max(0, length) + } + + public var upperBound: Int { location + length } + + public func intersects(_ other: RDAITextRange) -> Bool { + location < other.upperBound && other.location < upperBound + } +} + +public struct RDAINormalizedRect: Codable, Hashable, Sendable { + public var x: Double + public var y: Double + public var width: Double + public var height: Double + + public init(x: Double, y: Double, width: Double, height: Double) { + self.x = min(max(x, 0), 1) + self.y = min(max(y, 0), 1) + self.width = min(max(width, 0), 1) + self.height = min(max(height, 0), 1) + } +} + +public struct RDAIPDFAnchor: Codable, Hashable, Sendable { + public enum TextSource: String, Codable, Sendable { + case native + case ocr + } + + public var pageIndex: Int + public var rects: [RDAINormalizedRect] + public var textSource: TextSource + public var readingOrder: Int? + + public init(pageIndex: Int, rects: [RDAINormalizedRect], textSource: TextSource, readingOrder: Int? = nil) { + self.pageIndex = max(0, pageIndex) + self.rects = rects + self.textSource = textSource + self.readingOrder = readingOrder + } +} + +public struct RDAIEPUBAnchor: Codable, Hashable, Sendable { + public var href: String + public var cfi: String? + public var rangeCFI: String? + public var progression: Double? + + public init(href: String, cfi: String? = nil, rangeCFI: String? = nil, progression: Double? = nil) { + self.href = href + self.cfi = cfi + self.rangeCFI = rangeCFI + self.progression = progression.map { min(max($0, 0), 1) } + } +} + +public enum RDAIAnchor: Hashable, Sendable { + case pdf(RDAIPDFAnchor) + case epub(RDAIEPUBAnchor) +} + +extension RDAIAnchor: Codable { + private enum CodingKeys: String, CodingKey { case type, pdf, epub } + private enum Kind: String, Codable { case pdf, epub } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + switch try container.decode(Kind.self, forKey: .type) { + case .pdf: + self = .pdf(try container.decode(RDAIPDFAnchor.self, forKey: .pdf)) + case .epub: + self = .epub(try container.decode(RDAIEPUBAnchor.self, forKey: .epub)) + } + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + switch self { + case .pdf(let anchor): + try container.encode(Kind.pdf, forKey: .type) + try container.encode(anchor, forKey: .pdf) + case .epub(let anchor): + try container.encode(Kind.epub, forKey: .type) + try container.encode(anchor, forKey: .epub) + } + } +} + +public struct RDAILocator: Codable, Hashable, Sendable { + public var documentIdentifier: RDAIDocumentIdentifier + public var resourceIdentifier: RDAIResourceIdentifier + public var textRange: RDAITextRange + public var anchor: RDAIAnchor + public var sourceHash: String + + public init( + documentIdentifier: RDAIDocumentIdentifier, + resourceIdentifier: RDAIResourceIdentifier, + textRange: RDAITextRange, + anchor: RDAIAnchor, + sourceHash: String + ) { + self.documentIdentifier = documentIdentifier + self.resourceIdentifier = resourceIdentifier + self.textRange = textRange + self.anchor = anchor + self.sourceHash = sourceHash + } +} + +public struct RDAICitation: Codable, Hashable, Sendable, Identifiable { + public let id: String + public let passageIdentifier: String + public let quote: String + public let locator: RDAILocator + + public init(id: String = UUID().uuidString, passageIdentifier: String, quote: String, locator: RDAILocator) { + self.id = id + self.passageIdentifier = passageIdentifier + self.quote = quote + self.locator = locator + } +} + +public enum RDAIDocumentFormat: String, Codable, Sendable { + case pdf + case epub +} + +public struct RDAIDocumentDescriptor: Codable, Equatable, Sendable { + public let identifier: RDAIDocumentIdentifier + public let title: String + public let format: RDAIDocumentFormat + public let contentRevision: String + + public init(identifier: RDAIDocumentIdentifier, title: String, format: RDAIDocumentFormat, contentRevision: String) { + self.identifier = identifier + self.title = title + self.format = format + self.contentRevision = contentRevision + } +} + +public struct RDAIResourceDescriptor: Codable, Equatable, Sendable { + public let identifier: RDAIResourceIdentifier + public let title: String? + public let order: Int + public let estimatedUTF16Length: Int? + + public init(identifier: RDAIResourceIdentifier, title: String? = nil, order: Int, estimatedUTF16Length: Int? = nil) { + self.identifier = identifier + self.title = title + self.order = max(0, order) + self.estimatedUTF16Length = estimatedUTF16Length + } +} + +public struct RDAILocatorRun: Sendable { + public let textRange: RDAITextRange + public let anchor: RDAIAnchor + + public init(textRange: RDAITextRange, anchor: RDAIAnchor) { + self.textRange = textRange + self.anchor = anchor + } +} + +public struct RDAIResourceSnapshot: Sendable { + public let descriptor: RDAIResourceDescriptor + public let sourceText: String + public let sourceHash: String + public let locatorRuns: [RDAILocatorRun] + + public init(descriptor: RDAIResourceDescriptor, sourceText: String, sourceHash: String, locatorRuns: [RDAILocatorRun]) { + self.descriptor = descriptor + self.sourceText = sourceText + self.sourceHash = sourceHash + self.locatorRuns = locatorRuns + } +} + +@MainActor +public protocol RDAIContentProvider: AnyObject { + func aiDocumentDescriptor() -> RDAIDocumentDescriptor + func aiResources() async throws -> [RDAIResourceDescriptor] + func aiResourceSnapshot(for identifier: RDAIResourceIdentifier) async throws -> RDAIResourceSnapshot + func aiNavigate(to locator: RDAILocator, animated: Bool) async throws + func aiShowCitationHighlight(_ citation: RDAICitation) async throws + func aiClearCitationHighlight() +} + +public struct RDAIReadScope: Codable, Equatable, Sendable { + public let upperBound: RDAILocator? + public let includesWholeDocument: Bool + + public init(upperBound: RDAILocator? = nil, includesWholeDocument: Bool = false) { + self.upperBound = upperBound + self.includesWholeDocument = includesWholeDocument + } + + public static let wholeDocument = RDAIReadScope(includesWholeDocument: true) +} + +@MainActor +public protocol RDAIReadScopeProviding: AnyObject { + func aiCurrentReadScope() -> RDAIReadScope +} + +public enum RDAIPassageKind: String, Codable, Sendable { + case paragraph + case unknown +} + +public struct RDAIPassage: Codable, Equatable, Sendable, Identifiable { + public let id: String + public let documentIdentifier: RDAIDocumentIdentifier + public let resourceIdentifier: RDAIResourceIdentifier + public let text: String + public let languageCode: String? + public let kind: RDAIPassageKind + public let locator: RDAILocator + public let contentHash: String + public let order: Int + + public init( + id: String, + documentIdentifier: RDAIDocumentIdentifier, + resourceIdentifier: RDAIResourceIdentifier, + text: String, + languageCode: String?, + kind: RDAIPassageKind = .paragraph, + locator: RDAILocator, + contentHash: String, + order: Int + ) { + self.id = id + self.documentIdentifier = documentIdentifier + self.resourceIdentifier = resourceIdentifier + self.text = text + self.languageCode = languageCode + self.kind = kind + self.locator = locator + self.contentHash = contentHash + self.order = order + } +} + +public enum RDAIEntityKind: String, Codable, Sendable { + case person + case place + case organization + case other +} + +public struct RDAIEntityMention: Codable, Equatable, Sendable, Identifiable { + public let id: String + public let normalizedName: String + public let surfaceText: String + public let kind: RDAIEntityKind + public let confidence: Double + public let locator: RDAILocator + + public init(id: String, normalizedName: String, surfaceText: String, kind: RDAIEntityKind, confidence: Double, locator: RDAILocator) { + self.id = id + self.normalizedName = normalizedName + self.surfaceText = surfaceText + self.kind = kind + self.confidence = min(max(confidence, 0), 1) + self.locator = locator + } +} + +public struct RDAIAnalysisResult: Sendable { + public let passages: [RDAIPassage] + public let entityMentions: [RDAIEntityMention] + + public init(passages: [RDAIPassage], entityMentions: [RDAIEntityMention]) { + self.passages = passages + self.entityMentions = entityMentions + } +} + +public protocol RDAIAnalyzing: Sendable { + func analyze(document: RDAIDocumentDescriptor, snapshot: RDAIResourceSnapshot) async -> RDAIAnalysisResult +} + +public protocol RDAISemanticScoring: Sendable { + func score(query: String, text: String, languageCode: String?) async -> Double? +} + +public enum RDAIError: Error, Equatable, Sendable { + case disabled + case invalidDocument + case resourceUnavailable(RDAIResourceIdentifier) + case staleCitation + case indexingFailed(String) + case modelUnavailable(RDAIUnavailableReason) + case insufficientEvidence + case storageFailure(String) + case cancelled +} + +public enum RDAICapability: String, Codable, Sendable { + case languageAnalysis, entityExtraction, lexicalSearch, semanticSearch + case summarization, questionAnswering, characterRelationships +} + +public enum RDAIUnavailableReason: Equatable, Sendable { + case operatingSystemUnsupported, deviceNotEligible, appleIntelligenceNotEnabled + case modelNotReady, languageUnsupported(String?), embeddingAssetsUnavailable + case providerNotInstalled, unknown(String) +} + +public enum RDAICapabilityAvailability: Equatable, Sendable { + case available + case degraded(reason: RDAIUnavailableReason) + case unavailable(reason: RDAIUnavailableReason) +} + +public protocol RDAICapabilityProviding: Sendable { + func availability(for capability: RDAICapability, locale: Locale?) async -> RDAICapabilityAvailability +} + +public enum RDAISummaryLength: String, Codable, Sendable { case brief, standard, detailed } +public enum RDAIAnswerStatus: String, Codable, Sendable { case answered, insufficientEvidence, unsupportedLanguage, unavailable } +public enum RDAIRelationshipStatus: String, Codable, Sendable { case confirmed, possible, conflicting } + +public struct RDAIGenerationMetadata: Codable, Sendable { + public let providerIdentifier: String + public let modelVersion: String? + public let promptIdentifier: String + public let promptVersion: Int + public let generatedAt: Date + public let scopeHash: String + + public init(providerIdentifier: String, modelVersion: String? = nil, promptIdentifier: String, promptVersion: Int, generatedAt: Date = .init(), scopeHash: String) { + self.providerIdentifier = providerIdentifier + self.modelVersion = modelVersion + self.promptIdentifier = promptIdentifier + self.promptVersion = promptVersion + self.generatedAt = generatedAt + self.scopeHash = scopeHash + } +} + +public struct RDAISourcedStatement: Codable, Sendable, Identifiable { + public let id: String + public let text: String + public let citationIdentifiers: [String] + public init(id: String = UUID().uuidString, text: String, citationIdentifiers: [String]) { self.id = id; self.text = text; self.citationIdentifiers = citationIdentifiers } +} + +public struct RDAISummary: Codable, Sendable { + public let title: String + public let overview: String + public let keyPoints: [RDAISourcedStatement] + public let citations: [RDAICitation] + public let metadata: RDAIGenerationMetadata +} + +public struct RDAIAnswer: Codable, Sendable { + public let status: RDAIAnswerStatus + public let text: String + public let statements: [RDAISourcedStatement] + public let citations: [RDAICitation] + public let metadata: RDAIGenerationMetadata +} + +public struct RDAICharacter: Codable, Sendable, Identifiable { + public let id: String + public let displayName: String + public let aliases: [String] + public let description: String + public let firstAppearance: RDAICitation? + public let evidence: [RDAICitation] +} + +public struct RDAIRelationship: Codable, Sendable, Identifiable { + public let id: String + public let sourceCharacterIdentifier: String + public let targetCharacterIdentifier: String + public let label: String + public let status: RDAIRelationshipStatus + public let evidence: [RDAICitation] +} + +public enum RDAIGenerationTask: Sendable { case summary(RDAISummaryLength), answer, characters, relationships } + +public struct RDAIGenerationRequest: Sendable { + public let task: RDAIGenerationTask + public let userText: String? + public let passages: [RDAIPassage] + public let locale: Locale + public let scope: RDAIReadScope + public init(task: RDAIGenerationTask, userText: String? = nil, passages: [RDAIPassage], locale: Locale = .current, scope: RDAIReadScope) { self.task = task; self.userText = userText; self.passages = passages; self.locale = locale; self.scope = scope } +} + +public enum RDAIGeneratedArtifact: Sendable { + case summary(overview: String, statements: [RDAISourcedStatement]) + case answer(text: String, statements: [RDAISourcedStatement]) + case characters([RDAICharacter]) + case relationships([RDAIRelationship]) +} + +public protocol RDAIGenerativeProvider: RDAICapabilityProviding { + var identifier: String { get } + func generate(_ request: RDAIGenerationRequest) async throws -> RDAIGeneratedArtifact +} + +public enum RDAISpoilerPolicy: String, Codable, Sendable { case readContentOnly, wholeDocument } +public enum RDAIDiagnosticsLevel: String, Codable, Sendable { case disabled, metadataOnly } + +public struct RDAIReaderConfiguration: Sendable { + public var isAIEnabled: Bool + public var isLocalOnly: Bool + public var spoilerPolicy: RDAISpoilerPolicy + public var maximumRetrievedPassages: Int + public var storesGeneratedArtifacts: Bool + public var diagnosticsLevel: RDAIDiagnosticsLevel + public init(isAIEnabled: Bool = true, isLocalOnly: Bool = true, spoilerPolicy: RDAISpoilerPolicy = .readContentOnly, maximumRetrievedPassages: Int = 4, storesGeneratedArtifacts: Bool = true, diagnosticsLevel: RDAIDiagnosticsLevel = .metadataOnly) { self.isAIEnabled = isAIEnabled; self.isLocalOnly = isLocalOnly; self.spoilerPolicy = spoilerPolicy; self.maximumRetrievedPassages = max(1, maximumRetrievedPassages); self.storesGeneratedArtifacts = storesGeneratedArtifacts; self.diagnosticsLevel = diagnosticsLevel } + public static let `default` = RDAIReaderConfiguration() +} diff --git a/Sources/RDAIReaderView/Core/RDAISQLiteIndexStore.swift b/Sources/RDAIReaderView/Core/RDAISQLiteIndexStore.swift new file mode 100644 index 0000000..3500f2d --- /dev/null +++ b/Sources/RDAIReaderView/Core/RDAISQLiteIndexStore.swift @@ -0,0 +1,125 @@ +import Foundation +import SQLite3 + +private let rdaiSQLiteTransient = unsafeBitCast(-1, to: sqlite3_destructor_type.self) + +/// Durable local store. Each resource replacement is atomic, so interrupted +/// indexing can safely resume from the first resource without a checkpoint. +public actor RDAISQLiteIndexStore { + private var database: OpaquePointer? + private let encoder = JSONEncoder() + private let decoder = JSONDecoder() + + public init(directory: URL? = nil) throws { + let base = directory ?? FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + try FileManager.default.createDirectory(at: base, withIntermediateDirectories: true) + let url = base.appendingPathComponent("RDAIReaderView.sqlite") + guard sqlite3_open_v2(url.path, &database, SQLITE_OPEN_CREATE | SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, nil) == SQLITE_OK else { + throw RDAIError.storageFailure("open") + } + try Self.configure(database: database) + } + + deinit { sqlite3_close(database) } + + public func replace(document: RDAIDocumentDescriptor, resource: RDAIResourceDescriptor, analysis: RDAIAnalysisResult, sourceHash: String) throws { + try transaction { + try execute("INSERT INTO documents(id,title,format,revision) VALUES(?,?,?,?) ON CONFLICT(id) DO UPDATE SET title=excluded.title,format=excluded.format,revision=excluded.revision", [document.identifier.rawValue, document.title, document.format.rawValue, document.contentRevision]) + try execute("DELETE FROM resources WHERE document_id=? AND resource_id=?", [document.identifier.rawValue, resource.identifier.rawValue]) + try execute("INSERT INTO resources(document_id,resource_id,source_hash,payload) VALUES(?,?,?,?)", [document.identifier.rawValue, resource.identifier.rawValue, sourceHash, try json(resource)]) + try execute("DELETE FROM passages WHERE document_id=? AND resource_id=?", [document.identifier.rawValue, resource.identifier.rawValue]) + try execute("DELETE FROM passage_fts WHERE document_id=? AND resource_id=?", [document.identifier.rawValue, resource.identifier.rawValue]) + try execute("DELETE FROM entity_mentions WHERE document_id=? AND resource_id=?", [document.identifier.rawValue, resource.identifier.rawValue]) + for passage in analysis.passages { + try execute("INSERT INTO passages(id,document_id,resource_id,content_hash,payload) VALUES(?,?,?,?,?)", [passage.id, document.identifier.rawValue, resource.identifier.rawValue, passage.contentHash, try json(passage)]) + try execute("INSERT INTO passage_fts(id,document_id,resource_id,text) VALUES(?,?,?,?)", [passage.id, document.identifier.rawValue, resource.identifier.rawValue, passage.text]) + } + for mention in analysis.entityMentions { + try execute("INSERT INTO entity_mentions(id,document_id,resource_id,normalized_name,payload) VALUES(?,?,?,?,?)", [mention.id, document.identifier.rawValue, resource.identifier.rawValue, mention.normalizedName, try json(mention)]) + } + } + } + + public func resourceHash(documentID: RDAIDocumentIdentifier, resourceID: RDAIResourceIdentifier) throws -> String? { + try query("SELECT source_hash FROM resources WHERE document_id=? AND resource_id=?", [documentID.rawValue, resourceID.rawValue]).first + } + + public func passages(documentID: RDAIDocumentIdentifier) throws -> [RDAIPassage] { + try query("SELECT payload FROM passages WHERE document_id=? ORDER BY rowid", [documentID.rawValue]).compactMap { try? decode(RDAIPassage.self, $0) } + } + + public func entities(documentID: RDAIDocumentIdentifier) throws -> [RDAIEntityMention] { + try query("SELECT payload FROM entity_mentions WHERE document_id=? ORDER BY rowid", [documentID.rawValue]).compactMap { try? decode(RDAIEntityMention.self, $0) } + } + + public func resourceOrder(documentID: RDAIDocumentIdentifier, resourceID: RDAIResourceIdentifier) throws -> Int? { + guard let payload = try query("SELECT payload FROM resources WHERE document_id=? AND resource_id=?", [documentID.rawValue, resourceID.rawValue]).first, + let resource = try? decode(RDAIResourceDescriptor.self, payload) else { return nil } + return resource.order + } + + public func remove(documentID: RDAIDocumentIdentifier) throws { + try transaction { + try execute("DELETE FROM passage_fts WHERE document_id=?", [documentID.rawValue]) + try execute("DELETE FROM documents WHERE id=?", [documentID.rawValue]) + } + } + public func removeAll() throws { + try transaction { + try execute("DELETE FROM documents") + try execute("DELETE FROM passage_fts") + } + } + + public func saveCheckpoint(documentID: RDAIDocumentIdentifier, resourceOrder: Int) throws { + try execute("INSERT INTO index_jobs(document_id,completed_order,updated_at) VALUES(?,?,?) ON CONFLICT(document_id) DO UPDATE SET completed_order=excluded.completed_order,updated_at=excluded.updated_at", [documentID.rawValue, String(resourceOrder), String(Date().timeIntervalSince1970)]) + } + + public func checkpoint(documentID: RDAIDocumentIdentifier) throws -> Int? { + try query("SELECT completed_order FROM index_jobs WHERE document_id=?", [documentID.rawValue]).first.flatMap(Int.init) + } + + public func saveArtifact(documentID: RDAIDocumentIdentifier, key: String, payload: Data) throws { + try execute("INSERT INTO artifacts(document_id,cache_key,payload,created_at) VALUES(?,?,?,?) ON CONFLICT(document_id,cache_key) DO UPDATE SET payload=excluded.payload,created_at=excluded.created_at", [documentID.rawValue, key, payload, String(Date().timeIntervalSince1970)]) + } + + public func artifact(documentID: RDAIDocumentIdentifier, key: String) throws -> Data? { + try queryData("SELECT payload FROM artifacts WHERE document_id=? AND cache_key=?", [documentID.rawValue, key]).first + } + + public func storageBytes() -> Int64 { + guard let database, + let path = sqlite3_db_filename(database, "main"), + let attributes = try? FileManager.default.attributesOfItem(atPath: String(cString: path)), + let size = attributes[.size] as? NSNumber else { return 0 } + return size.int64Value + } + + private static func configure(database: OpaquePointer?) throws { + try executeScript(database: database, sql: """ + CREATE TABLE IF NOT EXISTS schema_metadata(version INTEGER NOT NULL); + INSERT INTO schema_metadata(version) SELECT 1 WHERE NOT EXISTS(SELECT 1 FROM schema_metadata); + CREATE TABLE IF NOT EXISTS documents(id TEXT PRIMARY KEY,title TEXT NOT NULL,format TEXT NOT NULL,revision TEXT NOT NULL); + CREATE TABLE IF NOT EXISTS resources(document_id TEXT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,resource_id TEXT NOT NULL,source_hash TEXT NOT NULL,payload BLOB NOT NULL,PRIMARY KEY(document_id,resource_id)); + CREATE TABLE IF NOT EXISTS passages(id TEXT PRIMARY KEY,document_id TEXT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,resource_id TEXT NOT NULL,content_hash TEXT NOT NULL,payload BLOB NOT NULL); + CREATE VIRTUAL TABLE IF NOT EXISTS passage_fts USING fts5(id UNINDEXED,document_id UNINDEXED,resource_id UNINDEXED,text); + CREATE TABLE IF NOT EXISTS entity_mentions(id TEXT PRIMARY KEY,document_id TEXT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,resource_id TEXT NOT NULL,normalized_name TEXT NOT NULL,payload BLOB NOT NULL); + CREATE TABLE IF NOT EXISTS index_jobs(document_id TEXT PRIMARY KEY REFERENCES documents(id) ON DELETE CASCADE,completed_order INTEGER NOT NULL,updated_at REAL NOT NULL); + CREATE TABLE IF NOT EXISTS artifacts(document_id TEXT NOT NULL REFERENCES documents(id) ON DELETE CASCADE,cache_key TEXT NOT NULL,payload BLOB NOT NULL,created_at REAL NOT NULL,PRIMARY KEY(document_id,cache_key)); + """) + } + + private func transaction(_ body: () throws -> Void) throws { try execute("BEGIN IMMEDIATE"); do { try body(); try execute("COMMIT") } catch { try? execute("ROLLBACK"); throw error } } + private static func executeScript(database: OpaquePointer?, sql: String) throws { + var errorMessage: UnsafeMutablePointer? + guard sqlite3_exec(database, sql, nil, nil, &errorMessage) == SQLITE_OK else { + defer { sqlite3_free(errorMessage) } + throw RDAIError.storageFailure("migration") + } + } + private func json(_ value: T) throws -> Data { try encoder.encode(value) } + private func decode(_ type: T.Type, _ value: String) throws -> T { try decoder.decode(T.self, from: Data(value.utf8)) } + private func queryData(_ sql: String, _ bindings: [String]) throws -> [Data] { var statement: OpaquePointer?; guard sqlite3_prepare_v2(database, sql, -1, &statement, nil) == SQLITE_OK else { throw RDAIError.storageFailure("prepare") }; defer { sqlite3_finalize(statement) }; for (index, value) in bindings.enumerated() { sqlite3_bind_text(statement, Int32(index + 1), value, -1, rdaiSQLiteTransient) }; var rows: [Data] = []; while sqlite3_step(statement) == SQLITE_ROW { let count = sqlite3_column_bytes(statement, 0); if let value = sqlite3_column_blob(statement, 0), count > 0 { rows.append(Data(bytes: value, count: Int(count))) } }; return rows } + private func query(_ sql: String, _ bindings: [String]) throws -> [String] { var statement: OpaquePointer?; guard sqlite3_prepare_v2(database, sql, -1, &statement, nil) == SQLITE_OK else { throw RDAIError.storageFailure("prepare") }; defer { sqlite3_finalize(statement) }; for (index, value) in bindings.enumerated() { sqlite3_bind_text(statement, Int32(index + 1), value, -1, rdaiSQLiteTransient) }; var rows: [String] = []; while sqlite3_step(statement) == SQLITE_ROW { if let value = sqlite3_column_text(statement, 0) { rows.append(String(cString: value)) } }; return rows } + private func execute(_ sql: String, _ bindings: [Any] = []) throws { var statement: OpaquePointer?; guard sqlite3_prepare_v2(database, sql, -1, &statement, nil) == SQLITE_OK else { throw RDAIError.storageFailure("prepare") }; defer { sqlite3_finalize(statement) }; for (index, value) in bindings.enumerated() { if let text = value as? String { sqlite3_bind_text(statement, Int32(index + 1), text, -1, rdaiSQLiteTransient) } else if let data = value as? Data { _ = data.withUnsafeBytes { sqlite3_bind_blob(statement, Int32(index + 1), $0.baseAddress, Int32(data.count), rdaiSQLiteTransient) } } }; guard sqlite3_step(statement) == SQLITE_DONE else { throw RDAIError.storageFailure("execute") } } +} diff --git a/Sources/RDAIReaderView/FoundationModels/RDAIAppleFoundationModelsProvider.swift b/Sources/RDAIReaderView/FoundationModels/RDAIAppleFoundationModelsProvider.swift new file mode 100644 index 0000000..d251293 --- /dev/null +++ b/Sources/RDAIReaderView/FoundationModels/RDAIAppleFoundationModelsProvider.swift @@ -0,0 +1,77 @@ +import Foundation +import FoundationModels + +@available(iOS 26.0, *) +@Generable(description: "A factual statement grounded in one or more supplied passage identifiers.") +private struct RDAIModelStatement { + var text: String + var passageIDs: [String] +} + +@available(iOS 26.0, *) +@Generable(description: "A citation-grounded book summary.") +private struct RDAIModelSummary { + var overview: String + var statements: [RDAIModelStatement] +} + +@available(iOS 26.0, *) +@Generable(description: "A citation-grounded answer to a question about supplied passages.") +private struct RDAIModelAnswer { + var answer: String + var statements: [RDAIModelStatement] +} + +/// Optional on-device provider. The Core service remains fully functional on +/// older systems by falling back to evidence-only retrieval. +@available(iOS 26.0, *) +public actor RDAIAppleFoundationModelsProvider: RDAIGenerativeProvider { + public let identifier = "apple.foundation-models" + + public init() {} + + public func availability(for capability: RDAICapability, locale: Locale?) async -> RDAICapabilityAvailability { + switch SystemLanguageModel.default.availability { + case .available: return .available + case .unavailable(.deviceNotEligible): return .unavailable(reason: .deviceNotEligible) + case .unavailable(.appleIntelligenceNotEnabled): return .unavailable(reason: .appleIntelligenceNotEnabled) + case .unavailable(.modelNotReady): return .unavailable(reason: .modelNotReady) + @unknown default: return .unavailable(reason: .unknown("system-model-unavailable")) + } + } + + public func generate(_ request: RDAIGenerationRequest) async throws -> RDAIGeneratedArtifact { + guard case .available = await availability(for: capability(for: request.task), locale: request.locale) else { + throw RDAIError.modelUnavailable(.modelNotReady) + } + let context = request.passages.enumerated().map { "[\($0.element.id)] \($0.element.text)" }.joined(separator: "\n\n") + let task: String + switch request.task { + case .summary: task = "Summarize the passages in the user's language. Do not add facts." + case .answer: task = "Answer the question using only the passages. If evidence is insufficient, say so. Question: \(request.userText ?? "")" + case .characters, .relationships: throw RDAIError.insufficientEvidence + } + let session = LanguageModelSession(instructions: "You are a book reading assistant. Use only supplied passages and never reveal unread content.") + switch request.task { + case .summary: + let response = try await session.respond(to: "\(task) Each statement must include its supplied passage IDs.\n\nPassages:\n\(context)", generating: RDAIModelSummary.self) + return .summary(overview: response.content.overview, statements: response.content.statements.map(statement)) + case .answer: + let response = try await session.respond(to: "\(task) Each statement must include its supplied passage IDs.\n\nPassages:\n\(context)", generating: RDAIModelAnswer.self) + return .answer(text: response.content.answer, statements: response.content.statements.map(statement)) + case .characters, .relationships: throw RDAIError.insufficientEvidence + } + } + + private func capability(for task: RDAIGenerationTask) -> RDAICapability { + switch task { + case .summary: return .summarization + case .answer: return .questionAnswering + case .characters, .relationships: return .characterRelationships + } + } + + private func statement(_ value: RDAIModelStatement) -> RDAISourcedStatement { + RDAISourcedStatement(text: value.text, citationIdentifiers: value.passageIDs) + } +} diff --git a/Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageAnalyzer.swift b/Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageAnalyzer.swift new file mode 100644 index 0000000..7337bda --- /dev/null +++ b/Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageAnalyzer.swift @@ -0,0 +1,171 @@ +import Foundation +import NaturalLanguage + +public struct RDAINaturalLanguageAnalyzer: RDAIAnalyzing { + public struct Configuration: Sendable { + public var maximumPassageUTF16Length: Int + public var overlapSentenceCount: Int + + public init(maximumPassageUTF16Length: Int = 800, overlapSentenceCount: Int = 1) { + self.maximumPassageUTF16Length = max(160, maximumPassageUTF16Length) + self.overlapSentenceCount = max(0, overlapSentenceCount) + } + } + + public let configuration: Configuration + + public init(configuration: Configuration = .init()) { + self.configuration = configuration + } + + public func analyze(document: RDAIDocumentDescriptor, snapshot: RDAIResourceSnapshot) async -> RDAIAnalysisResult { + await Task.detached(priority: .utility) { + let language = Self.detectLanguage(in: snapshot.sourceText) + let passages = Self.makePassages(document: document, snapshot: snapshot, language: language, configuration: configuration) + let mentions = Self.makeEntityMentions(document: document, snapshot: snapshot) + return RDAIAnalysisResult(passages: passages, entityMentions: mentions) + }.value + } + + private static func detectLanguage(in text: String) -> String? { + let recognizer = NLLanguageRecognizer() + recognizer.processString(text) + return recognizer.dominantLanguage?.rawValue + } + + private static func makePassages( + document: RDAIDocumentDescriptor, + snapshot: RDAIResourceSnapshot, + language: String?, + configuration: Configuration + ) -> [RDAIPassage] { + let sentenceRanges = sentenceRanges( + in: snapshot.sourceText, + maximumUTF16Length: configuration.maximumPassageUTF16Length + ) + guard !sentenceRanges.isEmpty else { return [] } + var result: [RDAIPassage] = [] + var startIndex = 0 + var order = 0 + + while startIndex < sentenceRanges.count { + var endIndex = startIndex + var length = 0 + while endIndex < sentenceRanges.count { + let candidate = sentenceRanges[endIndex] + let nextLength = max(candidate.upperBound - sentenceRanges[startIndex].location, candidate.length) + if endIndex > startIndex && nextLength > configuration.maximumPassageUTF16Length { break } + length = nextLength + endIndex += 1 + } + guard length > 0 else { break } + let rawRange = RDAITextRange(location: sentenceRanges[startIndex].location, length: length) + guard let range = trimmedRange(rawRange, in: snapshot.sourceText), + let locator = RDAILocatorBuilder.makeLocator(document: document, snapshot: snapshot, range: range) else { + startIndex = max(startIndex + 1, endIndex) + continue + } + let text = (snapshot.sourceText as NSString).substring(with: NSRange(location: range.location, length: range.length)) + let contentHash = RDAIContentHasher.hash(text) + result.append(RDAIPassage( + id: RDAIContentHasher.hash("\(document.identifier.rawValue)|\(snapshot.descriptor.identifier.rawValue)|\(range.location)|\(range.length)|\(contentHash)"), + documentIdentifier: document.identifier, + resourceIdentifier: snapshot.descriptor.identifier, + text: text, + languageCode: language, + locator: locator, + contentHash: contentHash, + order: order + )) + order += 1 + let nextStart = max(endIndex - configuration.overlapSentenceCount, startIndex + 1) + startIndex = nextStart + } + return result + } + + private static func sentenceRanges(in text: String, maximumUTF16Length: Int) -> [RDAITextRange] { + let tokenizer = NLTokenizer(unit: .sentence) + tokenizer.string = text + var ranges: [RDAITextRange] = [] + tokenizer.enumerateTokens(in: text.startIndex.. 0 { ranges.append(RDAITextRange(location: nsRange.location, length: nsRange.length)) } + return true + } + if ranges.isEmpty, !text.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { + ranges = [RDAITextRange(location: 0, length: text.utf16.count)] + } + return ranges.flatMap { split($0, in: text, maximumUTF16Length: maximumUTF16Length) } + } + + private static func split( + _ range: RDAITextRange, + in text: String, + maximumUTF16Length: Int + ) -> [RDAITextRange] { + guard range.length > maximumUTF16Length else { return [range] } + let source = text as NSString + var result: [RDAITextRange] = [] + var cursor = range.location + while cursor < range.upperBound { + let candidate = min(cursor + maximumUTF16Length, range.upperBound) + var boundary = candidate + if candidate < range.upperBound { + let composed = source.rangeOfComposedCharacterSequence(at: candidate) + boundary = composed.location > cursor ? composed.location : min(composed.upperBound, range.upperBound) + } + guard boundary > cursor else { break } + result.append(RDAITextRange(location: cursor, length: boundary - cursor)) + cursor = boundary + } + return result + } + + private static func trimmedRange(_ range: RDAITextRange, in text: String) -> RDAITextRange? { + let source = (text as NSString).substring(with: NSRange(location: range.location, length: range.length)) + let trimmed = source.trimmingCharacters(in: .whitespacesAndNewlines) + guard !trimmed.isEmpty else { return nil } + let leading = source.utf16.count - source.drop(while: { $0.isWhitespace || $0.isNewline }).utf16.count + return RDAITextRange(location: range.location + leading, length: trimmed.utf16.count) + } + + private static func makeEntityMentions( + document: RDAIDocumentDescriptor, + snapshot: RDAIResourceSnapshot + ) -> [RDAIEntityMention] { + let tagger = NLTagger(tagSchemes: [.nameType]) + tagger.string = snapshot.sourceText + var mentions: [RDAIEntityMention] = [] + let fullRange = snapshot.sourceText.startIndex.. RDAIEntityKind? { + switch tag { + case .personalName: return .person + case .placeName: return .place + case .organizationName: return .organization + default: return nil + } + } +} diff --git a/Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageSemanticScorer.swift b/Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageSemanticScorer.swift new file mode 100644 index 0000000..c174a7d --- /dev/null +++ b/Sources/RDAIReaderView/NaturalLanguage/RDAINaturalLanguageSemanticScorer.swift @@ -0,0 +1,19 @@ +import Foundation +import NaturalLanguage + +/// Uses Apple's bundled sentence embeddings when the language asset exists. +/// Distances are converted to a stable 0...1 ranking signal only within one +/// query; callers must not compare values across embedding revisions. +public struct RDAINaturalLanguageSemanticScorer: RDAISemanticScoring { + public init() {} + + public func score(query: String, text: String, languageCode: String?) async -> Double? { + await Task.detached(priority: .utility) { + let language = languageCode.flatMap(NLLanguage.init(rawValue:)) ?? .english + guard let embedding = NLEmbedding.sentenceEmbedding(for: language) else { return nil } + let distance = embedding.distance(between: query, and: text) + guard distance.isFinite else { return nil } + return 1 / (1 + Double(distance)) + }.value + } +} diff --git a/Sources/RDAIReaderView/RDAIReaderView.podspec b/Sources/RDAIReaderView/RDAIReaderView.podspec new file mode 100644 index 0000000..48d5abd --- /dev/null +++ b/Sources/RDAIReaderView/RDAIReaderView.podspec @@ -0,0 +1,37 @@ +Pod::Spec.new do |s| + s.name = "RDAIReaderView" + s.module_name = "RDAIReaderView" + s.version = "0.1.0" + s.summary = "Local-first AI indexing and retrieval primitives for ReadViewSDK readers" + s.platform = :ios, "15.0" + s.swift_versions = ["5.10"] + s.homepage = "https://example.invalid/RDAIReaderView" + s.author = { "readoor" => "ios@touchread.com" } + s.source = { :path => "." } + s.license = "MIT" + s.requires_arc = true + + s.subspec "Core" do |core| + core.source_files = "Core/**/*.swift" + core.frameworks = "CryptoKit" + core.libraries = "sqlite3" + end + + s.subspec "NaturalLanguage" do |natural_language| + natural_language.source_files = "NaturalLanguage/**/*.swift" + natural_language.dependency "RDAIReaderView/Core", "~> 0.1" + natural_language.frameworks = "NaturalLanguage" + end + + s.subspec "FoundationModels" do |foundation_models| + foundation_models.source_files = "FoundationModels/**/*.swift" + foundation_models.dependency "RDAIReaderView/Core", "~> 0.1" + foundation_models.frameworks = "FoundationModels" + end + + s.subspec "UI" do |ui| + ui.source_files = "UI/**/*.swift" + ui.dependency "RDAIReaderView/Core", "~> 0.1" + ui.frameworks = "UIKit" + end +end diff --git a/Sources/RDAIReaderView/README.md b/Sources/RDAIReaderView/README.md new file mode 100644 index 0000000..8a88de2 --- /dev/null +++ b/Sources/RDAIReaderView/README.md @@ -0,0 +1,38 @@ +# RDAIReaderView + +`RDAIReaderView` is the local indexing and retrieval foundation for ReadViewSDK AI reader features. Version `0.1` provides Natural Language sentence chunking, language detection, named-entity candidates, source-backed citations and local lexical retrieval. It does not upload book content. + +## Install + +```ruby +pod 'RDAIReaderView/NaturalLanguage' +pod 'RDPDFReaderView/AI' +pod 'RDEpubReaderView/AI' +``` + +## Use with PDF + +```swift +let service = reader.makeAIReaderService() +try await service.prepareIndex( + options: RDAIIndexOptions(scope: .wholeDocument) +) + +let matches = await service.retrieve( + query: "主角为什么离开", + options: RDAIRetrievalOptions(scope: .wholeDocument) +) + +if let match = matches.first { + let citation = RDAICitation( + passageIdentifier: match.passage.id, + quote: match.passage.text, + locator: match.passage.locator + ) + try await reader.makeAIContentProvider().aiShowCitationHighlight(citation) +} +``` + +PDF citations retain native-text versus OCR provenance. EPUB citations use normalized `href` and derive CFI ranges when navigating. + +Foundation Models generation, persistent SQLite storage and the AI UI are planned follow-up modules; the Core API is intentionally independent of those capabilities. diff --git a/Sources/RDAIReaderView/UI/RDAIReaderAssistantViewController.swift b/Sources/RDAIReaderView/UI/RDAIReaderAssistantViewController.swift new file mode 100644 index 0000000..2426d57 --- /dev/null +++ b/Sources/RDAIReaderView/UI/RDAIReaderAssistantViewController.swift @@ -0,0 +1,136 @@ +import UIKit + +/// A reusable, local-first assistant sheet. Hosts supply the read scope so the +/// UI cannot silently expand answers beyond the reader's spoiler boundary. +@MainActor +public final class RDAIReaderAssistantViewController: UIViewController { + private let service: RDAIReaderService + private let scope: RDAIReadScope + private let output = UITextView() + private let citationsStack = UIStackView() + private let questionField = UITextField() + private let activity = UIActivityIndicatorView(style: .medium) + private var citations: [RDAICitation] = [] + private var indexingTask: Task? + + private struct Presentation { + let text: String + let citations: [RDAICitation] + } + + public init(service: RDAIReaderService, scope: RDAIReadScope) { + self.service = service + self.scope = scope + super.init(nibName: nil, bundle: nil) + title = "阅读助手" + } + + required init?(coder: NSCoder) { nil } + + public override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .systemBackground + let closeButton = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(close)) + let cancelButton = UIBarButtonItem(title: "取消索引", style: .plain, target: self, action: #selector(cancelIndexing)) + navigationItem.rightBarButtonItems = [closeButton, cancelButton] + navigationItem.leftBarButtonItem = UIBarButtonItem(title: "清除数据", style: .plain, target: self, action: #selector(clearAIData)) + let summary = button("摘要", action: #selector(showSummary)) + let characters = button("人物", action: #selector(showCharacters)) + let relationships = button("关系", action: #selector(showRelationships)) + questionField.placeholder = "向已读内容提问" + questionField.borderStyle = .roundedRect + questionField.returnKeyType = .send + questionField.delegate = self + output.isEditable = false + output.font = .preferredFont(forTextStyle: .body) + output.adjustsFontForContentSizeCategory = true + output.accessibilityIdentifier = "rdai.assistant.output" + let actions = UIStackView(arrangedSubviews: [summary, characters, relationships]) + actions.axis = .horizontal; actions.distribution = .fillEqually; actions.spacing = 8 + citationsStack.axis = .vertical; citationsStack.spacing = 6 + let stack = UIStackView(arrangedSubviews: [actions, questionField, output, citationsStack]) + stack.axis = .vertical; stack.spacing = 12 + view.addSubview(stack); view.addSubview(activity) + stack.translatesAutoresizingMaskIntoConstraints = false; activity.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([stack.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 16), stack.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor), stack.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor), stack.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -16), output.heightAnchor.constraint(greaterThanOrEqualToConstant: 180), activity.centerXAnchor.constraint(equalTo: view.centerXAnchor), activity.centerYAnchor.constraint(equalTo: view.centerYAnchor)]) + startIndexing() + } + + deinit { indexingTask?.cancel() } + + @objc private func close() { indexingTask?.cancel(); service.resumeIndexing(); service.clearCitationHighlight(); dismiss(animated: true) } + @objc private func cancelIndexing() { indexingTask?.cancel(); service.resumeIndexing(); output.text = "已取消本地索引。"; activity.stopAnimating() } + @objc private func clearAIData() { + let alert = UIAlertController(title: "清除 AI 数据", message: "将删除本书的本地索引、缓存和生成结果,不会删除原书或用户标注。", preferredStyle: .actionSheet) + alert.addAction(UIAlertAction(title: "取消", style: .cancel)) + alert.addAction(UIAlertAction(title: "清除", style: .destructive) { [weak self] _ in + guard let self else { return } + Task { await self.service.removeIndex(); self.service.clearCitationHighlight(); self.output.text = "已清除本地 AI 数据。"; self.renderCitations([]) } + }) + present(alert, animated: true) + } + private func startIndexing() { + indexingTask?.cancel() + indexingTask = Task { [weak self] in + guard let self else { return } + await self.prepareIndex() + } + } + + private func prepareIndex() async { + activity.startAnimating() + output.text = "正在建立本地索引…" + let updatesTask = Task { [weak self] in + guard let self else { return } + for await state in service.stateUpdates() { + guard !Task.isCancelled else { return } + self.display(indexState: state) + } + } + defer { updatesTask.cancel(); activity.stopAnimating(); indexingTask = nil } + do { + try await service.prepareIndex(options: .init(scope: scope)) + } catch is CancellationError { + output.text = "已取消本地索引。" + } catch { + output.text = "本地索引暂不可用。" + } + } + + private func display(indexState: RDAIIndexState) { + switch indexState { + case .indexing(let completed, let total): output.text = "正在建立本地索引:\(completed)/\(total)" + case .paused(let completed, let total): output.text = "索引已暂停:\(completed)/\(total)" + case .ready: output.text = "本地索引已就绪。" + case .failed: output.text = "本地索引暂不可用。" + case .notStarted: break + } + } + @objc private func showSummary() { Task { await perform("正在生成摘要…") { let summary = try await self.service.summarize(scope: self.scope, length: .standard); return .init(text: summary.keyPoints.map(\.text).joined(separator: "\n\n"), citations: summary.citations) } } } + @objc private func showCharacters() { Task { await perform("正在整理人物…") { let values = await self.service.characters(scope: self.scope); return .init(text: values.map { "\($0.displayName):\($0.description)" }.joined(separator: "\n"), citations: values.flatMap(\.evidence)) } } } + @objc private func showRelationships() { Task { await perform("正在整理关系…") { + let characters = await self.service.characters(scope: self.scope) + let names = Dictionary(uniqueKeysWithValues: characters.map { ($0.id, $0.displayName) }) + let values = await self.service.relationships(scope: self.scope) + guard !values.isEmpty else { return .init(text: "当前已读范围内没有足够证据建立人物关系。", citations: []) } + return .init(text: values.map { relationship in + let source = names[relationship.sourceCharacterIdentifier] ?? "未知人物" + let target = names[relationship.targetCharacterIdentifier] ?? "未知人物" + return "\(source) - \(relationship.label) - \(target)(\(relationship.status.localizedDescription))" + }.joined(separator: "\n"), citations: values.flatMap(\.evidence)) + } } } + + private func ask() { guard let question = questionField.text?.trimmingCharacters(in: .whitespacesAndNewlines), !question.isEmpty else { return }; Task { await perform("正在检索原文…") { let answer = try await self.service.answer(question: question, scope: self.scope); return .init(text: ([answer.text] + answer.statements.map(\.text)).joined(separator: "\n\n"), citations: answer.citations) } } } + private func perform(_ placeholder: String, operation: @escaping @MainActor () async throws -> Presentation) async { activity.startAnimating(); output.text = placeholder; renderCitations([]); defer { activity.stopAnimating() }; do { let presentation = try await operation(); output.text = presentation.text; renderCitations(presentation.citations) } catch { output.text = "暂时无法完成此请求。" } } + private func renderCitations(_ values: [RDAICitation]) { citations = values; citationsStack.arrangedSubviews.forEach { $0.removeFromSuperview() }; for (index, citation) in values.enumerated() { var configuration = UIButton.Configuration.gray(); configuration.title = "原文:\(citation.quote.prefix(42))"; configuration.titleLineBreakMode = .byTruncatingTail; let button = UIButton(configuration: configuration); button.contentHorizontalAlignment = .leading; button.tag = index; button.addTarget(self, action: #selector(openCitation(_:)), for: .touchUpInside); citationsStack.addArrangedSubview(button) } } + @objc private func openCitation(_ sender: UIButton) { guard citations.indices.contains(sender.tag) else { return }; Task { try? await service.showCitation(citations[sender.tag]) } } + private func button(_ title: String, action: Selector) -> UIButton { var configuration = UIButton.Configuration.tinted(); configuration.title = title; let button = UIButton(configuration: configuration); button.addTarget(self, action: action, for: .touchUpInside); return button } +} + +extension RDAIReaderAssistantViewController: UITextFieldDelegate { public func textFieldShouldReturn(_ textField: UITextField) -> Bool { ask(); return true } } + +private extension RDAIRelationshipStatus { + var localizedDescription: String { + switch self { case .confirmed: return "已确认"; case .possible: return "可能"; case .conflicting: return "存在冲突" } + } +} diff --git a/Sources/RDEpubReaderView/AI/RDEPUBAIContentProvider.swift b/Sources/RDEpubReaderView/AI/RDEPUBAIContentProvider.swift new file mode 100644 index 0000000..b3dd741 --- /dev/null +++ b/Sources/RDEpubReaderView/AI/RDEPUBAIContentProvider.swift @@ -0,0 +1,198 @@ +import Foundation +import RDAIReaderView +import UIKit + +/// EPUB adapter using normalized hrefs and the existing CFI index table for +/// stable citation navigation across font and pagination changes. +@MainActor +public final class RDEPUBAIContentProvider: RDAIContentProvider { + private weak var controller: RDEPUBReaderController? + + init(controller: RDEPUBReaderController) { + self.controller = controller + } + + public func aiDocumentDescriptor() -> RDAIDocumentDescriptor { + let identifier = controller?.currentBookIdentifier ?? "rd-epub-reader" + let chapters = readableChapters() + let revision = chapters.map { "\($0.href)|\($0.text.utf16.count)" }.joined(separator: "|") + return RDAIDocumentDescriptor( + identifier: RDAIDocumentIdentifier(rawValue: identifier), + title: controller?.title ?? "", + format: .epub, + contentRevision: RDAIContentHasher.hash(revision) + ) + } + + public func aiResources() async throws -> [RDAIResourceDescriptor] { + readableChapters().enumerated().map { index, chapter in + RDAIResourceDescriptor( + identifier: RDAIResourceIdentifier(rawValue: chapter.href), + title: chapter.title, + order: index, + estimatedUTF16Length: chapter.text.utf16.count + ) + } + } + + public func aiResourceSnapshot(for identifier: RDAIResourceIdentifier) async throws -> RDAIResourceSnapshot { + guard let chapter = readableChapters().first(where: { $0.href == identifier.rawValue }) else { + throw RDAIError.resourceUnavailable(identifier) + } + let resource = RDAIResourceDescriptor( + identifier: identifier, + title: chapter.title, + order: chapter.order, + estimatedUTF16Length: chapter.text.utf16.count + ) + let anchor = RDAIEPUBAnchor(href: chapter.href, progression: 0) + return RDAIResourceSnapshot( + descriptor: resource, + sourceText: chapter.text, + sourceHash: RDAIContentHasher.hash(chapter.text), + locatorRuns: [RDAILocatorRun( + textRange: RDAITextRange(location: 0, length: chapter.text.utf16.count), + anchor: .epub(anchor) + )] + ) + } + + public func aiNavigate(to locator: RDAILocator, animated: Bool) async throws { + guard let controller, + case .epub(let anchor) = locator.anchor else { + throw RDAIError.staleCitation + } + let resolved = resolveLocation(locator: locator, anchor: anchor, controller: controller) + controller.go(to: resolved) + } + + public func aiShowCitationHighlight(_ citation: RDAICitation) async throws { + guard let controller, + case .epub(let anchor) = citation.locator.anchor else { + throw RDAIError.staleCitation + } + let location = resolveLocation(locator: citation.locator, anchor: anchor, controller: controller) + let range = citation.locator.textRange + let decoration = RDEPUBHighlight( + id: "rdai-citation-\(citation.id)", + bookIdentifier: controller.currentBookIdentifier, + location: location, + text: citation.quote, + rangeInfo: RDEPUBTextOffsetRangeInfo(href: anchor.href, start: range.location, end: range.upperBound).jsonString(), + style: .highlight, + color: "#86D7FF" + ) + controller.setTransientHighlights([decoration]) + controller.go(to: location) + } + + public func aiClearCitationHighlight() { controller?.clearTransientHighlights() } + + private func resolveLocation( + locator: RDAILocator, + anchor: RDAIEPUBAnchor, + controller: RDEPUBReaderController + ) -> RDEPUBLocation { + let sourceLength = readableChapters().first { $0.href == anchor.href }?.text.utf16.count ?? 1 + let progression = Double(locator.textRange.location) / Double(max(sourceLength - 1, 1)) + guard let chapterData = controller.textChapterData(forNormalizedHref: anchor.href) else { + return RDEPUBLocation( + bookIdentifier: controller.currentBookIdentifier, + href: anchor.href, + progression: anchor.progression ?? progression, + cfi: anchor.cfi, + rangeCFI: anchor.rangeCFI + ) + } + let range = NSRange(location: locator.textRange.location, length: max(locator.textRange.length, 1)) + let rangeAnchor = chapterData.rangeAnchor(for: range) + let cfiRange = chapterData.indexTable.cfiRange(for: rangeAnchor) + return RDEPUBLocation( + bookIdentifier: controller.currentBookIdentifier, + href: anchor.href, + progression: progression, + rangeAnchor: rangeAnchor, + cfi: cfiRange?.start.rawValue, + rangeCFI: cfiRange?.rawValue + ) + } + + private func readableChapters() -> [(href: String, title: String?, text: String, order: Int)] { + guard let controller else { return [] } + if let textBook = controller.textBook { + return textBook.chapters.enumerated().map { + (href: $0.element.href, title: $0.element.title, text: $0.element.attributedContent.string, order: $0.offset) + } + } + guard let publication = controller.publication, + let parser = controller.parser else { + return [] + } + return publication.spine.enumerated().compactMap { index, item in + guard item.linear, + item.mediaType.contains("html") || item.mediaType.contains("xhtml"), + let html = parser.htmlString(forRelativePath: item.href) else { + return nil + } + let href = publication.resourceResolver.normalizedHref(item.href) ?? item.href + return (href: href, title: item.href, text: plainText(fromHTML: html), order: index) + } + } + + private func plainText(fromHTML html: String) -> String { + guard let data = html.data(using: .utf8), + let attributed = try? NSAttributedString( + data: data, + options: [ + .documentType: NSAttributedString.DocumentType.html, + .characterEncoding: String.Encoding.utf8.rawValue + ], + documentAttributes: nil + ) else { + return html.replacingOccurrences(of: "<[^>]+>", with: " ", options: .regularExpression) + } + return attributed.string + } +} + +public extension RDEPUBReaderController { + func aiCurrentReadScope() -> RDAIReadScope { + guard let location = currentLocation else { return .init() } + let locator = RDAILocator( + documentIdentifier: RDAIDocumentIdentifier(rawValue: currentBookIdentifier ?? "rd-epub-reader"), + resourceIdentifier: RDAIResourceIdentifier(rawValue: location.href), + textRange: RDAITextRange(location: 0, length: Int.max), + anchor: .epub(.init(href: location.href, cfi: location.cfi, rangeCFI: location.rangeCFI, progression: location.progression)), + sourceHash: "" + ) + return RDAIReadScope(upperBound: locator) + } + + func makeAIContentProvider() -> RDEPUBAIContentProvider { + RDEPUBAIContentProvider(controller: self) + } + + func makeAIReaderService( + generativeProvider: (any RDAIGenerativeProvider)? = nil, + configuration: RDAIReaderConfiguration = .default + ) -> RDAIReaderService { + RDAIReaderService( + contentProvider: makeAIContentProvider(), + analyzer: RDAINaturalLanguageAnalyzer(), + semanticScorer: RDAINaturalLanguageSemanticScorer(), + persistentStore: try? RDAISQLiteIndexStore(), + generativeProvider: generativeProvider, + configuration: configuration + ) + } + + func makeAIReaderAssistant(scope: RDAIReadScope) -> UIViewController { + UINavigationController(rootViewController: RDAIReaderAssistantViewController(service: makeAIReaderService(), scope: scope)) + } + + func makeAIReaderAssistant(scope: RDAIReadScope, generativeProvider: (any RDAIGenerativeProvider)?) -> UIViewController { + UINavigationController(rootViewController: RDAIReaderAssistantViewController(service: makeAIReaderService(generativeProvider: generativeProvider), scope: scope)) + } + + func makeAIReaderAssistant() -> UIViewController { makeAIReaderAssistant(scope: aiCurrentReadScope()) } +} diff --git a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+DataSource.swift b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+DataSource.swift index cfff51e..fed513a 100644 --- a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+DataSource.swift +++ b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+DataSource.swift @@ -164,14 +164,14 @@ extension RDEPUBReaderController: RDEpubReaderDataSource, RDEpubReaderPageProvid private func textHighlights(for page: RDEPUBTextPage) -> [RDEPUBHighlight] { if let textBook, let chapterData = textBook.chapterData(for: page.href) { - return chapterData.highlights(on: page, from: activeHighlights) + return chapterData.highlights(on: page, from: activeHighlights + transientHighlights) } guard let publication else { - return activeHighlights.filter { $0.location.href == page.href } + return (activeHighlights + transientHighlights).filter { $0.location.href == page.href } } let pageHref = publication.resourceResolver.normalizedHref(page.href) ?? page.href - return activeHighlights.filter { + return (activeHighlights + transientHighlights).filter { (publication.resourceResolver.normalizedHref($0.location.href) ?? $0.location.href) == pageHref } } diff --git a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+PublicAPI.swift b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+PublicAPI.swift index afe8d50..67a11b8 100644 --- a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+PublicAPI.swift +++ b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+PublicAPI.swift @@ -21,6 +21,18 @@ extension RDEPUBReaderController { runtime.clearSelection() } + /// Displays temporary decorations without mutating annotation persistence. + public func setTransientHighlights(_ highlights: [RDEPUBHighlight]) { + transientHighlights = highlights + refreshVisibleContentPreservingLocation() + } + + public func clearTransientHighlights() { + guard !transientHighlights.isEmpty else { return } + transientHighlights.removeAll() + refreshVisibleContentPreservingLocation() + } + public func bookmark(withID id: String) -> RDEPUBBookmark? { runtime.bookmark(withID: id) } diff --git a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+RenderSupport.swift b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+RenderSupport.swift index 00ae4f3..7e2952f 100644 --- a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+RenderSupport.swift +++ b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController+RenderSupport.swift @@ -69,7 +69,7 @@ extension RDEPUBReaderController { guard let publication else { return [] } if let spread = page.fixedSpread { let hrefs = Set(spread.resources.compactMap { publication.resourceResolver.normalizedHref($0.href) }) - return activeHighlights.filter { highlight in + return (activeHighlights + transientHighlights).filter { highlight in guard let normalizedHref = publication.resourceResolver.normalizedHref(highlight.location.href) else { return false } @@ -80,7 +80,7 @@ extension RDEPUBReaderController { guard publication.spine.indices.contains(page.spineIndex) else { return [] } let href = publication.spine[page.spineIndex].href let normalizedHref = publication.resourceResolver.normalizedHref(href) - return activeHighlights.filter { highlight in + return (activeHighlights + transientHighlights).filter { highlight in publication.resourceResolver.normalizedHref(highlight.location.href) == normalizedHref } } diff --git a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift index a327463..b50a702 100644 --- a/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift +++ b/Sources/RDEpubReaderView/EPUBUI/RDEPUBReaderController.swift @@ -140,6 +140,11 @@ public final class RDEPUBReaderController: UIViewController { set { readerContext.activeHighlights = newValue } } + var transientHighlights: [RDEPUBHighlight] { + get { readerContext.transientHighlights } + set { readerContext.transientHighlights = newValue } + } + lazy var topToolView = runtime.makeTopToolView() lazy var bottomToolView = runtime.makeBottomToolView() diff --git a/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift b/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift index 97fa982..dbb9444 100644 --- a/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift +++ b/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderContext.swift @@ -72,6 +72,11 @@ final class RDEPUBReaderContext { set { state.activeHighlights = newValue } } + var transientHighlights: [RDEPUBHighlight] { + get { state.transientHighlights } + set { state.transientHighlights = newValue } + } + var currentBookIdentifier: String? { get { state.currentBookIdentifier } set { state.currentBookIdentifier = newValue } diff --git a/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift b/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift index eefa79e..2aae87a 100644 --- a/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift +++ b/Sources/RDEpubReaderView/EPUBUI/ReaderController/RDEPUBReaderState.swift @@ -20,6 +20,9 @@ final class RDEPUBReaderState { var activeHighlights: [RDEPUBHighlight] = [] + // Session-only decorations (for search/AI focus) are never persisted. + var transientHighlights: [RDEPUBHighlight] = [] + var currentBookIdentifier: String? var paginationToken = UUID() diff --git a/Sources/RDEpubReaderView/RDEpubReaderView.podspec b/Sources/RDEpubReaderView/RDEpubReaderView.podspec index 92b3625..2fc0c07 100644 --- a/Sources/RDEpubReaderView/RDEpubReaderView.podspec +++ b/Sources/RDEpubReaderView/RDEpubReaderView.podspec @@ -11,7 +11,7 @@ Pod::Spec.new do |s| s.license = "MIT" # This podspec lives inside Sources/RDEpubReaderView, so paths must be # relative to this directory when it is consumed as a local pod. - s.source_files = "**/*.swift" + s.source_files = "{DocumentFormats,EPUBCore,EPUBTextRendering,EPUBUI,ReaderView}/**/*.swift" s.resource_bundles = { "RDEpubReaderViewAssets" => ["EPUBCore/Resources/**/*"] } @@ -19,4 +19,15 @@ Pod::Spec.new do |s| s.dependency "DTCoreText", "~> 1.6" s.dependency "SnapKit", "~> 5.7" s.requires_arc = true + + s.subspec "Speech" do |speech| + speech.source_files = "Speech/**/*.swift" + speech.dependency "RDSpeechReaderView", "~> 0.1" + end + + s.subspec "AI" do |ai| + ai.source_files = "AI/**/*.swift" + ai.dependency "RDAIReaderView/NaturalLanguage", "~> 0.1" + ai.dependency "RDAIReaderView/UI", "~> 0.1" + end end diff --git a/Sources/RDEpubReaderView/Speech/RDEPUBSpeechContentProvider.swift b/Sources/RDEpubReaderView/Speech/RDEPUBSpeechContentProvider.swift new file mode 100644 index 0000000..849669f --- /dev/null +++ b/Sources/RDEpubReaderView/Speech/RDEPUBSpeechContentProvider.swift @@ -0,0 +1,108 @@ +import Foundation +import RDSpeechReaderView + +/// EPUB/text-book adapter. Locations use an EPUB resource href plus a UTF-16 +/// offset, keeping saved speech progress independent of screen pagination. +@MainActor +public final class RDEPUBSpeechContentProvider: RDSpeechContentProvider { + private weak var controller: RDEPUBReaderController? + + public init(controller: RDEPUBReaderController) { + self.controller = controller + } + + public func speechBookDescriptor() -> RDSpeechBookDescriptor { + let identifier = controller?.currentLocation?.bookIdentifier + ?? controller?.currentBookIdentifier + ?? "rd-epub-reader" + return RDSpeechBookDescriptor(identifier: identifier, title: controller?.title ?? "") + } + + public func speechContentBatch( + startingAt location: RDSpeechLocation?, + limit: Int + ) async throws -> RDSpeechContentBatch { + guard let controller else { throw RDSpeechReaderError.invalidContentLocation } + let descriptor = speechBookDescriptor() + let chapters = readableChapters(from: controller) + guard !chapters.isEmpty else { throw RDSpeechReaderError.noReadableContent } + let startHref = location?.resourceIdentifier + let startOffset = location?.textOffset ?? 0 + let startIndex = startHref.flatMap { href in + chapters.firstIndex { $0.href == href } + } ?? 0 + var units: [RDSpeechTextUnit] = [] + + for chapter in chapters.dropFirst(startIndex) { + let chapterLocation = RDSpeechLocation( + bookIdentifier: descriptor.identifier, + resourceIdentifier: chapter.href + ) + let chapterUnits = RDSpeechTextPreprocessor.makeUnits( + text: chapter.text, + location: chapterLocation + ).filter { chapter.href != startHref || NSMaxRange($0.textRange) > startOffset } + + for unit in chapterUnits { + guard units.count < limit else { + return RDSpeechContentBatch(units: units, nextLocation: unit.location) + } + units.append(unit) + } + } + return RDSpeechContentBatch(units: units, nextLocation: nil) + } + + private func readableChapters(from controller: RDEPUBReaderController) -> [(href: String, text: String)] { + if let textBook = controller.textBook { + return textBook.chapters.map { (href: $0.href, text: $0.attributedContent.string) } + } + guard let publication = controller.publication, + let parser = controller.parser else { + return [] + } + return publication.spine.compactMap { item in + guard item.linear, + item.mediaType.contains("html") || item.mediaType.contains("xhtml"), + let html = parser.htmlString(forRelativePath: item.href) else { + return nil + } + let href = publication.resourceResolver.normalizedHref(item.href) ?? item.href + return (href: href, text: plainText(fromHTML: html, baseURL: parser.fileURL(forRelativePath: item.href)?.deletingLastPathComponent())) + } + } + + private func plainText(fromHTML html: String, baseURL: URL?) -> String { + guard let data = html.data(using: .utf8) else { + return fallbackPlainText(fromHTML: html) + } + var options: [NSAttributedString.DocumentReadingOptionKey: Any] = [ + .documentType: NSAttributedString.DocumentType.html, + .characterEncoding: String.Encoding.utf8.rawValue + ] + if let baseURL { + options[NSAttributedString.DocumentReadingOptionKey(rawValue: "NSBaseURLDocumentOption")] = baseURL + } + if let attributed = try? NSAttributedString(data: data, options: options, documentAttributes: nil) { + return attributed.string + } + return fallbackPlainText(fromHTML: html) + } + + private func fallbackPlainText(fromHTML html: String) -> String { + html + .replacingOccurrences(of: "<[^>]+>", with: " ", options: .regularExpression) + .replacingOccurrences(of: " ", with: " ") + .replacingOccurrences(of: "&", with: "&") + .replacingOccurrences(of: "<", with: "<") + .replacingOccurrences(of: ">", with: ">") + .replacingOccurrences(of: "'", with: "'") + .replacingOccurrences(of: """, with: "\"") + } +} + +public extension RDEPUBReaderController { + func makeSpeechContentProvider() -> RDEPUBSpeechContentProvider { + RDEPUBSpeechContentProvider(controller: self) + } +} diff --git a/Sources/RDPDFReaderView/AI/RDPDFAIContentProvider.swift b/Sources/RDPDFReaderView/AI/RDPDFAIContentProvider.swift new file mode 100644 index 0000000..b9a1aab --- /dev/null +++ b/Sources/RDPDFReaderView/AI/RDPDFAIContentProvider.swift @@ -0,0 +1,169 @@ +import CoreGraphics +import Foundation +import RDAIReaderView +import UIKit + +/// Bridges PDF text runs into RDAIReaderView without exposing PDF reader UI +/// types to the AI core. The reader remains the source of truth for native +/// text, OCR and page-level highlighting. +@MainActor +public final class RDPDFAIContentProvider: RDAIContentProvider { + private weak var reader: RDPDFReaderViewController? + private let book: RDPDFReaderBookDescriptor + private let extractionCoordinator = RDPDFAIExtractionCoordinator() + + init(reader: RDPDFReaderViewController) { + self.reader = reader + book = reader.pageProvider.readerBookDescriptor() + } + + public func aiDocumentDescriptor() -> RDAIDocumentDescriptor { + let identifier = RDAIDocumentIdentifier(rawValue: book.identifier) + return RDAIDocumentDescriptor( + identifier: identifier, + title: book.title, + format: .pdf, + contentRevision: RDAIContentHasher.hash("\(book.identifier)|\(book.totalPages)") + ) + } + + public func aiResources() async throws -> [RDAIResourceDescriptor] { + (0.. RDAIResourceSnapshot { + guard let reader, + let pageIndex = Int(identifier.rawValue), + pageIndex >= 0, + pageIndex < book.totalPages else { + throw RDAIError.resourceUnavailable(identifier) + } + let extraction = await extractionCoordinator.text(for: pageIndex, reader: reader) + let runs = extraction.runs.sorted { $0.readingOrder < $1.readingOrder } + let textSource = extraction.source + var sourceText = "" + var locatorRuns: [RDAILocatorRun] = [] + for run in runs where !run.text.isEmpty { + if !sourceText.isEmpty { sourceText.append("\n") } + let range = RDAITextRange(location: sourceText.utf16.count, length: run.text.utf16.count) + sourceText.append(run.text) + let source: RDAIPDFAnchor.TextSource = textSource == .ocr ? .ocr : .native + let anchor = RDAIPDFAnchor( + pageIndex: pageIndex, + rects: run.normalizedRects.map(RDAINormalizedRect.init), + textSource: source, + readingOrder: run.readingOrder + ) + locatorRuns.append(RDAILocatorRun(textRange: range, anchor: .pdf(anchor))) + } + let descriptor = RDAIResourceDescriptor( + identifier: identifier, + order: pageIndex, + estimatedUTF16Length: sourceText.utf16.count + ) + return RDAIResourceSnapshot( + descriptor: descriptor, + sourceText: sourceText, + sourceHash: RDAIContentHasher.hash(sourceText), + locatorRuns: locatorRuns + ) + } + + public func aiNavigate(to locator: RDAILocator, animated: Bool) async throws { + guard let reader, + case .pdf(let anchor) = locator.anchor else { + throw RDAIError.staleCitation + } + reader.showSpeechHighlight( + pageIndex: anchor.pageIndex, + normalizedRects: anchor.rects.map(\.cgRect), + animated: animated + ) + } + + public func aiShowCitationHighlight(_ citation: RDAICitation) async throws { + try await aiNavigate(to: citation.locator, animated: true) + } + + public func aiClearCitationHighlight() { + reader?.clearSpeechHighlight() + } +} + +private actor RDPDFAIExtractionCoordinator { + struct Result: Sendable { + let runs: [RDPDFReaderTextRun] + let source: RDPDFReaderAnnotationSource + } + + private var tasks: [Int: Task] = [:] + + func text(for pageIndex: Int, reader: RDPDFReaderViewController) async -> Result { + if let task = tasks[pageIndex] { return await task.value } + let task = Task { @MainActor [weak reader] in + guard let reader else { return Result(runs: [], source: .region) } + let runs = await reader.speechTextRuns(at: pageIndex) + let source = await reader.speechTextSource(at: pageIndex) + return Result(runs: runs, source: source) + } + tasks[pageIndex] = task + let result = await task.value + tasks.removeValue(forKey: pageIndex) + return result + } +} + +public extension RDPDFReaderViewController { + func aiCurrentReadScope() -> RDAIReadScope { + let page = currentPageIndex + let descriptor = pageProvider.readerBookDescriptor() + let locator = RDAILocator( + documentIdentifier: RDAIDocumentIdentifier(rawValue: descriptor.identifier), + resourceIdentifier: RDAIResourceIdentifier(rawValue: String(page)), + textRange: RDAITextRange(location: 0, length: Int.max), + anchor: .pdf(.init(pageIndex: page, rects: [], textSource: .native)), + sourceHash: "" + ) + return RDAIReadScope(upperBound: locator) + } + + func makeAIContentProvider() -> RDPDFAIContentProvider { + RDPDFAIContentProvider(reader: self) + } + + func makeAIReaderService( + generativeProvider: (any RDAIGenerativeProvider)? = nil, + configuration: RDAIReaderConfiguration = .default + ) -> RDAIReaderService { + RDAIReaderService( + contentProvider: makeAIContentProvider(), + analyzer: RDAINaturalLanguageAnalyzer(), + semanticScorer: RDAINaturalLanguageSemanticScorer(), + persistentStore: try? RDAISQLiteIndexStore(), + generativeProvider: generativeProvider, + configuration: configuration + ) + } + + func makeAIReaderAssistant(scope: RDAIReadScope) -> UIViewController { + UINavigationController(rootViewController: RDAIReaderAssistantViewController(service: makeAIReaderService(), scope: scope)) + } + + func makeAIReaderAssistant(scope: RDAIReadScope, generativeProvider: (any RDAIGenerativeProvider)?) -> UIViewController { + UINavigationController(rootViewController: RDAIReaderAssistantViewController(service: makeAIReaderService(generativeProvider: generativeProvider), scope: scope)) + } + + func makeAIReaderAssistant() -> UIViewController { makeAIReaderAssistant(scope: aiCurrentReadScope()) } +} + +private extension RDAINormalizedRect { + init(_ rect: CGRect) { + self.init(x: rect.origin.x, y: rect.origin.y, width: rect.width, height: rect.height) + } + + var cgRect: CGRect { + CGRect(x: x, y: y, width: width, height: height) + } +} diff --git a/Sources/RDPDFReaderView/RDPDFReaderView.podspec b/Sources/RDPDFReaderView/RDPDFReaderView.podspec index 836dd35..e8dc663 100644 --- a/Sources/RDPDFReaderView/RDPDFReaderView.podspec +++ b/Sources/RDPDFReaderView/RDPDFReaderView.podspec @@ -13,4 +13,15 @@ Pod::Spec.new do |s| s.dependency "SnapKit", "~> 5.7" s.frameworks = "Vision", "CoreImage", "PDFKit" s.requires_arc = true + + s.subspec "Speech" do |speech| + speech.source_files = "Speech/**/*.swift" + speech.dependency "RDSpeechReaderView", "~> 0.1" + end + + s.subspec "AI" do |ai| + ai.source_files = "AI/**/*.swift" + ai.dependency "RDAIReaderView/NaturalLanguage", "~> 0.1" + ai.dependency "RDAIReaderView/UI", "~> 0.1" + end end diff --git a/Sources/RDPDFReaderView/Sources/RDPDFReaderContracts.swift b/Sources/RDPDFReaderView/Sources/RDPDFReaderContracts.swift index c32cf0f..25d5a21 100644 --- a/Sources/RDPDFReaderView/Sources/RDPDFReaderContracts.swift +++ b/Sources/RDPDFReaderView/Sources/RDPDFReaderContracts.swift @@ -39,7 +39,7 @@ public struct RDPDFReaderPageDescriptor { /// 断行、双栏或 OCR 合并后的文字块。 /// /// 所有矩形均以页面图片左上角为原点,x/y/width/height 都是 0...1 的比例值。 -public struct RDPDFReaderTextRun: Equatable, Codable { +public struct RDPDFReaderTextRun: Equatable, Codable, Sendable { public let text: String public let normalizedRects: [CGRect] /// 页内阅读顺序。SDK 在相同页的文本选择中依此排序。 @@ -70,7 +70,7 @@ public struct RDPDFReaderTextRun: Equatable, Codable { } /// 标注的文字来源,用于让 UI 清楚地展示“宿主文本”“OCR”或“区域标注”的能力差异。 -public enum RDPDFReaderAnnotationSource: String, Codable, Equatable { +public enum RDPDFReaderAnnotationSource: String, Codable, Equatable, Sendable { /// 宿主直接提供的 PDF 解析文字坐标。 case text /// SDK 从页面图片识别出的 OCR 文字坐标。 diff --git a/Sources/RDPDFReaderView/Sources/RDPDFReaderImageTextLayerView.swift b/Sources/RDPDFReaderView/Sources/RDPDFReaderImageTextLayerView.swift index 97afbea..2097b3d 100644 --- a/Sources/RDPDFReaderView/Sources/RDPDFReaderImageTextLayerView.swift +++ b/Sources/RDPDFReaderView/Sources/RDPDFReaderImageTextLayerView.swift @@ -83,6 +83,11 @@ public final class RDPDFReaderImageTextLayerView: UIView, UIGestureRecognizerDel } } + /// 当前朗读句的临时高亮。它不参与点击、复制或持久化,避免与用户标注混淆。 + public var speechHighlightRects: [CGRect] = [] { + didSet { setNeedsDisplay() } + } + /// `textRuns` 的来源。主程序解析的文本使用 `.text`,SDK OCR 结果使用 `.ocr`。 /// 区域框选始终使用 `.region`,不会受此属性影响。 public var textSource: RDPDFReaderAnnotationSource = .text { @@ -203,6 +208,7 @@ public final class RDPDFReaderImageTextLayerView: UIView, UIGestureRecognizerDel context.clear(rect) currentPageAnnotations.forEach { draw(annotation: $0, in: context) } + drawSpeechHighlight(in: context) if let selectedSelection { draw(selection: selectedSelection, in: context) } @@ -220,6 +226,14 @@ public final class RDPDFReaderImageTextLayerView: UIView, UIGestureRecognizerDel selectedSelection = nil } + private func drawSpeechHighlight(in context: CGContext) { + guard !speechHighlightRects.isEmpty else { return } + context.setFillColor(UIColor(red: 0.18, green: 0.50, blue: 0.95, alpha: 0.24).cgColor) + for normalizedRect in speechHighlightRects.compactMap(clampedNormalizedRect) { + context.fill(contentRect(from: normalizedRect)) + } + } + /// 当前选区的外接矩形(本视图坐标),用于锚定选区操作菜单。 public func menuAnchorRect() -> CGRect? { guard let selection = selectedSelection else { return nil } diff --git a/Sources/RDPDFReaderView/Sources/RDPDFReaderPageView.swift b/Sources/RDPDFReaderView/Sources/RDPDFReaderPageView.swift index 80c331c..b6afab0 100644 --- a/Sources/RDPDFReaderView/Sources/RDPDFReaderPageView.swift +++ b/Sources/RDPDFReaderView/Sources/RDPDFReaderPageView.swift @@ -143,6 +143,11 @@ public final class RDPDFReaderPageView: UIView, RDPDFReaderPageInteractable, UIG updateAccessibilityViewport() } + /// Shows a non-persistent highlight while the speech engine reads text. + public func setSpeechHighlightRects(_ rects: [CGRect]) { + textLayer.speechHighlightRects = rects + } + public func configureDrawing( pageIndex: Int, document: RDPDFReaderDrawingDocument, diff --git a/Sources/RDPDFReaderView/Sources/RDPDFReaderViewController.swift b/Sources/RDPDFReaderView/Sources/RDPDFReaderViewController.swift index da8f458..4b06f75 100644 --- a/Sources/RDPDFReaderView/Sources/RDPDFReaderViewController.swift +++ b/Sources/RDPDFReaderView/Sources/RDPDFReaderViewController.swift @@ -40,6 +40,8 @@ public final class RDPDFReaderViewController: UIViewController, RDPDFReaderDataS public let annotationPersistence: RDPDFReaderAnnotationPersisting? public private(set) var configuration: Configuration + public var currentPageIndex: Int { max(0, readerView.currentPage) } + private let readerView = RDPDFReaderView() private let recognizer: RDPDFReaderImageTextRecognizer private let ocrDiskCache: RDPDFReaderTextRunDiskCache? @@ -50,6 +52,7 @@ public final class RDPDFReaderViewController: UIViewController, RDPDFReaderDataS private var recognizingPages = Set() /// 每页的逻辑请求标识。快速翻页取消旧请求后,迟到回调不能覆盖当前状态。 private var ocrRequestTokens: [Int: UUID] = [:] + private var speechHighlight: (pageIndex: Int, rects: [CGRect])? private var bookmarks = Set() private weak var topToolbar: RDPDFReaderKitTopToolView? private weak var bottomToolbar: RDPDFReaderKitBottomToolView? @@ -188,6 +191,63 @@ public final class RDPDFReaderViewController: UIViewController, RDPDFReaderDataS readerView.transitionToPage(pageNum: pageIndex, animated: animated) } + /// Returns native PDF text when available and otherwise performs the same + /// on-device OCR fallback used by the reader page. This keeps speech and + /// visual selection on one source of truth for scanned documents. + public func speechTextRuns(at pageIndex: Int) async -> [RDPDFReaderTextRun] { + guard pageIndex >= 0, pageIndex < book.totalPages else { return [] } + if let nativeRuns = pageDescriptors[pageIndex]?.textRuns, !nativeRuns.isEmpty { return nativeRuns } + if let cachedRuns = ocrRuns[pageIndex], !cachedRuns.isEmpty { return cachedRuns } + + let descriptor: RDPDFReaderPageDescriptor + if let cached = pageDescriptors[pageIndex] { + descriptor = cached + } else { + descriptor = await withCheckedContinuation { continuation in + pageProvider.readerPage(at: pageIndex) { continuation.resume(returning: $0) } + } + pageDescriptors[pageIndex] = descriptor + } + if let nativeRuns = descriptor.textRuns, !nativeRuns.isEmpty { return nativeRuns } + guard configuration.enablesOCR, let image = descriptor.image else { return [] } + + let runs = await withCheckedContinuation { continuation in + recognizer.recognizeTextRuns(in: image) { continuation.resume(returning: $0) } + } + guard !runs.isEmpty else { return [] } + ocrRuns[pageIndex] = runs + ocrDiskCache?.save(runs, pageIndex: pageIndex) + refreshVisiblePage(pageIndex) + return runs + } + + /// Reports whether readable text for a page came from the host/PDF source + /// or the reader's OCR fallback. AI citations retain this distinction so + /// callers can present OCR-derived facts with appropriate confidence. + public func speechTextSource(at pageIndex: Int) async -> RDPDFReaderAnnotationSource { + guard pageIndex >= 0, pageIndex < book.totalPages else { return configuration.missingTextSource } + if pageDescriptors[pageIndex]?.textRuns != nil { return .text } + _ = await speechTextRuns(at: pageIndex) + return pageDescriptors[pageIndex]?.textRuns != nil + ? .text + : (configuration.enablesOCR ? .ocr : configuration.missingTextSource) + } + + /// Updates the transient speech focus without creating a user annotation. + /// The caller supplies the same normalized coordinate system as text runs. + public func showSpeechHighlight(pageIndex: Int, normalizedRects: [CGRect], animated: Bool = true) { + guard pageIndex >= 0, pageIndex < book.totalPages else { return } + speechHighlight = normalizedRects.isEmpty ? nil : (pageIndex, normalizedRects) + goToPage(pageIndex, animated: animated) + refreshVisiblePage(pageIndex) + } + + public func clearSpeechHighlight() { + let highlightedPage = speechHighlight?.pageIndex + speechHighlight = nil + if let highlightedPage { refreshVisiblePage(highlightedPage) } + } + /// 首版画笔模式入口。横屏双页下左右内容页各自承载画布,笔迹严格裁剪在所属页内。 public func setDrawingMode(_ enabled: Bool) { guard isDrawingMode != enabled else { return } @@ -278,6 +338,7 @@ public final class RDPDFReaderViewController: UIViewController, RDPDFReaderDataS let runs = descriptor?.textRuns ?? ocrRuns[index] ?? [] let source: RDPDFReaderAnnotationSource = descriptor?.textRuns != nil ? .text : (configuration.enablesOCR ? .ocr : configuration.missingTextSource) page.configureTextLayer(pageIndex: index, textRuns: runs, textSource: source, annotations: annotations(for: index)) + page.setSpeechHighlightRects(speechHighlight?.pageIndex == index ? speechHighlight?.rects ?? [] : []) page.isDrawingSessionActive = isDrawingMode page.isDrawingMode = isDrawingMode && currentDrawingTool != nil page.configureDrawing( diff --git a/Sources/RDPDFReaderView/Speech/RDPDFSpeechContentProvider.swift b/Sources/RDPDFReaderView/Speech/RDPDFSpeechContentProvider.swift new file mode 100644 index 0000000..0596993 --- /dev/null +++ b/Sources/RDPDFReaderView/Speech/RDPDFSpeechContentProvider.swift @@ -0,0 +1,106 @@ +import Foundation +import RDSpeechReaderView + +/// Adapts host-supplied PDF text runs to the generic speech reader. It reads +/// native text when available; image-only PDF OCR remains owned by the PDF +/// reader's OCR pipeline and can be added without changing the core API. +@MainActor +public final class RDPDFSpeechContentProvider: RDSpeechContentProvider { + private let pageProvider: RDPDFReaderPageProvider + private let book: RDPDFReaderBookDescriptor + private weak var reader: RDPDFReaderViewController? + private var textRunsByPage: [Int: [RDPDFReaderTextRun]] = [:] + + public init(pageProvider: RDPDFReaderPageProvider) { + self.pageProvider = pageProvider + book = pageProvider.readerBookDescriptor() + } + + init(reader: RDPDFReaderViewController) { + self.reader = reader + pageProvider = reader.pageProvider + book = reader.pageProvider.readerBookDescriptor() + } + + public func speechBookDescriptor() -> RDSpeechBookDescriptor { + RDSpeechBookDescriptor(identifier: book.identifier, title: book.title) + } + + public func speechContentBatch( + startingAt location: RDSpeechLocation?, + limit: Int + ) async throws -> RDSpeechContentBatch { + let startPage = max(0, Int(location?.resourceIdentifier ?? "") ?? 0) + let startOffset = location?.textOffset ?? 0 + var units: [RDSpeechTextUnit] = [] + + for pageIndex in startPage.. startOffset } + + for unit in pageUnits { + guard units.count < limit else { + return RDSpeechContentBatch(units: units, nextLocation: unit.location) + } + units.append(unit) + } + } + return RDSpeechContentBatch(units: units, nextLocation: nil) + } + + /// Converts the current utterance range into page rectangles. A text run + /// may span several lines, so the first release highlights whole matching + /// runs; character-level rectangles can refine this later without changing + /// the speech controller API. + public func normalizedRects(for spokenRange: RDSpeechSpokenRange) -> [CGRect] { + guard let pageIndex = Int(spokenRange.unit.location.resourceIdentifier), + let runs = textRunsByPage[pageIndex] else { + return [] + } + let target = NSRange( + location: spokenRange.unit.textRange.location + spokenRange.range.location, + length: spokenRange.range.length + ) + var runStart = 0 + var rects: [CGRect] = [] + for run in runs { + let runLength = run.text.utf16.count + let runRange = NSRange(location: runStart, length: runLength) + if NSIntersectionRange(runRange, target).length > 0 { + rects.append(contentsOf: run.normalizedRects) + } + // The text provider joins runs with a newline before tokenizing. + runStart += runLength + 1 + } + return rects + } + + private func loadPage(at index: Int) async -> RDPDFReaderPageDescriptor { + await withCheckedContinuation { continuation in + pageProvider.readerPage(at: index) { page in + continuation.resume(returning: page) + } + } + } +} + +public extension RDPDFReaderViewController { + func makeSpeechContentProvider() -> RDPDFSpeechContentProvider { + RDPDFSpeechContentProvider(reader: self) + } +} diff --git a/Sources/RDPDFReaderView/Speech/RDPDFSpeechSession.swift b/Sources/RDPDFReaderView/Speech/RDPDFSpeechSession.swift new file mode 100644 index 0000000..2a03393 --- /dev/null +++ b/Sources/RDPDFReaderView/Speech/RDPDFSpeechSession.swift @@ -0,0 +1,59 @@ +import Foundation +import RDSpeechReaderView + +/// A ready-to-use PDF speech session. It owns the controller delegate so page +/// navigation and temporary sentence highlighting stay synchronized. +@MainActor +public final class RDPDFSpeechSession: NSObject, RDSpeechReaderControllerDelegate { + public let controller: RDSpeechReaderController + public let contentProvider: RDPDFSpeechContentProvider + public var onStateChange: ((RDSpeechReaderState) -> Void)? + + private weak var reader: RDPDFReaderViewController? + + init(reader: RDPDFReaderViewController, configuration: RDSpeechReaderConfiguration) { + self.reader = reader + contentProvider = reader.makeSpeechContentProvider() + controller = RDSpeechReaderController(contentProvider: contentProvider, configuration: configuration) + super.init() + controller.delegate = self + } + + public func start(from pageIndex: Int = 0) async throws { + let location = RDSpeechLocation( + bookIdentifier: contentProvider.speechBookDescriptor().identifier, + resourceIdentifier: String(max(0, pageIndex)) + ) + try await controller.start(from: location) + } + + public func pause() { controller.pause() } + public func resume() { controller.resume() } + + public func stop() { + controller.stop() + reader?.clearSpeechHighlight() + } + + public func speechReaderController(_ controller: RDSpeechReaderController, didChange state: RDSpeechReaderState) { + if case .finished = state { reader?.clearSpeechHighlight() } + if case .idle = state { reader?.clearSpeechHighlight() } + onStateChange?(state) + } + + public func speechReaderController(_ controller: RDSpeechReaderController, willSpeak range: RDSpeechSpokenRange) { + guard let pageIndex = Int(range.unit.location.resourceIdentifier) else { return } + reader?.showSpeechHighlight( + pageIndex: pageIndex, + normalizedRects: contentProvider.normalizedRects(for: range) + ) + } +} + +public extension RDPDFReaderViewController { + func makeSpeechSession( + configuration: RDSpeechReaderConfiguration = .default + ) -> RDPDFSpeechSession { + RDPDFSpeechSession(reader: self, configuration: configuration) + } +} diff --git a/Sources/RDSpeechReaderView/AIBridge/RDAISpeechContentProvider.swift b/Sources/RDSpeechReaderView/AIBridge/RDAISpeechContentProvider.swift new file mode 100644 index 0000000..c75076b --- /dev/null +++ b/Sources/RDSpeechReaderView/AIBridge/RDAISpeechContentProvider.swift @@ -0,0 +1,34 @@ +import Foundation +import RDAIReaderView + +/// Temporary speech content for an AI answer or summary. It deliberately uses +/// an in-memory identifier and disables progress persistence by default. +@MainActor +public final class RDAISpeechContentProvider: RDSpeechContentProvider { + private let descriptor: RDSpeechBookDescriptor + private let units: [RDSpeechTextUnit] + + public init(title: String, text: String, language: String? = nil) { + let identifier = "rdai-speech-\(UUID().uuidString)" + descriptor = RDSpeechBookDescriptor(identifier: identifier, title: title) + let location = RDSpeechLocation(bookIdentifier: identifier, resourceIdentifier: "ai-result") + units = RDSpeechTextPreprocessor.makeUnits(text: text, location: location, language: language) + } + + public func speechBookDescriptor() -> RDSpeechBookDescriptor { descriptor } + + public func speechContentBatch(startingAt location: RDSpeechLocation?, limit: Int) async throws -> RDSpeechContentBatch { + let start = location.flatMap { requested in units.firstIndex { $0.location.textOffset >= requested.textOffset } } ?? 0 + let batch = Array(units.dropFirst(start).prefix(max(1, limit))) + let nextIndex = start + batch.count + return RDSpeechContentBatch(units: batch, nextLocation: nextIndex < units.count ? units[nextIndex].location : nil) + } +} + +@MainActor +public extension RDSpeechReaderController { + convenience init(aiTitle: String, text: String, language: String? = nil, configuration: RDSpeechReaderConfiguration = .default) { + let provider = RDAISpeechContentProvider(title: aiTitle, text: text, language: language) + self.init(contentProvider: provider, configuration: configuration, progressStore: nil) + } +} diff --git a/Sources/RDSpeechReaderView/RDSpeechReaderView.podspec b/Sources/RDSpeechReaderView/RDSpeechReaderView.podspec new file mode 100644 index 0000000..7990810 --- /dev/null +++ b/Sources/RDSpeechReaderView/RDSpeechReaderView.podspec @@ -0,0 +1,20 @@ +Pod::Spec.new do |s| + s.name = "RDSpeechReaderView" + s.module_name = "RDSpeechReaderView" + s.version = "0.1.0" + s.summary = "Text-to-speech playback primitives for ReadViewSDK readers" + s.platform = :ios, "15.0" + s.swift_versions = ["5.10"] + s.homepage = "https://example.invalid/RDSpeechReaderView" + s.author = { "readoor" => "ios@touchread.com" } + s.source = { :path => "." } + s.license = "MIT" + s.source_files = "Sources/*.swift" + s.frameworks = "AVFAudio", "NaturalLanguage", "MediaPlayer" + s.requires_arc = true + + s.subspec "AI" do |ai| + ai.source_files = "AIBridge/**/*.swift" + ai.dependency "RDAIReaderView/Core", "~> 0.1" + end +end diff --git a/Sources/RDSpeechReaderView/README.md b/Sources/RDSpeechReaderView/README.md new file mode 100644 index 0000000..184d4f4 --- /dev/null +++ b/Sources/RDSpeechReaderView/README.md @@ -0,0 +1,46 @@ +# RDSpeechReaderView + +`RDSpeechReaderView` provides bounded, on-device text-to-speech playback for +ReadViewSDK readers. It uses `AVSpeechSynthesizer` and does not upload book +content or create exportable audio files. + +## Install + +```ruby +pod 'RDSpeechReaderView' +pod 'RDPDFReaderView/Speech' +pod 'RDEpubReaderView/Speech' +``` + +The host app must enable the **Audio, AirPlay, and Picture in Picture** +background mode to continue reading after it enters the background. + +## Use with PDF + +```swift +let provider = reader.makeSpeechContentProvider() +let speech = RDSpeechReaderController(contentProvider: provider) +try await speech.start() +``` + +The PDF adapter reads `RDPDFReaderTextRun` values supplied by the host or by +PDFKit. Image-only PDFs require an OCR-backed provider before they can speak. + +For automatic page navigation and temporary read-aloud highlighting, create a +PDF session instead: + +```swift +let session = reader.makeSpeechSession() +try await session.start(from: 0) +``` + +## Use with EPUB + +```swift +let provider = reader.makeSpeechContentProvider() +let speech = RDSpeechReaderController(contentProvider: provider) +try await speech.start(from: nil) +``` + +Speech locations use EPUB `href` plus a UTF-16 text offset. They remain stable +when the user changes fonts or page size, unlike screen page numbers. diff --git a/Sources/RDSpeechReaderView/Sources/RDSpeechReaderContracts.swift b/Sources/RDSpeechReaderView/Sources/RDSpeechReaderContracts.swift new file mode 100644 index 0000000..206f312 --- /dev/null +++ b/Sources/RDSpeechReaderView/Sources/RDSpeechReaderContracts.swift @@ -0,0 +1,199 @@ +import Foundation +import AVFAudio + +/// A stable position in a book. The reader-specific adapter owns the mapping +/// between this value and its own pagination or document location model. +public struct RDSpeechLocation: Codable, Equatable, Hashable, Sendable { + public var bookIdentifier: String + public var resourceIdentifier: String + public var textOffset: Int + public var anchor: String? + + public init( + bookIdentifier: String, + resourceIdentifier: String, + textOffset: Int = 0, + anchor: String? = nil + ) { + self.bookIdentifier = bookIdentifier + self.resourceIdentifier = resourceIdentifier + self.textOffset = max(0, textOffset) + self.anchor = anchor + } +} + +public struct RDSpeechBookDescriptor: Equatable, Sendable { + public let identifier: String + public let title: String + + public init(identifier: String, title: String) { + self.identifier = identifier + self.title = title + } +} + +/// A text unit is normally one sentence. `textRange` is expressed in UTF-16 +/// offsets within the resource identified by `location`. +public struct RDSpeechTextUnit: Equatable, Sendable, Identifiable { + public let id: String + public let text: String + public let location: RDSpeechLocation + public let textRange: NSRange + public let language: String? + + public init( + id: String = UUID().uuidString, + text: String, + location: RDSpeechLocation, + textRange: NSRange, + language: String? = nil + ) { + self.id = id + self.text = text + self.location = location + self.textRange = textRange + self.language = language + } +} + +/// A bounded result keeps long books from being loaded into the speech queue +/// all at once. `nextLocation` is nil after the final readable unit. +public struct RDSpeechContentBatch: Sendable { + public let units: [RDSpeechTextUnit] + public let nextLocation: RDSpeechLocation? + + public init(units: [RDSpeechTextUnit], nextLocation: RDSpeechLocation?) { + self.units = units + self.nextLocation = nextLocation + } +} + +@MainActor +public protocol RDSpeechContentProvider: AnyObject { + func speechBookDescriptor() -> RDSpeechBookDescriptor + func speechContentBatch( + startingAt location: RDSpeechLocation?, + limit: Int + ) async throws -> RDSpeechContentBatch +} + +public enum RDSpeechReaderState: Equatable, Sendable { + case idle + case preparing + case speaking(RDSpeechLocation) + case paused(RDSpeechLocation) + case finished + case failed(String) +} + +public struct RDSpeechSpokenRange: Equatable, Sendable { + public let unit: RDSpeechTextUnit + /// UTF-16 range relative to `unit.text`. + public let range: NSRange + + public init(unit: RDSpeechTextUnit, range: NSRange) { + self.unit = unit + self.range = range + } +} + +@MainActor +public protocol RDSpeechReaderControllerDelegate: AnyObject { + func speechReaderController(_ controller: RDSpeechReaderController, didChange state: RDSpeechReaderState) + func speechReaderController(_ controller: RDSpeechReaderController, willSpeak range: RDSpeechSpokenRange) +} + +public extension RDSpeechReaderControllerDelegate { + func speechReaderController(_ controller: RDSpeechReaderController, didChange state: RDSpeechReaderState) {} + func speechReaderController(_ controller: RDSpeechReaderController, willSpeak range: RDSpeechSpokenRange) {} +} + +public struct RDSpeechReaderConfiguration: Sendable { + public var rate: Float + public var voiceIdentifier: String? + public var defaultLanguage: String + public var batchSize: Int + public var configuresAudioSession: Bool + public var ducksOtherAudio: Bool + public var enablesRemoteControls: Bool + + public init( + rate: Float = 0.48, + voiceIdentifier: String? = nil, + defaultLanguage: String = "zh-CN", + batchSize: Int = 24, + configuresAudioSession: Bool = true, + ducksOtherAudio: Bool = false, + enablesRemoteControls: Bool = true + ) { + self.rate = min(max(rate, 0.0), 1.0) + self.voiceIdentifier = voiceIdentifier + self.defaultLanguage = defaultLanguage + self.batchSize = max(1, batchSize) + self.configuresAudioSession = configuresAudioSession + self.ducksOtherAudio = ducksOtherAudio + self.enablesRemoteControls = enablesRemoteControls + } + + public static let `default` = RDSpeechReaderConfiguration() +} + +/// Stores only the book identifier and reading location. Book text is never +/// persisted by the speech framework. +public protocol RDSpeechProgressPersisting: AnyObject { + func restoreSpeechLocation(for bookIdentifier: String) -> RDSpeechLocation? + func saveSpeechLocation(_ location: RDSpeechLocation, for bookIdentifier: String) + func clearSpeechLocation(for bookIdentifier: String) +} + +public final class RDSpeechUserDefaultsProgressStore: RDSpeechProgressPersisting { + private let defaults: UserDefaults + private let keyPrefix: String + + public init(defaults: UserDefaults = .standard, keyPrefix: String = "com.readoor.rdspeech.progress.") { + self.defaults = defaults + self.keyPrefix = keyPrefix + } + + public func restoreSpeechLocation(for bookIdentifier: String) -> RDSpeechLocation? { + guard let data = defaults.data(forKey: key(for: bookIdentifier)) else { return nil } + return try? JSONDecoder().decode(RDSpeechLocation.self, from: data) + } + + public func saveSpeechLocation(_ location: RDSpeechLocation, for bookIdentifier: String) { + guard let data = try? JSONEncoder().encode(location) else { return } + defaults.set(data, forKey: key(for: bookIdentifier)) + } + + public func clearSpeechLocation(for bookIdentifier: String) { + defaults.removeObject(forKey: key(for: bookIdentifier)) + } + + private func key(for bookIdentifier: String) -> String { keyPrefix + bookIdentifier } +} + +public struct RDSpeechVoice: Equatable, Sendable, Identifiable { + public let id: String + public let name: String + public let language: String + + public init(voice: AVSpeechSynthesisVoice) { + id = voice.identifier + name = voice.name + language = voice.language + } +} + +public enum RDSpeechReaderError: LocalizedError, Equatable { + case noReadableContent + case invalidContentLocation + + public var errorDescription: String? { + switch self { + case .noReadableContent: + return "The selected content has no readable text." + case .invalidContentLocation: + return "The selected speech location is no longer available." + } + } +} diff --git a/Sources/RDSpeechReaderView/Sources/RDSpeechReaderControlView.swift b/Sources/RDSpeechReaderView/Sources/RDSpeechReaderControlView.swift new file mode 100644 index 0000000..b9c7651 --- /dev/null +++ b/Sources/RDSpeechReaderView/Sources/RDSpeechReaderControlView.swift @@ -0,0 +1,106 @@ +import UIKit + +/// A small host-owned control strip. It deliberately exposes actions as +/// closures so reader-specific sessions can keep navigation and highlights in +/// sync without coupling this view to a document format. +public final class RDSpeechReaderControlView: UIView { + public var onTogglePlayback: (() -> Void)? + public var onStop: (() -> Void)? + public var onChangeRate: (() -> Void)? + public var onPreviousSentence: (() -> Void)? + public var onNextSentence: (() -> Void)? + + private let previousButton = UIButton(type: .system) + private let playPauseButton = UIButton(type: .system) + private let nextButton = UIButton(type: .system) + private let stopButton = UIButton(type: .system) + private let rateButton = UIButton(type: .system) + + public override init(frame: CGRect) { + super.init(frame: frame) + backgroundColor = UIColor.secondarySystemBackground.withAlphaComponent(0.96) + layer.cornerRadius = 18 + layer.cornerCurve = .continuous + layer.shadowColor = UIColor.black.cgColor + layer.shadowOpacity = 0.12 + layer.shadowRadius = 10 + layer.shadowOffset = CGSize(width: 0, height: 4) + + let stack = UIStackView(arrangedSubviews: [previousButton, playPauseButton, nextButton, stopButton, rateButton]) + stack.axis = .horizontal + stack.alignment = .center + stack.spacing = 4 + addSubview(stack) + stack.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + stack.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 8), + stack.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -8), + stack.topAnchor.constraint(equalTo: topAnchor, constant: 6), + stack.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -6) + ]) + + configure(previousButton, identifier: "rd.speech.previous") + configure(playPauseButton, identifier: "rd.speech.playPause") + configure(nextButton, identifier: "rd.speech.next") + configure(stopButton, identifier: "rd.speech.stop") + configure(rateButton, identifier: "rd.speech.rate") + previousButton.setImage(UIImage(systemName: "backward.fill"), for: .normal) + nextButton.setImage(UIImage(systemName: "forward.fill"), for: .normal) + stopButton.setImage(UIImage(systemName: "stop.fill"), for: .normal) + rateButton.titleLabel?.font = .monospacedDigitSystemFont(ofSize: 13, weight: .semibold) + previousButton.addTarget(self, action: #selector(previousSentence), for: .touchUpInside) + playPauseButton.addTarget(self, action: #selector(togglePlayback), for: .touchUpInside) + nextButton.addTarget(self, action: #selector(nextSentence), for: .touchUpInside) + stopButton.addTarget(self, action: #selector(stop), for: .touchUpInside) + rateButton.addTarget(self, action: #selector(changeRate), for: .touchUpInside) + update(state: .idle, rate: 0.48) + } + + public required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } + + public func update(state: RDSpeechReaderState, rate: Float) { + let isPaused: Bool + switch state { + case .speaking: + isPaused = false + playPauseButton.setImage(UIImage(systemName: "pause.fill"), for: .normal) + playPauseButton.accessibilityLabel = "暂停朗读" + case .paused: + isPaused = true + playPauseButton.setImage(UIImage(systemName: "play.fill"), for: .normal) + playPauseButton.accessibilityLabel = "继续朗读" + default: + isPaused = false + playPauseButton.setImage(UIImage(systemName: "play.fill"), for: .normal) + playPauseButton.accessibilityLabel = "开始朗读" + } + stopButton.isEnabled = isPaused || state.isActive + previousButton.isEnabled = state.isActive + nextButton.isEnabled = state.isActive + rateButton.setTitle(String(format: "%.2gx", rate), for: .normal) + } + + private func configure(_ button: UIButton, identifier: String) { + button.tintColor = .label + button.accessibilityIdentifier = identifier + button.widthAnchor.constraint(equalToConstant: 42).isActive = true + button.heightAnchor.constraint(equalToConstant: 36).isActive = true + } + + @objc private func togglePlayback() { onTogglePlayback?() } + @objc private func previousSentence() { onPreviousSentence?() } + @objc private func nextSentence() { onNextSentence?() } + @objc private func stop() { onStop?() } + @objc private func changeRate() { onChangeRate?() } +} + +private extension RDSpeechReaderState { + var isActive: Bool { + switch self { + case .preparing, .speaking, .paused: + return true + case .idle, .finished, .failed: + return false + } + } +} diff --git a/Sources/RDSpeechReaderView/Sources/RDSpeechReaderController.swift b/Sources/RDSpeechReaderView/Sources/RDSpeechReaderController.swift new file mode 100644 index 0000000..fc0db82 --- /dev/null +++ b/Sources/RDSpeechReaderView/Sources/RDSpeechReaderController.swift @@ -0,0 +1,381 @@ +import AVFAudio +import Foundation +import MediaPlayer + +@MainActor +public final class RDSpeechReaderController: NSObject { + public weak var delegate: RDSpeechReaderControllerDelegate? + public private(set) var state: RDSpeechReaderState = .idle { + didSet { + updateNowPlayingInfo() + delegate?.speechReaderController(self, didChange: state) + } + } + public private(set) var configuration: RDSpeechReaderConfiguration + + private let contentProvider: RDSpeechContentProvider + private let progressStore: RDSpeechProgressPersisting? + private let synthesizer = AVSpeechSynthesizer() + private var currentUnit: RDSpeechTextUnit? + private var queuedUnits: [RDSpeechTextUnit] = [] + private var completedUnits: [RDSpeechTextUnit] = [] + private var nextLocation: RDSpeechLocation? + private var isLoadingBatch = false + private var isStopping = false + private var shouldResumeAfterInterruption = false + private var sleepTimerTask: Task? + private var notificationTokens: [NSObjectProtocol] = [] + + public init( + contentProvider: RDSpeechContentProvider, + configuration: RDSpeechReaderConfiguration = .default, + progressStore: RDSpeechProgressPersisting? = RDSpeechUserDefaultsProgressStore() + ) { + self.contentProvider = contentProvider + self.configuration = configuration + self.progressStore = progressStore + super.init() + synthesizer.delegate = self + installAudioObservers() + if configuration.enablesRemoteControls { installRemoteControls() } + } + + deinit { + notificationTokens.forEach(NotificationCenter.default.removeObserver) + MPRemoteCommandCenter.shared().playCommand.removeTarget(nil) + MPRemoteCommandCenter.shared().pauseCommand.removeTarget(nil) + MPRemoteCommandCenter.shared().togglePlayPauseCommand.removeTarget(nil) + MPRemoteCommandCenter.shared().nextTrackCommand.removeTarget(nil) + MPRemoteCommandCenter.shared().previousTrackCommand.removeTarget(nil) + } + + public func start(from location: RDSpeechLocation? = nil) async throws { + stop(clearProgress: false) + isStopping = false + completedUnits.removeAll() + state = .preparing + do { + if configuration.configuresAudioSession { try configureAudioSession() } + let initialLocation = location ?? progressStore?.restoreSpeechLocation(for: contentProvider.speechBookDescriptor().identifier) + try await loadBatch(startingAt: initialLocation, requiresContent: true) + try await speakNextUnit() + } catch { + state = .failed(error.localizedDescription) + throw error + } + } + + public func pause() { + guard synthesizer.isSpeaking else { return } + synthesizer.pauseSpeaking(at: .word) + } + + public func resume() { + guard synthesizer.isPaused else { return } + synthesizer.continueSpeaking() + } + + public func stop() { stop(clearProgress: false) } + + public func stop(clearProgress: Bool) { + isStopping = true + synthesizer.stopSpeaking(at: .immediate) + currentUnit = nil + queuedUnits.removeAll() + nextLocation = nil + isLoadingBatch = false + sleepTimerTask?.cancel() + sleepTimerTask = nil + if clearProgress { progressStore?.clearSpeechLocation(for: contentProvider.speechBookDescriptor().identifier) } + state = .idle + } + + public func skipToNextSentence() { + guard state.isActive else { return } + stopCurrentUtteranceForNavigation() + Task { [weak self] in + guard let self else { return } + do { try await self.speakNextUnit() } + catch { self.state = .failed(error.localizedDescription) } + } + } + + public func skipToPreviousSentence() { + guard state.isActive else { return } + let current = currentUnit + let previous = completedUnits.popLast() ?? current + guard let previous else { return } + if let current, previous.id != current.id { queuedUnits.insert(current, at: 0) } + stopCurrentUtteranceForNavigation() + currentUnit = previous + speak(previous) + } + + /// Restarts the current sentence so a changed rate takes effect immediately. + public func updateRate(_ rate: Float) { + configuration.rate = min(max(rate, 0.0), 1.0) + restartCurrentUnitIfNeeded() + } + + /// Restarts the current sentence so a changed voice takes effect immediately. + public func updateVoice(identifier: String?) { + configuration.voiceIdentifier = identifier + restartCurrentUnitIfNeeded() + } + + public func availableVoices(languagePrefix: String? = nil) -> [RDSpeechVoice] { + AVSpeechSynthesisVoice.speechVoices() + .filter { voice in languagePrefix.map { voice.language.hasPrefix($0) } ?? true } + .map(RDSpeechVoice.init) + .sorted { $0.name.localizedCaseInsensitiveCompare($1.name) == .orderedAscending } + } + + public func setSleepTimer(after interval: TimeInterval?) { + sleepTimerTask?.cancel() + guard let interval, interval > 0 else { + sleepTimerTask = nil + return + } + sleepTimerTask = Task { [weak self] in + try? await Task.sleep(nanoseconds: UInt64(interval * 1_000_000_000)) + guard !Task.isCancelled else { return } + self?.stop() + } + } + + private func loadBatch(startingAt location: RDSpeechLocation?, requiresContent: Bool) async throws { + guard !isLoadingBatch, !isStopping else { return } + isLoadingBatch = true + defer { isLoadingBatch = false } + var requestedLocation = location + var mustContainContent = requiresContent + while !isStopping { + let batch = try await contentProvider.speechContentBatch( + startingAt: requestedLocation, + limit: configuration.batchSize + ) + guard !isStopping else { return } + if !batch.units.isEmpty { + queuedUnits.append(contentsOf: batch.units) + nextLocation = batch.nextLocation + return + } + guard let next = batch.nextLocation else { + if mustContainContent { throw RDSpeechReaderError.noReadableContent } + state = .finished + progressStore?.clearSpeechLocation(for: contentProvider.speechBookDescriptor().identifier) + return + } + requestedLocation = next + mustContainContent = false + } + } + + private func speakNextUnit() async throws { + guard !isStopping else { return } + if queuedUnits.isEmpty, let nextLocation { + try await loadBatch(startingAt: nextLocation, requiresContent: false) + } + guard !isStopping else { return } + guard !queuedUnits.isEmpty else { + if state != .finished { + state = .finished + progressStore?.clearSpeechLocation(for: contentProvider.speechBookDescriptor().identifier) + } + return + } + let unit = queuedUnits.removeFirst() + currentUnit = unit + speak(unit) + } + + private func speak(_ unit: RDSpeechTextUnit) { + let utterance = AVSpeechUtterance(string: unit.text) + utterance.rate = configuration.rate + utterance.voice = resolvedVoice(for: unit) + synthesizer.speak(utterance) + } + + private func restartCurrentUnitIfNeeded() { + guard let currentUnit, state.isActive else { return } + let wasPaused = synthesizer.isPaused + stopCurrentUtteranceForNavigation() + self.currentUnit = currentUnit + speak(currentUnit) + if wasPaused { synthesizer.pauseSpeaking(at: .immediate) } + } + + private func stopCurrentUtteranceForNavigation() { + isStopping = true + synthesizer.stopSpeaking(at: .immediate) + isStopping = false + } + + private func resolvedVoice(for unit: RDSpeechTextUnit) -> AVSpeechSynthesisVoice? { + if let identifier = configuration.voiceIdentifier, + let voice = AVSpeechSynthesisVoice(identifier: identifier) { + return voice + } + return AVSpeechSynthesisVoice(language: unit.language ?? configuration.defaultLanguage) + ?? AVSpeechSynthesisVoice(language: configuration.defaultLanguage) + } + + private func configureAudioSession() throws { + let session = AVAudioSession.sharedInstance() + var options: AVAudioSession.CategoryOptions = [] + if configuration.ducksOtherAudio { options.insert(.duckOthers) } + try session.setCategory(.playback, mode: .spokenAudio, options: options) + try session.setActive(true, options: []) + } + + private func installAudioObservers() { + let center = NotificationCenter.default + notificationTokens.append(center.addObserver( + forName: AVAudioSession.interruptionNotification, + object: AVAudioSession.sharedInstance(), + queue: .main + ) { [weak self] notification in + let typeValue = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? UInt ?? 0 + guard let type = AVAudioSession.InterruptionType(rawValue: typeValue) else { return } + Task { @MainActor [weak self] in + guard let self else { return } + if type == .began { + self.shouldResumeAfterInterruption = self.state.isSpeaking + self.pause() + } else if self.shouldResumeAfterInterruption { + self.shouldResumeAfterInterruption = false + self.resume() + } + } + }) + notificationTokens.append(center.addObserver( + forName: AVAudioSession.routeChangeNotification, + object: AVAudioSession.sharedInstance(), + queue: .main + ) { [weak self] notification in + guard let rawValue = notification.userInfo?[AVAudioSessionRouteChangeReasonKey] as? UInt, + AVAudioSession.RouteChangeReason(rawValue: rawValue) == .oldDeviceUnavailable else { return } + Task { @MainActor [weak self] in self?.pause() } + }) + } + + private func installRemoteControls() { + let commands = MPRemoteCommandCenter.shared() + commands.playCommand.isEnabled = true + commands.pauseCommand.isEnabled = true + commands.togglePlayPauseCommand.isEnabled = true + commands.nextTrackCommand.isEnabled = true + commands.previousTrackCommand.isEnabled = true + commands.playCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.resume() } + return .success + } + commands.pauseCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.pause() } + return .success + } + commands.togglePlayPauseCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in + guard let self else { return } + self.synthesizer.isPaused ? self.resume() : self.pause() + } + return .success + } + commands.nextTrackCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.skipToNextSentence() } + return .success + } + commands.previousTrackCommand.addTarget { [weak self] _ in + Task { @MainActor [weak self] in self?.skipToPreviousSentence() } + return .success + } + } + + private func updateNowPlayingInfo() { + guard configuration.enablesRemoteControls else { return } + let book = contentProvider.speechBookDescriptor() + var info: [String: Any] = [ + MPMediaItemPropertyTitle: book.title, + MPMediaItemPropertyArtist: "ReadViewSDK" + ] + info[MPNowPlayingInfoPropertyPlaybackRate] = state.isSpeaking ? 1.0 : 0.0 + MPNowPlayingInfoCenter.default().nowPlayingInfo = info + } +} + +extension RDSpeechReaderController: AVSpeechSynthesizerDelegate { + public nonisolated func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didStart utterance: AVSpeechUtterance) { + Task { @MainActor [weak self] in self?.handleDidStart() } + } + + public nonisolated func speechSynthesizer( + _ synthesizer: AVSpeechSynthesizer, + willSpeakRangeOfSpeechString characterRange: NSRange, + utterance: AVSpeechUtterance + ) { + Task { @MainActor [weak self, characterRange] in self?.handleWillSpeak(characterRange) } + } + + public nonisolated func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didPause utterance: AVSpeechUtterance) { + Task { @MainActor [weak self] in self?.handleDidPause() } + } + + public nonisolated func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didContinue utterance: AVSpeechUtterance) { + Task { @MainActor [weak self] in self?.handleDidContinue() } + } + + public nonisolated func speechSynthesizer(_ synthesizer: AVSpeechSynthesizer, didFinish utterance: AVSpeechUtterance) { + Task { @MainActor [weak self] in self?.handleDidFinish() } + } +} + +private extension RDSpeechReaderController { + func handleDidStart() { + guard let currentUnit else { return } + progressStore?.saveSpeechLocation(currentUnit.location, for: contentProvider.speechBookDescriptor().identifier) + state = .speaking(currentUnit.location) + } + + func handleWillSpeak(_ characterRange: NSRange) { + guard let currentUnit else { return } + var location = currentUnit.location + location.textOffset = currentUnit.textRange.location + characterRange.location + progressStore?.saveSpeechLocation(location, for: contentProvider.speechBookDescriptor().identifier) + delegate?.speechReaderController(self, willSpeak: RDSpeechSpokenRange(unit: currentUnit, range: characterRange)) + } + + func handleDidPause() { + guard let currentUnit else { return } + state = .paused(currentUnit.location) + } + + func handleDidContinue() { + guard let currentUnit else { return } + state = .speaking(currentUnit.location) + } + + func handleDidFinish() { + guard !isStopping, let finished = currentUnit else { return } + completedUnits.append(finished) + currentUnit = nil + Task { [weak self] in + guard let self else { return } + do { try await self.speakNextUnit() } + catch { self.state = .failed(error.localizedDescription) } + } + } +} + +private extension RDSpeechReaderState { + var isActive: Bool { + switch self { + case .preparing, .speaking, .paused: return true + case .idle, .finished, .failed: return false + } + } + + var isSpeaking: Bool { + if case .speaking = self { return true } + return false + } +} diff --git a/Sources/RDSpeechReaderView/Sources/RDSpeechTextPreprocessor.swift b/Sources/RDSpeechReaderView/Sources/RDSpeechTextPreprocessor.swift new file mode 100644 index 0000000..ec70d12 --- /dev/null +++ b/Sources/RDSpeechReaderView/Sources/RDSpeechTextPreprocessor.swift @@ -0,0 +1,71 @@ +import Foundation +import NaturalLanguage + +public enum RDSpeechTextPreprocessor { + /// Splits one resource into sentence-sized units while preserving UTF-16 + /// offsets, so adapters can map speech progress back to their reader UI. + public static func makeUnits( + text: String, + location: RDSpeechLocation, + language: String? = nil + ) -> [RDSpeechTextUnit] { + // Keep the source text unchanged here. Reader adapters use UTF-16 + // offsets to drive their highlights, so whitespace normalization would + // make the returned ranges drift away from the rendered document. + let source = text + guard !source.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { return [] } + + let resolvedLanguage = language ?? detectLanguage(in: source) + let tokenizer = NLTokenizer(unit: .sentence) + tokenizer.string = source + let fullRange = source.startIndex.. String { + text + .replacingOccurrences(of: "\\u{00A0}", with: " ") + .replacingOccurrences(of: "\\r\\n", with: "\\n") + .replacingOccurrences(of: "\\r", with: "\\n") + .replacingOccurrences(of: "[\\t ]+", with: " ", options: .regularExpression) + .replacingOccurrences(of: " *\\n *", with: "\\n", options: .regularExpression) + .trimmingCharacters(in: .whitespacesAndNewlines) + } + + private static func detectLanguage(in text: String) -> String? { + let recognizer = NLLanguageRecognizer() + recognizer.processString(text) + return recognizer.dominantLanguage?.rawValue + } +}