<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Chfychin🍉</title>
  
  
  <link href="http://265832.xyz/atom.xml" rel="self"/>
  
  <link href="http://265832.xyz/"/>
  <updated>2026-11-06T15:10:30.000Z</updated>
  <id>http://265832.xyz/</id>
  
  <author>
    <name>chfychin🍉</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Linux系统git代理与pip换源</title>
    <link href="http://265832.xyz/posts/7386673f.html"/>
    <id>http://265832.xyz/posts/7386673f.html</id>
    <published>2026-11-06T14:56:34.000Z</published>
    <updated>2026-11-06T15:10:30.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、配置-git-代理">一、配置 git 代理</h1><h2 id="1-确认当前环境">1.确认当前环境</h2><p>Ubuntu/Debian: <code>sudo apt install socat</code></p><p>如果安装失败，在终端依次运行以下命令，看看输出：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">whoami</span></span><br><span class="line"><span class="built_in">which</span> apt apt-get yum dnf apk conda</span><br></pre></td></tr></table></figure><p>如果 whoami 输出 root：直接去掉 sudo 执行安装命令即可：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">apt install socat</span><br><span class="line"><span class="comment"># 或</span></span><br><span class="line">apt-get update &amp;&amp; apt-get install -y socat</span><br></pre></td></tr></table></figure><h2 id="2-如果-apt-可用且你是-root">2.如果 apt 可用且你是 root</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apt-get update</span><br><span class="line">apt-get install -y socat</span><br></pre></td></tr></table></figure><h2 id="3-修改config文件">3.修改config文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">PROXY_HOST=127.0.0.1</span><br><span class="line">PROXY_PORT=7890</span><br><span class="line"></span><br><span class="line">SOCAT_BIN=<span class="string">&quot;<span class="subst">$(command -v socat)</span>&quot;</span></span><br><span class="line"><span class="built_in">test</span> -n <span class="string">&quot;<span class="variable">$SOCAT_BIN</span>&quot;</span> || &#123; <span class="built_in">echo</span> <span class="string">&quot;没有 socat，别用方案A&quot;</span>; <span class="built_in">exit</span> 1; &#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &gt; ~/.ssh/config &lt;&lt;<span class="string">EOF</span></span><br><span class="line"><span class="string">Host github.com</span></span><br><span class="line"><span class="string">    HostName ssh.github.com</span></span><br><span class="line"><span class="string">    Port 443</span></span><br><span class="line"><span class="string">    User git</span></span><br><span class="line"><span class="string">    ProxyCommand $&#123;SOCAT_BIN&#125; -t 10 - PROXY:$&#123;PROXY_HOST&#125;:%h:%p,proxyport=$&#123;PROXY_PORT&#125;</span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">chmod</span> 600 ~/.ssh/config</span><br><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><h2 id="4-验证与-git-clone">4.验证与 git clone</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> 600 ~/.ssh/config</span><br><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><p>首次连接会提示：<code>Are you sure you want to continue connecting (yes/no/[fingerprint])?</code>，输入<code>yes</code></p><h2 id="5-检查是否已有-SSH-key">5.检查是否已有 SSH key</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -l ~/.ssh/id_*.pub 2&gt;/dev/null</span><br></pre></td></tr></table></figure><p>没输出（提示 No such file）→ 执行第6步生成新 key</p><h2 id="6-生成-SSH-key（如果没有的话）">6.生成 SSH key（如果没有的话）</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t ed25519 -C <span class="string">&quot;你的邮箱@example.com&quot;</span> -f ~/.ssh/id_ed25519 -N <span class="string">&quot;&quot;</span></span><br></pre></td></tr></table></figure><p>参数说明：</p><p>-t ed25519：推荐的现代算法<br>-C：注释，一般写你的 GitHub 邮箱<br>-f：指定文件路径<br>-N “”：不设密码（方便后续无人值守 clone；如果想加密码可以去掉这项）</p><p>生成后会得到两个文件：</p><p>~/.ssh/id_ed25519（私钥，千万别外泄）<br>~/.ssh/id_ed25519.pub（公钥，要贴到 GitHub）</p><h2 id="7-查看并复制公钥内容">7.查看并复制公钥内容</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> ~/.ssh/id_ed25519.pub</span><br></pre></td></tr></table></figure><p>输出的公钥内容类似：<code>ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...你的邮箱@example.com</code></p><h2 id="8-把公钥添加到-GitHub">8.把公钥添加到 GitHub</h2><p>浏览器打开 <a href="https://github.com/settings/keys">https://github.com/settings/keys</a></p><p>点击右上角 New SSH key</p><p>Title：随便写，比如 算力平台</p><p>Key type：保持 Authentication Key</p><p>Key：粘贴刚才复制的那一整行公钥</p><p>点 Add SSH key</p><h2 id="9-测试链接">9.测试链接</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><p>看到：<code>Hi your-username! You've successfully authenticated, but GitHub does not provide shell access.</code>，配置成功</p><h1 id="二、pip-换源">二、pip 换源</h1><p>覆盖环境变量，强制改用清华源（不需要凭证）</p><p>在 ~/.bashrc 中覆盖：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &gt;&gt; ~/.bashrc &lt;&lt;<span class="string">&#x27;EOF&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 覆盖平台默认 pip 源，强制使用清华源</span></span><br><span class="line"><span class="built_in">export</span> PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple</span><br><span class="line"><span class="built_in">export</span> PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn</span><br><span class="line"><span class="built_in">export</span> PIP_TIMEOUT=6000</span><br><span class="line">EOF</span><br><span class="line"></span><br><span class="line"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure><p>验证覆盖是否生效</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip config list</span><br></pre></td></tr></table></figure><p>现在 <code>:env:.index-url</code> 应该显示为 <code>https://pypi.tuna.tsinghua.edu.cn/simple</code></p><p>装个小包验证速度和成功率：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install requests -v 2&gt;&amp;1 | <span class="built_in">tail</span> -20</span><br></pre></td></tr></table></figure><p>在 -v 日志里看到类似：<code>Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple</code></p>]]></content>
    
    
    <summary type="html">Linux系统git代理与pip换源</summary>
    
    
    
    <category term="系统配置" scheme="http://265832.xyz/categories/%E7%B3%BB%E7%BB%9F%E9%85%8D%E7%BD%AE/"/>
    
    
    <category term="Linux" scheme="http://265832.xyz/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>外挂标签速查</title>
    <link href="http://265832.xyz/posts/56032921.html"/>
    <id>http://265832.xyz/posts/56032921.html</id>
    <published>2026-10-02T02:00:00.000Z</published>
    <updated>2026-10-02T02:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>这一页把主题自带的外挂标签集中演示一遍，写文章时直接抄。</p><h2 id="1-提示块-note">1. 提示块 note</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note info flat %&#125;说明文字&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><div class="note info flat"><p>info：普通提示</p></div><div class="note primary modern"><p>primary：主要提示</p></div><div class="note warning flat"><p>warning：警告提示</p></div><h2 id="2-标签页-tabs">2. 标签页 tabs</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs 分组名 %&#125;</span><br><span class="line">&lt;!-- tab 第一个标签 --&gt;</span><br><span class="line">内容一</span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&lt;!-- tab 第二个标签 --&gt;</span><br><span class="line">内容二</span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure><div class="tabs" id="演示"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#演示-1">用 YAML 写</button></li><li class="tab"><button type="button" data-href="#演示-2">用 JSON 写</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="演示-1"><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">title:</span> <span class="string">示例</span></span><br><span class="line"><span class="attr">tags:</span> [<span class="string">Hexo</span>]</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="演示-2"><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span> <span class="attr">&quot;title&quot;</span><span class="punctuation">:</span> <span class="string">&quot;示例&quot;</span><span class="punctuation">,</span> <span class="attr">&quot;tags&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;Hexo&quot;</span><span class="punctuation">]</span> <span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="3-折叠-hideToggle">3. 折叠 hideToggle</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% hideToggle 点开看更多 %&#125;</span><br><span class="line">被折叠的内容</span><br><span class="line">&#123;% endhideToggle %&#125;</span><br></pre></td></tr></table></figure><details class="toggle" ><summary class="toggle-button" style="">点开看更多</summary><div class="toggle-content"><p>被折叠的内容，适合放答案、长代码或剧透。</p></div></details><h2 id="4-按钮、标签、居中标题">4. 按钮、标签、居中标题</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% btn https://hexo.io/zh-cn/, Hexo 文档, hexo %&#125;</span><br><span class="line">&#123;% label 绿色标签 green %&#125;</span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">h2</span> <span class="attr">style</span>=<span class="string">&quot;text-align:center&quot;</span>&gt;</span></span>居中的大标题<span class="language-xml"><span class="tag">&lt;/<span class="name">h2</span>&gt;</span></span></span><br></pre></td></tr></table></figure><a class="btn-beautify " href="https://hexo.io/zh-cn/"   title="Hexo 文档"><i class="hexo"></i><span>Hexo 文档</span></a> <mark class="hl-label green">绿色标签</mark> <span class='p center logo h2'>居中的大标题</span><h2 id="5-时间线与画廊">5. 时间线与画廊</h2><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;% timeline 标题 %&#125;</span><br><span class="line">&lt;!-- timeline 2026-10-01 --&gt;</span><br><span class="line">条目一</span><br><span class="line">&lt;!-- endtimeline --&gt;</span><br><span class="line">&#123;% endtimeline %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% galleryGroup &#x27;分组名&#x27; &#x27;描述&#x27; &#x27;/链接&#x27; 封面图 %&#125;</span><br></pre></td></tr></table></figure><div class="timeline undefined"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>演示</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-10-01</p></div></div><div class='timeline-item-content'><p>这一条演示时间线</p></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2026-10-02</p></div></div><div class='timeline-item-content'><p>时间线支持多段，用来写站史很好用</p></div></div></div><h2 id="6-图表-mermaid">6. 图表 mermaid</h2><div class="mermaid-wrap"><pre class="mermaid-src" hidden>  graph LR  A[写 Markdown] --&gt; B[hexo generate]  B --&gt; C[gulp 压缩]  C --&gt; D[推到托管平台]  </pre></div><div class="note primary flat"><p>以上标签的实现都在 <code>themes/youtheme/scripts/tag/</code>，想加自己的标签照着改一个文件即可。</p></div>]]></content>
    
    
    <summary type="html">该主题自带的外挂标签用法速查，复制粘贴即可用。</summary>
    
    
    
    <category term="开始使用" scheme="http://265832.xyz/categories/%E5%BC%80%E5%A7%8B%E4%BD%BF%E7%94%A8/"/>
    
    
    <category term="Hexo" scheme="http://265832.xyz/tags/Hexo/"/>
    
    <category term="标签" scheme="http://265832.xyz/tags/%E6%A0%87%E7%AD%BE/"/>
    
    <category term="学习" scheme="http://265832.xyz/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>初学WAM-ImageWAM</title>
    <link href="http://265832.xyz/posts/a7bdabd7.html"/>
    <id>http://265832.xyz/posts/a7bdabd7.html</id>
    <published>2026-07-17T03:09:15.000Z</published>
    <updated>2026-07-21T10:17:15.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="ImageWAM-论文笔记">ImageWAM 论文笔记</h1><h2 id="📌-论文基本信息">📌 论文基本信息</h2><table><thead><tr><th style="text-align:left">项目</th><th style="text-align:left">内容</th></tr></thead><tbody><tr><td style="text-align:left"><strong>标题</strong></td><td style="text-align:left">ImageWAM: Do World Action Models Really Need Video Generation, or Just Image Editing?</td></tr><tr><td style="text-align:left"><strong>作者</strong></td><td style="text-align:left">Yuyang Zhang*, Wenyao Zhang*, Zekun Qi, He Zhang, Haitao Lin, Jingbo Zhang, Yao Mu, Xiaokang Yang, Wenjun Zeng, Xin Jin</td></tr><tr><td style="text-align:left"><strong>单位</strong></td><td style="text-align:left">上海交通大学、东方理工学院、腾讯 Robotics X、清华大学、中关村学院</td></tr><tr><td style="text-align:left"><strong>日期</strong></td><td style="text-align:left">2026年6月19日</td></tr><tr><td style="text-align:left"><strong>论文链接</strong></td><td style="text-align:left"><a href="https://arxiv.org/abs/2606.19531">https://arxiv.org/abs/2606.19531</a></td></tr><tr><td style="text-align:left"><strong>项目主页</strong></td><td style="text-align:left"><a href="https://zhangwenyao1.github.io/ImageWAM/">https://zhangwenyao1.github.io/ImageWAM/</a></td></tr><tr><td style="text-align:left"><strong>GitHub</strong></td><td style="text-align:left"><a href="https://github.com/yuyangalin/ImageWAM">https://github.com/yuyangalin/ImageWAM</a></td></tr></tbody></table><hr><h2 id="🎯-核心思想（一句话总结）">🎯 核心思想（一句话总结）</h2><blockquote><p><strong>WAM 不一定需要视频生成，用图像编辑模型作为骨干更高效、更聚焦于任务相关的视觉变化，且推理成本大幅降低。</strong></p></blockquote><hr><h2 id="1-研究背景与动机">1. 研究背景与动机</h2><h3 id="1-1-现有-WAM-的问题">1.1 现有 WAM 的问题</h3><p>传统 WAM 依赖 <strong>视频生成模型</strong> 来预测未来帧，存在三大耦合问题：</p><table><thead><tr><th style="text-align:left">问题</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left"><strong>推理成本高</strong></td><td style="text-align:left">需要生成密集的多帧时空 token，计算量大</td></tr><tr><td style="text-align:left"><strong>容量浪费</strong></td><td style="text-align:left">视频模型需要建模外观细节、背景变化、相机运动等，这些与机器人动作弱相关</td></tr><tr><td style="text-align:left"><strong>误差积累</strong></td><td style="text-align:left">长时程想象可能产生错误的未来视频，误导动作预测</td></tr></tbody></table><blockquote><p><strong>核心疑问</strong>：世界动作模型真的需要视频生成吗？</p></blockquote><h3 id="1-2-图像编辑的优势">1.2 图像编辑的优势</h3><p>图像编辑模型是将<strong>源图像</strong>根据<strong>语言指令</strong>进行转换，相比视频生成，它具有三个优势：</p><ol><li><strong>指令-变化对齐</strong>：预训练目标直接耦合语言与视觉修改，关注&quot;什么应该变、在哪里变、怎么变&quot;</li><li><strong>更简单的代理任务</strong>：只需建模当前状态与目标状态的视觉差异，而非完整时间轨迹</li><li><strong>更紧凑的推理路径</strong>：可直接使用内部编辑感知表示，无需解码密集多帧视频</li></ol><hr><h2 id="2-方法：ImageWAM">2. 方法：ImageWAM</h2><h3 id="2-1-问题形式化">2.1 问题形式化</h3><ul><li><strong>输入</strong>：当前观测图像 $o_t$+语言指令 $l$</li></ul><!-- \(o_t\) + 语言指令 \(l\) --><ul><li><strong>输出</strong>：动作块 ${\mathbf{a}}<em>{t:t+H}=(a_t, a</em>{t+1}, \dots, a_{t+H})$</li></ul><!-- \(\mathbf{a}_{t:t+H} = (a_t, a_{t+1}, \dots, a_{t+H})\) --><ul><li><strong>策略学习目标</strong>：${\pi}<em>0({\mathbf{a}}</em>{t:t+H}|0_t,l)$</li></ul><!-- \(\pi_\theta(\mathbf{a}_{t:t+H} \mid o_t, l)\) --><p><strong>视频 WAM</strong>：</p><p>$$(o_t, l) \rightarrow \hat{o}<em>{t+1:t+H+1} \rightarrow \mathbf{a}</em>{t:t+H}$$</p><!-- (o_t, l) \rightarrow \hat{o}_{t+1:t+H+1} \rightarrow \mathbf{a}_{t:t+H} --><p><strong>ImageWAM</strong>：</p><p>$$(o_t, l) \rightarrow \hat{o}<em>{\text{edit}} \equiv \hat{o}</em>{t+H+1} \rightarrow \mathbf{a}_{t:t+H}$$</p><!-- \[(o_t, l) \rightarrow \hat{o}_{\text{edit}} \equiv \hat{o}_{t+H+1} \rightarrow \mathbf{a}_{t:t+H}\] --><blockquote><p>ImageWAM <strong>只预测一个终点帧</strong>，而非完整视频轨迹。</p></blockquote><h3 id="2-2-架构设计">2.2 架构设计</h3><p><strong>关键机制</strong>：</p><ul><li><strong>KV Cache 提取</strong>：(\mathcal{C}<em>{\text{edit}}^\tau = f</em>{\text{edit}}^\tau(o_t, l))，从编辑骨干的某一去噪时间步提取</li><li><strong>动作专家</strong>：基于 KV Cache，通过流匹配（Flow Matching）生成动作块</li><li><strong>推理时</strong>：只需一步编辑前向传播，无需完整去噪轨迹</li></ul><h3 id="2-3-训练目标">2.3 训练目标</h3><p><strong>图像编辑损失</strong>：<br>$$\mathcal{L}<em>{\text{img}} = \mathbb{E}\left[| u</em>\phi(z_r, r | o_t, l) - (\epsilon_z - z_{t+K}^*)|_2^2\right]$$</p><!-- \[\mathcal{L}_{\text{img}} = \mathbb{E}\left[\| u_\phi(z_r, r | o_t, l) - (\epsilon_z - z_{t+K}^*)\|_2^2\right]\] --><p><strong>动作流匹配损失</strong>：<br>$$\mathcal{L}<em>{\text{act}} = \mathbb{E}\left[| v</em>\theta(\mathbf{a}<em>s, s | o_t, l, \mathcal{C}</em>{\text{edit}}^\tau) - (\epsilon_a - \mathbf{a}_{t:t+H}^*)|_2^2\right]$$</p><!-- \[\mathcal{L}_{\text{act}} = \mathbb{E}\left[\| v_\theta(\mathbf{a}_s, s | o_t, l, \mathcal{C}_{\text{edit}}^\tau) - (\epsilon_a - \mathbf{a}_{t:t+H}^*)\|_2^2\right]\] --><p><strong>联合优化</strong>：$\mathcal{L} = \mathcal{L}<em>{\text{act}} + \mathcal{L}</em>{\text{img}}$</p><!-- \(\mathcal{L} = \mathcal{L}_{\text{act}} + \mathcal{L}_{\text{img}}\) --><h3 id="2-4-高效推理">2.4 高效推理</h3><ul><li>使用<strong>固定编辑去噪时间步</strong> $\tau^*$</li></ul><!-- \(\tau^*\) --><ul><li>仅执行<strong>一次编辑前向传播</strong>获得 KV Cache</li><li>动作专家在缓存条件下生成动作块</li></ul><hr><h2 id="3-实验设置">3. 实验设置</h2><h3 id="3-1-评测基准">3.1 评测基准</h3><table><thead><tr><th style="text-align:left">基准</th><th style="text-align:left">特点</th><th style="text-align:left">任务数</th></tr></thead><tbody><tr><td style="text-align:left"><strong>LIBERO</strong></td><td style="text-align:left">标准机器人操作基准</td><td style="text-align:left">4个套件 × 10任务</td></tr><tr><td style="text-align:left"><strong>LIBERO-Plus</strong></td><td style="text-align:left">增加视觉和布局变化扰动</td><td style="text-align:left">4个套件</td></tr><tr><td style="text-align:left"><strong>RoboTwin 2.0</strong></td><td style="text-align:left">双臂机器人操作，大规模仿真</td><td style="text-align:left">50+ 任务</td></tr><tr><td style="text-align:left"><strong>Real-World</strong></td><td style="text-align:left">真实双机械臂平台（Dobot XTrainer）</td><td style="text-align:left">4个任务</td></tr></tbody></table><h3 id="3-2-真实世界任务">3.2 真实世界任务</h3><table><thead><tr><th style="text-align:left">任务</th><th style="text-align:left">类型</th></tr></thead><tbody><tr><td style="text-align:left">T1: Stack Three Bowls</td><td style="text-align:left">长时程操作</td></tr><tr><td style="text-align:left">T2: Fold Towel</td><td style="text-align:left">可变形物体操作</td></tr><tr><td style="text-align:left">T3: Open Drawer &amp; Store Marker</td><td style="text-align:left">视觉遮挡、精细操作</td></tr><tr><td style="text-align:left">T4: Hang Cup On Rack</td><td style="text-align:left">精细操作</td></tr></tbody></table><h3 id="3-3-基线方法">3.3 基线方法</h3><ul><li><strong>VLA 基线</strong>：π₀、π₀.₅、OpenVLA、GR00T N1、UniVLA、WorldVLA</li><li><strong>WAM 基线</strong>：LingBot-VA、Motus、FastWAM、ABot-M0</li></ul><hr><h2 id="4-主要结果">4. 主要结果</h2><h3 id="4-1-RoboTwin-2-0-结果">4.1 RoboTwin 2.0 结果</h3><table><thead><tr><th style="text-align:left">方法</th><th style="text-align:center">P.T.</th><th style="text-align:center">Clean</th><th style="text-align:center">Rand.</th><th style="text-align:center">Avg.</th></tr></thead><tbody><tr><td style="text-align:left">π₀</td><td style="text-align:center">✓</td><td style="text-align:center">65.92</td><td style="text-align:center">58.40</td><td style="text-align:center">62.16</td></tr><tr><td style="text-align:left">π₀.₅</td><td style="text-align:center">✓</td><td style="text-align:center">82.74</td><td style="text-align:center">76.76</td><td style="text-align:center">79.75</td></tr><tr><td style="text-align:left">ABot-M0</td><td style="text-align:center">✗</td><td style="text-align:center">81.20</td><td style="text-align:center">80.40</td><td style="text-align:center">80.80</td></tr><tr><td style="text-align:left">Motus</td><td style="text-align:center">✓</td><td style="text-align:center">88.66</td><td style="text-align:center">87.02</td><td style="text-align:center">87.80</td></tr><tr><td style="text-align:left">LingBot-VA</td><td style="text-align:center">✓</td><td style="text-align:center">92.90</td><td style="text-align:center">91.50</td><td style="text-align:center">92.20</td></tr><tr><td style="text-align:left">FastWAM</td><td style="text-align:center">✗</td><td style="text-align:center">91.88</td><td style="text-align:center">91.78</td><td style="text-align:center">91.83</td></tr><tr><td style="text-align:left"><strong>ImageWAM (Ours)</strong></td><td style="text-align:center">✗</td><td style="text-align:center"><strong>93.20</strong></td><td style="text-align:center"><strong>93.56</strong></td><td style="text-align:center"><strong>93.38</strong></td></tr></tbody></table><blockquote><p><strong>结论</strong>：ImageWAM 在干净和随机场景下均达到最优，且<strong>无需额外策略预训练</strong>。</p></blockquote><h3 id="4-2-LIBERO-结果">4.2 LIBERO 结果</h3><table><thead><tr><th style="text-align:left">方法</th><th style="text-align:center">P.T.</th><th style="text-align:center">Spatial</th><th style="text-align:center">Object</th><th style="text-align:center">Goal</th><th style="text-align:center">Long</th><th style="text-align:center">Avg.</th></tr></thead><tbody><tr><td style="text-align:left">OpenVLA</td><td style="text-align:center">✓</td><td style="text-align:center">84.7</td><td style="text-align:center">88.4</td><td style="text-align:center">79.2</td><td style="text-align:center">53.7</td><td style="text-align:center">76.5</td></tr><tr><td style="text-align:left">π₀</td><td style="text-align:center">✓</td><td style="text-align:center">96.8</td><td style="text-align:center">98.8</td><td style="text-align:center">95.8</td><td style="text-align:center">85.2</td><td style="text-align:center">94.1</td></tr><tr><td style="text-align:left">π₀.₅</td><td style="text-align:center">✓</td><td style="text-align:center">98.8</td><td style="text-align:center">98.2</td><td style="text-align:center">98.0</td><td style="text-align:center">92.4</td><td style="text-align:center">96.9</td></tr><tr><td style="text-align:left">LingBot-VA</td><td style="text-align:center">✓</td><td style="text-align:center">98.5</td><td style="text-align:center">99.6</td><td style="text-align:center">97.2</td><td style="text-align:center">98.5</td><td style="text-align:center">98.5</td></tr><tr><td style="text-align:left">FastWAM</td><td style="text-align:center">✗</td><td style="text-align:center">98.2</td><td style="text-align:center">100.0</td><td style="text-align:center">97.0</td><td style="text-align:center">95.2</td><td style="text-align:center">97.6</td></tr><tr><td style="text-align:left"><strong>ImageWAM</strong></td><td style="text-align:center">✗</td><td style="text-align:center"><strong>97.2</strong></td><td style="text-align:center">99.2</td><td style="text-align:center"><strong>98.8</strong></td><td style="text-align:center">98.4</td><td style="text-align:center"><strong>98.4</strong></td></tr></tbody></table><h3 id="4-3-LIBERO-Plus-结果（更具挑战性）">4.3 LIBERO-Plus 结果（更具挑战性）</h3><table><thead><tr><th style="text-align:left">方法</th><th style="text-align:center">P.T.</th><th style="text-align:center">Camera</th><th style="text-align:center">Robot</th><th style="text-align:center">Language</th><th style="text-align:center">Light</th><th style="text-align:center">Background</th><th style="text-align:center">Noise</th><th style="text-align:center">Layout</th><th style="text-align:center">Avg.</th></tr></thead><tbody><tr><td style="text-align:left">FastWAM</td><td style="text-align:center">✗</td><td style="text-align:center">16.4</td><td style="text-align:center">44.5</td><td style="text-align:center">68.9</td><td style="text-align:center">78.2</td><td style="text-align:center">53.7</td><td style="text-align:center">37.7</td><td style="text-align:center">60.7</td><td style="text-align:center">51.5</td></tr><tr><td style="text-align:left">ImageWAM (FLUX.2 4B)</td><td style="text-align:center">✗</td><td style="text-align:center"><strong>80.8</strong></td><td style="text-align:center"><strong>50.3</strong></td><td style="text-align:center"><strong>91.4</strong></td><td style="text-align:center"><strong>98.1</strong></td><td style="text-align:center"><strong>85.5</strong></td><td style="text-align:center"><strong>93.8</strong></td><td style="text-align:center"><strong>80.5</strong></td><td style="text-align:center"><strong>83.1</strong></td></tr></tbody></table><blockquote><p><strong>结论</strong>：ImageWAM 在全部 7 种扰动维度上均大幅优于 FastWAM，尤其在 <strong>Camera、Robot、Layout</strong> 等难度较高的维度上优势明显。</p></blockquote><h3 id="4-4-真实机器人实验">4.4 真实机器人实验</h3><table><thead><tr><th style="text-align:left">方法</th><th style="text-align:center">T1 (叠碗)</th><th style="text-align:center">T2 (叠毛巾)</th><th style="text-align:center">T3 (开抽屉)</th><th style="text-align:center">T4 (挂杯子)</th><th style="text-align:center">Avg.</th></tr></thead><tbody><tr><td style="text-align:left">π₀</td><td style="text-align:center">57</td><td style="text-align:center">58</td><td style="text-align:center">54</td><td style="text-align:center">54</td><td style="text-align:center">55.8</td></tr><tr><td style="text-align:left">π₀.₅</td><td style="text-align:center">83</td><td style="text-align:center">77</td><td style="text-align:center">74</td><td style="text-align:center">55</td><td style="text-align:center">72.3</td></tr><tr><td style="text-align:left">FastWAM</td><td style="text-align:center">88</td><td style="text-align:center">75</td><td style="text-align:center">77</td><td style="text-align:center">76</td><td style="text-align:center">79.0</td></tr><tr><td style="text-align:left"><strong>ImageWAM</strong></td><td style="text-align:center"><strong>94</strong></td><td style="text-align:center"><strong>84</strong></td><td style="text-align:center"><strong>78</strong></td><td style="text-align:center"><strong>82</strong></td><td style="text-align:center"><strong>84.5</strong></td></tr></tbody></table><blockquote><p><strong>结论</strong>：ImageWAM 在所有四项真实任务上均取得最优成绩，尤其在可变形物体操作（叠毛巾）上提升最显著（+9%）。</p></blockquote><h3 id="4-5-效率对比">4.5 效率对比</h3><table><thead><tr><th style="text-align:left">方法</th><th style="text-align:center">延迟 (ms)</th><th style="text-align:center">TFLOPs</th></tr></thead><tbody><tr><td style="text-align:left">FastWAM-IDM (视频)</td><td style="text-align:center">1081</td><td style="text-align:center">63.65</td></tr><tr><td style="text-align:left">FastWAM (1 Step)</td><td style="text-align:center">302</td><td style="text-align:center">13.21</td></tr><tr><td style="text-align:left"><strong>ImageWAM (Ours)</strong></td><td style="text-align:center"><strong>263</strong></td><td style="text-align:center"><strong>9.72</strong></td></tr></tbody></table><blockquote><p><strong>结论</strong>：ImageWAM 将延迟降至视频 WAM 的 <strong>1/4</strong>，FLOPs 降至 <strong>1/6</strong>。</p></blockquote><hr><h2 id="5-消融与分析">5. 消融与分析</h2><h3 id="5-1-不同编辑骨干的影响">5.1 不同编辑骨干的影响</h3><table><thead><tr><th style="text-align:left">骨干</th><th style="text-align:center">LIBERO-Plus Avg.</th></tr></thead><tbody><tr><td style="text-align:left">OmniGen2</td><td style="text-align:center">71.8%</td></tr><tr><td style="text-align:left">Ovis-U1</td><td style="text-align:center">71.2%</td></tr><tr><td style="text-align:left">FLUX.2 4B</td><td style="text-align:center">83.1%</td></tr><tr><td style="text-align:left">FLUX.2 9B</td><td style="text-align:center"><strong>85.2%</strong></td></tr></tbody></table><blockquote><p><strong>结论</strong>：ImageWAM 不依赖特定编辑模型，更强的编辑骨干可直接提升策略鲁棒性。</p></blockquote><h3 id="5-2-与统一理解-生成模型的对比">5.2 与统一理解-生成模型的对比</h3><table><thead><tr><th style="text-align:left">方法</th><th style="text-align:center">P.T.</th><th style="text-align:center">LIBERO</th><th style="text-align:center">RoboTwin (Clean)</th><th style="text-align:center">RoboTwin (Hard)</th></tr></thead><tbody><tr><td style="text-align:left">UniVLA</td><td style="text-align:center">✓</td><td style="text-align:center">95.5</td><td style="text-align:center">—</td><td style="text-align:center">—</td></tr><tr><td style="text-align:left">BagelVLA (w/ K.F.)</td><td style="text-align:center">✓</td><td style="text-align:center">—</td><td style="text-align:center">75.3</td><td style="text-align:center">20.9</td></tr><tr><td style="text-align:left">BagelVLA (w/o K.F.)</td><td style="text-align:center">✓</td><td style="text-align:center">—</td><td style="text-align:center">56.7</td><td style="text-align:center">15.9</td></tr><tr><td style="text-align:left"><strong>ImageWAM</strong></td><td style="text-align:center">✗</td><td style="text-align:center"><strong>98.4</strong></td><td style="text-align:center"><strong>84.4</strong></td><td style="text-align:center"><strong>18.3</strong></td></tr></tbody></table><blockquote><p><strong>关键洞察</strong>：统一理解-生成模型存在任务干扰，而 ImageWAM 通过<strong>冻结理解模块、仅训练生成模块</strong>的解耦设计，在无预训练的情况下取得更优性能。</p></blockquote><h3 id="5-3-注意力可视化">5.3 注意力可视化</h3><p>ImageWAM 的注意力集中在<strong>任务相关的变化区域</strong>（操作对象、目标容器、接触区域），而 FastWAM 的注意力较为分散，包含较多背景无关区域。</p><h3 id="5-4-未来视频伪影分析">5.4 未来视频伪影分析</h3><p>视频 WAM 在预测未来帧时会产生明显伪影（几何扭曲、空间布局不一致），这些伪影会误导动作专家。ImageWAM 通过<strong>不生成实际未来视频帧</strong>，避免了这一问题。</p><hr><h2 id="6-核心贡献总结">6. 核心贡献总结</h2><table><thead><tr><th style="text-align:left">贡献</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left"><strong>新框架</strong></td><td style="text-align:left">首次将图像编辑模型作为 WAM 骨干，替代视频生成</td></tr><tr><td style="text-align:left"><strong>新视角</strong></td><td style="text-align:left">将机器人操作公式化为&quot;指令引导的视觉转换&quot;问题</td></tr><tr><td style="text-align:left"><strong>三个优势</strong></td><td style="text-align:left">指令-变化对齐、更简单的代理任务、紧凑推理路径</td></tr><tr><td style="text-align:left"><strong>高效性能</strong></td><td style="text-align:left">在多个基准上达到 SOTA，且 FLOPs 仅 1/6、延迟 1/4</td></tr><tr><td style="text-align:left"><strong>无需预训练</strong></td><td style="text-align:left">无需额外策略预训练（P.T.），仅在任务演示上训练</td></tr></tbody></table><hr><h2 id="7-与综述论文的关联">7. 与综述论文的关联</h2><table><thead><tr><th style="text-align:left">综述 (WAM Survey)</th><th style="text-align:left">ImageWAM 的定位</th></tr></thead><tbody><tr><td style="text-align:left">WAM 定义：联合预测未来状态与动作</td><td style="text-align:left">ImageWAM：预测单帧终点状态（简化版）</td></tr><tr><td style="text-align:left">级联式 WAM：先预测状态，再生成动作</td><td style="text-align:left">ImageWAM 属于级联式，但用图像编辑替代视频生成</td></tr><tr><td style="text-align:left">联合式 WAM：联合生成状态与动作</td><td style="text-align:left">不在该范畴，属于轻量级替代方案</td></tr><tr><td style="text-align:left">隐式规划（Latent Planning）</td><td style="text-align:left">ImageWAM 使用 KV Cache 作为隐式规划中间表示</td></tr><tr><td style="text-align:left">推理延迟是核心挑战</td><td style="text-align:left">ImageWAM 将延迟从 1081ms 降至 263ms</td></tr></tbody></table><hr><h2 id="8-论文的局限与未来工作">8. 论文的局限与未来工作</h2><ol><li><strong>端点帧预测的适用性</strong>：对于需要精确理解完整轨迹动态的任务，单帧预测是否足够？</li><li><strong>编辑骨干的可扩展性</strong>：随着编辑骨干规模增大，性能增益是否持续？</li><li><strong>动作专家与编辑骨干的耦合</strong>：是否有更优的耦合方式？</li><li><strong>真实场景泛化</strong>：在更复杂、更开放的真实环境中表现如何？</li></ol><hr><h2 id="🔑-关键术语速查">🔑 关键术语速查</h2><table><thead><tr><th style="text-align:left">术语</th><th style="text-align:left">英文</th><th style="text-align:left">含义</th></tr></thead><tbody><tr><td style="text-align:left">WAM</td><td style="text-align:left">World Action Model</td><td style="text-align:left">联合预测未来状态与动作的具身模型</td></tr><tr><td style="text-align:left">VLA</td><td style="text-align:left">Vision-Language-Action</td><td style="text-align:left">视觉-语言-动作模型，直接映射观测到动作</td></tr><tr><td style="text-align:left">KV Cache</td><td style="text-align:left">Key-Value Cache</td><td style="text-align:left">Transformer 中的键值缓存，用于高效注意力计算</td></tr><tr><td style="text-align:left">Flow Matching</td><td style="text-align:left">Flow Matching</td><td style="text-align:left">一种生成模型训练方法，学习从噪声到数据的连续变换</td></tr><tr><td style="text-align:left">DiT</td><td style="text-align:left">Diffusion Transformer</td><td style="text-align:left">基于 Transformer 的扩散模型骨干</td></tr><tr><td style="text-align:left">MoT</td><td style="text-align:left">Mixture of Transformers</td><td style="text-align:left">多专家 Transformer 架构</td></tr><tr><td style="text-align:left">P.T.</td><td style="text-align:left">Policy Pretraining</td><td style="text-align:left">策略预训练</td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;ImageWAM-论文笔记&quot;&gt;ImageWAM 论文笔记&lt;/h1&gt;
&lt;h2 id=&quot;📌-论文基本信息&quot;&gt;📌 论文基本信息&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align:left&quot;&gt;项目&lt;/th&gt;
&lt;th sty</summary>
      
    
    
    
    <category term="学习" scheme="http://265832.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="人工智能" scheme="http://265832.xyz/tags/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/"/>
    
  </entry>
  
  <entry>
    <title>第十七届蓝桥杯</title>
    <link href="http://265832.xyz/posts/3996d841.html"/>
    <id>http://265832.xyz/posts/3996d841.html</id>
    <published>2026-04-12T09:25:18.000Z</published>
    <updated>2026-04-12T09:25:18.000Z</updated>
    
    <content type="html"><![CDATA[<p>第十七届蓝桥杯 C++ B组<br>试题 A: 青春常数</p><p>本题总分：5 分</p><p>【A问题描述】<br>小蓝与蓝桥杯的缘分已经走到了第四个年头。从 2023 年的初出茅庐，到 2024、2025 年的披荆斩棘，而今年的 2026 年，将是他大学生涯最后一次站上这个赛场。</p><p>退役前夕，百感交集的小蓝在草稿纸上将这四届参赛的年份倒序写下，拼接成了一个巨大的整数 N = 2026202520242023。</p><p>在整理四年的竞心得时，他决定将这一常数 N 拆分为两个非负整数 x 和 y，分别代表他这段旅程的前半段积累与后半段突破。按照拆分规则，这两部分的数值之和必须恰好等于 N（即 x + y = N）。</p><p>同时，由于在后半段程中小蓝积累了更深厚的算法功底，因此后半部分的数值 y 必须严格大于前半部分的数值 x（即 0 ≤ x &lt; y)。</p><p>现在，请你计算满足上述条件的整数对 (x, y) 共有多少个？</p><p>试题 B: 双碳战略</p><p>本题总分：5 分</p><p>【B问题描述】<br>城市照明系统的智能化改造是落实国家 “双碳” 战略的核心试点。作为示范工程，市能源局在新建的绿色大道上部署了一组由 2026 盏智能路灯组成的线性阵列。</p><p>初始状态下，这 2026 盏路灯均处于高能耗的 “全亮模式”。为了评估系统在极端工况下的响应能力，该局的主控系统需要针对理论上存在的所有开关组合进行全状态遍历推演。</p><p>只是，受限于底层硬件的物理特性，主控系统必须严格按照 “双向交替” 的规则执行操作：</p><p>第奇数次指令（第 1, 3, 5 . . . 次）：系统需选定一盏路灯 i（1 ≤ i ≤ 2026），将该路灯及其右侧（后方）所有路灯的开关状态进行翻转（亮变暗，暗变亮）。<br>第偶数次指令（第 2, 4, 6 . . . 次）：系统需选定一盏路灯 i，将该路灯及其左侧（前方）所有路灯的开关状态进行翻转。<br>对于 2026 盏路灯，共存在 2^2026 种不同的明暗状态组合，每一种状态都必定能被抵达。针对每一种特定的状态，都存在一个从初始 “全亮” 状态到达该状态所需的最少指令操作次数（无论有多少种不同的操作序列可以到达该状态，仅以步数最少的为准）。</p><p>注意：初始的 “全亮” 状态也包含在这 2^2026 种组合中，且到达该状态的最少操作次数记为 0 次。</p><p>现在，请你计算出这全部 2^2026 种状态对应的最少操作次数的累加总和。由</p><p>于总和可能很大，请将结果对 998244353 取模后输出。</p><p>试题 C: 循环右移</p><p>时间限制: 1.0s 内存限制: 256.0MB 本题总分：10 分</p><p>【C问题描述】<br>给定三个整数 N, X, Y。请计算有多少个长度为 N 的整数数组 A 满足以下条件：</p><p>数组 A 中的每个元素 A<strong>i 都满足 X ≤ A</strong>i ≤ Y；<br>对于数组 A 中的任意一个连续子数组，对其进行一次循环右移操作，得到的新子数组与原数组完全一致。<br>循环右移：对一个长度为 k 的连续子数组 [B1, B2, . . . , B**k] 执行一次循环右移操作，是指将该子数组变换为 [Bk, B1, B2, …, Bk−1]（即把最后一个元素移到最开头，其余元素保持原有顺序依次向后顺延一位）。</p><p>【输入格式】<br>第一行包含一个整数 T ，表示测试数据的组数。</p><p>接下来的 T 行，每行包含三个由空格隔开的整数 N, X, Y。</p><p>【输出格式】<br>对于每组测试数据，输出一行，包含一个整数，表示满足条件的数组 A 的个数。</p><p>【样例输入】<br>3<br>31 2<br>510 10<br>25 3<br>【样例输出】</p><p>2</p><p>1</p><p>0</p><p>【评测用例规模与约定】<br>对于 30% 的评测用例，1 ≤ T ≤ 20，1 ≤ N ≤ 100，1 ≤ X, Y ≤ 100； 对于 100% 的评测用例，1 ≤ T ≤ 10^3，1 ≤ N ≤ 10^18，1 ≤ X, Y ≤ 10^18。</p><p>试题 D: 蓝桥竞技</p><p>时间限制: 1.0s 内存限制: 256.0MB 本题总分：10 分</p><p>【D问题描述】<br>小蓝，作为电竞俱乐部 “蓝桥竞技” 的战队经理，正面临着一个巨大的管理危机。俱乐部目前签约了 N 种不同位置的职业选手，其中第 i 种位置的选手共有 A**i 名。</p><p>为了参加即将举办的 “峡谷 5v5”，小蓝必须将俱乐部内的所有选手都编入战队，不能有任何一人坐冷板凳。</p><p>根据![事组委会的严苛规则，一支合法的战队必须满足以下条件：</p><p>5 人成团：每支战队有且只能由 5 名选手组成。<br>职业互斥：同一支战队内的 5 名选手，必须来自 5 种完全不同的位置。<br>现在，请你帮助小蓝判断：在当前的人员数量下，是否有一种分组方案，能够将所有选手恰好分配完，且每支战队都符合参加规则？</p><p>【输入格式】<br>第一行包含一个整数 T ，表示测试用例组数。接下来包含 T 组数据，每组数据的格式如下：</p><p>• 第一行包含一个整数 N，表示职业位置的种类数量。</p><p>• 第二行包含 N 个整数 A1, A2, . . . , A**N，分别表示第 i 种位置的选手人数。</p><p>【输出格式】<br>对于每组测试用例，如果存在满足条件的分组方案，输出 ‘T’，否则输出 ‘F’。</p><p>【样例输入】<br>4</p><p>5</p><p>11111<br>6<br>22221 1<br>5<br>11112<br>6<br>31112 2<br>【样例输出】<br>T T F F</p><p>【样例说明】<br>第一组数据：共有 5 名选手，各占 1 个位置，恰好可以组成 1 支战队。</p><p>第二组数据：共有 10 名选手，可以分成 2 支战队。一种合法的分配方案</p><p>是：战队一由位置 1, 2, 3, 4, 5 的选手组成；战队二由位置 1, 2, 3, 4, 6 的选手组成。</p><p>第三、四组数据不存在满足条件的分组方案。</p><p>【评测用例规模与约定】<br>对于 30% 的评测用例：1 ≤ T ≤ 5，1 ≤ N ≤ 20，0 ≤ A**i ≤ 100；</p><p>对于 100% 的评测用例：1 ≤ T ≤ 10^3，1 ≤ N ≤ 10^5，0 ≤ A**i ≤ 10^9，且保证所有测试用例中 N 的总和不超过 2 × 10^5。</p><p>试题 E: LQ 聚合</p><p>时间限制: 1.0s 内存限制: 256.0MB 本题总分：15 分</p><p>【E问题描述】<br>2056 年，探险队在月球背面的环形山深处发现了一座信号发射塔，其核心控制台正在不断闪烁着一串长度为 N 的粒子序列。</p><p>序列中的每个位置被严格定义为 L 型粒子、Q 型粒子，或者因岁月侵蚀而模糊不清的未知状态 ? 。这些粒子将被依次射入反应场，而反应场的稳定性取决于序列的 “LQ 聚合” 数量，该数量被定义为所有满足 1 ≤ i &lt; j ≤ N 且第 i 个节点为 L、第 j 个节点为 Q 的二元组 数量。</p><p>为了重启这座沉睡的巨塔，探险队需要将序列中所有的 ? 修复为确定的 L或 Q。</p><p>现在，请你计算出在所有可能的修复方案中，所能得到的 “LQ 聚合” 数量的最大值是多少。</p><p>【输入格式】<br>第一行输入一个整数 N，表示粒子序列的长度。</p><p>第二行输入一个长度为 N 的字符串 ，仅包含字符 L、Q 和 ?，表示当前探测到的粒子序列状态。</p><p>【输出格式】<br>输出一个整数，表示在将所有 ? 替换为 L 或 Q 后，能获得的最大“LQ 聚合”数量。</p><p>【样例输入】<br>5</p><p>??L??</p><p>【样例输出】<br>6</p><p>【样例说明】<br>一种最优的策略是将序列修复为 LLLQQ。此时位于前面的 3 个 L 与位于后面的 2 个 Q 共可产生 3 × 2 = 6 个聚合。</p><p>【评测用例规模与约定】<br>对于 30% 的评测用例，字符串 <em>?</em> 的个数不超过 10。对于所有评测用例，2 ≤ N ≤ 10^5。</p><p>试题 F: 应急布线</p><p>时间限制: 1.0s 内存限制: 256.0MB 本题总分：15 分</p><p>【F问题描述】<br>实验室内，小蓝负责维护一个由 N 台计算机组成的局域网络。这些计算机原本通过高速网线互联，但随着设备老化，目前仅剩 M 条网线还能正常工作。正因如此，原本统一的网络分裂成了多个互不相连的通信区域。</p><p>为了恢复通信，小蓝计划架设一种特殊的 “应急跳线” 来重新连接这些区域。在物理逻辑上，只要任意两台计算机之间可以通过残存的网线或新架设的应急跳线建立直接或间接的通路，即视为它们之间恢复了连通。小蓝的任务是选定最优的布线方案，使得实验室内的所有 N 台计算机重新回到全连通的状态。</p><p>由于应急跳线的接口会占用计算机宝贵的硬件资源，小蓝在制定方案时设定了两个优先层级：首先，必须确保使用的应急跳线总数达到理论上的最小值；其次，为了减轻单台计算机的负载压力，他要求尽可能平均地分摊这些跳线。具体而言，他需要寻找一种方案，使得在所有计算机中，接入这种应急跳线数量最多的那一台机器，其接入的跳线数降到最低。</p><p>现在，请你根据当前网线的残存连接情况，计算出实现全连通所需的最少应急跳线数量，以及在这一最优前提下，单台计算机接入应急跳线数量最大值的最小可能值。</p><p>【输入格式】<br>第一行包含两个整数 N 和 M，分别表示计算机的总数和目前完好的网线数量。</p><p>接下来的 M 行，每行包含两个整数 a 和 b，表示计算机 a 和 b 之间目前仍存在一条完好的网线。</p><p>【输出格式】<br>输出一行，包含两个由单个空格隔开的整数。第一个整数表示最少需要添加的应急跳线数量，第二个整数表示在确保跳线总数最少的前提下，单台计算机接入跳线数量最大值的最小可能值。</p><p>【样例输入】<br>7 2</p><p>1 2</p><p>2 3</p><p>【样例输出】<br>4 2</p><p>【样例说明】</p><p>通过连接 1 − 4，4 − 5，5 − 6，6 − 7（共计 4 条跳线），可以使节点 4, 5, 6 各承担两条跳线，而其他节点仅承担一条或不承担，从而使最大值达到最小值为 2。</p><p>【评测用例规模与约定】<br>对于 30% 的评测用例，1 ≤ N ≤ 100，0 ≤ M ≤ 100；</p><p>对于所有评测用例，1 ≤ N ≤ 10^5，0 ≤ M ≤ 10^5，1 ≤ a, b ≤ N，a ≠ b。保证输入的连接信息中不包含重边。</p><p>试题 G: 理想温度</p><p>时间限制: 1.0s 内存限制: 256.0MB 本题总分：20 分</p><p>【G问题描述】<br>一条工业流水线上排列着 n 个温度传感器。当前各个传感器测得的温度记录在数组 A 中，而各传感器对应的理想标准温度记录在数组 B 中（即 A<strong>i 为第 i个传感器的当前温度，B</strong>i 为第 i 个传感器的理想温度）。</p><p>为了让尽可能多的传感器达到理想温度，你可以进行一次区域温度补偿操作：</p><p>在流水线上划定一段连续的传感器区间 [l, r]（即第 l 个到第 r 个传感器）。<br>输入一个温度补偿值 k（k 为任意整数），使得该区间内所有传感器的当前温度都加上 k。<br>请问在执行完这一次校准操作后，最多能使多少个传感器的温度恰好等于其对应的理想标准温度？</p><p>【输入格式】<br>第一行包含一个整数 n，表示传感器的数量。</p><p>第二行包含 n 个整数 A1, A2, . . . , A**n，表示各传感器的当前温度。</p><p>第三行包含 n 个整数 B1, B2, . . . , B**n，表示各传感器对应的理想标准温度。</p><p>【输出格式】<br>输出一行，包含一个整数，表示补偿操作后处于理想温度的传感器最大数量。</p><p>【样例输入】<br>5</p><p>1 2 3 4 5</p><p>2 3 2 3 2</p><p>【样例输出】<br>2</p><p>【评测用例规模与约定】<br>对于 30% 的评测用例，保证 1 ≤ n ≤ 2000；</p><p>对于所有评测用例，保证 1 ≤ n ≤ 2 × 10^5， −10^9 ≤ A<strong>i, B</strong>i ≤ 10^9。</p><p>试题 H: 足球训练</p><p>时间限制: 1.0s 内存限制: 256.0MB 本题总分：20 分</p><p>【H问题描述】<br>小蓝是一支足球队的队长，他正在为下一场重要比做准备。接下来的 m天中，他每天可以选择一名队员进行训练，并且选择之后当天的训练对象不能更换。</p><p>球队中共有 n 名队员。对于第 i 名队员，已知其：</p><p>• 初始实力值为 ai；</p><p>• 天赋值为 bi。</p><p>训练规则如下：</p><p>• 如果小蓝在某一天训练了队员 i，则这一天会使该队员的实力值增加 bi；</p><p>• 如果一共用 k 天来训练队员 i， 那么这名队员的最终实力值将变为： ai + kbi。</p><p>一支队伍的整体实力定义为所有队员最终实力值的乘积，即：</p><p>其中 ki 表示分配给第 i 名队员的训练天数，且满足：</p><p>小蓝希望通过合理分配这 m 天的训练计划，使得队伍的整体实力最大。由于结果可能非常大，你只需要输出该最大值对 998244353 取模的结果。</p><p>【输入格式】<br>输入共 n + 1 行。</p><p>第一行包含两个正整数 n, m，分别表示队员人数和可用于训练的总天数。接下来 n 行，第 i 行包含两个正整数 ai, bi，表示第 i 名队员的初始实力值与天赋值。</p><p>【输出格式】<br>输出一行，包含一个非负整数，表示经过 m 天训练后，队伍实力的最大可能值对 998244353 取模的结果。</p><p>【样例输入】<br>2 3</p><p>4 2</p><p>5 3</p><p>【样例输出】<br>66</p><p>【样例说明】<br>一种最优方案是：</p><p>• 第 1 名队员训练 1 天；</p><p>• 第 2 名队员训练 2 天。此时：</p><p>• 第 1 名队员的最终实力为 4 + 2 × 1 = 6；</p><p>• 第 2 名队员的最终实力为 5 + 3 × 2 = 11。队伍的整体实力为：6 × 11 = 66，因此输出 66。</p><p>【评测用例规模与约定】<br>对于 30% 的数据，n, m ≤ 8；</p><p>对于 60% 的数据，n, m, ai, bi ≤ 3000；</p><p>对于 100% 的数据，1 ≤ n ≤ 100000，1 ≤ m ≤ 10^9，1 ≤ ai, bi ≤ 10^5</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;第十七届蓝桥杯 C++ B组&lt;br&gt;
试题 A: 青春常数&lt;/p&gt;
&lt;p&gt;本题总分：5 分&lt;/p&gt;
&lt;p&gt;【A问题描述】&lt;br&gt;
小蓝与蓝桥杯的缘分已经走到了第四个年头。从 2023 年的初出茅庐，到 2024、2025 年的披荆斩棘，而今年的 2026 年，将是他大学生涯</summary>
      
    
    
    
    <category term="算法" scheme="http://265832.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="竞赛" scheme="http://265832.xyz/tags/%E7%AB%9E%E8%B5%9B/"/>
    
  </entry>
  
  <entry>
    <title>喜提河南icpc金牌</title>
    <link href="http://265832.xyz/posts/9f4b8961.html"/>
    <id>http://265832.xyz/posts/9f4b8961.html</id>
    <published>2025-05-13T08:49:18.000Z</published>
    <updated>2025-05-14T00:17:37.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="赛事">赛事</h2><h3 id="赛事感受">赛事感受</h3><p>先吐槽一下主办方的系统，开赛时系统众生平等的卡顿打不开网页，不平等的是每个队伍的系统上显示的时间进度都不同，导致有队伍提前看题提交21s<code>ac</code>赛后被喷的，然后就是测评系统卡顿，我们队代码提交之后等了近十分钟，还没有得到反馈，最后是代码打印，我们提交了两次打印，近两个小时才给我们送过来，此前bug已经调好了，主办方的这些相关设备都是得升级。<br>做题，我们是开赛后一个队友从前往后看题，我从后往前看，另一个队友写模板，我们看题很快，找到了三个签到题（<code>m</code>、<code>j</code>、<code>b</code>）都是一次<code>ac</code>，然后我看了<code>i</code>计算几何，这是个板子题，然后我写模板，中间另外两名队友讨论了<code>k</code>有思路，但未注意细节喜提罚时一发，然后也是<code>ac</code>了。然后我继续写几何模板，中间队友又看了<code>e</code>，我们讨论了思路认为可行，继续交换身份，但还是细节问题又喜提一发罚时，我在给他俩的代码调试时发现了优先队列为空的情况，排除了这个错误后，由于没有找到别的可能错误，也是抱着试试的心理交了一发，然后他俩继续讨论思路，我继续写几何模板（计算几何真的是太长了），期间我时不时看测评界面都是pending（主办方测评系统该升级了），大概第五次，我看到刚提交的绿色反馈，全队狂喜。再然后他俩跟着榜单走，看了剩下的题目，我写好后，对着模板复查了代码，然后我就直接跑计算面积的函数修改了代码（删除了<code>return</code>，替换为<code>cout</code>，改了导致了<code>TLE</code>，不应该改的QWQ），一键提交，也是得到了<code>TLE</code>，然后我打印了代码，由于一直没有给我们送来，我拿着系统的错误代码反馈对着模板改，结果看到了<code>no return</code>，然后我就把函数类型<code>double</code>改为<code>void</code>，再找不到别的错误，就再次抱着试试的心理，然后疯狂刷新界面，喜提<code>ac</code>。这是赛时过了三个小时，也是我们最后开出来的一个，这题开后我们的排名是前<code>15</code>名，拿金牌很有希望，剩下的俩小时，由于罚时太高，我们求稳打算再开，实在找不到能<code>ac</code>的思路，提交也是止步于此了QWQ。然后我们封榜前是前20名，到赛完也没再开出一个题QWQ。最后滚榜我们的排名正好在金尾，喜提大学第一块金牌，<code>燃尽了！！!</code>。<br>我们本次比赛获得金牌也是气运好，也感谢学弟们跟我组队拿奖，本来只能拿到银牌的有了学弟的加持也是喜提金牌<code>hhh</code>。<br><img src="https://tuchuang.voooe.cn/images/2025/05/14/2025icpcjinpai.jpg" alt="img"></p><h2 id="题解">题解</h2><h3 id="B">B</h3><p>将$(2^i&lt;=n)$的数累加即可。时间$O(1)$，空间$O(1)$。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pii pair&lt;int, int&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> mod 100000007</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MOD 998244353</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> x first</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> y second</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> db long double</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N  =  <span class="number">2e5</span> + <span class="number">10</span>, M = <span class="number">1010</span>, P = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="type">int</span> x;</span><br><span class="line">cin &gt;&gt; x;</span><br><span class="line"><span class="type">int</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="number">32</span>; i ++) &#123;</span><br><span class="line"><span class="keyword">if</span>(ans +  (<span class="number">1ll</span> &lt;&lt; i) &lt;= x) &#123;</span><br><span class="line">ans += (<span class="number">1ll</span> &lt;&lt; i);</span><br><span class="line">&#125;</span><br><span class="line">&#125; cout &lt;&lt; ans &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>), cout.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line"><span class="type">int</span> _ = <span class="number">1</span>;</span><br><span class="line">cin &gt;&gt; _;</span><br><span class="line">cout &lt;&lt; fixed &lt;&lt; <span class="built_in">setprecision</span>(<span class="number">6</span>);</span><br><span class="line"><span class="keyword">while</span>(_ --) &#123;</span><br><span class="line"><span class="built_in">solve</span>();</span><br><span class="line">&#125; <span class="keyword">return</span> _ ^ _;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="E">E</h3><p>用并查集维护生成树，根据增加的黑边和白边顺序维护$(s<em>s&lt;=(s+1)</em>(s+1))$，更新生成树和答案。时间$O(nlog(n))$，空间$O(n)$。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pii pair&lt;int, int&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> mod 100000007</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MOD 998244353</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> x first</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> y second</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> db long double</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N  =  <span class="number">2e5</span> + <span class="number">10</span>, M = <span class="number">1010</span>, P = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">node</span> &#123;</span><br><span class="line">    <span class="type">int</span> v, x, y, c;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="type">int</span> fa[N];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">find</span><span class="params">(<span class="type">int</span> x)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(fa[x] != x) &#123;</span><br><span class="line">        fa[x] = <span class="built_in">find</span>(fa[x]);</span><br><span class="line">    &#125; <span class="keyword">return</span> fa[x];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">merge</span><span class="params">(<span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123;</span><br><span class="line">    fa[<span class="built_in">find</span>(x)] = <span class="built_in">find</span>(y);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">cmp</span><span class="params">(<span class="type">const</span> node &amp;a, <span class="type">const</span> node &amp;b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> a.v &lt; b.v;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">kruskal</span><span class="params">(vector&lt;node&gt; &amp;fs, <span class="type">int</span> n)</span> </span>&#123;</span><br><span class="line">    <span class="built_in">sort</span>(fs.<span class="built_in">begin</span>(), fs.<span class="built_in">end</span>(), cmp);</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i ++) &#123;</span><br><span class="line">        fa[i] = i;</span><br><span class="line">    &#125; <span class="type">int</span> cnt = <span class="number">0</span>, s = <span class="number">0</span>, ff = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">const</span> <span class="keyword">auto</span> &amp;f : fs) &#123;</span><br><span class="line">        <span class="keyword">if</span>(<span class="built_in">find</span>(f.x) != <span class="built_in">find</span>(f.y)) &#123;</span><br><span class="line">            <span class="built_in">merge</span>(f.x, f.y);</span><br><span class="line">            cnt += f.v;</span><br><span class="line">            <span class="keyword">if</span>(f.c == <span class="number">0</span>) &#123;</span><br><span class="line">                s ++;</span><br><span class="line">            &#125; ff ++;</span><br><span class="line">            <span class="keyword">if</span>(ff == n - <span class="number">1</span>) &#123;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">return</span> cnt + s * s;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n, m;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line">    <span class="function">vector&lt;node&gt; <span class="title">fs</span><span class="params">(m)</span></span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt; m; i ++) &#123;</span><br><span class="line">        cin &gt;&gt; fs[i].x &gt;&gt; fs[i].y &gt;&gt; fs[i].v &gt;&gt; fs[i].c;</span><br><span class="line">    &#125; cout &lt;&lt; <span class="built_in">kruskal</span>(fs, n) &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>), cout.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    <span class="type">int</span> _ = <span class="number">1</span>;</span><br><span class="line">    <span class="comment">// cin &gt;&gt; _;</span></span><br><span class="line">    cout &lt;&lt; fixed &lt;&lt; <span class="built_in">setprecision</span>(<span class="number">6</span>);</span><br><span class="line">    <span class="keyword">while</span>(_ --) &#123;</span><br><span class="line">        <span class="built_in">solve</span>();</span><br><span class="line">    &#125; <span class="keyword">return</span> _ ^ _;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="I">I</h3><p>将给出的点集和点集左右端点横坐标一并存入凸包，跑凸包模板即可。时间$O(nlog(n))$，空间$O(n)$。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pii pair&lt;int, int&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pdd pair&lt;double, double&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> mod 100000007</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MOD 998244353</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> x first</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> y second</span></span><br><span class="line"><span class="comment">// #define db long double</span></span><br><span class="line"><span class="comment">// #define double long double</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N = <span class="number">2e5</span> + <span class="number">10</span>, M = <span class="number">1010</span>, P = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">double</span> eps = <span class="number">1e-6</span>;</span><br><span class="line"></span><br><span class="line">vector&lt;pdd&gt; in;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">sign</span><span class="params">(<span class="type">double</span> x)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(<span class="built_in">fabs</span>(x) &lt; eps) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    &#125; <span class="keyword">if</span>(x &lt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    &#125; <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">bool</span> <span class="keyword">operator</span> == (pdd a, pdd b) &#123;</span><br><span class="line">    <span class="keyword">return</span> !<span class="built_in">sign</span>(a.x - b.x)&amp;&amp;!<span class="built_in">sign</span>(a.y - b.y);</span><br><span class="line">&#125;</span><br><span class="line">pdd <span class="keyword">operator</span> - (pdd a, pdd b) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">pdd</span>(a.x - b.x, a.y - b.y);</span><br><span class="line">&#125;</span><br><span class="line">pdd <span class="keyword">operator</span> + (pdd a, pdd b) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">pdd</span>(a.x + b.x, a.y + b.y);</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">double</span> <span class="keyword">operator</span> ^ (pdd a, pdd b) &#123;</span><br><span class="line">    <span class="keyword">return</span> a.x * b.y - a.y * b.x;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">double</span> <span class="keyword">operator</span> * (pdd a, pdd b) &#123;</span><br><span class="line">    <span class="keyword">return</span> a.x * b.x + a.y * b.y;</span><br><span class="line">&#125;</span><br><span class="line">pdd <span class="keyword">operator</span> * (pdd a, <span class="type">double</span> b) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">pdd</span>(a.x * b, a.y * b);</span><br><span class="line">&#125;</span><br><span class="line">pdd <span class="keyword">operator</span> / (pdd a, <span class="type">double</span> b) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">pdd</span>(a.x / b, a.y / b);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">static</span> <span class="type">double</span> <span class="title">cross</span><span class="params">(pdd a,pdd b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> a.x * b.y - a.y * b.x;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">static</span> <span class="type">double</span> <span class="title">dot</span><span class="params">(pdd a,pdd b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> a.x * b.x + a.y * b.y;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">static</span> <span class="type">double</span> <span class="title">dis2</span><span class="params">(pdd a, pdd b)</span></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">double</span> <span class="title">dis</span><span class="params">(pdd a, pdd b)</span></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">sqrt</span>((a.x - b.x) * (a.x - b.x) * <span class="number">1.0</span> + (a.y - b.y) * (a.y - b.y) * <span class="number">1.0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">double</span> <span class="title">culk</span><span class="params">(pdd a, pdd b)</span></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> (a.y - b.y) / (a.x - b.x);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">quicksort</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;               <span class="comment">//快排 </span></span><br><span class="line">    <span class="keyword">if</span>(l&lt;r) &#123;</span><br><span class="line">        <span class="built_in">swap</span>(in[l], in[(l + r) / <span class="number">2</span>]);</span><br><span class="line">        <span class="type">int</span> i = l, j = r;</span><br><span class="line">        pdd x = in[l];</span><br><span class="line">        <span class="keyword">while</span>(i &lt; j) &#123;</span><br><span class="line">            <span class="keyword">while</span>(i &lt; j&amp;&amp;(<span class="built_in">cross</span>(in[j] - in[<span class="number">0</span>], x - in[j]) &lt; <span class="number">0</span>||(<span class="built_in">cross</span>(in[j] - in[<span class="number">0</span>], x - in[j]) == <span class="number">0</span>&amp;&amp;<span class="built_in">dis2</span>(in[j], in[<span class="number">0</span>]) &gt; <span class="built_in">dis2</span>(x, in[<span class="number">0</span>])))) &#123;</span><br><span class="line">                j--;</span><br><span class="line">            &#125; <span class="keyword">if</span>(i &lt; j) &#123;</span><br><span class="line">                in[i ++] = in[j];</span><br><span class="line">            &#125; <span class="keyword">while</span>(i &lt; j&amp;&amp;(<span class="built_in">cross</span>(in[i] - in[<span class="number">0</span>], x - in[i]) &gt; <span class="number">0</span>||(<span class="built_in">cross</span>(in[i] - in[<span class="number">0</span>], x - in[i]) == <span class="number">0</span>&amp;&amp;<span class="built_in">dis2</span>(in[i], in[<span class="number">0</span>]) &lt; <span class="built_in">dis2</span>(x, in[<span class="number">0</span>])))) &#123;</span><br><span class="line">                i++;</span><br><span class="line">            &#125; <span class="keyword">if</span>(i &lt; j) &#123;</span><br><span class="line">                in[j --] = in[i];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; in[i] = x;</span><br><span class="line">        <span class="built_in">quicksort</span>(l, i - <span class="number">1</span>);</span><br><span class="line">        <span class="built_in">quicksort</span>(i + <span class="number">1</span>, r);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">convexHell</span><span class="params">()</span> </span>&#123;                          <span class="comment">//查找凸包上的点 </span></span><br><span class="line">    <span class="type">int</span> ori = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt; in.<span class="built_in">size</span>(); i ++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(in[i].y &lt; in[ori].y||(in[i].y == in[ori].y&amp;&amp;in[i].x &lt; in[ori].x)) &#123;</span><br><span class="line">            ori = i;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="built_in">swap</span>(in[<span class="number">0</span>], in[ori]);</span><br><span class="line">    <span class="built_in">quicksort</span>(<span class="number">1</span>, in.<span class="built_in">size</span>() - <span class="number">1</span>);</span><br><span class="line">    <span class="function">vector&lt;pdd&gt; <span class="title">tmp</span><span class="params">(in.size() + <span class="number">10</span>)</span></span>;</span><br><span class="line">    <span class="type">int</span> nw = <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt; in.<span class="built_in">size</span>(); i ++) &#123;</span><br><span class="line">        <span class="keyword">while</span>(nw &gt;= <span class="number">1</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span>(<span class="built_in">cross</span>(tmp[nw] - tmp[nw - <span class="number">1</span>], in[i] - tmp[nw]) &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span>(<span class="built_in">cross</span>(tmp[nw] - tmp[nw - <span class="number">1</span>],  in[i] - tmp[nw]) == <span class="number">0</span>) &#123;</span><br><span class="line">                nw --;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                nw --;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; tmp[++ nw] = in[i];</span><br><span class="line">    &#125; in.<span class="built_in">clear</span>();</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt;= nw; i ++) &#123;</span><br><span class="line">        in.<span class="built_in">emplace_back</span>(tmp[i]);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">cularea</span><span class="params">()</span> </span>&#123;                       <span class="comment">//计算面积</span></span><br><span class="line">    <span class="built_in">convexHell</span>();</span><br><span class="line">    <span class="type">double</span> ans = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt; in.<span class="built_in">size</span>(); i ++)&#123;</span><br><span class="line">        ans += <span class="built_in">cross</span>(in[i], in[(i + <span class="number">1</span>) % in.<span class="built_in">size</span>()]);</span><br><span class="line">    &#125; cout &lt;&lt; ans / <span class="number">2.0</span>  &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line">    pdd l = &#123;<span class="number">1e7</span>, <span class="number">0</span>&#125;, r = &#123;<span class="number">0</span>, <span class="number">0</span>&#125;;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i ++) &#123;</span><br><span class="line">        pdd t;</span><br><span class="line">        cin &gt;&gt; t.x &gt;&gt; t.y;</span><br><span class="line">        l.x = <span class="built_in">min</span>(l.x, t.x);</span><br><span class="line">        r.x = <span class="built_in">max</span>(r.x, t.x);</span><br><span class="line">        in.<span class="built_in">emplace_back</span>(t);</span><br><span class="line">    &#125; in.<span class="built_in">emplace_back</span>(l);</span><br><span class="line">    in.<span class="built_in">emplace_back</span>(r);</span><br><span class="line">    <span class="built_in">cularea</span>();</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>), cout.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    <span class="type">int</span> _ = <span class="number">1</span>;</span><br><span class="line">    <span class="comment">// cin &gt;&gt; _;</span></span><br><span class="line">    cout &lt;&lt; fixed &lt;&lt; <span class="built_in">setprecision</span>(<span class="number">6</span>);</span><br><span class="line">    <span class="keyword">while</span>(_ --) &#123;</span><br><span class="line">        <span class="built_in">solve</span>();</span><br><span class="line">    &#125; <span class="keyword">return</span> _ ^ _;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="J">J</h3><p>由于敲击的字母顺序与所给的字符串无关，只需将所给的字符串排序后顺序扫描更新答案。时间$O(n)$，空间$O(n)$。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pii pair&lt;int, int&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> mod 100000007</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MOD 998244353</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> x first</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> y second</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> db long double</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N  =  <span class="number">2e5</span> + <span class="number">10</span>, M = <span class="number">1010</span>, P = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">string s;</span><br><span class="line">cin &gt;&gt; s;</span><br><span class="line"><span class="type">int</span> ans = <span class="number">0</span>;</span><br><span class="line"><span class="type">char</span> c = <span class="string">&#x27;a&#x27;</span>;</span><br><span class="line"><span class="built_in">sort</span>(s.<span class="built_in">begin</span>(), s.<span class="built_in">end</span>());</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt; s.<span class="built_in">size</span>(); i ++) &#123;</span><br><span class="line">ans += <span class="built_in">abs</span>(s[i] - c) + <span class="number">1</span>;</span><br><span class="line">c = s[i];</span><br><span class="line">&#125; cout &lt;&lt; ans &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>), cout.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line"><span class="type">int</span> _ = <span class="number">1</span>;</span><br><span class="line"><span class="comment">// cin &gt;&gt; _;</span></span><br><span class="line">cout &lt;&lt; fixed &lt;&lt; <span class="built_in">setprecision</span>(<span class="number">6</span>);</span><br><span class="line"><span class="keyword">while</span>(_ --) &#123;</span><br><span class="line"><span class="built_in">solve</span>();</span><br><span class="line">&#125; <span class="keyword">return</span> _ ^ _;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="K">K</h3><p>由于<code>n &lt;= 10</code>很小，只要暴力跑全排列找出符合答案的排列即可。时间$O(n!*n^2)$，空间$O(n)$。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pii pair&lt;int, int&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pdd pair&lt;double, double&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> mod 100000007</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MOD 998244353</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> x first</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> y second</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> db long double</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N  =  <span class="number">2e5</span> + <span class="number">10</span>, M = <span class="number">1010</span>, P = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">p</span><span class="params">(P)</span></span>;</span><br><span class="line"><span class="function">vector&lt;<span class="type">bool</span>&gt; <span class="title">st</span><span class="params">(P)</span></span>;</span><br><span class="line"><span class="function">vector&lt;pdd&gt; <span class="title">f</span><span class="params">(P)</span></span>;</span><br><span class="line"><span class="function">vector&lt;<span class="type">double</span>&gt; <span class="title">ff</span><span class="params">(P)</span></span>;</span><br><span class="line"><span class="type">bool</span> ok;</span><br><span class="line"><span class="type">int</span> n;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">double</span> <span class="title">get</span><span class="params">(pdd a, pdd b)</span> </span>&#123;</span><br><span class="line">    <span class="type">double</span> x = a.x - b.x, y = a.y - b.y;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">sqrt</span>(x * x + y * y);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">check</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt; n; i ++) &#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> j = i + <span class="number">1</span>; j &lt;= n; j ++) &#123;</span><br><span class="line">            <span class="type">double</span> t = <span class="built_in">get</span>(f[i], f[j]);</span><br><span class="line">            <span class="type">double</span> a = ff[p[i]], b = ff[p[j]];</span><br><span class="line">            <span class="keyword">if</span>(t &gt; <span class="built_in">fabs</span>(a - b)&amp;&amp;t &lt; <span class="built_in">fabs</span>(a + b)) &#123;</span><br><span class="line">                <span class="keyword">return</span> ;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; ok = <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> u)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(ok) &#123;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125; <span class="keyword">if</span>(u == n + <span class="number">1</span>) &#123;</span><br><span class="line">        <span class="built_in">check</span>();</span><br><span class="line">        <span class="keyword">if</span>(ok) &#123;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i ++) &#123;</span><br><span class="line">                cout &lt;&lt; p[i] &lt;&lt; <span class="string">&quot; \n&quot;</span>[i == n];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125; <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i ++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(!st[i]) &#123;</span><br><span class="line">            st[i] = <span class="literal">true</span>;</span><br><span class="line">            p[u] = i;</span><br><span class="line">            <span class="built_in">dfs</span>(u + <span class="number">1</span>);</span><br><span class="line">            st[i] = <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i ++) &#123;</span><br><span class="line">        cin &gt;&gt; f[i].x &gt;&gt; f[i].y;</span><br><span class="line">    &#125; <span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i ++) &#123;</span><br><span class="line">        cin &gt;&gt; ff[i];</span><br><span class="line">    &#125; ok = <span class="literal">false</span>;</span><br><span class="line">    <span class="built_in">dfs</span>(<span class="number">1</span>);</span><br><span class="line">    <span class="keyword">if</span>(!ok) &#123;</span><br><span class="line">        cout &lt;&lt; <span class="string">&quot;-1\n&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>), cout.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    <span class="type">int</span> _ = <span class="number">1</span>;</span><br><span class="line">    <span class="comment">// cin &gt;&gt; _;</span></span><br><span class="line">    cout &lt;&lt; fixed &lt;&lt; <span class="built_in">setprecision</span>(<span class="number">6</span>);</span><br><span class="line">    <span class="keyword">while</span>(_ --) &#123;</span><br><span class="line">        <span class="built_in">solve</span>();</span><br><span class="line">    &#125; <span class="keyword">return</span> _ ^ _;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="M">M</h3><p>签到题，根据题目模拟即可。时间$O(1)$，空间$O(1)$。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> pii pair&lt;int, int&gt;</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> mod 100000007</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MOD 998244353</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> x first</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> y second</span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> db long double</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N  =  <span class="number">2e5</span> + <span class="number">10</span>, M = <span class="number">1010</span>, P = <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="type">int</span> x;</span><br><span class="line">string s;</span><br><span class="line">cin &gt;&gt; x &gt;&gt; s;</span><br><span class="line"><span class="keyword">if</span>(s == <span class="string">&quot;MiB&quot;</span>)&#123;</span><br><span class="line">cout &lt;&lt; x * (<span class="number">1ll</span> &lt;&lt; <span class="number">10</span>)  &lt;&lt;  <span class="string">&quot; KiB\n&quot;</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">cout &lt;&lt; x * <span class="number">1000</span> &lt;&lt; <span class="string">&quot; KB\n&quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>), cout.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line"><span class="type">int</span> _ = <span class="number">1</span>;</span><br><span class="line"><span class="comment">// cin &gt;&gt; _;</span></span><br><span class="line">cout &lt;&lt; fixed &lt;&lt; <span class="built_in">setprecision</span>(<span class="number">6</span>);</span><br><span class="line"><span class="keyword">while</span>(_ --) &#123;</span><br><span class="line"><span class="built_in">solve</span>();</span><br><span class="line">&#125; <span class="keyword">return</span> _ ^ _;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">终于拿金了！！！</summary>
    
    
    
    <category term="算法" scheme="http://265832.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="程序设计竞赛" scheme="http://265832.xyz/tags/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E7%AB%9E%E8%B5%9B/"/>
    
  </entry>
  
  <entry>
    <title>2024 CCPC 郑州邀请赛暨河南省赛 题解</title>
    <link href="http://265832.xyz/posts/9f4b8961.html"/>
    <id>http://265832.xyz/posts/9f4b8961.html</id>
    <published>2024-10-04T12:32:02.000Z</published>
    <updated>2024-10-05T14:57:02.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="A-Once-In-My-Life-（构造）">A - Once In My Life （构造）</h1><h2 id="分析">分析</h2><p>根据题目要求需要两个d，并且要保证<code>123456789</code>都存在，那么就可以尝试先构造出一个数保证存在<code>123456789</code>。<br>尝试以下构造方式：设n的长度为len，则可以构造出 $k<em>n=(\frac{123456789</em>{10}^{len+1}}{n}+1)<em>n$, 可以发现 $k</em>n$ 的前缀一定是<code>1234567890X</code>，此时只要对$k$每次+1，至多一百次一定能出现想要的$d$。</p><h2 id="代码实现">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    <span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line">    <span class="keyword">constexpr</span> <span class="type">int</span> N = <span class="number">123456789LL</span>;</span><br><span class="line">    <span class="type">int</span> tt;</span><br><span class="line">    <span class="keyword">for</span> (std::cin &gt;&gt; tt; tt--;) &#123;</span><br><span class="line">        <span class="type">int</span> n, d;</span><br><span class="line">        std::cin &gt;&gt; n &gt;&gt; d;</span><br><span class="line">        <span class="type">int</span> k = <span class="number">123456789LL</span> * std::<span class="built_in">pow</span>&lt;<span class="type">int</span>&gt;(<span class="number">10</span>, <span class="number">2</span> + (<span class="type">int</span>)std::<span class="built_in">log10</span>&lt;<span class="type">int</span>&gt;(n)) / n + <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">auto</span> check = [&amp;](<span class="type">int</span> w) &#123;</span><br><span class="line">            std::vector&lt;<span class="type">int</span>&gt; <span class="built_in">c</span>(<span class="number">10</span>);</span><br><span class="line">            <span class="type">int</span> num = w * n;</span><br><span class="line">            <span class="keyword">while</span> (num) c[num % <span class="number">10</span>] += <span class="number">1</span>, num /= <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= <span class="number">9</span>; ++i) <span class="keyword">if</span> (c[i] &lt; <span class="number">1</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> c[d] &gt;= <span class="number">2</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">while</span> (!<span class="built_in">check</span>(k)) k += <span class="number">1</span>;</span><br><span class="line">        std::cout &lt;&lt; k &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="B-扫雷-1">B - 扫雷 1</h1><h2 id="分析-2">分析</h2><p>队友写的，并没有看题，就贴一下队友代码和思路：<br>贪心。要使得买的探测仪最多，就要尽可能的买价格较便宜的，相同便宜的要买后面出现的，因为这样手中的钱会更多。所以我们只需要把价格作为第一关键词升序排序，出现序号作为第二关键词降序排序，然后一个一个尽可能的多买，直到已经到最后一个时退出就行</p><h2 id="代码实现-2">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">using</span> ll = <span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line">    vector&lt;tuple&lt;ll , ll&gt;&gt; tl;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">1</span>; i&lt;=n; ++ i) &#123;</span><br><span class="line">        <span class="type">int</span> x;</span><br><span class="line">        cin &gt;&gt; x;</span><br><span class="line">        tl.<span class="built_in">emplace_back</span>(x , -i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">sort</span>(tl.<span class="built_in">begin</span>() , tl.<span class="built_in">end</span>());</span><br><span class="line">    ll ans = <span class="number">0</span> , cur = <span class="number">0</span> , pre = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> [a , b] : tl) &#123;</span><br><span class="line">        b = -b;</span><br><span class="line">        <span class="keyword">if</span> (b &gt;= a &amp;&amp; b &gt; pre) &#123;</span><br><span class="line">            ans += (b - cur) / a;</span><br><span class="line">            cur += (b - cur) / a * a;</span><br><span class="line">            pre = b;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (b == n) <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    std::cout &lt;&lt; ans &lt;&lt; <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="C-中二病也要打比赛-（树状数组-dp）">C - 中二病也要打比赛 （树状数组+dp）</h1><h2 id="分析-3">分析</h2><p>依旧队友神力</p><h2 id="代码实现-3">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">template</span> &lt;<span class="keyword">typename</span> T&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Fenwick</span> &#123;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    vector&lt;T&gt; d;</span><br><span class="line">    <span class="built_in">Fenwick</span>() : <span class="built_in">n</span>(<span class="number">0</span>) &#123;&#125;</span><br><span class="line">    <span class="built_in">Fenwick</span>(<span class="type">int</span> n) : <span class="built_in">n</span>(n), <span class="built_in">d</span>(n) &#123;&#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">modify</span><span class="params">(<span class="type">int</span> x, T v)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">assert</span>(<span class="number">0</span> &lt;= x &amp;&amp; x &lt; n);</span><br><span class="line">        x += <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (x &lt;= n) &#123;</span><br><span class="line">            d[x - <span class="number">1</span>] = <span class="built_in">max</span>(d[x - <span class="number">1</span>], v);</span><br><span class="line">            x += x &amp; -x;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">T <span class="title">get</span><span class="params">(<span class="type">int</span> x)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">assert</span>(x &lt;= n);</span><br><span class="line">        T v = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> (x &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            v = <span class="built_in">max</span>(v, d[x - <span class="number">1</span>]);</span><br><span class="line">            x -= x &amp; -x;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> v;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">T <span class="title">get</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">assert</span>(l &lt;= r);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">get</span>(r) - <span class="built_in">get</span>(l);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">int</span> <span class="title">min_right</span><span class="params">(T k)</span> </span>&#123;</span><br><span class="line">        <span class="type">int</span> r = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> e = __lg(n); ~e; --e) &#123;</span><br><span class="line">            <span class="type">int</span> u = (<span class="number">1</span> &lt;&lt; e);</span><br><span class="line">            <span class="keyword">if</span> (r + u &lt;= n &amp;&amp; d[r + u - <span class="number">1</span>] &lt; k) &#123;</span><br><span class="line">                k -= d[(r += u) - <span class="number">1</span>];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> r;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">  cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">  <span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line">  <span class="type">int</span> n;</span><br><span class="line">  cin &gt;&gt; n;</span><br><span class="line">  <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">a</span><span class="params">(n)</span></span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">    cin &gt;&gt; a[i];</span><br><span class="line">    --a[i];</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">l</span><span class="params">(n, n)</span></span>;</span><br><span class="line">  <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">r</span><span class="params">(n, <span class="number">0</span>)</span></span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">    l[a[i]] = <span class="built_in">min</span>(l[a[i]], i);</span><br><span class="line">    r[a[i]] = <span class="built_in">max</span>(r[a[i]], i);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = n - <span class="number">1</span>; i &gt;= <span class="number">0</span>; ) &#123;</span><br><span class="line">    <span class="built_in">assert</span>(i == r[a[i]]);</span><br><span class="line">    <span class="type">int</span> j = l[a[i]], k = i;</span><br><span class="line">    <span class="keyword">while</span> (k &gt;= j) &#123;</span><br><span class="line">      r[a[k]] = i;</span><br><span class="line">      j = <span class="built_in">min</span>(j, l[a[k]]);</span><br><span class="line">      --k;</span><br><span class="line">    &#125;</span><br><span class="line">    i = k;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="function">Fenwick&lt;<span class="type">int</span>&gt; <span class="title">fen</span><span class="params">(n)</span></span>;</span><br><span class="line">  <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">dp</span><span class="params">(n)</span></span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">    <span class="built_in">assert</span>(i == l[a[i]]);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> j = i; j &lt;= r[a[i]]; ++j) &#123;</span><br><span class="line">      <span class="keyword">if</span> (j == l[a[j]]) &#123;</span><br><span class="line">        dp[l[a[j]]] = fen.<span class="built_in">get</span>(a[j]) + <span class="number">1</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> j = i; j &lt;= r[a[i]]; ++j) &#123;</span><br><span class="line">      <span class="keyword">if</span> (j == l[a[j]]) &#123;</span><br><span class="line">        fen.<span class="built_in">modify</span>(a[j], dp[l[a[j]]]);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    i = r[a[i]];</span><br><span class="line">  &#125;</span><br><span class="line">  cout &lt;&lt; <span class="built_in">set</span>&lt;<span class="type">int</span>&gt;(a.<span class="built_in">begin</span>(), a.<span class="built_in">end</span>()).<span class="built_in">size</span>() - *<span class="built_in">max_element</span>(dp.<span class="built_in">begin</span>(), dp.<span class="built_in">end</span>()) &lt;&lt; <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="D-距离之比（推公式-贪心）">D - 距离之比（推公式+贪心）</h1><h2 id="分析-4">分析</h2><p>设<br>,对原公式进行平方并化简可得：</p><p>。想让这个式子尽可能的大，也就是说让</p><p>尽量取小。设</p><p>, 此时式子变化为</p><p>, 可以发现其在<br>为<br>和<br>时取到最优。因此只要对<br>和<br>分别进行排序，此时两两相邻为最优，两者取个最大值即可。</p><h2 id="代码实现-4">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    std::cout &lt;&lt; std::fixed &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; std::<span class="built_in">setprecision</span>(<span class="number">20</span>);</span><br><span class="line">    <span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line">    <span class="type">int</span> tt;</span><br><span class="line">    <span class="keyword">for</span> (std::cin &gt;&gt; tt; tt--;) &#123;</span><br><span class="line">        <span class="type">int</span> n;</span><br><span class="line">        std::cin &gt;&gt; n;</span><br><span class="line">        std::vector&lt;std::pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt;&gt; <span class="built_in">p</span>(n);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> &amp;[x, y] : p) &#123;</span><br><span class="line">            std::cin &gt;&gt; x &gt;&gt; y;</span><br><span class="line">        &#125;</span><br><span class="line">        std::<span class="built_in">sort</span>(p.<span class="built_in">begin</span>(), p.<span class="built_in">end</span>(), </span><br><span class="line">            [&amp;](<span class="type">const</span> <span class="keyword">auto</span>&amp; a, <span class="type">const</span> <span class="keyword">auto</span>&amp; b) &#123;</span><br><span class="line">                <span class="keyword">return</span> a.first + a.second &lt; b.first + b.second;</span><br><span class="line">            &#125;);</span><br><span class="line">        <span class="type">double</span> ans = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            <span class="type">int</span> d1 = p[i - <span class="number">1</span>].first - p[i].first, d2 = p[i - <span class="number">1</span>].second - p[i].second;</span><br><span class="line">            ans = std::<span class="built_in">max</span>&lt;<span class="type">double</span>&gt;(ans, ((<span class="built_in">abs</span>(d1) + <span class="built_in">abs</span>(d2)) * <span class="number">1.</span> / <span class="built_in">sqrt</span>(d1 * d1 + d2 * d2)));</span><br><span class="line">        &#125;</span><br><span class="line">        std::<span class="built_in">sort</span>(p.<span class="built_in">begin</span>(), p.<span class="built_in">end</span>(), </span><br><span class="line">            [&amp;](<span class="type">const</span> <span class="keyword">auto</span>&amp; a, <span class="type">const</span> <span class="keyword">auto</span>&amp; b) &#123;</span><br><span class="line">                <span class="keyword">return</span> a.first - a.second &lt; b.first - b.second;</span><br><span class="line">            &#125;);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            <span class="type">int</span> d1 = p[i - <span class="number">1</span>].first - p[i].first, d2 = p[i - <span class="number">1</span>].second - p[i].second;</span><br><span class="line">            ans = std::<span class="built_in">max</span>&lt;<span class="type">double</span>&gt;(ans, ((<span class="built_in">abs</span>(d1) + <span class="built_in">abs</span>(d2)) * <span class="number">1.</span> / <span class="built_in">sqrt</span>(d1 * d1 + d2 * d2)));</span><br><span class="line">        &#125;</span><br><span class="line">        std::cout &lt;&lt; ans &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="E-保卫城邦">E - 保卫城邦</h1><h2 id="分析-5">分析</h2><p>太菜了，不会写</p><h1 id="F-优秀字符串-模拟">F - 优秀字符串 (模拟)</h1><h2 id="分析-6">分析</h2><p>按照题意模拟即可</p><h2 id="代码实现-5">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    std::cin &gt;&gt; n;</span><br><span class="line">    <span class="type">int</span> ans = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">        std::string s;</span><br><span class="line">        std::cin &gt;&gt; s;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">size</span>(s) == <span class="number">5</span> &amp;&amp; s[<span class="number">2</span>] == s[<span class="number">4</span>] &amp;&amp; std::set&lt;<span class="type">char</span>&gt;&#123;s[<span class="number">0</span>], s[<span class="number">1</span>], s[<span class="number">2</span>], s[<span class="number">3</span>]&#125;.<span class="built_in">size</span>() == <span class="number">4</span>) &#123;</span><br><span class="line">            ans += <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    std::cout &lt;&lt; ans &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="G-扫雷-2-（构造）">G - 扫雷 2 （构造）</h1><h2 id="分析-7">分析</h2><p>原来扫雷2的2是这个2щ(ಠ益ಠщ)<br>想了有两种构造方法：</p><p>第一种方法：<br>对于<br>时，我们可以直接按照如下方法构造</p><p>01100        01100<br>11000        11000<br>10000        10000<br>00000        00000<br>00000        00001<br>此时对于m为奇数直接在左上角构造两个斜杠，为偶数时多出来的可以直接放在右下角。（注意特判<br>，<br>的情况）<br>此时对于<br>的情况我们考虑缩小矩阵，可将雷埋在最下面一行和最右边一行，此时可以得到<br>的矩阵，例如<br>时可以构造如下矩阵：<br>011011<br>110011<br>100011<br>000011<br>111111<br>111111<br>此时问题回到<br>的情况，注意构造过程中的细节即可。</p><p>第二种方法（感觉可行，但是并没有能写出来）：<br>构造一个匚字型，形如：</p><p>11100        11110<br>01000        10100<br>11100        10100<br>01000        10100<br>00000        11110<br>按照以上样子构造即可，构造完后多出来的雷往中间空出来的地方埋就行了，最后注意特判m较小的情况。（其实感觉可以方法一方法二结合写起来更简单一些）</p><h2 id="代码实现（方法1）">代码实现（方法1）</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    <span class="keyword">auto</span> bury = [&amp;](std::vector&lt;std::string&gt;&amp; adj, <span class="type">int</span> num, <span class="type">int</span> k) &#123;</span><br><span class="line">        <span class="type">int</span> len = (num + <span class="number">1</span>) / <span class="number">2</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; len; ++i) &#123;</span><br><span class="line">            adj[i][len - i - <span class="number">1</span>]++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; len - <span class="number">1</span>; ++i) &#123;</span><br><span class="line">            adj[i][len - i - <span class="number">2</span>]++;</span><br><span class="line">        &#125;</span><br><span class="line">        adj[k][k] += num % <span class="number">2</span> == <span class="number">0</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="type">int</span> tt;</span><br><span class="line">    <span class="keyword">for</span> (std::cin &gt;&gt; tt; tt--;) &#123;</span><br><span class="line">        <span class="type">int</span> n, m;</span><br><span class="line">        std::cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line">        <span class="function">std::vector&lt;std::string&gt; <span class="title">ans</span><span class="params">(n, std::string(n, <span class="string">&#x27;0&#x27;</span>))</span></span>;</span><br><span class="line">        <span class="keyword">if</span> (m &lt;= <span class="number">2</span> * n) &#123;</span><br><span class="line">            <span class="keyword">if</span> (n == <span class="number">5</span> &amp;&amp; m == <span class="number">10</span>) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">                    <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; i; ++j) &#123;</span><br><span class="line">                        ans[j][n - i - <span class="number">1</span>]++;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="built_in">bury</span>(ans, m, n - <span class="number">1</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="type">int</span> now = n;</span><br><span class="line">            <span class="keyword">while</span> (m &gt;= <span class="number">2</span> * now + <span class="number">1</span> &amp;&amp; now) &#123;</span><br><span class="line">                m -= <span class="number">2</span> * now - <span class="number">1</span>;</span><br><span class="line">                now--;</span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; now; ++i) &#123;</span><br><span class="line">                    ans[i][now]++, ans[now][i]++;</span><br><span class="line">                &#125;</span><br><span class="line">                ans[now][now]++;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (m &gt;= <span class="number">2</span> &amp;&amp; m &lt; <span class="number">2</span> * now - <span class="number">1</span>) &#123;</span><br><span class="line">                ans[<span class="number">0</span>][now - <span class="number">1</span>]++, ans[now - <span class="number">1</span>][<span class="number">0</span>]++;</span><br><span class="line">                m -= <span class="number">2</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (m) &#123;</span><br><span class="line">                <span class="keyword">if</span> (now == <span class="number">5</span> &amp;&amp; m == <span class="number">10</span>) &#123;</span><br><span class="line">                    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; now; ++i) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; i; ++j) &#123;</span><br><span class="line">                            ans[j][now - i - <span class="number">1</span>]++;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">else</span> <span class="keyword">if</span> (now == <span class="number">3</span> &amp;&amp; m == <span class="number">1</span>) &#123;</span><br><span class="line">                    ans[now - <span class="number">1</span>][now - <span class="number">1</span>]++;</span><br><span class="line">                &#125; <span class="keyword">else</span> <span class="keyword">if</span> (now == <span class="number">4</span> &amp;&amp; m == <span class="number">8</span>) &#123;</span><br><span class="line">                    <span class="built_in">bury</span>(ans, m, now - <span class="number">1</span>);</span><br><span class="line">                    ans[<span class="number">0</span>][<span class="number">0</span>]++, ans[now - <span class="number">1</span>][now - <span class="number">1</span>]--;</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    <span class="keyword">if</span> ((now == <span class="number">4</span> &amp;&amp; (m == <span class="number">3</span> || m == <span class="number">4</span>)) || (now == <span class="number">3</span> &amp;&amp; m == <span class="number">2</span>) || (now == <span class="number">5</span> &amp;&amp; m == <span class="number">5</span>)) &#123;</span><br><span class="line">                        ans[<span class="number">0</span>][now - <span class="number">1</span>]--, ans[now - <span class="number">1</span>][<span class="number">0</span>]--;</span><br><span class="line">                        <span class="keyword">if</span> (now == <span class="number">4</span> &amp;&amp; m == <span class="number">4</span>) &#123;</span><br><span class="line">                            ans[now - <span class="number">1</span>][now - <span class="number">1</span>]--;</span><br><span class="line">                            ans[<span class="number">0</span>][<span class="number">0</span>]++;</span><br><span class="line">                        &#125;</span><br><span class="line">                        m += <span class="number">2</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">if</span> (now &gt;= <span class="number">5</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (now - (m + <span class="number">1</span>) / <span class="number">2</span> == <span class="number">2</span>) &#123;</span><br><span class="line">                            ans[now - <span class="number">2</span>][now - <span class="number">1</span>]++, ans[now - <span class="number">1</span>][now - <span class="number">2</span>]++;</span><br><span class="line">                            m -= <span class="number">2</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                        <span class="keyword">if</span> ((m &amp; <span class="number">1</span>) &amp;&amp; !(now == <span class="number">5</span> &amp;&amp; m == <span class="number">9</span>)) &#123;</span><br><span class="line">                            m += <span class="number">1</span>;</span><br><span class="line">                            ans[n - <span class="number">1</span>][n - <span class="number">1</span>]--;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">if</span> (m) &#123;</span><br><span class="line">                        <span class="built_in">bury</span>(ans, m, now - <span class="number">1</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (now == <span class="number">3</span> || now == <span class="number">2</span>) &#123;</span><br><span class="line">                ans[<span class="number">0</span>][now - <span class="number">1</span>]--, ans[now - <span class="number">1</span>][<span class="number">0</span>]--;</span><br><span class="line">                ans[<span class="number">1</span>][<span class="number">1</span>]++, ans[<span class="number">0</span> + <span class="number">2</span> * (now == <span class="number">3</span>)][<span class="number">0</span> + <span class="number">2</span> * (now == <span class="number">3</span>)]++;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        std::cout &lt;&lt; <span class="string">&quot;Yes&quot;</span> &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            std::cout &lt;&lt; ans[i] &lt;&lt; <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="H-随机栈">H - 随机栈</h1><h2 id="分析-8">分析</h2><p>队友写的，题也没有看，贴一下队友代码和思路：<br>这题实际上是求这个随机栈的出栈序列是非降序的概率，然后求逆元就行。那么我们只需要求出这个概率的分子，分母，最后通过费马小定理用快速幂求出逆元就行</p><p>求分子分母的过程就是利用古典概型分别求出总共的情况数（即分母），非降序的情况数（即分子）。<br>求分母的过程就是每次入栈 -1 时要乘上当前栈的大小，就能算出总共的情况数；<br>求分子的过程就是每次入栈 -1 时要乘上当前栈顶元素的个数，表示这些元素都能达到出栈序列非降序。<br>特别的当无法达成出栈序列是非降序时，概率为0，将分子置0就行</p><h2 id="代码实现-6">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">using</span> ll = <span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"><span class="keyword">constexpr</span> ll mod = <span class="number">998244353</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//快速幂</span></span><br><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> P = <span class="number">998244353</span>; </span><br><span class="line"><span class="function">ll <span class="title">ksm</span><span class="params">(ll a , ll b)</span> </span>&#123;</span><br><span class="line">    ll res = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span> (b) &#123;</span><br><span class="line">        <span class="keyword">if</span> (b &amp; <span class="number">1</span>) res = (ll)res * a % P;</span><br><span class="line">        a = (ll)a * a % P; </span><br><span class="line">        b &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">    ll n , pren = <span class="number">0</span> , fenzi = <span class="number">1</span> , fenmu = <span class="number">1</span>;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line">    n *= <span class="number">2</span>;</span><br><span class="line">    priority_queue &lt;ll, vector&lt;ll&gt;, greater&lt;ll&gt;&gt; ql;</span><br><span class="line">    <span class="function">vector&lt;ll&gt; <span class="title">a</span><span class="params">(n<span class="number">+2</span>)</span></span>;</span><br><span class="line">    map&lt;ll , ll&gt; mp; </span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">1</span>; i &lt;= n; ++ i) &#123;</span><br><span class="line">        cin &gt;&gt; a[i];</span><br><span class="line">        <span class="keyword">if</span> (a[i] == <span class="number">-1</span>) &#123;</span><br><span class="line">            ll len = (ll)ql.<span class="built_in">size</span>();</span><br><span class="line">            fenmu = fenmu % mod * len % mod;</span><br><span class="line">            fenzi = fenzi % mod * mp[ql.<span class="built_in">top</span>()] % mod;</span><br><span class="line">            pren = <span class="built_in">max</span>(ql.<span class="built_in">top</span>() , pren);</span><br><span class="line">            mp[ql.<span class="built_in">top</span>()]--;</span><br><span class="line">            ql.<span class="built_in">pop</span>();</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (a[i] != <span class="number">-1</span>) &#123;</span><br><span class="line">            ql.<span class="built_in">push</span>(a[i]);</span><br><span class="line">            mp[a[i]] ++;</span><br><span class="line">            <span class="keyword">if</span> (a[i] &lt; pren) &#123;</span><br><span class="line">                fenzi = <span class="number">0</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; </span><br><span class="line">    ll ans = fenzi * <span class="built_in">ksm</span>(fenmu , mod - <span class="number">2</span>) % mod;</span><br><span class="line">    std::cout &lt;&lt; ans &lt;&lt; <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="I-378QAQ-和字符串-（枚举-hash-二分）">I - 378QAQ 和字符串 （枚举+hash+二分）</h1><h2 id="分析-9">分析</h2><p>枚举p，每次从p到n开始查找，每次跳过<br>和<br>的lcp，以i % p为起点,统计一下以此起点时需要修改的数量，并且标记一下i % p已经被修改过了，最后判断一下以p为循环节需要修改的数量是否小于k即可。（很极限的创过去了，队友还在想着如何用卷积卷过Test4 “v(〓￣(∵エ∵)￣〓)v”）</p><h2 id="代码实现-7">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> ULL = <span class="type">unsigned</span> <span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    <span class="type">int</span> tt;</span><br><span class="line">    <span class="keyword">for</span> (std::cin &gt;&gt; tt; tt--;)[&amp;] &#123;</span><br><span class="line">        <span class="type">int</span> n, k;</span><br><span class="line">        std::cin &gt;&gt; n &gt;&gt; k;</span><br><span class="line">        std::string s;</span><br><span class="line">        std::cin &gt;&gt; s;</span><br><span class="line">        <span class="keyword">constexpr</span> <span class="type">int</span> P = <span class="number">131</span>;</span><br><span class="line">        <span class="function">std::vector&lt;ULL&gt; <span class="title">h</span><span class="params">(n + <span class="number">1</span>)</span>, <span class="title">p</span><span class="params">(n + <span class="number">1</span>)</span></span>;</span><br><span class="line">        p[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            h[i + <span class="number">1</span>] = h[i] * P + s[i];</span><br><span class="line">            p[i + <span class="number">1</span>] = p[i] * P; </span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">auto</span> get = [&amp;](<span class="type">int</span> l, <span class="type">int</span> r) &#123; </span><br><span class="line">            <span class="keyword">return</span> h[r] - h[l - <span class="number">1</span>] * p[r - l + <span class="number">1</span>];</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="keyword">auto</span> lcp = [&amp;](<span class="type">int</span> a, <span class="type">int</span> b) &#123;</span><br><span class="line">            <span class="type">int</span> l = <span class="number">0</span>, r = n - b;</span><br><span class="line">            <span class="keyword">while</span> (l &lt; r) &#123;</span><br><span class="line">                <span class="type">int</span> mid = l + r &gt;&gt; <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">get</span>(a + <span class="number">1</span>, a + <span class="number">1</span> + mid) == <span class="built_in">get</span>(b + <span class="number">1</span>, b + <span class="number">1</span> + mid)) &#123;</span><br><span class="line">                    l = mid + <span class="number">1</span>;</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    r = mid;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> r;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">vis</span><span class="params">(n)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> p = n / <span class="number">4</span> + <span class="number">1</span>; p &lt;= n / <span class="number">2</span>; ++p) &#123;</span><br><span class="line">            <span class="type">int</span> cost = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = p; i &lt; n &amp;&amp; cost &lt;= k; ++i) &#123;</span><br><span class="line">                i += <span class="built_in">lcp</span>(i - p, i);</span><br><span class="line">                <span class="keyword">if</span> (i == n) <span class="keyword">break</span>;</span><br><span class="line">                <span class="type">int</span> x = i % p;</span><br><span class="line">                <span class="keyword">if</span> (vis[x] != p) &#123;</span><br><span class="line">                    vis[x] = p;</span><br><span class="line">                    <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">cnt</span><span class="params">(<span class="number">26</span>)</span></span>;</span><br><span class="line">                    <span class="type">int</span> res = <span class="number">0</span>, tot = <span class="number">0</span>;</span><br><span class="line">                    <span class="keyword">for</span> (<span class="type">int</span> j = x; j &lt; n; j += p) &#123;</span><br><span class="line">                        tot += <span class="number">1</span>;</span><br><span class="line">                        res = std::<span class="built_in">max</span>(res, ++cnt[s[j] - <span class="string">&#x27;a&#x27;</span>]);</span><br><span class="line">                    &#125;</span><br><span class="line">                    cost += tot - res;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (cost &lt;= k) &#123;</span><br><span class="line">                std::cout &lt;&lt; <span class="string">&quot;Yes&quot;</span> &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">                <span class="keyword">return</span> ;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        std::cout &lt;&lt; <span class="string">&quot;No&quot;</span> &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">    &#125; ();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="J-排列与合数-（全排列）">J - 排列与合数 （全排列）</h1><h2 id="分析-10">分析</h2><p>长度只有5，全排列暴力枚举即可，最后代码队友写的</p><h2 id="代码实现-8">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">using</span> ll = <span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"><span class="comment">//线性筛</span></span><br><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> maxn = <span class="number">1e6</span> + <span class="number">10</span>; </span><br><span class="line"><span class="type">int</span> pnl[maxn + <span class="number">10</span>], cnt;<span class="comment">//pnl</span></span><br><span class="line"><span class="type">int</span> st[maxn + <span class="number">10</span>];<span class="comment">//索引为质数值就是0</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">init_primes</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    st[<span class="number">0</span>]=<span class="number">1</span>;</span><br><span class="line">    st[<span class="number">1</span>]=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">2</span>; i &lt;= maxn; ++i) &#123;</span><br><span class="line">        <span class="keyword">if</span> (st[i] == <span class="number">0</span>)&#123;</span><br><span class="line">            pnl[cnt++] = i;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> j=<span class="number">0</span>; pnl[j] &lt;= maxn/i; ++j)&#123;</span><br><span class="line">            st[pnl[j]*i] = <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">if</span> (i%pnl[j] == <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">init_primes</span>();</span><br><span class="line"></span><br><span class="line">    <span class="type">int</span> tt = <span class="number">1</span>;</span><br><span class="line">    cin &gt;&gt; tt;</span><br><span class="line">    <span class="keyword">while</span> (tt--) [&amp;]&#123;</span><br><span class="line">        <span class="type">int</span> n , res;</span><br><span class="line">        cin &gt;&gt; n;</span><br><span class="line">        <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">cur</span><span class="params">(<span class="number">5</span>)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> j=<span class="number">4</span>; j&gt;=<span class="number">0</span>; -- j) &#123; </span><br><span class="line">            cur[j] = n % <span class="number">10</span>;</span><br><span class="line">            n /= <span class="number">10</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">sort</span>(cur.<span class="built_in">begin</span>(), cur.<span class="built_in">end</span>());</span><br><span class="line">        <span class="keyword">do</span> &#123;</span><br><span class="line">            <span class="type">int</span> nn = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> j=<span class="number">0</span>; j &lt; <span class="number">5</span>; ++ j) &#123;</span><br><span class="line">                nn = nn * <span class="number">10</span> + cur[j];</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="number">1e4</span> &lt;= nn &amp;&amp; st[nn] == <span class="number">1</span>) &#123;</span><br><span class="line">                std::cout &lt;&lt; nn &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">                <span class="keyword">return</span> ;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">while</span> (<span class="built_in">next_permutation</span>(cur.<span class="built_in">begin</span>() , cur.<span class="built_in">end</span>()));</span><br><span class="line">        std::cout &lt;&lt; <span class="number">-1</span> &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">    &#125;();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="K-树上问题-（并查集）">K - 树上问题 （并查集）</h1><h2 id="分析-11">分析</h2><p>可以将能够互为父子的视为一个集合，随后对集合之间连边，u-&gt;v代表u可以做v的父亲节点，最后找到唯一的根节点集合（唯一一个没有入度的集合，有多个则无解）即可。</p><h2 id="代码实现-9">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">DSU</span> &#123;</span><br><span class="line">    std::vector&lt;<span class="type">int</span>&gt; p, siz;</span><br><span class="line">    <span class="built_in">DSU</span>(<span class="type">int</span> n) : <span class="built_in">p</span>(n), <span class="built_in">siz</span>(n, <span class="number">1</span>) &#123; std::<span class="built_in">iota</span>(p.<span class="built_in">begin</span>(), p.<span class="built_in">end</span>(), <span class="number">0</span>); &#125;</span><br><span class="line">    <span class="function"><span class="type">int</span> <span class="title">leader</span><span class="params">(<span class="type">int</span> x)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">while</span> (x != p[x]) x = p[x] = p[p[x]];</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">bool</span> <span class="title">same</span><span class="params">(<span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123; <span class="keyword">return</span> <span class="built_in">leader</span>(x) == <span class="built_in">leader</span>(y); &#125;</span><br><span class="line">    <span class="function"><span class="type">bool</span> <span class="title">merge</span><span class="params">(<span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123;</span><br><span class="line">        x = <span class="built_in">leader</span>(x), y = <span class="built_in">leader</span>(y);</span><br><span class="line">        <span class="keyword">if</span> (x == y) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        siz[x] += siz[y], p[y] = x;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">int</span> <span class="title">size</span><span class="params">(<span class="type">int</span> x)</span> </span>&#123; <span class="keyword">return</span> siz[<span class="built_in">leader</span>(x)]; &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    <span class="type">int</span> tt;</span><br><span class="line">    <span class="keyword">for</span> (std::cin &gt;&gt; tt; tt--;) &#123;</span><br><span class="line">        <span class="type">int</span> n;</span><br><span class="line">        std::cin &gt;&gt; n;</span><br><span class="line">        <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">val</span><span class="params">(n)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            std::cin &gt;&gt; val[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function">DSU <span class="title">dsu</span><span class="params">(n)</span></span>;</span><br><span class="line">        std::vector&lt;std::pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt;&gt; edges;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n - <span class="number">1</span>; ++i) &#123;</span><br><span class="line">            <span class="type">int</span> a, b;</span><br><span class="line">            std::cin &gt;&gt; a &gt;&gt; b;</span><br><span class="line">            a--, b--;</span><br><span class="line">            <span class="type">int</span> num = (val[a] * <span class="number">2</span> &gt;= val[b]) + (val[b] * <span class="number">2</span> &gt;= val[a]);</span><br><span class="line">            <span class="keyword">if</span> (num == <span class="number">2</span>) &#123;</span><br><span class="line">                dsu.<span class="built_in">merge</span>(a, b);</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (val[a] * <span class="number">2</span> &lt;= val[b]) &#123;</span><br><span class="line">                    edges.<span class="built_in">emplace_back</span>(a, b);</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    edges.<span class="built_in">emplace_back</span>(b, a);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; </span><br><span class="line">        <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">d</span><span class="params">(n)</span></span>;</span><br><span class="line">        <span class="function">std::vector&lt;<span class="type">bool</span>&gt; <span class="title">use</span><span class="params">(n)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> [x, y] : edges) &#123;</span><br><span class="line">            x = dsu.<span class="built_in">leader</span>(x), y = dsu.<span class="built_in">leader</span>(y);</span><br><span class="line">            use[x] = use[y] = <span class="literal">true</span>;</span><br><span class="line">            d[y] += <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (dsu.<span class="built_in">size</span>(<span class="number">0</span>) == n) &#123;</span><br><span class="line">            std::cout &lt;&lt; n &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="type">int</span> root = <span class="number">-1</span>, num = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">                <span class="keyword">if</span> (d[i] == <span class="number">0</span> &amp;&amp; use[i]) &#123;</span><br><span class="line">                    root = i;</span><br><span class="line">                    num += <span class="number">1</span>;</span><br><span class="line">                &#125; </span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (num == <span class="number">1</span>) &#123;</span><br><span class="line">                std::cout &lt;&lt; dsu.<span class="built_in">size</span>(root) &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                std::cout &lt;&lt; <span class="number">0</span> &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="L-Toxel-与-PCPC-II（dp）">L - Toxel 与 PCPC II（dp）</h1><h2 id="分析-12">分析</h2><p>依旧队友神力，并没有读题的机会</p><h2 id="代码实现-10">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">  ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">  cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">  <span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line">  <span class="type">int</span> n, m;</span><br><span class="line">  cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line">  <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">a</span><span class="params">(m)</span></span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; m; ++i) &#123;</span><br><span class="line">    cin &gt;&gt; a[i];</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">auto</span> power = [&amp;](<span class="type">int</span> x) &#123;</span><br><span class="line">    <span class="keyword">return</span> x * x * x * x;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="function">vector&lt;<span class="type">int</span>&gt; <span class="title">dp</span><span class="params">(m + <span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">  <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= m; ++i) &#123;</span><br><span class="line">    dp[i] = <span class="number">2e18</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> j = <span class="built_in">max</span>&lt;<span class="type">int</span>&gt;(<span class="number">0</span>, i - <span class="number">400</span>); j &lt; i; ++j) &#123;</span><br><span class="line">      dp[i] = <span class="built_in">min</span>&lt;<span class="type">int</span>&gt;(dp[i] , dp[j] + a[i - <span class="number">1</span>] + <span class="built_in">power</span>(i - j));</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  cout &lt;&lt; dp[m] &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="M-有效算法-（二分）">M - 有效算法 （二分）</h1><h2 id="分析-13">分析</h2><p>可以发现<br>越大，<br>可取的范围越大，因此直接二分<br>的最小值，判断所有<br>可以取到的<br>是否有公共区间即可。</p><h2 id="代码实现-11">代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>)-&gt;<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    <span class="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line">    <span class="type">int</span> tt;</span><br><span class="line">    <span class="keyword">for</span> (std::cin &gt;&gt; tt; tt--;) &#123;</span><br><span class="line">        <span class="type">int</span> n;</span><br><span class="line">        std::cin &gt;&gt; n;</span><br><span class="line">        <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">a</span><span class="params">(n)</span>, <span class="title">b</span><span class="params">(n)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            std::cin &gt;&gt; a[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            std::cin &gt;&gt; b[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">auto</span> check = [&amp;](<span class="type">int</span> k) &#123;</span><br><span class="line">            <span class="type">int</span> x = k * b[<span class="number">0</span>];</span><br><span class="line">            <span class="type">int</span> L = a[<span class="number">0</span>] - x, R = a[<span class="number">0</span>] + x;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; n; ++i) &#123;</span><br><span class="line">                x = k * b[i];</span><br><span class="line">                <span class="type">int</span> l = a[i] - x, r = a[i] + x;</span><br><span class="line">                <span class="keyword">if</span> (r &lt; L || l &gt; R) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    L = std::<span class="built_in">max</span>(L, l);</span><br><span class="line">                    R = std::<span class="built_in">min</span>(R, r);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="type">int</span> l = <span class="number">0</span> , r = <span class="number">1e9</span>;</span><br><span class="line">        <span class="keyword">while</span>(l &lt; r) &#123;</span><br><span class="line">            <span class="type">int</span> mid = l + r &gt;&gt; <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">check</span>(mid)) &#123;</span><br><span class="line">                r = mid;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                l = mid + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        std::cout &lt;&lt; r &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;A-Once-In-My-Life-（构造）&quot;&gt;A - Once In My Life （构造）&lt;/h1&gt;
&lt;h2 id=&quot;分析&quot;&gt;分析&lt;/h2&gt;
&lt;p&gt;根据题目要求需要两个d，并且要保证&lt;code&gt;123456789&lt;/code&gt;都存在，那么就可以尝试先构造出一</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>Jiangly算法模板收集</title>
    <link href="http://265832.xyz/posts/4478d89.html"/>
    <id>http://265832.xyz/posts/4478d89.html</id>
    <published>2024-09-20T14:57:26.000Z</published>
    <updated>2024-09-20T14:57:26.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、杂类">一、杂类</h1><h2 id="01-int128-输出流自定义">01 - int128 输出流自定义</h2><p><a href="https://codeforces.com/contest/1806/submission/198413531">2023-03-20</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&lt;/details&gt;</span><br><span class="line">using i128 = __int128<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">st<span class="number">d::</span>ostream &amp;operator&lt;&lt;<span class="punctuation">(</span>st<span class="number">d::</span>ostream &amp;os, i128 n<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>string s<span class="comment">;</span></span><br><span class="line">    while <span class="punctuation">(</span>n<span class="punctuation">)</span> &#123;</span><br><span class="line">        s += &#x27;<span class="number">0</span>&#x27; + n % <span class="number">10</span><span class="comment">;</span></span><br><span class="line">        n /= <span class="number">10</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    st<span class="number">d::</span>reverse<span class="punctuation">(</span>s.begin<span class="punctuation">(</span><span class="punctuation">)</span>, s.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return os &lt;&lt; s<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="02-常用库函数重载">02 - 常用库函数重载</h2><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">using i64 = long long<span class="comment">;</span></span><br><span class="line">using i128 = __int128<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">i64 ceilDiv<span class="punctuation">(</span>i64 n, i64 m<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>n &gt;= <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return <span class="punctuation">(</span>n + m - <span class="number">1</span><span class="punctuation">)</span> / m<span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        return n / m<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line">i64 floorDiv<span class="punctuation">(</span>i64 n, i64 m<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>n &gt;= <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return n / m<span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        return <span class="punctuation">(</span>n - m + <span class="number">1</span><span class="punctuation">)</span> / m<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">template&lt;class T&gt;</span><br><span class="line">void chmax<span class="punctuation">(</span>T &amp;<span class="keyword">a</span>, T b<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span><span class="keyword">a</span> &lt; b<span class="punctuation">)</span> &#123;</span><br><span class="line">        <span class="keyword">a</span> = b<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">i128 gcd<span class="punctuation">(</span>i128 <span class="keyword">a</span>, i128 b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return b ? gcd<span class="punctuation">(</span>b, <span class="keyword">a</span> % b<span class="punctuation">)</span> : <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="二、图与网络">二、图与网络</h1><h2 id="01-强连通分量缩点（SCC）">01 - 强连通分量缩点（SCC）</h2><p><a href="https://codeforces.com/contest/1835/submission/210147209">2023-06-18</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line">struct SCC &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; adj<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; stk<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; dfn, low, bel<span class="comment">;</span></span><br><span class="line">    int cur, cnt<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    SCC<span class="punctuation">(</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    SCC<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        this-&gt;n = n<span class="comment">;</span></span><br><span class="line">        adj.assign<span class="punctuation">(</span>n, &#123;&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        dfn.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        low.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        bel.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        stk.clear<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        cur = cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        adj[u].push_back<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void dfs<span class="punctuation">(</span>int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        dfn[x] = low[x] = cur++<span class="comment">;</span></span><br><span class="line">        stk.push_back<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>auto y : adj[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>dfn[y] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                dfs<span class="punctuation">(</span>y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                low[x] = st<span class="number">d::</span>min<span class="punctuation">(</span>low[x], low[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125; else if <span class="punctuation">(</span>bel[y] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                low[x] = st<span class="number">d::</span>min<span class="punctuation">(</span>low[x], dfn[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        if <span class="punctuation">(</span>dfn[x] == low[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">            int y<span class="comment">;</span></span><br><span class="line">            do &#123;</span><br><span class="line">                y = stk.back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                bel[y] = cnt<span class="comment">;</span></span><br><span class="line">                stk.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125; while <span class="punctuation">(</span>y != x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            cnt++<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; work<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>dfn[i] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                dfs<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return bel<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="02-割边与割边缩点（EBCC）">02 - 割边与割边缩点（EBCC）</h2><p><a href="https://codeforces.com/contest/118/submission/205426518">2023-05-11</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br></pre></td><td class="code"><pre><span class="line">st<span class="number">d::</span>set&lt;st<span class="number">d::</span>pair&lt;int, int&gt;&gt; E<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">struct EBCC &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; adj<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; stk<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; dfn, low, bel<span class="comment">;</span></span><br><span class="line">    int cur, cnt<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    EBCC<span class="punctuation">(</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    EBCC<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        this-&gt;n = n<span class="comment">;</span></span><br><span class="line">        adj.assign<span class="punctuation">(</span>n, &#123;&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        dfn.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        low.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        bel.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        stk.clear<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        cur = cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        adj[u].push_back<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        adj[v].push_back<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void dfs<span class="punctuation">(</span>int x, int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        dfn[x] = low[x] = cur++<span class="comment">;</span></span><br><span class="line">        stk.push_back<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>auto y : adj[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>y == p<span class="punctuation">)</span> &#123;</span><br><span class="line">                continue<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            if <span class="punctuation">(</span>dfn[y] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                E.emplace<span class="punctuation">(</span>x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                dfs<span class="punctuation">(</span>y, x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                low[x] = st<span class="number">d::</span>min<span class="punctuation">(</span>low[x], low[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125; else if <span class="punctuation">(</span>bel[y] == -<span class="number">1</span> &amp;&amp; dfn[y] &lt; dfn[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">                E.emplace<span class="punctuation">(</span>x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                low[x] = st<span class="number">d::</span>min<span class="punctuation">(</span>low[x], dfn[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        if <span class="punctuation">(</span>dfn[x] == low[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">            int y<span class="comment">;</span></span><br><span class="line">            do &#123;</span><br><span class="line">                y = stk.back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                bel[y] = cnt<span class="comment">;</span></span><br><span class="line">                stk.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125; while <span class="punctuation">(</span>y != x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            cnt++<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; work<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        dfs<span class="punctuation">(</span><span class="number">0</span>, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return bel<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    struct Graph &#123;</span><br><span class="line">        int n<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>pair&lt;int, int&gt;&gt; edges<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; siz<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; cnte<span class="comment">;</span></span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    Graph compress<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        Graph g<span class="comment">;</span></span><br><span class="line">        g.n = cnt<span class="comment">;</span></span><br><span class="line">        g.siz.resize<span class="punctuation">(</span>cnt<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        g.cnte.resize<span class="punctuation">(</span>cnt<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">            g.siz[bel[i]]++<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>auto j : adj[i]<span class="punctuation">)</span> &#123;</span><br><span class="line">                if <span class="punctuation">(</span>bel[i] &lt; bel[j]<span class="punctuation">)</span> &#123;</span><br><span class="line">                    g.edges.emplace_back<span class="punctuation">(</span>bel[i], bel[j]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125; else if <span class="punctuation">(</span>i &lt; j<span class="punctuation">)</span> &#123;</span><br><span class="line">                    g.cnte[bel[i]]++<span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return g<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="03-二分图最大权匹配（MaxAssignment-基于KM）【久远】">03 - 二分图最大权匹配（MaxAssignment 基于KM）【久远】</h2><p><a href="https://atcoder.jp/contests/abc247/submissions/30867023">2022-04-10</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br></pre></td><td class="code"><pre><span class="line">template&lt;class T&gt;</span><br><span class="line">struct MaxAssignment &#123;</span><br><span class="line">    public:</span><br><span class="line">        T solve<span class="punctuation">(</span>int nx, int ny, st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;T&gt;&gt; <span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            assert<span class="punctuation">(</span><span class="number">0</span> &lt;= nx &amp;&amp; nx &lt;= ny<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            assert<span class="punctuation">(</span>int<span class="punctuation">(</span><span class="keyword">a</span>.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> == nx<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; nx; ++i) &#123;</span></span><br><span class="line">                assert<span class="punctuation">(</span>int<span class="punctuation">(</span><span class="keyword">a</span>[i].size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> == ny<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                for <span class="punctuation">(</span>auto x : <span class="keyword">a</span>[i]<span class="punctuation">)</span></span><br><span class="line">                    assert<span class="punctuation">(</span>x &gt;= <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            auto update = [&amp;]<span class="punctuation">(</span>int x<span class="punctuation">)</span> &#123;</span><br><span class="line">                for <span class="punctuation">(</span>int y = <span class="number">0</span><span class="comment">; y &lt; ny; ++y) &#123;</span></span><br><span class="line">                    if <span class="punctuation">(</span>lx[x] + ly[y] - <span class="keyword">a</span>[x][y] &lt; slack[y]<span class="punctuation">)</span> &#123;</span><br><span class="line">                        slack[y] = lx[x] + ly[y] - <span class="keyword">a</span>[x][y]<span class="comment">;</span></span><br><span class="line">                        slackx[y] = x<span class="comment">;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;<span class="comment">;</span></span><br><span class="line">            </span><br><span class="line">            costs.resize<span class="punctuation">(</span>nx + <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            costs[<span class="number">0</span>] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            lx.assign<span class="punctuation">(</span>nx, st<span class="number">d::</span>numeric_limits&lt;T&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            ly.assign<span class="punctuation">(</span>ny, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            xy.assign<span class="punctuation">(</span>nx, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            yx.assign<span class="punctuation">(</span>ny, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            slackx.resize<span class="punctuation">(</span>ny<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int cur = <span class="number">0</span><span class="comment">; cur &lt; nx; ++cur) &#123;</span></span><br><span class="line">                st<span class="number">d::</span>queue&lt;int&gt; que<span class="comment">;</span></span><br><span class="line">                visx.assign<span class="punctuation">(</span>nx, false<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                visy.assign<span class="punctuation">(</span>ny, false<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                slack.assign<span class="punctuation">(</span>ny, st<span class="number">d::</span>numeric_limits&lt;T&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                p.assign<span class="punctuation">(</span>nx, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                </span><br><span class="line">                for <span class="punctuation">(</span>int x = <span class="number">0</span><span class="comment">; x &lt; nx; ++x) &#123;</span></span><br><span class="line">                    if <span class="punctuation">(</span>xy[x] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                        que.push<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                        visx[x] = true<span class="comment">;</span></span><br><span class="line">                        update<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                </span><br><span class="line">                int ex, ey<span class="comment">;</span></span><br><span class="line">                bool found = false<span class="comment">;</span></span><br><span class="line">                while <span class="punctuation">(</span>!found<span class="punctuation">)</span> &#123;</span><br><span class="line">                    while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span> &amp;&amp; !found<span class="punctuation">)</span> &#123;</span><br><span class="line">                        auto x = que.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                        que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                        for <span class="punctuation">(</span>int y = <span class="number">0</span><span class="comment">; y &lt; ny; ++y) &#123;</span></span><br><span class="line">                            if <span class="punctuation">(</span><span class="keyword">a</span>[x][y] == lx[x] + ly[y] &amp;&amp; !visy[y]<span class="punctuation">)</span> &#123;</span><br><span class="line">                                if <span class="punctuation">(</span>yx[y] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                                    ex = x<span class="comment">;</span></span><br><span class="line">                                    ey = y<span class="comment">;</span></span><br><span class="line">                                    found = true<span class="comment">;</span></span><br><span class="line">                                    break<span class="comment">;</span></span><br><span class="line">                                &#125;</span><br><span class="line">                                que.push<span class="punctuation">(</span>yx[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                                p[yx[y]] = x<span class="comment">;</span></span><br><span class="line">                                visy[y] = visx[yx[y]] = true<span class="comment">;</span></span><br><span class="line">                                update<span class="punctuation">(</span>yx[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    if <span class="punctuation">(</span>found<span class="punctuation">)</span></span><br><span class="line">                        break<span class="comment">;</span></span><br><span class="line">                    </span><br><span class="line">                    T delta = st<span class="number">d::</span>numeric_limits&lt;T&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    for <span class="punctuation">(</span>int y = <span class="number">0</span><span class="comment">; y &lt; ny; ++y)</span></span><br><span class="line">                        if <span class="punctuation">(</span>!visy[y]<span class="punctuation">)</span></span><br><span class="line">                            delta = st<span class="number">d::</span>min<span class="punctuation">(</span>delta, slack[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    for <span class="punctuation">(</span>int x = <span class="number">0</span><span class="comment">; x &lt; nx; ++x)</span></span><br><span class="line">                        if <span class="punctuation">(</span>visx[x]<span class="punctuation">)</span></span><br><span class="line">                            lx[x] -= delta<span class="comment">;</span></span><br><span class="line">                    for <span class="punctuation">(</span>int y = <span class="number">0</span><span class="comment">; y &lt; ny; ++y) &#123;</span></span><br><span class="line">                        if <span class="punctuation">(</span>visy[y]<span class="punctuation">)</span> &#123;</span><br><span class="line">                            ly[y] += delta<span class="comment">;</span></span><br><span class="line">                        &#125; else &#123;</span><br><span class="line">                            slack[y] -= delta<span class="comment">;</span></span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    for <span class="punctuation">(</span>int y = <span class="number">0</span><span class="comment">; y &lt; ny; ++y) &#123;</span></span><br><span class="line">                        if <span class="punctuation">(</span>!visy[y] &amp;&amp; slack[y] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                            if <span class="punctuation">(</span>yx[y] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                                ex = slackx[y]<span class="comment">;</span></span><br><span class="line">                                ey = y<span class="comment">;</span></span><br><span class="line">                                found = true<span class="comment">;</span></span><br><span class="line">                                break<span class="comment">;</span></span><br><span class="line">                            &#125;</span><br><span class="line">                            que.push<span class="punctuation">(</span>yx[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                            p[yx[y]] = slackx[y]<span class="comment">;</span></span><br><span class="line">                            visy[y] = visx[yx[y]] = true<span class="comment">;</span></span><br><span class="line">                            update<span class="punctuation">(</span>yx[y]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                </span><br><span class="line">                costs[cur + <span class="number">1</span>] = costs[cur]<span class="comment">;</span></span><br><span class="line">                for <span class="punctuation">(</span>int x = ex, y = ey, ty<span class="comment">; x != -1; x = p[x], y = ty) &#123;</span></span><br><span class="line">                    costs[cur + <span class="number">1</span>] += <span class="keyword">a</span>[x][y]<span class="comment">;</span></span><br><span class="line">                    if <span class="punctuation">(</span>xy[x] != -<span class="number">1</span><span class="punctuation">)</span></span><br><span class="line">                        costs[cur + <span class="number">1</span>] -= <span class="keyword">a</span>[x][xy[x]]<span class="comment">;</span></span><br><span class="line">                    ty = xy[x]<span class="comment">;</span></span><br><span class="line">                    xy[x] = y<span class="comment">;</span></span><br><span class="line">                    yx[y] = x<span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            return costs[nx]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; assignment<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return xy<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        st<span class="number">d::</span>pair&lt;st<span class="number">d::</span>vector&lt;T&gt;, st<span class="number">d::</span>vector&lt;T&gt;&gt; labels<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return st<span class="number">d::</span>make_pair<span class="punctuation">(</span>lx, ly<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;T&gt; weights<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return costs<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    private:</span><br><span class="line">        st<span class="number">d::</span>vector&lt;T&gt; lx, ly, slack, costs<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; xy, yx, p, slackx<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>vector&lt;bool&gt; visx, visy<span class="comment">;</span></span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="04-一般图最大匹配（Graph-带花树算法）【久远】">04 - 一般图最大匹配（Graph 带花树算法）【久远】</h2><p><a href="https://codeforces.com/contest/1615/submission/140509278">2021-12-24</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br></pre></td><td class="code"><pre><span class="line">struct Graph &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; e<span class="comment">;</span></span><br><span class="line">    Graph<span class="punctuation">(</span>int n<span class="punctuation">)</span> : n<span class="punctuation">(</span>n<span class="punctuation">)</span>, e<span class="punctuation">(</span>n<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        e[u].push_back<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e[v].push_back<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; findMatching<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; match<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span>, vis<span class="punctuation">(</span>n<span class="punctuation">)</span>, link<span class="punctuation">(</span>n<span class="punctuation">)</span>, f<span class="punctuation">(</span>n<span class="punctuation">)</span>, dep<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        // disjoint set union</span><br><span class="line">        auto find = [&amp;]<span class="punctuation">(</span>int u<span class="punctuation">)</span> &#123;</span><br><span class="line">            while <span class="punctuation">(</span>f[u] != u<span class="punctuation">)</span></span><br><span class="line">                u = f[u] = f[f[u]]<span class="comment">;</span></span><br><span class="line">            return u<span class="comment">;</span></span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        auto lca = [&amp;]<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">            u = find<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            v = find<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            while <span class="punctuation">(</span>u != v<span class="punctuation">)</span> &#123;</span><br><span class="line">                if <span class="punctuation">(</span>dep[u] &lt; dep[v]<span class="punctuation">)</span></span><br><span class="line">                    st<span class="number">d::</span>swap<span class="punctuation">(</span>u, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                u = find<span class="punctuation">(</span>link[match[u]]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            return u<span class="comment">;</span></span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        st<span class="number">d::</span>queue&lt;int&gt; que<span class="comment">;</span></span><br><span class="line">        auto blossom = [&amp;]<span class="punctuation">(</span>int u, int v, int p<span class="punctuation">)</span> &#123;</span><br><span class="line">            while <span class="punctuation">(</span>find<span class="punctuation">(</span>u<span class="punctuation">)</span> != p<span class="punctuation">)</span> &#123;</span><br><span class="line">                link[u] = v<span class="comment">;</span></span><br><span class="line">                v = match[u]<span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>vis[v] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    vis[v] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                    que.push<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">                f[u] = f[v] = p<span class="comment">;</span></span><br><span class="line">                u = link[v]<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        // find an augmenting path starting from u and augment <span class="punctuation">(</span>if exist<span class="punctuation">)</span></span><br><span class="line">        auto augment = [&amp;]<span class="punctuation">(</span>int u<span class="punctuation">)</span> &#123;</span><br><span class="line">            </span><br><span class="line">            while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span></span><br><span class="line">                que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            </span><br><span class="line">            st<span class="number">d::</span>iota<span class="punctuation">(</span>f.begin<span class="punctuation">(</span><span class="punctuation">)</span>, f.end<span class="punctuation">(</span><span class="punctuation">)</span>, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            </span><br><span class="line">            // vis = <span class="number">0</span> corresponds to inner vertices, vis = <span class="number">1</span> corresponds to outer vertices</span><br><span class="line">            st<span class="number">d::f</span>ill<span class="punctuation">(</span>vis.begin<span class="punctuation">(</span><span class="punctuation">)</span>, vis.end<span class="punctuation">(</span><span class="punctuation">)</span>, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            </span><br><span class="line">            que.push<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            vis[u] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            dep[u] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            </span><br><span class="line">            while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span>&#123;</span><br><span class="line">                int u = que.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                for <span class="punctuation">(</span>auto v : e[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                    if <span class="punctuation">(</span>vis[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                        </span><br><span class="line">                        vis[v] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">                        link[v] = u<span class="comment">;</span></span><br><span class="line">                        dep[v] = dep[u] + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                        </span><br><span class="line">                        // found an augmenting path</span><br><span class="line">                        if <span class="punctuation">(</span>match[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                            for <span class="punctuation">(</span>int x = v, y = u, temp<span class="comment">; y != -1; x = temp, y = x == -1 ? -1 : link[x]) &#123;</span></span><br><span class="line">                                temp = match[y]<span class="comment">;</span></span><br><span class="line">                                match[x] = y<span class="comment">;</span></span><br><span class="line">                                match[y] = x<span class="comment">;</span></span><br><span class="line">                            &#125;</span><br><span class="line">                            return<span class="comment">;</span></span><br><span class="line">                        &#125;</span><br><span class="line">                        </span><br><span class="line">                        vis[match[v]] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                        dep[match[v]] = dep[u] + <span class="number">2</span><span class="comment">;</span></span><br><span class="line">                        que.push<span class="punctuation">(</span>match[v]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                        </span><br><span class="line">                    &#125; else if <span class="punctuation">(</span>vis[v] == <span class="number">1</span> &amp;&amp; find<span class="punctuation">(</span>v<span class="punctuation">)</span> != find<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                        // found <span class="keyword">a</span> blossom</span><br><span class="line">                        int p = lca<span class="punctuation">(</span>u, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                        blossom<span class="punctuation">(</span>u, v, p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                        blossom<span class="punctuation">(</span>v, u, p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        // find <span class="keyword">a</span> maximal matching greedily <span class="punctuation">(</span>decrease constant<span class="punctuation">)</span></span><br><span class="line">        auto greedy = [&amp;]<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            </span><br><span class="line">            for <span class="punctuation">(</span>int u = <span class="number">0</span><span class="comment">; u &lt; n; ++u) &#123;</span></span><br><span class="line">                if <span class="punctuation">(</span>match[u] != -<span class="number">1</span><span class="punctuation">)</span></span><br><span class="line">                    continue<span class="comment">;</span></span><br><span class="line">                for <span class="punctuation">(</span>auto v : e[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                    if <span class="punctuation">(</span>match[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                        match[u] = v<span class="comment">;</span></span><br><span class="line">                        match[v] = u<span class="comment">;</span></span><br><span class="line">                        break<span class="comment">;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        greedy<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>int u = <span class="number">0</span><span class="comment">; u &lt; n; ++u)</span></span><br><span class="line">            if <span class="punctuation">(</span>match[u] == -<span class="number">1</span><span class="punctuation">)</span></span><br><span class="line">                augment<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        return match<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="05-TwoSat（2-Sat）">05 - TwoSat（2-Sat）</h2><p><a href="https://atcoder.jp/contests/arc161/submissions/46031530">2023-09-29</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">struct TwoSat &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; e<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;bool&gt; ans<span class="comment">;</span></span><br><span class="line">    TwoSat<span class="punctuation">(</span>int n<span class="punctuation">)</span> : n<span class="punctuation">(</span>n<span class="punctuation">)</span>, e<span class="punctuation">(</span><span class="number">2</span> * n<span class="punctuation">)</span>, ans<span class="punctuation">(</span>n<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    void addClause<span class="punctuation">(</span>int u, bool f, int v, bool g<span class="punctuation">)</span> &#123;</span><br><span class="line">        e[<span class="number">2</span> * u + !f].push_back<span class="punctuation">(</span><span class="number">2</span> * v + g<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e[<span class="number">2</span> * v + !g].push_back<span class="punctuation">(</span><span class="number">2</span> * u + f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    bool satisfiable<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; id<span class="punctuation">(</span><span class="number">2</span> * n, -<span class="number">1</span><span class="punctuation">)</span>, dfn<span class="punctuation">(</span><span class="number">2</span> * n, -<span class="number">1</span><span class="punctuation">)</span>, low<span class="punctuation">(</span><span class="number">2</span> * n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; stk<span class="comment">;</span></span><br><span class="line">        int now = <span class="number">0</span>, cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::f</span>unction&lt;void<span class="punctuation">(</span>int<span class="punctuation">)</span>&gt; tarjan = [&amp;]<span class="punctuation">(</span>int u<span class="punctuation">)</span> &#123;</span><br><span class="line">            stk.push_back<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            dfn[u] = low[u] = now++<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>auto v : e[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                if <span class="punctuation">(</span>dfn[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    tarjan<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    low[u] = st<span class="number">d::</span>min<span class="punctuation">(</span>low[u], low[v]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125; else if <span class="punctuation">(</span>id[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    low[u] = st<span class="number">d::</span>min<span class="punctuation">(</span>low[u], dfn[v]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            if <span class="punctuation">(</span>dfn[u] == low[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                int v<span class="comment">;</span></span><br><span class="line">                do &#123;</span><br><span class="line">                    v = stk.back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    stk.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    id[v] = cnt<span class="comment">;</span></span><br><span class="line">                &#125; while <span class="punctuation">(</span>v != u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                ++cnt<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; 2 * n; ++i) if (dfn[i] == -1) tarjan(i);</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; ++i) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>id[<span class="number">2</span> * i] == id[<span class="number">2</span> * i + <span class="number">1</span>]<span class="punctuation">)</span> return false<span class="comment">;</span></span><br><span class="line">            ans[i] = id[<span class="number">2</span> * i] &gt; id[<span class="number">2</span> * i + <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return true<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;bool&gt; answer<span class="punctuation">(</span><span class="punctuation">)</span> &#123; return ans<span class="comment">; &#125;</span></span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="06A-最大流（Flow-旧版其一，整数应用）">06A - 最大流（Flow 旧版其一，整数应用）</h2><p><a href="https://codeforces.com/contest/1717/submission/170688062">2022-09-03</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">template&lt;class T&gt;</span><br><span class="line">struct Flow &#123;</span><br><span class="line">    const int n<span class="comment">;</span></span><br><span class="line">    struct Edge &#123;</span><br><span class="line">        int to<span class="comment">;</span></span><br><span class="line">        T cap<span class="comment">;</span></span><br><span class="line">        Edge<span class="punctuation">(</span>int to, T cap<span class="punctuation">)</span> : to<span class="punctuation">(</span>to<span class="punctuation">)</span>, cap<span class="punctuation">(</span>cap<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Edge&gt; e<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; g<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; cur, h<span class="comment">;</span></span><br><span class="line">    Flow<span class="punctuation">(</span>int n<span class="punctuation">)</span> : n<span class="punctuation">(</span>n<span class="punctuation">)</span>, g<span class="punctuation">(</span>n<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    bool bfs<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        h.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>queue&lt;int&gt; que<span class="comment">;</span></span><br><span class="line">        h[s] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        que.push<span class="punctuation">(</span>s<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            const int u = que.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i : g[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                auto [v, c] = e[i]<span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>c &gt; <span class="number">0</span> &amp;&amp; h[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    h[v] = h[u] + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                    if <span class="punctuation">(</span>v == t<span class="punctuation">)</span> &#123;</span><br><span class="line">                        return true<span class="comment">;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                    que.push<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return false<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    T dfs<span class="punctuation">(</span>int u, int t, T f<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>u == t<span class="punctuation">)</span> &#123;</span><br><span class="line">            return f<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        auto r = f<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int &amp;i = cur[u]<span class="comment">; i &lt; int(g[u].size()); ++i) &#123;</span></span><br><span class="line">            const int j = g[u][i]<span class="comment">;</span></span><br><span class="line">            auto [v, c] = e[j]<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>c &gt; <span class="number">0</span> &amp;&amp; h[v] == h[u] + <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                auto <span class="keyword">a</span> = dfs<span class="punctuation">(</span>v, t, st<span class="number">d::</span>min<span class="punctuation">(</span>r, c<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                e[j].cap -= <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                e[j ^ <span class="number">1</span>].cap += <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                r -= <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>r == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    return f<span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return f - r<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v, T c<span class="punctuation">)</span> &#123;</span><br><span class="line">        g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>v, c<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>u, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    T maxFlow<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        T ans = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>bfs<span class="punctuation">(</span>s, t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            cur.assign<span class="punctuation">(</span>n, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            ans += dfs<span class="punctuation">(</span>s, t, st<span class="number">d::</span>numeric_limits&lt;T&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return ans<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="06B-最大流（Flow-旧版其二，浮点数应用）">06B - 最大流（Flow 旧版其二，浮点数应用）</h2><p><a href="https://cf.dianhsu.com/gym/104288/submission/201412765">2022-04-09</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line">template&lt;class T&gt;</span><br><span class="line">struct Flow &#123;</span><br><span class="line">    const int n<span class="comment">;</span></span><br><span class="line">    struct Edge &#123;</span><br><span class="line">        int to<span class="comment">;</span></span><br><span class="line">        T cap<span class="comment">;</span></span><br><span class="line">        Edge<span class="punctuation">(</span>int to, T cap<span class="punctuation">)</span> : to<span class="punctuation">(</span>to<span class="punctuation">)</span>, cap<span class="punctuation">(</span>cap<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Edge&gt; e<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; g<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; cur, h<span class="comment">;</span></span><br><span class="line">    Flow<span class="punctuation">(</span>int n<span class="punctuation">)</span> : n<span class="punctuation">(</span>n<span class="punctuation">)</span>, g<span class="punctuation">(</span>n<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    bool bfs<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        h.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>queue&lt;int&gt; que<span class="comment">;</span></span><br><span class="line">        h[s] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        que.push<span class="punctuation">(</span>s<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            const int u = que.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i : g[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                auto [v, c] = e[i]<span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>c &gt; <span class="number">0</span> &amp;&amp; h[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    h[v] = h[u] + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                    if <span class="punctuation">(</span>v == t<span class="punctuation">)</span> &#123;</span><br><span class="line">                        return true<span class="comment">;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                    que.push<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return false<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    T dfs<span class="punctuation">(</span>int u, int t, T f<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>u == t<span class="punctuation">)</span> &#123;</span><br><span class="line">            return f<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        auto r = f<span class="comment">;</span></span><br><span class="line">        double res = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int &amp;i = cur[u]<span class="comment">; i &lt; int(g[u].size()); ++i) &#123;</span></span><br><span class="line">            const int j = g[u][i]<span class="comment">;</span></span><br><span class="line">            auto [v, c] = e[j]<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>c &gt; <span class="number">0</span> &amp;&amp; h[v] == h[u] + <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                auto <span class="keyword">a</span> = dfs<span class="punctuation">(</span>v, t, st<span class="number">d::</span>min<span class="punctuation">(</span>r, c<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                res += <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                e[j].cap -= <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                e[j ^ <span class="number">1</span>].cap += <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                r -= <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>r == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    return f<span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v, T c<span class="punctuation">)</span> &#123;</span><br><span class="line">        g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>v, c<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>u, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    T maxFlow<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        T ans = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>bfs<span class="punctuation">(</span>s, t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            cur.assign<span class="punctuation">(</span>n, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            ans += dfs<span class="punctuation">(</span>s, t, <span class="number">1</span>E100<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return ans<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="06C-最大流（MaxFlow-新版）">06C - 最大流（MaxFlow 新版）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=62915815">2023-07-21</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br></pre></td><td class="code"><pre><span class="line">constexpr int inf = <span class="number">1</span>E9<span class="comment">;</span></span><br><span class="line">template&lt;class T&gt;</span><br><span class="line">struct MaxFlow &#123;</span><br><span class="line">    struct _Edge &#123;</span><br><span class="line">        int to<span class="comment">;</span></span><br><span class="line">        T cap<span class="comment">;</span></span><br><span class="line">        _Edge<span class="punctuation">(</span>int to, T cap<span class="punctuation">)</span> : to<span class="punctuation">(</span>to<span class="punctuation">)</span>, cap<span class="punctuation">(</span>cap<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;_Edge&gt; e<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; g<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; cur, h<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    MaxFlow<span class="punctuation">(</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    MaxFlow<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        this-&gt;n = n<span class="comment">;</span></span><br><span class="line">        e.clear<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        g.assign<span class="punctuation">(</span>n, &#123;&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        cur.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        h.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    bool bfs<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        h.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>queue&lt;int&gt; que<span class="comment">;</span></span><br><span class="line">        h[s] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        que.push<span class="punctuation">(</span>s<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            const int u = que.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i : g[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                auto [v, c] = e[i]<span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>c &gt; <span class="number">0</span> &amp;&amp; h[v] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    h[v] = h[u] + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                    if <span class="punctuation">(</span>v == t<span class="punctuation">)</span> &#123;</span><br><span class="line">                        return true<span class="comment">;</span></span><br><span class="line">                    &#125;</span><br><span class="line">                    que.push<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return false<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    T dfs<span class="punctuation">(</span>int u, int t, T f<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>u == t<span class="punctuation">)</span> &#123;</span><br><span class="line">            return f<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        auto r = f<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int &amp;i = cur[u]<span class="comment">; i &lt; int(g[u].size()); ++i) &#123;</span></span><br><span class="line">            const int j = g[u][i]<span class="comment">;</span></span><br><span class="line">            auto [v, c] = e[j]<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>c &gt; <span class="number">0</span> &amp;&amp; h[v] == h[u] + <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                auto <span class="keyword">a</span> = dfs<span class="punctuation">(</span>v, t, st<span class="number">d::</span>min<span class="punctuation">(</span>r, c<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                e[j].cap -= <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                e[j ^ <span class="number">1</span>].cap += <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                r -= <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>r == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    return f<span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return f - r<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v, T c<span class="punctuation">)</span> &#123;</span><br><span class="line">        g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>v, c<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>u, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    T flow<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        T ans = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>bfs<span class="punctuation">(</span>s, t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            cur.assign<span class="punctuation">(</span>n, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            ans += dfs<span class="punctuation">(</span>s, t, st<span class="number">d::</span>numeric_limits&lt;T&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return ans<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>vector&lt;bool&gt; minCut<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;bool&gt; c<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">            c[i] = <span class="punctuation">(</span>h[i] != -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return c<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    struct Edge &#123;</span><br><span class="line">        int from<span class="comment">;</span></span><br><span class="line">        int to<span class="comment">;</span></span><br><span class="line">        T cap<span class="comment">;</span></span><br><span class="line">        T flow<span class="comment">;</span></span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Edge&gt; edges<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;Edge&gt; <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; e.size(); i += 2) &#123;</span></span><br><span class="line">            Edge x<span class="comment">;</span></span><br><span class="line">            x.from = e[i + <span class="number">1</span>].to<span class="comment">;</span></span><br><span class="line">            x.to = e[i].to<span class="comment">;</span></span><br><span class="line">            x.cap = e[i].cap + e[i + <span class="number">1</span>].cap<span class="comment">;</span></span><br><span class="line">            x.flow = e[i + <span class="number">1</span>].cap<span class="comment">;</span></span><br><span class="line">            <span class="keyword">a</span>.push_back<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="07A-费用流（MCFGraph-最小费用可行流）">07A - 费用流（MCFGraph 最小费用可行流）</h2><p><a href="https://codeforces.com/contest/1766/submission/184974697">2022-12-12</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line">struct MCFGraph &#123;</span><br><span class="line">    struct Edge &#123;</span><br><span class="line">        int v, c, f<span class="comment">;</span></span><br><span class="line">        Edge<span class="punctuation">(</span>int v, int c, int f<span class="punctuation">)</span> : v<span class="punctuation">(</span>v<span class="punctuation">)</span>, c<span class="punctuation">(</span>c<span class="punctuation">)</span>, f<span class="punctuation">(</span>f<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    const int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Edge&gt; e<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; g<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;i64&gt; h, dis<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; pre<span class="comment">;</span></span><br><span class="line">    bool dijkstra<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        dis.assign<span class="punctuation">(</span>n, st<span class="number">d::</span>numeric_limits&lt;i64&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        pre.assign<span class="punctuation">(</span>n, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>priority_queue&lt;st<span class="number">d::</span>pair&lt;i64, int&gt;, st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>pair&lt;i64, int&gt;&gt;, st<span class="number">d::</span>greater&lt;st<span class="number">d::</span>pair&lt;i64, int&gt;&gt;&gt; que<span class="comment">;</span></span><br><span class="line">        dis[s] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        que.emplace<span class="punctuation">(</span><span class="number">0</span>, s<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            i64 d = que.top<span class="punctuation">(</span><span class="punctuation">)</span>.first<span class="comment">;</span></span><br><span class="line">            int u = que.top<span class="punctuation">(</span><span class="punctuation">)</span>.second<span class="comment">;</span></span><br><span class="line">            que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>dis[u] &lt; d<span class="punctuation">)</span> continue<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i : g[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">                int v = e[i].v<span class="comment">;</span></span><br><span class="line">                int c = e[i].c<span class="comment">;</span></span><br><span class="line">                int f = e[i].f<span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>c &gt; <span class="number">0</span> &amp;&amp; dis[v] &gt; d + h[u] - h[v] + f<span class="punctuation">)</span> &#123;</span><br><span class="line">                    dis[v] = d + h[u] - h[v] + f<span class="comment">;</span></span><br><span class="line">                    pre[v] = i<span class="comment">;</span></span><br><span class="line">                    que.emplace<span class="punctuation">(</span>dis[v], v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return dis[t] != st<span class="number">d::</span>numeric_limits&lt;i64&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    MCFGraph<span class="punctuation">(</span>int n<span class="punctuation">)</span> : n<span class="punctuation">(</span>n<span class="punctuation">)</span>, g<span class="punctuation">(</span>n<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v, int c, int f<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>f &lt; <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            e.emplace_back<span class="punctuation">(</span>v, <span class="number">0</span>, f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            e.emplace_back<span class="punctuation">(</span>u, c, -f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            e.emplace_back<span class="punctuation">(</span>v, c, f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            e.emplace_back<span class="punctuation">(</span>u, <span class="number">0</span>, -f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    st<span class="number">d::</span>pair&lt;int, i64&gt; flow<span class="punctuation">(</span>int s, int t<span class="punctuation">)</span> &#123;</span><br><span class="line">        int flow = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        i64 cost = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        h.assign<span class="punctuation">(</span>n, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>dijkstra<span class="punctuation">(</span>s, t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; ++i) h[i] += dis[i];</span></span><br><span class="line">            int aug = st<span class="number">d::</span>numeric_limits&lt;int&gt;<span class="number">::</span>max<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = t<span class="comment">; i != s; i = e[pre[i] ^ 1].v) aug = std::min(aug, e[pre[i]].c);</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = t<span class="comment">; i != s; i = e[pre[i] ^ 1].v) &#123;</span></span><br><span class="line">                e[pre[i]].c -= aug<span class="comment">;</span></span><br><span class="line">                e[pre[i] ^ <span class="number">1</span>].c += aug<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            flow += aug<span class="comment">;</span></span><br><span class="line">            cost += i64<span class="punctuation">(</span>aug<span class="punctuation">)</span> * h[t]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return st<span class="number">d::</span>make_pair<span class="punctuation">(</span>flow, cost<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="07B-费用流（MCFGraph-最小费用最大流）">07B - 费用流（MCFGraph 最小费用最大流）</h2><p>代码同上，但是需要注释掉建边限制。以下为参考：</p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">void addEdge<span class="punctuation">(</span>int u, int v, int c, int f<span class="punctuation">)</span> &#123; // 可行流</span><br><span class="line">    if <span class="punctuation">(</span>f &lt; <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>v, <span class="number">0</span>, f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>u, c, -f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>v, c, f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        e.emplace_back<span class="punctuation">(</span>u, <span class="number">0</span>, -f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">void addEdge<span class="punctuation">(</span>int u, int v, int c, int f<span class="punctuation">)</span> &#123; // 最大流</span><br><span class="line">    g[u].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    e.emplace_back<span class="punctuation">(</span>v, c, f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    g[v].push_back<span class="punctuation">(</span>e.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    e.emplace_back<span class="punctuation">(</span>u, <span class="number">0</span>, -f<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="08-树链剖分（HLD）">08 - 树链剖分（HLD）</h2><p><a href="https://codeforces.com/contest/1863/submission/221214363">2023-08-31</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br></pre></td><td class="code"><pre><span class="line">struct HLD &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; siz, top, dep, parent, <span class="type">in</span>, out, seq<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; adj<span class="comment">;</span></span><br><span class="line">    int cur<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    HLD<span class="punctuation">(</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    HLD<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void init<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        this-&gt;n = n<span class="comment">;</span></span><br><span class="line">        siz.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        top.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        dep.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        parent.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        <span class="type">in</span>.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        out.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        seq.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        cur = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        adj.assign<span class="punctuation">(</span>n, &#123;&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void addEdge<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        adj[u].push_back<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        adj[v].push_back<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void work<span class="punctuation">(</span>int root = <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        top[root] = root<span class="comment">;</span></span><br><span class="line">        dep[root] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        parent[root] = -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">        dfs1<span class="punctuation">(</span>root<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        dfs2<span class="punctuation">(</span>root<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void dfs1<span class="punctuation">(</span>int u<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>parent[u] != -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            adj[u].erase<span class="punctuation">(</span>st<span class="number">d::f</span>ind<span class="punctuation">(</span>adj[u].begin<span class="punctuation">(</span><span class="punctuation">)</span>, adj[u].end<span class="punctuation">(</span><span class="punctuation">)</span>, parent[u]<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        siz[u] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>auto &amp;v : adj[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">            parent[v] = u<span class="comment">;</span></span><br><span class="line">            dep[v] = dep[u] + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            dfs1<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            siz[u] += siz[v]<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>siz[v] &gt; siz[adj[u][<span class="number">0</span>]]<span class="punctuation">)</span> &#123;</span><br><span class="line">                st<span class="number">d::</span>swap<span class="punctuation">(</span>v, adj[u][<span class="number">0</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    void dfs2<span class="punctuation">(</span>int u<span class="punctuation">)</span> &#123;</span><br><span class="line">        <span class="type">in</span>[u] = cur++<span class="comment">;</span></span><br><span class="line">        seq[<span class="type">in</span>[u]] = u<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>auto v : adj[u]<span class="punctuation">)</span> &#123;</span><br><span class="line">            top[v] = v == adj[u][<span class="number">0</span>] ? top[u] : v<span class="comment">;</span></span><br><span class="line">            dfs2<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        out[u] = cur<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int lca<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        while <span class="punctuation">(</span>top[u] != top[v]<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>dep[top[u]] &gt; dep[top[v]]<span class="punctuation">)</span> &#123;</span><br><span class="line">                u = parent[top[u]]<span class="comment">;</span></span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                v = parent[top[v]]<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return dep[u] &lt; dep[v] ? u : v<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int dist<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        return dep[u] + dep[v] - <span class="number">2</span> * dep[lca<span class="punctuation">(</span>u, v<span class="punctuation">)</span>]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int jump<span class="punctuation">(</span>int u, int k<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>dep[u] &lt; k<span class="punctuation">)</span> &#123;</span><br><span class="line">            return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        int d = dep[u] - k<span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        while <span class="punctuation">(</span>dep[top[u]] &gt; d<span class="punctuation">)</span> &#123;</span><br><span class="line">            u = parent[top[u]]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        return seq[<span class="type">in</span>[u] - dep[u] + d]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    bool isAncester<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        return <span class="type">in</span>[u] &lt;= <span class="type">in</span>[v] &amp;&amp; <span class="type">in</span>[v] &lt; out[u]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int rootedParent<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>swap<span class="punctuation">(</span>u, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>u == v<span class="punctuation">)</span> &#123;</span><br><span class="line">            return u<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>!isAncester<span class="punctuation">(</span>u, v<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return parent[u]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        auto it = st<span class="number">d::</span>upper_bound<span class="punctuation">(</span>adj[u].begin<span class="punctuation">(</span><span class="punctuation">)</span>, adj[u].end<span class="punctuation">(</span><span class="punctuation">)</span>, v, [&amp;]<span class="punctuation">(</span>int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">            return <span class="type">in</span>[x] &lt; <span class="type">in</span>[y]<span class="comment">;</span></span><br><span class="line">        &#125;<span class="punctuation">)</span> - <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        return *it<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int rootedSize<span class="punctuation">(</span>int u, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>u == v<span class="punctuation">)</span> &#123;</span><br><span class="line">            return n<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>!isAncester<span class="punctuation">(</span>v, u<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return siz[v]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return n - siz[rootedParent<span class="punctuation">(</span>u, v<span class="punctuation">)</span>]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int rootedLca<span class="punctuation">(</span>int <span class="keyword">a</span>, int b, int c<span class="punctuation">)</span> &#123;</span><br><span class="line">        return lca<span class="punctuation">(</span><span class="keyword">a</span>, b<span class="punctuation">)</span> ^ lca<span class="punctuation">(</span>b, c<span class="punctuation">)</span> ^ lca<span class="punctuation">(</span>c, <span class="keyword">a</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h1 id="三、数论、几何、多项式">三、数论、几何、多项式</h1><h2 id="01-快速幂">01 - 快速幂</h2><p><a href="https://atcoder.jp/contests/tenka1-2017/submissions/46411797">2023-10-09</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">int power<span class="punctuation">(</span>int <span class="keyword">a</span>, i64 b, int p<span class="punctuation">)</span> &#123;</span><br><span class="line">    int res = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span><span class="comment">; b; b /= 2, a = 1LL * a * a % p) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>b % <span class="number">2</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res = <span class="number">1</span>LL * res * <span class="keyword">a</span> % p<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="02-欧拉筛">02 - 欧拉筛</h2><p><a href="https://cf.dianhsu.com/gym/104479/submission/220987267">2023-08-29</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">st<span class="number">d::</span>vector&lt;int&gt; minp, primes<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">void sieve<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">    minp.assign<span class="punctuation">(</span>n + <span class="number">1</span>, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    primes.clear<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">2</span><span class="comment">; i &lt;= n; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>minp[i] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            minp[i] = i<span class="comment">;</span></span><br><span class="line">            primes.push_back<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>auto p : primes<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>i * p &gt; n<span class="punctuation">)</span> &#123;</span><br><span class="line">                break<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            minp[i * p] = p<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>p == minp[i]<span class="punctuation">)</span> &#123;</span><br><span class="line">                break<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="03-莫比乌斯函数筛（莫比乌斯函数-反演）">03 - 莫比乌斯函数筛（莫比乌斯函数/反演）</h2><p><a href="https://atcoder.jp/contests/tupc2022/submissions/39391116">2023-03-04</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br></pre></td><td class="code"><pre><span class="line">st<span class="number">d::</span>unordered_map&lt;int, Z&gt; fMu<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">constexpr int N = <span class="number">1</span>E7<span class="comment">;</span></span><br><span class="line">st<span class="number">d::</span>vector&lt;int&gt; minp, primes<span class="comment">;</span></span><br><span class="line">st<span class="number">d::</span>vector&lt;Z&gt; mu<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">void sieve<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">    minp.assign<span class="punctuation">(</span>n + <span class="number">1</span>, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    mu.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    primes.clear<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    mu[<span class="number">1</span>] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">2</span><span class="comment">; i &lt;= n; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>minp[i] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            mu[i] = -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">            minp[i] = i<span class="comment">;</span></span><br><span class="line">            primes.push_back<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>auto p : primes<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>i * p &gt; n<span class="punctuation">)</span> &#123;</span><br><span class="line">                break<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            minp[i * p] = p<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>p == minp[i]<span class="punctuation">)</span> &#123;</span><br><span class="line">                break<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            mu[i * p] = -mu[i]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">1</span><span class="comment">; i &lt;= n; i++) &#123;</span></span><br><span class="line">        mu[i] += mu[i - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">Z sumMu<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>n &lt;= N<span class="punctuation">)</span> &#123;</span><br><span class="line">        return mu[n]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>fMu.count<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return fMu[n]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>n == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z ans = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int l = <span class="number">2</span>, r<span class="comment">; l &lt;= n; l = r + 1) &#123;</span></span><br><span class="line">        r = n / <span class="punctuation">(</span>n / l<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        ans -= <span class="punctuation">(</span>r - l + <span class="number">1</span><span class="punctuation">)</span> * sumMu<span class="punctuation">(</span>n / l<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return ans<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int main<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>ios<span class="number">::</span>sync_with_stdio<span class="punctuation">(</span>false<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::c</span>in.tie<span class="punctuation">(</span>nullptr<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    sieve<span class="punctuation">(</span>N<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    int L, R<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::c</span>in &gt;&gt; L &gt;&gt; R<span class="comment">;</span></span><br><span class="line">    L -= <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    Z ans = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int l = <span class="number">1</span>, r<span class="comment">; l &lt;= R; l = r + 1) &#123;</span></span><br><span class="line">        r = R / <span class="punctuation">(</span>R / l<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>l &lt;= L<span class="punctuation">)</span> &#123;</span><br><span class="line">            r = st<span class="number">d::</span>min<span class="punctuation">(</span>r, L / <span class="punctuation">(</span>L / l<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        ans += <span class="punctuation">(</span>power<span class="punctuation">(</span>Z<span class="punctuation">(</span><span class="number">2</span><span class="punctuation">)</span>, R / l - L / l<span class="punctuation">)</span> - <span class="number">1</span><span class="punctuation">)</span> * <span class="punctuation">(</span>sumMu<span class="punctuation">(</span>r<span class="punctuation">)</span> - sumMu<span class="punctuation">(</span>l - <span class="number">1</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::c</span>out &lt;&lt; ans &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="04-求解单个数的欧拉函数">04 - 求解单个数的欧拉函数</h2><p><a href="https://atcoder.jp/contests/tenka1-2017/submissions/46411797">2023-10-09</a></p><figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">int phi(int n) &#123;</span><br><span class="line">    int res <span class="operator">=</span> n<span class="comment">;</span></span><br><span class="line">    for (int i <span class="operator">=</span> <span class="number">2</span><span class="comment">; i * i &lt;= n; i++) &#123;</span></span><br><span class="line">        if (n % i <span class="operator">=</span><span class="operator">=</span> <span class="number">0</span>) &#123;</span><br><span class="line">            while (n % i <span class="operator">=</span><span class="operator">=</span> <span class="number">0</span>) &#123;</span><br><span class="line">                n /<span class="operator">=</span> i<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            res <span class="operator">=</span> res / i * (i - <span class="number">1</span>)<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    if (n &gt; <span class="number">1</span>) &#123;</span><br><span class="line">        res <span class="operator">=</span> res / n * (n - <span class="number">1</span>)<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="05-扩展欧几里得（exGCD）">05 - 扩展欧几里得（exGCD）</h2><p><a href="https://atcoder.jp/contests/tenka1-2017/submissions/46411797">2023-10-09</a></p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">int</span> <span class="title function_">exgcd</span>(<span class="built_in">int</span> a, <span class="built_in">int</span> b, <span class="built_in">int</span> &amp;x, <span class="built_in">int</span> &amp;y) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!b) &#123;</span><br><span class="line">        x = <span class="number">1</span>, y = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">int</span> g = <span class="title function_">exgcd</span>(b, a % b, y, x);</span><br><span class="line">    y -= a / b * x;</span><br><span class="line">    <span class="keyword">return</span> g;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="06-组合数（Comb-with-MInt-MLong）">06 - 组合数（Comb, with. MInt &amp; MLong）</h2><p><a href="https://codeforces.com/contest/1864/submission/220584872">2023-08-26</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">struct Comb &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Z&gt; _fac<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Z&gt; _invfac<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Z&gt; _inv<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    Comb<span class="punctuation">(</span><span class="punctuation">)</span> : n&#123;<span class="number">0</span>&#125;, _fac&#123;<span class="number">1</span>&#125;, _invfac&#123;<span class="number">1</span>&#125;, _inv&#123;<span class="number">0</span>&#125; &#123;&#125;</span><br><span class="line">    Comb<span class="punctuation">(</span>int n<span class="punctuation">)</span> : Comb<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span>int m<span class="punctuation">)</span> &#123;</span><br><span class="line">        m = st<span class="number">d::</span>min<span class="punctuation">(</span>m, Z<span class="number">::</span>getMod<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>m &lt;= n<span class="punctuation">)</span> return<span class="comment">;</span></span><br><span class="line">        _fac.resize<span class="punctuation">(</span>m + <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        _invfac.resize<span class="punctuation">(</span>m + <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        _inv.resize<span class="punctuation">(</span>m + <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>int i = n + <span class="number">1</span><span class="comment">; i &lt;= m; i++) &#123;</span></span><br><span class="line">            _fac[i] = _fac[i - <span class="number">1</span>] * i<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        _invfac[m] = _fac[m].inv<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = m<span class="comment">; i &gt; n; i--) &#123;</span></span><br><span class="line">            _invfac[i - <span class="number">1</span>] = _invfac[i] * i<span class="comment">;</span></span><br><span class="line">            _inv[i] = _invfac[i] * _fac[i - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        n = m<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    Z fac<span class="punctuation">(</span>int m<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>m &gt; n<span class="punctuation">)</span> init<span class="punctuation">(</span><span class="number">2</span> * m<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return _fac[m]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z invfac<span class="punctuation">(</span>int m<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>m &gt; n<span class="punctuation">)</span> init<span class="punctuation">(</span><span class="number">2</span> * m<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return _invfac[m]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z inv<span class="punctuation">(</span>int m<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>m &gt; n<span class="punctuation">)</span> init<span class="punctuation">(</span><span class="number">2</span> * m<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return _inv[m]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z binom<span class="punctuation">(</span>int n, int m<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>n &lt; m || m &lt; <span class="number">0</span><span class="punctuation">)</span> return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        return fac<span class="punctuation">(</span>n<span class="punctuation">)</span> * invfac<span class="punctuation">(</span>m<span class="punctuation">)</span> * invfac<span class="punctuation">(</span>n - m<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125; comb<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="07-二项式（Binomial-任意模数计算）">07 - 二项式（Binomial 任意模数计算）</h2><p><a href="https://codeforces.com/contest/896/submission/219861532">2023-08-22</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br></pre></td><td class="code"><pre><span class="line">st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>pair&lt;int, int&gt;&gt; factorize<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>pair&lt;int, int&gt;&gt; factors<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">2</span><span class="comment">; static_cast&lt;long long&gt;(i) * i &lt;= n; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>n % i == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            int t = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span><span class="comment">; n % i == 0; n /= i)</span></span><br><span class="line">                ++t<span class="comment">;</span></span><br><span class="line">            factors.emplace_back<span class="punctuation">(</span>i, t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>n &gt; <span class="number">1</span><span class="punctuation">)</span></span><br><span class="line">        factors.emplace_back<span class="punctuation">(</span>n, <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return factors<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">constexpr int power<span class="punctuation">(</span>int base, i64 exp<span class="punctuation">)</span> &#123;</span><br><span class="line">    int res = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span><span class="comment">; exp &gt; 0; base *= base, exp /= 2) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>exp % <span class="number">2</span> == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res *= base<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">constexpr int power<span class="punctuation">(</span>int base, i64 exp, int mod<span class="punctuation">)</span> &#123;</span><br><span class="line">    int res = <span class="number">1</span> % mod<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span><span class="comment">; exp &gt; 0; base = 1LL * base * base % mod, exp /= 2) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>exp % <span class="number">2</span> == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res = <span class="number">1</span>LL * res * base % mod<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">int inverse<span class="punctuation">(</span>int <span class="keyword">a</span>, int m<span class="punctuation">)</span> &#123;</span><br><span class="line">    int g = m, r = <span class="keyword">a</span>, x = <span class="number">0</span>, y = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    while <span class="punctuation">(</span>r != <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        int q = g / r<span class="comment">;</span></span><br><span class="line">        g %= r<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>swap<span class="punctuation">(</span>g, r<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        x -= q * y<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>swap<span class="punctuation">(</span>x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return x &lt; <span class="number">0</span> ? x + m : x<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">int solveModuloEquations<span class="punctuation">(</span>const st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>pair&lt;int, int&gt;&gt; &amp;e<span class="punctuation">)</span> &#123;</span><br><span class="line">    int m = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>st<span class="number">d::</span>size_t i = <span class="number">0</span><span class="comment">; i &lt; e.size(); i++) &#123;</span></span><br><span class="line">        m *= e[i].first<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int res = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>st<span class="number">d::</span>size_t i = <span class="number">0</span><span class="comment">; i &lt; e.size(); i++) &#123;</span></span><br><span class="line">        int p = e[i].first<span class="comment">;</span></span><br><span class="line">        res = <span class="punctuation">(</span>res + <span class="number">1</span>LL * e[i].second * <span class="punctuation">(</span>m / p<span class="punctuation">)</span> * inverse<span class="punctuation">(</span>m / p, p<span class="punctuation">)</span><span class="punctuation">)</span> % m<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">constexpr int N = <span class="number">1</span>E5<span class="comment">;</span></span><br><span class="line">class Binomial &#123;</span><br><span class="line">    const int mod<span class="comment">;</span></span><br><span class="line">private:</span><br><span class="line">    const st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>pair&lt;int, int&gt;&gt; factors<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; pk<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;int&gt;&gt; prod<span class="comment">;</span></span><br><span class="line">    static constexpr i64 exponent<span class="punctuation">(</span>i64 n, int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        i64 res = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>n /= p<span class="comment">; n &gt; 0; n /= p) &#123;</span></span><br><span class="line">            res += n<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int product<span class="punctuation">(</span>i64 n, st<span class="number">d::</span>size_t i<span class="punctuation">)</span> &#123;</span><br><span class="line">        int res = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        int p = factors[i].first<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span><span class="comment">; n &gt; 0; n /= p) &#123;</span></span><br><span class="line">            res = <span class="number">1</span>LL * res * power<span class="punctuation">(</span>prod[i].back<span class="punctuation">(</span><span class="punctuation">)</span>, n / pk[i], pk[i]<span class="punctuation">)</span> % pk[i] * prod[i][n % pk[i]] % pk[i]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">public:</span><br><span class="line">    Binomial<span class="punctuation">(</span>int mod<span class="punctuation">)</span> : mod<span class="punctuation">(</span>mod<span class="punctuation">)</span>, factors<span class="punctuation">(</span>factorize<span class="punctuation">(</span>mod<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        pk.resize<span class="punctuation">(</span>factors.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        prod.resize<span class="punctuation">(</span>factors.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>st<span class="number">d::</span>size_t i = <span class="number">0</span><span class="comment">; i &lt; factors.size(); i++) &#123;</span></span><br><span class="line">            int p = factors[i].first<span class="comment">;</span></span><br><span class="line">            int k = factors[i].second<span class="comment">;</span></span><br><span class="line">            pk[i] = power<span class="punctuation">(</span>p, k<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            prod[i].resize<span class="punctuation">(</span>st<span class="number">d::</span>min<span class="punctuation">(</span>N + <span class="number">1</span>, pk[i]<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            prod[i][<span class="number">0</span>] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int j = <span class="number">1</span><span class="comment">; j &lt; prod[i].size(); j++) &#123;</span></span><br><span class="line">                if <span class="punctuation">(</span>j % p == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    prod[i][j] = prod[i][j - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                    prod[i][j] = <span class="number">1</span>LL * prod[i][j - <span class="number">1</span>] * j % pk[i]<span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    int operator<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">(</span>i64 n, i64 m<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>n &lt; m || m &lt; <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>pair&lt;int, int&gt;&gt; ans<span class="punctuation">(</span>factors.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; factors.size(); i++) &#123;</span></span><br><span class="line">            int p = factors[i].first<span class="comment">;</span></span><br><span class="line">            int k = factors[i].second<span class="comment">;</span></span><br><span class="line">            int e = exponent<span class="punctuation">(</span>n, p<span class="punctuation">)</span> - exponent<span class="punctuation">(</span>m, p<span class="punctuation">)</span> - exponent<span class="punctuation">(</span>n - m, p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>e &gt;= k<span class="punctuation">)</span> &#123;</span><br><span class="line">                ans[i] = st<span class="number">d::</span>make_pair<span class="punctuation">(</span>pk[i], <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                int pn = product<span class="punctuation">(</span>n, i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                int pm = product<span class="punctuation">(</span>m, i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                int pd = product<span class="punctuation">(</span>n - m, i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                int res = <span class="number">1</span>LL * pn * inverse<span class="punctuation">(</span>pm, pk[i]<span class="punctuation">)</span> % pk[i] * inverse<span class="punctuation">(</span>pd, pk[i]<span class="punctuation">)</span> % pk[i] * power<span class="punctuation">(</span>p, e<span class="punctuation">)</span> % pk[i]<span class="comment">;</span></span><br><span class="line">                ans[i] = st<span class="number">d::</span>make_pair<span class="punctuation">(</span>pk[i], res<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return solveModuloEquations<span class="punctuation">(</span>ans<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="08-素数测试与因式分解（Miller-Rabin-Pollard-Rho）">08 - 素数测试与因式分解（Miller-Rabin &amp; Pollard-Rho）</h2><p><a href="https://cf.dianhsu.com/gym/104354/submission/206130894">2023-05-16</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line">i64 mul<span class="punctuation">(</span>i64 <span class="keyword">a</span>, i64 b, i64 m<span class="punctuation">)</span> &#123;</span><br><span class="line">    return static_cast&lt;__int128&gt;<span class="punctuation">(</span><span class="keyword">a</span><span class="punctuation">)</span> * b % m<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">i64 power<span class="punctuation">(</span>i64 <span class="keyword">a</span>, i64 b, i64 m<span class="punctuation">)</span> &#123;</span><br><span class="line">    i64 res = <span class="number">1</span> % m<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span><span class="comment">; b; b &gt;&gt;= 1, a = mul(a, a, m))</span></span><br><span class="line">        if <span class="punctuation">(</span>b &amp; <span class="number">1</span><span class="punctuation">)</span></span><br><span class="line">            res = mul<span class="punctuation">(</span>res, <span class="keyword">a</span>, m<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">bool isprime<span class="punctuation">(</span>i64 n<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>n &lt; <span class="number">2</span><span class="punctuation">)</span></span><br><span class="line">        return false<span class="comment">;</span></span><br><span class="line">    static constexpr int <span class="keyword">A</span>[] = &#123;<span class="number">2</span>, <span class="number">3</span>, <span class="number">5</span>, <span class="number">7</span>, <span class="number">11</span>, <span class="number">13</span>, <span class="number">17</span>, <span class="number">19</span>, <span class="number">23</span>&#125;<span class="comment">;</span></span><br><span class="line">    int s = __builtin_ctzll<span class="punctuation">(</span>n - <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    i64 d = <span class="punctuation">(</span>n - <span class="number">1</span><span class="punctuation">)</span> &gt;&gt; s<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>auto <span class="keyword">a</span> : <span class="keyword">A</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span><span class="keyword">a</span> == n<span class="punctuation">)</span></span><br><span class="line">            return true<span class="comment">;</span></span><br><span class="line">        i64 x = power<span class="punctuation">(</span><span class="keyword">a</span>, d, n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>x == <span class="number">1</span> || x == n - <span class="number">1</span><span class="punctuation">)</span></span><br><span class="line">            continue<span class="comment">;</span></span><br><span class="line">        bool ok = false<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; s - 1; ++i) &#123;</span></span><br><span class="line">            x = mul<span class="punctuation">(</span>x, x, n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>x == n - <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                ok = true<span class="comment">;</span></span><br><span class="line">                break<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>!ok<span class="punctuation">)</span></span><br><span class="line">            return false<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return true<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">st<span class="number">d::</span>vector&lt;i64&gt; factorize<span class="punctuation">(</span>i64 n<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;i64&gt; p<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::f</span>unction&lt;void<span class="punctuation">(</span>i64<span class="punctuation">)</span>&gt; f = [&amp;]<span class="punctuation">(</span>i64 n<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>n &lt;= <span class="number">10000</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">2</span><span class="comment">; i * i &lt;= n; ++i)</span></span><br><span class="line">                for <span class="punctuation">(</span><span class="comment">; n % i == 0; n /= i)</span></span><br><span class="line">                    p.push_back<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>n &gt; <span class="number">1</span><span class="punctuation">)</span></span><br><span class="line">                p.push_back<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            return<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>isprime<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            p.push_back<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            return<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        auto g = [&amp;]<span class="punctuation">(</span>i64 x<span class="punctuation">)</span> &#123;</span><br><span class="line">            return <span class="punctuation">(</span>mul<span class="punctuation">(</span>x, x, n<span class="punctuation">)</span> + <span class="number">1</span><span class="punctuation">)</span> % n<span class="comment">;</span></span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        i64 x0 = <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>true<span class="punctuation">)</span> &#123;</span><br><span class="line">            i64 x = x0<span class="comment">;</span></span><br><span class="line">            i64 y = x0<span class="comment">;</span></span><br><span class="line">            i64 d = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            i64 power = <span class="number">1</span>, lam = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            i64 v = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            while <span class="punctuation">(</span>d == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                y = g<span class="punctuation">(</span>y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                ++lam<span class="comment">;</span></span><br><span class="line">                v = mul<span class="punctuation">(</span>v, st<span class="number">d::ab</span>s<span class="punctuation">(</span>x - y<span class="punctuation">)</span>, n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>lam % <span class="number">127</span> == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    d = st<span class="number">d::</span>gcd<span class="punctuation">(</span>v, n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    v = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">                if <span class="punctuation">(</span>power == lam<span class="punctuation">)</span> &#123;</span><br><span class="line">                    x = y<span class="comment">;</span></span><br><span class="line">                    power *= <span class="number">2</span><span class="comment">;</span></span><br><span class="line">                    lam = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">                    d = st<span class="number">d::</span>gcd<span class="punctuation">(</span>v, n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    v = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            if <span class="punctuation">(</span>d != n<span class="punctuation">)</span> &#123;</span><br><span class="line">                f<span class="punctuation">(</span>d<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                f<span class="punctuation">(</span>n / d<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                return<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            ++x0<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    f<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>sort<span class="punctuation">(</span>p.begin<span class="punctuation">(</span><span class="punctuation">)</span>, p.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return p<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="09-平面几何">09 - 平面几何</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=62808640">2023-07-17</a></p><details><summary>长度过长，点击查看</summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">T</span>&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Point</span> &#123;</span><br><span class="line">    T x;</span><br><span class="line">    T y;</span><br><span class="line">    <span class="built_in">Point</span>(T x_ = <span class="number">0</span>, T y_ = <span class="number">0</span>) : <span class="built_in">x</span>(x_), <span class="built_in">y</span>(y_) &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">U</span>&gt;</span><br><span class="line">    <span class="keyword">operator</span> <span class="built_in">Point</span>&lt;U&gt;() &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Point</span>&lt;U&gt;(<span class="built_in">U</span>(x), <span class="built_in">U</span>(y));</span><br><span class="line">    &#125;</span><br><span class="line">    Point &amp;<span class="keyword">operator</span>+=(Point p) &amp; &#123;</span><br><span class="line">        x += p.x;</span><br><span class="line">        y += p.y;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Point &amp;<span class="keyword">operator</span>-=(Point p) &amp; &#123;</span><br><span class="line">        x -= p.x;</span><br><span class="line">        y -= p.y;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Point &amp;<span class="keyword">operator</span>*=(T v) &amp; &#123;</span><br><span class="line">        x *= v;</span><br><span class="line">        y *= v;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Point <span class="keyword">operator</span>-() <span class="type">const</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Point</span>(-x, -y);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Point <span class="keyword">operator</span>+(Point a, Point b) &#123;</span><br><span class="line">        <span class="keyword">return</span> a += b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Point <span class="keyword">operator</span>-(Point a, Point b) &#123;</span><br><span class="line">        <span class="keyword">return</span> a -= b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Point <span class="keyword">operator</span>*(Point a, T b) &#123;</span><br><span class="line">        <span class="keyword">return</span> a *= b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Point <span class="keyword">operator</span>*(T a, Point b) &#123;</span><br><span class="line">        <span class="keyword">return</span> b *= a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="type">bool</span> <span class="keyword">operator</span>==(Point a, Point b) &#123;</span><br><span class="line">        <span class="keyword">return</span> a.x == b.x &amp;&amp; a.y == b.y;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> std::istream &amp;<span class="keyword">operator</span>&gt;&gt;(std::istream &amp;is, Point &amp;p) &#123;</span><br><span class="line">        <span class="keyword">return</span> is &gt;&gt; p.x &gt;&gt; p.y;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> std::ostream &amp;<span class="keyword">operator</span>&lt;&lt;(std::ostream &amp;os, Point p) &#123;</span><br><span class="line">        <span class="keyword">return</span> os &lt;&lt; <span class="string">&quot;(&quot;</span> &lt;&lt; p.x &lt;&lt; <span class="string">&quot;, &quot;</span> &lt;&lt; p.y &lt;&lt; <span class="string">&quot;)&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function">T <span class="title">dot</span><span class="params">(Point&lt;T&gt; a, Point&lt;T&gt; b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> a.x * b.x + a.y * b.y;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function">T <span class="title">cross</span><span class="params">(Point&lt;T&gt; a, Point&lt;T&gt; b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> a.x * b.y - a.y * b.x;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function">T <span class="title">square</span><span class="params">(Point&lt;T&gt; p)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> dot(p, p);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function"><span class="type">double</span> <span class="title">length</span><span class="params">(Point&lt;T&gt; p)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> std::<span class="built_in">sqrt</span>(<span class="type">double</span>(<span class="built_in">square</span>(p)));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">long</span> <span class="type">double</span> <span class="title">length</span><span class="params">(Point&lt;<span class="type">long</span> <span class="type">double</span>&gt; p)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> std::<span class="built_in">sqrt</span>(<span class="built_in">square</span>(p));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">T</span>&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Line</span> &#123;</span><br><span class="line">    Point&lt;T&gt; a;</span><br><span class="line">    Point&lt;T&gt; b;</span><br><span class="line">    <span class="built_in">Line</span>(Point&lt;T&gt; a_ = <span class="built_in">Point</span>&lt;T&gt;(), Point&lt;T&gt; b_ = <span class="built_in">Point</span>&lt;T&gt;()) : <span class="built_in">a</span>(a_), <span class="built_in">b</span>(b_) &#123;&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function">Point&lt;T&gt; <span class="title">rotate</span><span class="params">(Point&lt;T&gt; a)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">Point</span>(-a.y, a.x);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">sgn</span><span class="params">(Point&lt;T&gt; a)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> a.y &gt; <span class="number">0</span> || (a.y == <span class="number">0</span> &amp;&amp; a.x &gt; <span class="number">0</span>) ? <span class="number">1</span> : <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">pointOnLineLeft</span><span class="params">(Point&lt;T&gt; p, Line&lt;T&gt; l)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">cross</span>(l.b - l.a, p - l.a) &gt; <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function">Point&lt;T&gt; <span class="title">lineIntersection</span><span class="params">(Line&lt;T&gt; l1, Line&lt;T&gt; l2)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> l1.a + (l1.b - l1.a) * (<span class="built_in">cross</span>(l2.b - l2.a, l1.a - l2.a) / <span class="built_in">cross</span>(l2.b - l2.a, l1.a - l1.b));</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">pointOnSegment</span><span class="params">(Point&lt;T&gt; p, Line&lt;T&gt; l)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">cross</span>(p - l.a, l.b - l.a) == <span class="number">0</span> &amp;&amp; std::<span class="built_in">min</span>(l.a.x, l.b.x) &lt;= p.x &amp;&amp; p.x &lt;= std::<span class="built_in">max</span>(l.a.x, l.b.x)</span><br><span class="line">    &amp;&amp; std::<span class="built_in">min</span>(l.a.y, l.b.y) &lt;= p.y &amp;&amp; p.y &lt;= std::<span class="built_in">max</span>(l.a.y, l.b.y);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">pointInPolygon</span><span class="params">(Point&lt;T&gt; a, std::vector&lt;Point&lt;T&gt;&gt; p)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n = p.<span class="built_in">size</span>();</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">pointOnSegment</span>(a, <span class="built_in">Line</span>(p[i], p[(i + <span class="number">1</span>) % n]))) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="type">int</span> t = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        <span class="keyword">auto</span> u = p[i];</span><br><span class="line">        <span class="keyword">auto</span> v = p[(i + <span class="number">1</span>) % n];</span><br><span class="line">        <span class="keyword">if</span> (u.x &lt; a.x &amp;&amp; v.x &gt;= a.x &amp;&amp; <span class="built_in">pointOnLineLeft</span>(a, <span class="built_in">Line</span>(v, u))) &#123;</span><br><span class="line">            t ^= <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (u.x &gt;= a.x &amp;&amp; v.x &lt; a.x &amp;&amp; <span class="built_in">pointOnLineLeft</span>(a, <span class="built_in">Line</span>(u, v))) &#123;</span><br><span class="line">            t ^= <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> t == <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 0 : not intersect</span></span><br><span class="line"><span class="comment">// 1 : strictly intersect</span></span><br><span class="line"><span class="comment">// 2 : overlap</span></span><br><span class="line"><span class="comment">// 3 : intersect at endpoint</span></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">T</span>&gt;</span><br><span class="line">std::tuple&lt;<span class="type">int</span>, Point&lt;T&gt;, Point&lt;T&gt;&gt; <span class="built_in">segmentIntersection</span>(Line&lt;T&gt; l1, Line&lt;T&gt; l2) &#123;</span><br><span class="line">    <span class="keyword">if</span> (std::<span class="built_in">max</span>(l1.a.x, l1.b.x) &lt; std::<span class="built_in">min</span>(l2.a.x, l2.b.x)) &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="number">0</span>, <span class="built_in">Point</span>&lt;T&gt;(), <span class="built_in">Point</span>&lt;T&gt;()&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (std::<span class="built_in">min</span>(l1.a.x, l1.b.x) &gt; std::<span class="built_in">max</span>(l2.a.x, l2.b.x)) &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="number">0</span>, <span class="built_in">Point</span>&lt;T&gt;(), <span class="built_in">Point</span>&lt;T&gt;()&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (std::<span class="built_in">max</span>(l1.a.y, l1.b.y) &lt; std::<span class="built_in">min</span>(l2.a.y, l2.b.y)) &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="number">0</span>, <span class="built_in">Point</span>&lt;T&gt;(), <span class="built_in">Point</span>&lt;T&gt;()&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (std::<span class="built_in">min</span>(l1.a.y, l1.b.y) &gt; std::<span class="built_in">max</span>(l2.a.y, l2.b.y)) &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="number">0</span>, <span class="built_in">Point</span>&lt;T&gt;(), <span class="built_in">Point</span>&lt;T&gt;()&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">cross</span>(l1.b - l1.a, l2.b - l2.a) == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">cross</span>(l1.b - l1.a, l2.a - l1.a) != <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> &#123;<span class="number">0</span>, <span class="built_in">Point</span>&lt;T&gt;(), <span class="built_in">Point</span>&lt;T&gt;()&#125;;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">auto</span> maxx1 = std::<span class="built_in">max</span>(l1.a.x, l1.b.x);</span><br><span class="line">            <span class="keyword">auto</span> minx1 = std::<span class="built_in">min</span>(l1.a.x, l1.b.x);</span><br><span class="line">            <span class="keyword">auto</span> maxy1 = std::<span class="built_in">max</span>(l1.a.y, l1.b.y);</span><br><span class="line">            <span class="keyword">auto</span> miny1 = std::<span class="built_in">min</span>(l1.a.y, l1.b.y);</span><br><span class="line">            <span class="keyword">auto</span> maxx2 = std::<span class="built_in">max</span>(l2.a.x, l2.b.x);</span><br><span class="line">            <span class="keyword">auto</span> minx2 = std::<span class="built_in">min</span>(l2.a.x, l2.b.x);</span><br><span class="line">            <span class="keyword">auto</span> maxy2 = std::<span class="built_in">max</span>(l2.a.y, l2.b.y);</span><br><span class="line">            <span class="keyword">auto</span> miny2 = std::<span class="built_in">min</span>(l2.a.y, l2.b.y);</span><br><span class="line">            <span class="function">Point&lt;T&gt; <span class="title">p1</span><span class="params">(std::max(minx1, minx2), std::max(miny1, miny2))</span></span>;</span><br><span class="line">            <span class="function">Point&lt;T&gt; <span class="title">p2</span><span class="params">(std::min(maxx1, maxx2), std::min(maxy1, maxy2))</span></span>;</span><br><span class="line">            <span class="keyword">if</span> (!<span class="built_in">pointOnSegment</span>(p1, l1)) &#123;</span><br><span class="line">                std::<span class="built_in">swap</span>(p1.y, p2.y);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (p1 == p2) &#123;</span><br><span class="line">                <span class="keyword">return</span> &#123;<span class="number">3</span>, p1, p2&#125;;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="keyword">return</span> &#123;<span class="number">2</span>, p1, p2&#125;;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">auto</span> cp1 = <span class="built_in">cross</span>(l2.a - l1.a, l2.b - l1.a);</span><br><span class="line">    <span class="keyword">auto</span> cp2 = <span class="built_in">cross</span>(l2.a - l1.b, l2.b - l1.b);</span><br><span class="line">    <span class="keyword">auto</span> cp3 = <span class="built_in">cross</span>(l1.a - l2.a, l1.b - l2.a);</span><br><span class="line">    <span class="keyword">auto</span> cp4 = <span class="built_in">cross</span>(l1.a - l2.b, l1.b - l2.b);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> ((cp1 &gt; <span class="number">0</span> &amp;&amp; cp2 &gt; <span class="number">0</span>) || (cp1 &lt; <span class="number">0</span> &amp;&amp; cp2 &lt; <span class="number">0</span>) || (cp3 &gt; <span class="number">0</span> &amp;&amp; cp4 &gt; <span class="number">0</span>) || (cp3 &lt; <span class="number">0</span> &amp;&amp; cp4 &lt; <span class="number">0</span>)) &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="number">0</span>, <span class="built_in">Point</span>&lt;T&gt;(), <span class="built_in">Point</span>&lt;T&gt;()&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    Point p = <span class="built_in">lineIntersection</span>(l1, l2);</span><br><span class="line">    <span class="keyword">if</span> (cp1 != <span class="number">0</span> &amp;&amp; cp2 != <span class="number">0</span> &amp;&amp; cp3 != <span class="number">0</span> &amp;&amp; cp4 != <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="number">1</span>, p, p&#125;;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="number">3</span>, p, p&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">segmentInPolygon</span><span class="params">(Line&lt;T&gt; l, std::vector&lt;Point&lt;T&gt;&gt; p)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n = p.<span class="built_in">size</span>();</span><br><span class="line">    <span class="keyword">if</span> (!<span class="built_in">pointInPolygon</span>(l.a, p)) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (!<span class="built_in">pointInPolygon</span>(l.b, p)) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        <span class="keyword">auto</span> u = p[i];</span><br><span class="line">        <span class="keyword">auto</span> v = p[(i + <span class="number">1</span>) % n];</span><br><span class="line">        <span class="keyword">auto</span> w = p[(i + <span class="number">2</span>) % n];</span><br><span class="line">        <span class="keyword">auto</span> [t, p1, p2] = <span class="built_in">segmentIntersection</span>(l, <span class="built_in">Line</span>(u, v));</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> (t == <span class="number">1</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (t == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">continue</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (t == <span class="number">2</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">pointOnSegment</span>(v, l) &amp;&amp; v != l.a &amp;&amp; v != l.b) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">cross</span>(v - u, w - v) &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (p1 != u &amp;&amp; p1 != v) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(l.a, <span class="built_in">Line</span>(v, u))</span><br><span class="line">                    || <span class="built_in">pointOnLineLeft</span>(l.b, <span class="built_in">Line</span>(v, u))) &#123;</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (p1 == v) &#123;</span><br><span class="line">                <span class="keyword">if</span> (l.a == v) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(u, l)) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(w, l)</span><br><span class="line">                            &amp;&amp; <span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(u, v))) &#123;</span><br><span class="line">                            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(w, l)</span><br><span class="line">                            || <span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(u, v))) &#123;</span><br><span class="line">                            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">else</span> <span class="keyword">if</span> (l.b == v) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(u, <span class="built_in">Line</span>(l.b, l.a))) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(l.b, l.a))</span><br><span class="line">                            &amp;&amp; <span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(u, v))) &#123;</span><br><span class="line">                            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(l.b, l.a))</span><br><span class="line">                            || <span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(u, v))) &#123;</span><br><span class="line">                            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(u, l)) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(l.b, l.a))</span><br><span class="line">                            || <span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(u, v))) &#123;</span><br><span class="line">                            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="built_in">pointOnLineLeft</span>(w, l)</span><br><span class="line">                            || <span class="built_in">pointOnLineLeft</span>(w, <span class="built_in">Line</span>(u, v))) &#123;</span><br><span class="line">                            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">T</span>&gt;</span><br><span class="line">std::vector&lt;Point&lt;T&gt;&gt; <span class="built_in">hp</span>(std::vector&lt;Line&lt;T&gt;&gt; lines) &#123;</span><br><span class="line">    std::<span class="built_in">sort</span>(lines.<span class="built_in">begin</span>(), lines.<span class="built_in">end</span>(), [&amp;](<span class="keyword">auto</span> l1, <span class="keyword">auto</span> l2) &#123;</span><br><span class="line">        <span class="keyword">auto</span> d1 = l1.b - l1.a;</span><br><span class="line">        <span class="keyword">auto</span> d2 = l2.b - l2.a;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">sgn</span>(d1) != <span class="built_in">sgn</span>(d2)) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">sgn</span>(d1) == <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">cross</span>(d1, d2) &gt; <span class="number">0</span>;</span><br><span class="line">    &#125;);</span><br><span class="line">    </span><br><span class="line">    std::deque&lt;Line&lt;T&gt;&gt; ls;</span><br><span class="line">    std::deque&lt;Point&lt;T&gt;&gt; ps;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> l : lines) &#123;</span><br><span class="line">        <span class="keyword">if</span> (ls.<span class="built_in">empty</span>()) &#123;</span><br><span class="line">            ls.<span class="built_in">push_back</span>(l);</span><br><span class="line">            <span class="keyword">continue</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">while</span> (!ps.<span class="built_in">empty</span>() &amp;&amp; !<span class="built_in">pointOnLineLeft</span>(ps.<span class="built_in">back</span>(), l)) &#123;</span><br><span class="line">            ps.<span class="built_in">pop_back</span>();</span><br><span class="line">            ls.<span class="built_in">pop_back</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">while</span> (!ps.<span class="built_in">empty</span>() &amp;&amp; !<span class="built_in">pointOnLineLeft</span>(ps[<span class="number">0</span>], l)) &#123;</span><br><span class="line">            ps.<span class="built_in">pop_front</span>();</span><br><span class="line">            ls.<span class="built_in">pop_front</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">cross</span>(l.b - l.a, ls.<span class="built_in">back</span>().b - ls.<span class="built_in">back</span>().a) == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (dot(l.b - l.a, ls.<span class="built_in">back</span>().b - ls.<span class="built_in">back</span>().a) &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                </span><br><span class="line">                <span class="keyword">if</span> (!<span class="built_in">pointOnLineLeft</span>(ls.<span class="built_in">back</span>().a, l)) &#123;</span><br><span class="line">                    <span class="built_in">assert</span>(ls.<span class="built_in">size</span>() == <span class="number">1</span>);</span><br><span class="line">                    ls[<span class="number">0</span>] = l;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> &#123;&#125;;</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        ps.<span class="built_in">push_back</span>(<span class="built_in">lineIntersection</span>(ls.<span class="built_in">back</span>(), l));</span><br><span class="line">        ls.<span class="built_in">push_back</span>(l);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">while</span> (!ps.<span class="built_in">empty</span>() &amp;&amp; !<span class="built_in">pointOnLineLeft</span>(ps.<span class="built_in">back</span>(), ls[<span class="number">0</span>])) &#123;</span><br><span class="line">        ps.<span class="built_in">pop_back</span>();</span><br><span class="line">        ls.<span class="built_in">pop_back</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (ls.<span class="built_in">size</span>() &lt;= <span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    ps.<span class="built_in">push_back</span>(<span class="built_in">lineIntersection</span>(ls[<span class="number">0</span>], ls.<span class="built_in">back</span>()));</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> std::<span class="built_in">vector</span>(ps.<span class="built_in">begin</span>(), ps.<span class="built_in">end</span>());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></details><h2 id="10A-静态凸包（with-Point）">10A - 静态凸包（with. Point）</h2><p><a href="https://cf.dianhsu.com/gym/104288/submission/201412835">2023-04-09</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line">struct Point &#123;</span><br><span class="line">    i64 x<span class="comment">;</span></span><br><span class="line">    i64 y<span class="comment">;</span></span><br><span class="line">    Point<span class="punctuation">(</span>i64 x = <span class="number">0</span>, i64 y = <span class="number">0</span><span class="punctuation">)</span> : x<span class="punctuation">(</span>x<span class="punctuation">)</span>, y<span class="punctuation">(</span>y<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">bool operator==<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span>, const Point &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return <span class="keyword">a</span>.x == b.x &amp;&amp; <span class="keyword">a</span>.y == b.y<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Point operator+<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span>, const Point &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return Point<span class="punctuation">(</span><span class="keyword">a</span>.x + b.x, <span class="keyword">a</span>.y + b.y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Point operator-<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span>, const Point &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return Point<span class="punctuation">(</span><span class="keyword">a</span>.x - b.x, <span class="keyword">a</span>.y - b.y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">i64 dot<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span>, const Point &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return <span class="keyword">a</span>.x * b.x + <span class="keyword">a</span>.y * b.y<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">i64 cross<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span>, const Point &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return <span class="keyword">a</span>.x * b.y - <span class="keyword">a</span>.y * b.x<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void norm<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;Point&gt; &amp;h<span class="punctuation">)</span> &#123;</span><br><span class="line">    int i = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int j = <span class="number">0</span><span class="comment">; j &lt; int(h.size()); j++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>h[j].y &lt; h[i].y || <span class="punctuation">(</span>h[j].y == h[i].y &amp;&amp; h[j].x &lt; h[i].x<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            i = j<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    st<span class="number">d::</span>rotate<span class="punctuation">(</span>h.begin<span class="punctuation">(</span><span class="punctuation">)</span>, h.begin<span class="punctuation">(</span><span class="punctuation">)</span> + i, h.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int sgn<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">    return <span class="keyword">a</span>.y &gt; <span class="number">0</span> || <span class="punctuation">(</span><span class="keyword">a</span>.y == <span class="number">0</span> &amp;&amp; <span class="keyword">a</span>.x &gt; <span class="number">0</span><span class="punctuation">)</span> ? <span class="number">0</span> : <span class="number">1</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">st<span class="number">d::</span>vector&lt;Point&gt; getHull<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;Point&gt; p<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;Point&gt; h, l<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>sort<span class="punctuation">(</span>p.begin<span class="punctuation">(</span><span class="punctuation">)</span>, p.end<span class="punctuation">(</span><span class="punctuation">)</span>, [&amp;]<span class="punctuation">(</span>auto <span class="keyword">a</span>, auto b<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span><span class="keyword">a</span>.x != b.x<span class="punctuation">)</span> &#123;</span><br><span class="line">            return <span class="keyword">a</span>.x &lt; b.x<span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            return <span class="keyword">a</span>.y &lt; b.y<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    p.erase<span class="punctuation">(</span>st<span class="number">d::</span>unique<span class="punctuation">(</span>p.begin<span class="punctuation">(</span><span class="punctuation">)</span>, p.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span>, p.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>p.size<span class="punctuation">(</span><span class="punctuation">)</span> &lt;= <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return p<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    for <span class="punctuation">(</span>auto <span class="keyword">a</span> : p<span class="punctuation">)</span> &#123;</span><br><span class="line">        while <span class="punctuation">(</span>h.size<span class="punctuation">(</span><span class="punctuation">)</span> &gt; <span class="number">1</span> &amp;&amp; cross<span class="punctuation">(</span><span class="keyword">a</span> - h.back<span class="punctuation">(</span><span class="punctuation">)</span>, <span class="keyword">a</span> - h[h.size<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">2</span>]<span class="punctuation">)</span> &lt;= <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            h.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        while <span class="punctuation">(</span>l.size<span class="punctuation">(</span><span class="punctuation">)</span> &gt; <span class="number">1</span> &amp;&amp; cross<span class="punctuation">(</span><span class="keyword">a</span> - l.back<span class="punctuation">(</span><span class="punctuation">)</span>, <span class="keyword">a</span> - l[l.size<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">2</span>]<span class="punctuation">)</span> &gt;= <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            l.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        l.push_back<span class="punctuation">(</span><span class="keyword">a</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        h.push_back<span class="punctuation">(</span><span class="keyword">a</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    l.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>reverse<span class="punctuation">(</span>h.begin<span class="punctuation">(</span><span class="punctuation">)</span>, h.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    h.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    l.insert<span class="punctuation">(</span>l.end<span class="punctuation">(</span><span class="punctuation">)</span>, h.begin<span class="punctuation">(</span><span class="punctuation">)</span>, h.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return l<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="10B-静态凸包（with-std-complex）">10B - 静态凸包（with. std::complex）</h2><p><a href="https://loj.ac/s/1370861">2022-02-04</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line">using Point = st<span class="number">d::c</span>omplex&lt;i64&gt;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">#define x real</span><br><span class="line">#define y imag</span><br><span class="line"></span><br><span class="line">auto dot<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span>, const Point &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return <span class="punctuation">(</span>st<span class="number">d::c</span>onj<span class="punctuation">(</span><span class="keyword">a</span><span class="punctuation">)</span> * b<span class="punctuation">)</span>.x<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">auto cross<span class="punctuation">(</span>const Point &amp;<span class="keyword">a</span>, const Point &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    return <span class="punctuation">(</span>st<span class="number">d::c</span>onj<span class="punctuation">(</span><span class="keyword">a</span><span class="punctuation">)</span> * b<span class="punctuation">)</span>.y<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">auto rot<span class="punctuation">(</span>const Point &amp;p<span class="punctuation">)</span> &#123;</span><br><span class="line">    return Point<span class="punctuation">(</span>-p.y<span class="punctuation">(</span><span class="punctuation">)</span>, p.x<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">auto complexHull<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;Point&gt; <span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>sort<span class="punctuation">(</span><span class="keyword">a</span>.begin<span class="punctuation">(</span><span class="punctuation">)</span>, <span class="keyword">a</span>.end<span class="punctuation">(</span><span class="punctuation">)</span>, [&amp;]<span class="punctuation">(</span>auto <span class="keyword">a</span>, auto b<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span><span class="keyword">a</span>.x<span class="punctuation">(</span><span class="punctuation">)</span> != b.x<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return <span class="keyword">a</span>.x<span class="punctuation">(</span><span class="punctuation">)</span> &lt; b.x<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            return <span class="keyword">a</span>.y<span class="punctuation">(</span><span class="punctuation">)</span> &lt; b.y<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line"></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Point&gt; l, h<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">    for <span class="punctuation">(</span>auto p : <span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        while <span class="punctuation">(</span>l.size<span class="punctuation">(</span><span class="punctuation">)</span> &gt; <span class="number">1</span> &amp;&amp; cross<span class="punctuation">(</span>l.back<span class="punctuation">(</span><span class="punctuation">)</span> - l[l.size<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">2</span>], p - l.back<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &lt;= <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            l.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        while <span class="punctuation">(</span>h.size<span class="punctuation">(</span><span class="punctuation">)</span> &gt; <span class="number">1</span> &amp;&amp; cross<span class="punctuation">(</span>h.back<span class="punctuation">(</span><span class="punctuation">)</span> - h[h.size<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">2</span>], p - h.back<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &gt;= <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            h.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        l.push_back<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        h.push_back<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    st<span class="number">d::</span>reverse<span class="punctuation">(</span>h.begin<span class="punctuation">(</span><span class="punctuation">)</span>, h.end<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line"></span><br><span class="line">    h.insert<span class="punctuation">(</span>h.end<span class="punctuation">(</span><span class="punctuation">)</span>, l.begin<span class="punctuation">(</span><span class="punctuation">)</span> + <span class="number">1</span>, l.end<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line"></span><br><span class="line">    return h<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int sgn<span class="punctuation">(</span>Point p<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>p.y<span class="punctuation">(</span><span class="punctuation">)</span> &gt; <span class="number">0</span> || <span class="punctuation">(</span>p.y<span class="punctuation">(</span><span class="punctuation">)</span> == <span class="number">0</span> &amp;&amp; p.x<span class="punctuation">(</span><span class="punctuation">)</span> &lt; <span class="number">0</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        return <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="11A-多项式相关（Poly-with-Z）">11A - 多项式相关（Poly, with. Z）</h2><p><a href="https://atcoder.jp/contests/arc155/submissions/38664055">2023-02-06</a></p><details><summary>长度过长，点击查看</summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br></pre></td><td class="code"><pre><span class="line">std::vector&lt;<span class="type">int</span>&gt; rev;</span><br><span class="line">std::vector&lt;Z&gt; roots&#123;<span class="number">0</span>, <span class="number">1</span>&#125;;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dft</span><span class="params">(std::vector&lt;Z&gt; &amp;a)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n = a.<span class="built_in">size</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">int</span>(rev.<span class="built_in">size</span>()) != n) &#123;</span><br><span class="line">        <span class="type">int</span> k = __builtin_ctz(n) - <span class="number">1</span>;</span><br><span class="line">        rev.<span class="built_in">resize</span>(n);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            rev[i] = rev[i &gt;&gt; <span class="number">1</span>] &gt;&gt; <span class="number">1</span> | (i &amp; <span class="number">1</span>) &lt;&lt; k;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (rev[i] &lt; i) &#123;</span><br><span class="line">            std::<span class="built_in">swap</span>(a[i], a[rev[i]]);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">int</span>(roots.<span class="built_in">size</span>()) &lt; n) &#123;</span><br><span class="line">        <span class="type">int</span> k = __builtin_ctz(roots.<span class="built_in">size</span>());</span><br><span class="line">        roots.<span class="built_in">resize</span>(n);</span><br><span class="line">        <span class="keyword">while</span> ((<span class="number">1</span> &lt;&lt; k) &lt; n) &#123;</span><br><span class="line">            Z e = <span class="built_in">power</span>(<span class="built_in">Z</span>(<span class="number">3</span>), (P - <span class="number">1</span>) &gt;&gt; (k + <span class="number">1</span>));</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span> &lt;&lt; (k - <span class="number">1</span>); i &lt; (<span class="number">1</span> &lt;&lt; k); i++) &#123;</span><br><span class="line">                roots[<span class="number">2</span> * i] = roots[i];</span><br><span class="line">                roots[<span class="number">2</span> * i + <span class="number">1</span>] = roots[i] * e;</span><br><span class="line">            &#125;</span><br><span class="line">            k++;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> k = <span class="number">1</span>; k &lt; n; k *= <span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i += <span class="number">2</span> * k) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; k; j++) &#123;</span><br><span class="line">                Z u = a[i + j];</span><br><span class="line">                Z v = a[i + j + k] * roots[k + j];</span><br><span class="line">                a[i + j] = u + v;</span><br><span class="line">                a[i + j + k] = u - v;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">idft</span><span class="params">(std::vector&lt;Z&gt; &amp;a)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n = a.<span class="built_in">size</span>();</span><br><span class="line">    std::<span class="built_in">reverse</span>(a.<span class="built_in">begin</span>() + <span class="number">1</span>, a.<span class="built_in">end</span>());</span><br><span class="line">    <span class="built_in">dft</span>(a);</span><br><span class="line">    Z inv = (<span class="number">1</span> - P) / n;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        a[i] *= inv;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Poly</span> &#123;</span><br><span class="line">    std::vector&lt;Z&gt; a;</span><br><span class="line">    <span class="built_in">Poly</span>() &#123;&#125;</span><br><span class="line">    <span class="function"><span class="keyword">explicit</span> <span class="title">Poly</span><span class="params">(<span class="type">int</span> size, std::function&lt;Z(<span class="type">int</span>)&gt; f = [](<span class="type">int</span>) &#123; <span class="keyword">return</span> <span class="number">0</span>; &#125;)</span> : a(size) &#123;</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; size; i++) &#123;</span><br><span class="line">            a[i] = <span class="built_in">f</span>(i);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">Poly</span>(<span class="type">const</span> std::vector&lt;Z&gt; &amp;a) : <span class="built_in">a</span>(a) &#123;&#125;</span><br><span class="line">    <span class="built_in">Poly</span>(<span class="type">const</span> std::initializer_list&lt;Z&gt; &amp;a) : <span class="built_in">a</span>(a) &#123;&#125;</span><br><span class="line">    <span class="function"><span class="type">int</span> <span class="title">size</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> a.<span class="built_in">size</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">resize</span><span class="params">(<span class="type">int</span> n)</span> </span>&#123;</span><br><span class="line">        a.<span class="built_in">resize</span>(n);</span><br><span class="line">    &#125;</span><br><span class="line">    Z <span class="keyword">operator</span>[](<span class="type">int</span> idx) <span class="type">const</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (idx &lt; <span class="built_in">size</span>()) &#123;</span><br><span class="line">            <span class="keyword">return</span> a[idx];</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    Z &amp;<span class="keyword">operator</span>[](<span class="type">int</span> idx) &#123;</span><br><span class="line">        <span class="keyword">return</span> a[idx];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">mulxk</span><span class="params">(<span class="type">int</span> k)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">auto</span> b = a;</span><br><span class="line">        b.<span class="built_in">insert</span>(b.<span class="built_in">begin</span>(), k, <span class="number">0</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(b);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">modxk</span><span class="params">(<span class="type">int</span> k)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        k = std::<span class="built_in">min</span>(k, <span class="built_in">size</span>());</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(std::<span class="built_in">vector</span>&lt;Z&gt;(a.<span class="built_in">begin</span>(), a.<span class="built_in">begin</span>() + k));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">divxk</span><span class="params">(<span class="type">int</span> k)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">size</span>() &lt;= k) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(std::<span class="built_in">vector</span>&lt;Z&gt;(a.<span class="built_in">begin</span>() + k, a.<span class="built_in">end</span>()));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Poly <span class="keyword">operator</span>+(<span class="type">const</span> Poly &amp;a, <span class="type">const</span> Poly &amp;b) &#123;</span><br><span class="line">        <span class="function">std::vector&lt;Z&gt; <span class="title">res</span><span class="params">(std::max(a.size(), b.size()))</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(res.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            res[i] = a[i] + b[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(res);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Poly <span class="keyword">operator</span>-(<span class="type">const</span> Poly &amp;a, <span class="type">const</span> Poly &amp;b) &#123;</span><br><span class="line">        <span class="function">std::vector&lt;Z&gt; <span class="title">res</span><span class="params">(std::max(a.size(), b.size()))</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(res.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            res[i] = a[i] - b[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(res);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Poly <span class="keyword">operator</span>-(<span class="type">const</span> Poly &amp;a) &#123;</span><br><span class="line">        <span class="function">std::vector&lt;Z&gt; <span class="title">res</span><span class="params">(a.size())</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(res.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            res[i] = -a[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(res);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Poly <span class="keyword">operator</span>*(Poly a, Poly b) &#123;</span><br><span class="line">        <span class="keyword">if</span> (a.<span class="built_in">size</span>() == <span class="number">0</span> || b.<span class="built_in">size</span>() == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (a.<span class="built_in">size</span>() &lt; b.<span class="built_in">size</span>()) &#123;</span><br><span class="line">            std::<span class="built_in">swap</span>(a, b);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (b.<span class="built_in">size</span>() &lt; <span class="number">128</span>) &#123;</span><br><span class="line">            <span class="function">Poly <span class="title">c</span><span class="params">(a.size() + b.size() - <span class="number">1</span>)</span></span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; a.<span class="built_in">size</span>(); i++) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; b.<span class="built_in">size</span>(); j++) &#123;</span><br><span class="line">                    c[i + j] += a[i] * b[j];</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> c;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> sz = <span class="number">1</span>, tot = a.<span class="built_in">size</span>() + b.<span class="built_in">size</span>() - <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (sz &lt; tot) &#123;</span><br><span class="line">            sz *= <span class="number">2</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        a.a.<span class="built_in">resize</span>(sz);</span><br><span class="line">        b.a.<span class="built_in">resize</span>(sz);</span><br><span class="line">        <span class="built_in">dft</span>(a.a);</span><br><span class="line">        <span class="built_in">dft</span>(b.a);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; sz; ++i) &#123;</span><br><span class="line">            a.a[i] = a[i] * b[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">idft</span>(a.a);</span><br><span class="line">        a.<span class="built_in">resize</span>(tot);</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Poly <span class="keyword">operator</span>*(Z a, Poly b) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(b.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            b[i] *= a;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> Poly <span class="keyword">operator</span>*(Poly a, Z b) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(a.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            a[i] *= b;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    Poly &amp;<span class="keyword">operator</span>+=(Poly b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) + b;</span><br><span class="line">    &#125;</span><br><span class="line">    Poly &amp;<span class="keyword">operator</span>-=(Poly b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) - b;</span><br><span class="line">    &#125;</span><br><span class="line">    Poly &amp;<span class="keyword">operator</span>*=(Poly b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) * b;</span><br><span class="line">    &#125;</span><br><span class="line">    Poly &amp;<span class="keyword">operator</span>*=(Z b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) * b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">deriv</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (a.<span class="built_in">empty</span>()) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function">std::vector&lt;Z&gt; <span class="title">res</span><span class="params">(size() - <span class="number">1</span>)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">size</span>() - <span class="number">1</span>; ++i) &#123;</span><br><span class="line">            res[i] = (i + <span class="number">1</span>) * a[i + <span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(res);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">integr</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="function">std::vector&lt;Z&gt; <span class="title">res</span><span class="params">(size() + <span class="number">1</span>)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">size</span>(); ++i) &#123;</span><br><span class="line">            res[i + <span class="number">1</span>] = a[i] / (i + <span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(res);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">inv</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        Poly x&#123;a[<span class="number">0</span>].<span class="built_in">inv</span>()&#125;;</span><br><span class="line">        <span class="type">int</span> k = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (k &lt; m) &#123;</span><br><span class="line">            k *= <span class="number">2</span>;</span><br><span class="line">            x = (x * (Poly&#123;<span class="number">2</span>&#125; - <span class="built_in">modxk</span>(k) * x)).<span class="built_in">modxk</span>(k);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x.<span class="built_in">modxk</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">log</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (<span class="built_in">deriv</span>() * <span class="built_in">inv</span>(m)).<span class="built_in">integr</span>().<span class="built_in">modxk</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">exp</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        Poly x&#123;<span class="number">1</span>&#125;;</span><br><span class="line">        <span class="type">int</span> k = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (k &lt; m) &#123;</span><br><span class="line">            k *= <span class="number">2</span>;</span><br><span class="line">            x = (x * (Poly&#123;<span class="number">1</span>&#125; - x.<span class="built_in">log</span>(k) + <span class="built_in">modxk</span>(k))).<span class="built_in">modxk</span>(k);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x.<span class="built_in">modxk</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">pow</span><span class="params">(<span class="type">int</span> k, <span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="type">int</span> i = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> (i &lt; <span class="built_in">size</span>() &amp;&amp; a[i].<span class="built_in">val</span>() == <span class="number">0</span>) &#123;</span><br><span class="line">            i++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (i == <span class="built_in">size</span>() || <span class="number">1LL</span> * i * k &gt;= m) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>(std::<span class="built_in">vector</span>&lt;Z&gt;(m));</span><br><span class="line">        &#125;</span><br><span class="line">        Z v = a[i];</span><br><span class="line">        <span class="keyword">auto</span> f = <span class="built_in">divxk</span>(i) * v.<span class="built_in">inv</span>();</span><br><span class="line">        <span class="keyword">return</span> (f.<span class="built_in">log</span>(m - i * k) * k).<span class="built_in">exp</span>(m - i * k).<span class="built_in">mulxk</span>(i * k) * <span class="built_in">power</span>(v, k);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">sqrt</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        Poly x&#123;<span class="number">1</span>&#125;;</span><br><span class="line">        <span class="type">int</span> k = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (k &lt; m) &#123;</span><br><span class="line">            k *= <span class="number">2</span>;</span><br><span class="line">            x = (x + (<span class="built_in">modxk</span>(k) * x.<span class="built_in">inv</span>(k)).<span class="built_in">modxk</span>(k)) * ((P + <span class="number">1</span>) / <span class="number">2</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x.<span class="built_in">modxk</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">mulT</span><span class="params">(Poly b)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (b.<span class="built_in">size</span>() == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> n = b.<span class="built_in">size</span>();</span><br><span class="line">        std::<span class="built_in">reverse</span>(b.a.<span class="built_in">begin</span>(), b.a.<span class="built_in">end</span>());</span><br><span class="line">        <span class="keyword">return</span> ((*<span class="keyword">this</span>) * b).<span class="built_in">divxk</span>(n - <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">std::vector&lt;Z&gt; <span class="title">eval</span><span class="params">(std::vector&lt;Z&gt; x)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">size</span>() == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> std::<span class="built_in">vector</span>&lt;Z&gt;(x.<span class="built_in">size</span>(), <span class="number">0</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">const</span> <span class="type">int</span> n = std::<span class="built_in">max</span>(<span class="built_in">int</span>(x.<span class="built_in">size</span>()), <span class="built_in">size</span>());</span><br><span class="line">        <span class="function">std::vector&lt;Poly&gt; <span class="title">q</span><span class="params">(<span class="number">4</span> * n)</span></span>;</span><br><span class="line">        <span class="function">std::vector&lt;Z&gt; <span class="title">ans</span><span class="params">(x.size())</span></span>;</span><br><span class="line">        x.<span class="built_in">resize</span>(n);</span><br><span class="line">        std::function&lt;<span class="type">void</span>(<span class="type">int</span>, <span class="type">int</span>, <span class="type">int</span>)&gt; build = [&amp;](<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r) &#123;</span><br><span class="line">            <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">                q[p] = Poly&#123;<span class="number">1</span>, -x[l]&#125;;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">                <span class="built_in">build</span>(<span class="number">2</span> * p, l, m);</span><br><span class="line">                <span class="built_in">build</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r);</span><br><span class="line">                q[p] = q[<span class="number">2</span> * p] * q[<span class="number">2</span> * p + <span class="number">1</span>];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">build</span>(<span class="number">1</span>, <span class="number">0</span>, n);</span><br><span class="line">        std::function&lt;<span class="type">void</span>(<span class="type">int</span>, <span class="type">int</span>, <span class="type">int</span>, <span class="type">const</span> Poly &amp;)&gt; work = [&amp;](<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">const</span> Poly &amp;num) &#123;</span><br><span class="line">            <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (l &lt; <span class="built_in">int</span>(ans.<span class="built_in">size</span>())) &#123;</span><br><span class="line">                    ans[l] = num[<span class="number">0</span>];</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">                <span class="built_in">work</span>(<span class="number">2</span> * p, l, m, num.<span class="built_in">mulT</span>(q[<span class="number">2</span> * p + <span class="number">1</span>]).<span class="built_in">modxk</span>(m - l));</span><br><span class="line">                <span class="built_in">work</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, num.<span class="built_in">mulT</span>(q[<span class="number">2</span> * p]).<span class="built_in">modxk</span>(r - m));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">work</span>(<span class="number">1</span>, <span class="number">0</span>, n, <span class="built_in">mulT</span>(q[<span class="number">1</span>].<span class="built_in">inv</span>(n)));</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></details><h2 id="11B-多项式相关（Poly-with-MInt-MLong）">11B - 多项式相关（Poly, with. MInt &amp; MLong）</h2><p><a href="https://atcoder.jp/contests/arc163/submissions/45737810">2023-09-20</a></p><details><summary>长度过长，点击查看</summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br></pre></td><td class="code"><pre><span class="line">std::vector&lt;<span class="type">int</span>&gt; rev;</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="type">int</span> P&gt;</span><br><span class="line">std::vector&lt;MInt&lt;P&gt;&gt; roots&#123;<span class="number">0</span>, <span class="number">1</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="type">int</span> P&gt;</span></span><br><span class="line"><span class="function"><span class="keyword">constexpr</span> MInt&lt;P&gt; <span class="title">findPrimitiveRoot</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    MInt&lt;P&gt; i = <span class="number">2</span>;</span><br><span class="line">    <span class="type">int</span> k = __builtin_ctz(P - <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">while</span> (<span class="literal">true</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">power</span>(i, (P - <span class="number">1</span>) / <span class="number">2</span>) != <span class="number">1</span>) &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        i += <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">power</span>(i, (P - <span class="number">1</span>) &gt;&gt; k);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="type">int</span> P&gt;</span><br><span class="line"><span class="keyword">constexpr</span> MInt&lt;P&gt; primitiveRoot = <span class="built_in">findPrimitiveRoot</span>&lt;P&gt;();</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;&gt;</span><br><span class="line"><span class="keyword">constexpr</span> MInt&lt;<span class="number">998244353</span>&gt; primitiveRoot&lt;<span class="number">998244353</span>&gt; &#123;<span class="number">31</span>&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="type">int</span> P&gt;</span></span><br><span class="line"><span class="function"><span class="keyword">constexpr</span> <span class="type">void</span> <span class="title">dft</span><span class="params">(std::vector&lt;MInt&lt;P&gt;&gt; &amp;a)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n = a.<span class="built_in">size</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="built_in">int</span>(rev.<span class="built_in">size</span>()) != n) &#123;</span><br><span class="line">        <span class="type">int</span> k = __builtin_ctz(n) - <span class="number">1</span>;</span><br><span class="line">        rev.<span class="built_in">resize</span>(n);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            rev[i] = rev[i &gt;&gt; <span class="number">1</span>] &gt;&gt; <span class="number">1</span> | (i &amp; <span class="number">1</span>) &lt;&lt; k;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (rev[i] &lt; i) &#123;</span><br><span class="line">            std::<span class="built_in">swap</span>(a[i], a[rev[i]]);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (roots&lt;P&gt;.<span class="built_in">size</span>() &lt; n) &#123;</span><br><span class="line">        <span class="type">int</span> k = __builtin_ctz(roots&lt;P&gt;.<span class="built_in">size</span>());</span><br><span class="line">        roots&lt;P&gt;.<span class="built_in">resize</span>(n);</span><br><span class="line">        <span class="keyword">while</span> ((<span class="number">1</span> &lt;&lt; k) &lt; n) &#123;</span><br><span class="line">            <span class="keyword">auto</span> e = <span class="built_in">power</span>(primitiveRoot&lt;P&gt;, <span class="number">1</span> &lt;&lt; (__builtin_ctz(P - <span class="number">1</span>) - k - <span class="number">1</span>));</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span> &lt;&lt; (k - <span class="number">1</span>); i &lt; (<span class="number">1</span> &lt;&lt; k); i++) &#123;</span><br><span class="line">                roots&lt;P&gt;[<span class="number">2</span> * i] = roots&lt;P&gt;[i];</span><br><span class="line">                roots&lt;P&gt;[<span class="number">2</span> * i + <span class="number">1</span>] = roots&lt;P&gt;[i] * e;</span><br><span class="line">            &#125;</span><br><span class="line">            k++;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> k = <span class="number">1</span>; k &lt; n; k *= <span class="number">2</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i += <span class="number">2</span> * k) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; k; j++) &#123;</span><br><span class="line">                MInt&lt;P&gt; u = a[i + j];</span><br><span class="line">                MInt&lt;P&gt; v = a[i + j + k] * roots&lt;P&gt;[k + j];</span><br><span class="line">                a[i + j] = u + v;</span><br><span class="line">                a[i + j + k] = u - v;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="type">int</span> P&gt;</span></span><br><span class="line"><span class="function"><span class="keyword">constexpr</span> <span class="type">void</span> <span class="title">idft</span><span class="params">(std::vector&lt;MInt&lt;P&gt;&gt; &amp;a)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n = a.<span class="built_in">size</span>();</span><br><span class="line">    std::<span class="built_in">reverse</span>(a.<span class="built_in">begin</span>() + <span class="number">1</span>, a.<span class="built_in">end</span>());</span><br><span class="line">    <span class="built_in">dft</span>(a);</span><br><span class="line">    MInt&lt;P&gt; inv = (<span class="number">1</span> - P) / n;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        a[i] *= inv;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="type">int</span> P = <span class="number">998244353</span>&gt;</span><br><span class="line"><span class="keyword">struct</span> Poly : <span class="keyword">public</span> std::vector&lt;MInt&lt;P&gt;&gt; &#123;</span><br><span class="line">    <span class="keyword">using</span> Value = MInt&lt;P&gt;;</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">Poly</span>() : std::<span class="built_in">vector</span>&lt;Value&gt;() &#123;&#125;</span><br><span class="line">    <span class="function"><span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="title">Poly</span><span class="params">(<span class="type">int</span> n)</span> : std::vector&lt;Value&gt;(n) &#123;</span>&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="title">Poly</span><span class="params">(<span class="type">const</span> std::vector&lt;Value&gt; &amp;a)</span> : std::vector&lt;Value&gt;(a) &#123;</span>&#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="title">Poly</span><span class="params">(<span class="type">const</span> std::initializer_list&lt;Value&gt; &amp;a)</span> : std::vector&lt;Value&gt;(a) &#123;</span>&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">InputIt</span>, <span class="keyword">class</span> = std::_RequireInputIter&lt;InputIt&gt;&gt;</span><br><span class="line">    <span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="built_in">Poly</span>(InputIt first, InputIt last) : std::<span class="built_in">vector</span>&lt;Value&gt;(first, last) &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt;</span><br><span class="line">    <span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="built_in">Poly</span>(<span class="type">int</span> n, F f) : std::<span class="built_in">vector</span>&lt;Value&gt;(n) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            (*<span class="keyword">this</span>)[i] = <span class="built_in">f</span>(i);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">shift</span><span class="params">(<span class="type">int</span> k)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (k &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">auto</span> b = *<span class="keyword">this</span>;</span><br><span class="line">            b.<span class="built_in">insert</span>(b.<span class="built_in">begin</span>(), k, <span class="number">0</span>);</span><br><span class="line">            <span class="keyword">return</span> b;</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (<span class="keyword">this</span>-&gt;<span class="built_in">size</span>() &lt;= -k) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>(<span class="keyword">this</span>-&gt;<span class="built_in">begin</span>() + (-k), <span class="keyword">this</span>-&gt;<span class="built_in">end</span>());</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">trunc</span><span class="params">(<span class="type">int</span> k)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        Poly f = *<span class="keyword">this</span>;</span><br><span class="line">        f.<span class="built_in">resize</span>(k);</span><br><span class="line">        <span class="keyword">return</span> f;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="keyword">friend</span> Poly <span class="keyword">operator</span>+(<span class="type">const</span> Poly &amp;a, <span class="type">const</span> Poly &amp;b) &#123;</span><br><span class="line">        <span class="function">Poly <span class="title">res</span><span class="params">(std::max(a.size(), b.size()))</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; a.<span class="built_in">size</span>(); i++) &#123;</span><br><span class="line">            res[i] += a[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; b.<span class="built_in">size</span>(); i++) &#123;</span><br><span class="line">            res[i] += b[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="keyword">friend</span> Poly <span class="keyword">operator</span>-(<span class="type">const</span> Poly &amp;a, <span class="type">const</span> Poly &amp;b) &#123;</span><br><span class="line">        <span class="function">Poly <span class="title">res</span><span class="params">(std::max(a.size(), b.size()))</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; a.<span class="built_in">size</span>(); i++) &#123;</span><br><span class="line">            res[i] += a[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; b.<span class="built_in">size</span>(); i++) &#123;</span><br><span class="line">            res[i] -= b[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="keyword">friend</span> Poly <span class="keyword">operator</span>-(<span class="type">const</span> Poly &amp;a) &#123;</span><br><span class="line">        <span class="function">std::vector&lt;Value&gt; <span class="title">res</span><span class="params">(a.size())</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(res.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            res[i] = -a[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(res);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="keyword">friend</span> Poly <span class="keyword">operator</span>*(Poly a, Poly b) &#123;</span><br><span class="line">        <span class="keyword">if</span> (a.<span class="built_in">size</span>() == <span class="number">0</span> || b.<span class="built_in">size</span>() == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (a.<span class="built_in">size</span>() &lt; b.<span class="built_in">size</span>()) &#123;</span><br><span class="line">            std::<span class="built_in">swap</span>(a, b);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> n = <span class="number">1</span>, tot = a.<span class="built_in">size</span>() + b.<span class="built_in">size</span>() - <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (n &lt; tot) &#123;</span><br><span class="line">            n *= <span class="number">2</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (((P - <span class="number">1</span>) &amp; (n - <span class="number">1</span>)) != <span class="number">0</span> || b.<span class="built_in">size</span>() &lt; <span class="number">128</span>) &#123;</span><br><span class="line">            <span class="function">Poly <span class="title">c</span><span class="params">(a.size() + b.size() - <span class="number">1</span>)</span></span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; a.<span class="built_in">size</span>(); i++) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; b.<span class="built_in">size</span>(); j++) &#123;</span><br><span class="line">                    c[i + j] += a[i] * b[j];</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">return</span> c;</span><br><span class="line">        &#125;</span><br><span class="line">        a.<span class="built_in">resize</span>(n);</span><br><span class="line">        b.<span class="built_in">resize</span>(n);</span><br><span class="line">        <span class="built_in">dft</span>(a);</span><br><span class="line">        <span class="built_in">dft</span>(b);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; ++i) &#123;</span><br><span class="line">            a[i] *= b[i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">idft</span>(a);</span><br><span class="line">        a.<span class="built_in">resize</span>(tot);</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="keyword">friend</span> Poly <span class="keyword">operator</span>*(Value a, Poly b) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(b.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            b[i] *= a;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="keyword">friend</span> Poly <span class="keyword">operator</span>*(Poly a, Value b) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(a.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            a[i] *= b;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="keyword">friend</span> Poly <span class="keyword">operator</span>/(Poly a, Value b) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="built_in">int</span>(a.<span class="built_in">size</span>()); i++) &#123;</span><br><span class="line">            a[i] /= b;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> a;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> Poly &amp;<span class="keyword">operator</span>+=(Poly b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) + b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> Poly &amp;<span class="keyword">operator</span>-=(Poly b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) - b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> Poly &amp;<span class="keyword">operator</span>*=(Poly b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) * b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> Poly &amp;<span class="keyword">operator</span>*=(Value b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) * b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> Poly &amp;<span class="keyword">operator</span>/=(Value b) &#123;</span><br><span class="line">        <span class="keyword">return</span> (*<span class="keyword">this</span>) = (*<span class="keyword">this</span>) / b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">deriv</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">this</span>-&gt;<span class="built_in">empty</span>()) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="function">Poly <span class="title">res</span><span class="params">(<span class="keyword">this</span>-&gt;size() - <span class="number">1</span>)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;<span class="built_in">size</span>() - <span class="number">1</span>; ++i) &#123;</span><br><span class="line">            res[i] = (i + <span class="number">1</span>) * (*<span class="keyword">this</span>)[i + <span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">integr</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="function">Poly <span class="title">res</span><span class="params">(<span class="keyword">this</span>-&gt;size() + <span class="number">1</span>)</span></span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; <span class="keyword">this</span>-&gt;<span class="built_in">size</span>(); ++i) &#123;</span><br><span class="line">            res[i + <span class="number">1</span>] = (*<span class="keyword">this</span>)[i] / (i + <span class="number">1</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">inv</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        Poly x&#123;(*<span class="keyword">this</span>)[<span class="number">0</span>].<span class="built_in">inv</span>()&#125;;</span><br><span class="line">        <span class="type">int</span> k = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (k &lt; m) &#123;</span><br><span class="line">            k *= <span class="number">2</span>;</span><br><span class="line">            x = (x * (Poly&#123;<span class="number">2</span>&#125; - <span class="built_in">trunc</span>(k) * x)).<span class="built_in">trunc</span>(k);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x.<span class="built_in">trunc</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">log</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (<span class="built_in">deriv</span>() * <span class="built_in">inv</span>(m)).<span class="built_in">integr</span>().<span class="built_in">trunc</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">exp</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        Poly x&#123;<span class="number">1</span>&#125;;</span><br><span class="line">        <span class="type">int</span> k = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (k &lt; m) &#123;</span><br><span class="line">            k *= <span class="number">2</span>;</span><br><span class="line">            x = (x * (Poly&#123;<span class="number">1</span>&#125; - x.<span class="built_in">log</span>(k) + <span class="built_in">trunc</span>(k))).<span class="built_in">trunc</span>(k);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x.<span class="built_in">trunc</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">pow</span><span class="params">(<span class="type">int</span> k, <span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="type">int</span> i = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> (i &lt; <span class="keyword">this</span>-&gt;<span class="built_in">size</span>() &amp;&amp; (*<span class="keyword">this</span>)[i] == <span class="number">0</span>) &#123;</span><br><span class="line">            i++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (i == <span class="keyword">this</span>-&gt;<span class="built_in">size</span>() || <span class="number">1LL</span> * i * k &gt;= m) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>(m);</span><br><span class="line">        &#125;</span><br><span class="line">        Value v = (*<span class="keyword">this</span>)[i];</span><br><span class="line">        <span class="keyword">auto</span> f = <span class="built_in">shift</span>(-i) * v.<span class="built_in">inv</span>();</span><br><span class="line">        <span class="keyword">return</span> (f.<span class="built_in">log</span>(m - i * k) * k).<span class="built_in">exp</span>(m - i * k).<span class="built_in">shift</span>(i * k) * <span class="built_in">power</span>(v, k);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">sqrt</span><span class="params">(<span class="type">int</span> m)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        Poly x&#123;<span class="number">1</span>&#125;;</span><br><span class="line">        <span class="type">int</span> k = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span> (k &lt; m) &#123;</span><br><span class="line">            k *= <span class="number">2</span>;</span><br><span class="line">            x = (x + (<span class="built_in">trunc</span>(k) * x.<span class="built_in">inv</span>(k)).<span class="built_in">trunc</span>(k)) * CInv&lt;<span class="number">2</span>, P&gt;;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x.<span class="built_in">trunc</span>(m);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> Poly <span class="title">mulT</span><span class="params">(Poly b)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (b.<span class="built_in">size</span>() == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Poly</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> n = b.<span class="built_in">size</span>();</span><br><span class="line">        std::<span class="built_in">reverse</span>(b.<span class="built_in">begin</span>(), b.<span class="built_in">end</span>());</span><br><span class="line">        <span class="keyword">return</span> ((*<span class="keyword">this</span>) * b).<span class="built_in">shift</span>(-(n - <span class="number">1</span>));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> std::vector&lt;Value&gt; <span class="title">eval</span><span class="params">(std::vector&lt;Value&gt; x)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">this</span>-&gt;<span class="built_in">size</span>() == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> std::<span class="built_in">vector</span>&lt;Value&gt;(x.<span class="built_in">size</span>(), <span class="number">0</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">const</span> <span class="type">int</span> n = std::<span class="built_in">max</span>(x.<span class="built_in">size</span>(), <span class="keyword">this</span>-&gt;<span class="built_in">size</span>());</span><br><span class="line">        <span class="function">std::vector&lt;Poly&gt; <span class="title">q</span><span class="params">(<span class="number">4</span> * n)</span></span>;</span><br><span class="line">        <span class="function">std::vector&lt;Value&gt; <span class="title">ans</span><span class="params">(x.size())</span></span>;</span><br><span class="line">        x.<span class="built_in">resize</span>(n);</span><br><span class="line">        std::function&lt;<span class="type">void</span>(<span class="type">int</span>, <span class="type">int</span>, <span class="type">int</span>)&gt; build = [&amp;](<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r) &#123;</span><br><span class="line">            <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">                q[p] = Poly&#123;<span class="number">1</span>, -x[l]&#125;;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">                <span class="built_in">build</span>(<span class="number">2</span> * p, l, m);</span><br><span class="line">                <span class="built_in">build</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r);</span><br><span class="line">                q[p] = q[<span class="number">2</span> * p] * q[<span class="number">2</span> * p + <span class="number">1</span>];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">build</span>(<span class="number">1</span>, <span class="number">0</span>, n);</span><br><span class="line">        std::function&lt;<span class="type">void</span>(<span class="type">int</span>, <span class="type">int</span>, <span class="type">int</span>, <span class="type">const</span> Poly &amp;)&gt; work = [&amp;](<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">const</span> Poly &amp;num) &#123;</span><br><span class="line">            <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (l &lt; <span class="built_in">int</span>(ans.<span class="built_in">size</span>())) &#123;</span><br><span class="line">                    ans[l] = num[<span class="number">0</span>];</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">                <span class="built_in">work</span>(<span class="number">2</span> * p, l, m, num.<span class="built_in">mulT</span>(q[<span class="number">2</span> * p + <span class="number">1</span>]).<span class="built_in">resize</span>(m - l));</span><br><span class="line">                <span class="built_in">work</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, num.<span class="built_in">mulT</span>(q[<span class="number">2</span> * p]).<span class="built_in">resize</span>(r - m));</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">work</span>(<span class="number">1</span>, <span class="number">0</span>, n, <span class="built_in">mulT</span>(q[<span class="number">1</span>].<span class="built_in">inv</span>(n)));</span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="type">int</span> P </span>= <span class="number">998244353</span>&gt;</span><br><span class="line"><span class="function">Poly&lt;P&gt; <span class="title">berlekampMassey</span><span class="params">(<span class="type">const</span> Poly&lt;P&gt; &amp;s)</span> </span>&#123;</span><br><span class="line">    Poly&lt;P&gt; c;</span><br><span class="line">    Poly&lt;P&gt; oldC;</span><br><span class="line">    <span class="type">int</span> f = <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; s.<span class="built_in">size</span>(); i++) &#123;</span><br><span class="line">        <span class="keyword">auto</span> delta = s[i];</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">1</span>; j &lt;= c.<span class="built_in">size</span>(); j++) &#123;</span><br><span class="line">            delta -= c[j - <span class="number">1</span>] * s[i - j];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (delta == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">continue</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (f == <span class="number">-1</span>) &#123;</span><br><span class="line">            c.<span class="built_in">resize</span>(i + <span class="number">1</span>);</span><br><span class="line">            f = i;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">auto</span> d = oldC;</span><br><span class="line">            d *= <span class="number">-1</span>;</span><br><span class="line">            d.<span class="built_in">insert</span>(d.<span class="built_in">begin</span>(), <span class="number">1</span>);</span><br><span class="line">            MInt&lt;P&gt; df1 = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">1</span>; j &lt;= d.<span class="built_in">size</span>(); j++) &#123;</span><br><span class="line">                df1 += d[j - <span class="number">1</span>] * s[f + <span class="number">1</span> - j];</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="built_in">assert</span>(df1 != <span class="number">0</span>);</span><br><span class="line">            <span class="keyword">auto</span> coef = delta / df1;</span><br><span class="line">            d *= coef;</span><br><span class="line">            <span class="function">Poly&lt;P&gt; <span class="title">zeros</span><span class="params">(i - f - <span class="number">1</span>)</span></span>;</span><br><span class="line">            zeros.<span class="built_in">insert</span>(zeros.<span class="built_in">end</span>(), d.<span class="built_in">begin</span>(), d.<span class="built_in">end</span>());</span><br><span class="line">            d = zeros;</span><br><span class="line">            <span class="keyword">auto</span> temp = c;</span><br><span class="line">            c += d;</span><br><span class="line">            <span class="keyword">if</span> (i - temp.<span class="built_in">size</span>() &gt; f - oldC.<span class="built_in">size</span>()) &#123;</span><br><span class="line">                oldC = temp;</span><br><span class="line">                f = i;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    c *= <span class="number">-1</span>;</span><br><span class="line">    c.<span class="built_in">insert</span>(c.<span class="built_in">begin</span>(), <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">return</span> c;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="type">int</span> P </span>= <span class="number">998244353</span>&gt;</span><br><span class="line"><span class="function">MInt&lt;P&gt; <span class="title">linearRecurrence</span><span class="params">(Poly&lt;P&gt; p, Poly&lt;P&gt; q, i64 n)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> m = q.<span class="built_in">size</span>() - <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span> (n &gt; <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">auto</span> newq = q;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= m; i += <span class="number">2</span>) &#123;</span><br><span class="line">            newq[i] *= <span class="number">-1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">auto</span> newp = p * newq;</span><br><span class="line">        newq = q * newq;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; m; i++) &#123;</span><br><span class="line">            p[i] = newp[i * <span class="number">2</span> + n % <span class="number">2</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt;= m; i++) &#123;</span><br><span class="line">            q[i] = newq[i * <span class="number">2</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        n /= <span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> p[<span class="number">0</span>] / q[<span class="number">0</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Comb</span> &#123;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    std::vector&lt;Z&gt; _fac;</span><br><span class="line">    std::vector&lt;Z&gt; _invfac;</span><br><span class="line">    std::vector&lt;Z&gt; _inv;</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">Comb</span>() : n&#123;<span class="number">0</span>&#125;, _fac&#123;<span class="number">1</span>&#125;, _invfac&#123;<span class="number">1</span>&#125;, _inv&#123;<span class="number">0</span>&#125; &#123;&#125;</span><br><span class="line">    <span class="built_in">Comb</span>(<span class="type">int</span> n) : <span class="built_in">Comb</span>() &#123;</span><br><span class="line">        <span class="built_in">init</span>(n);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">init</span><span class="params">(<span class="type">int</span> m)</span> </span>&#123;</span><br><span class="line">        m = std::<span class="built_in">min</span>(m, Z::<span class="built_in">getMod</span>() - <span class="number">1</span>);</span><br><span class="line">        <span class="keyword">if</span> (m &lt;= n) <span class="keyword">return</span>;</span><br><span class="line">        _fac.<span class="built_in">resize</span>(m + <span class="number">1</span>);</span><br><span class="line">        _invfac.<span class="built_in">resize</span>(m + <span class="number">1</span>);</span><br><span class="line">        _inv.<span class="built_in">resize</span>(m + <span class="number">1</span>);</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = n + <span class="number">1</span>; i &lt;= m; i++) &#123;</span><br><span class="line">            _fac[i] = _fac[i - <span class="number">1</span>] * i;</span><br><span class="line">        &#125;</span><br><span class="line">        _invfac[m] = _fac[m].<span class="built_in">inv</span>();</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = m; i &gt; n; i--) &#123;</span><br><span class="line">            _invfac[i - <span class="number">1</span>] = _invfac[i] * i;</span><br><span class="line">            _inv[i] = _invfac[i] * _fac[i - <span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        n = m;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function">Z <span class="title">fac</span><span class="params">(<span class="type">int</span> m)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (m &gt; n) <span class="built_in">init</span>(<span class="number">2</span> * m);</span><br><span class="line">        <span class="keyword">return</span> _fac[m];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Z <span class="title">invfac</span><span class="params">(<span class="type">int</span> m)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (m &gt; n) <span class="built_in">init</span>(<span class="number">2</span> * m);</span><br><span class="line">        <span class="keyword">return</span> _invfac[m];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Z <span class="title">inv</span><span class="params">(<span class="type">int</span> m)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (m &gt; n) <span class="built_in">init</span>(<span class="number">2</span> * m);</span><br><span class="line">        <span class="keyword">return</span> _inv[m];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Z <span class="title">binom</span><span class="params">(<span class="type">int</span> n, <span class="type">int</span> m)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (n &lt; m || m &lt; <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">fac</span>(n) * <span class="built_in">invfac</span>(m) * <span class="built_in">invfac</span>(n - m);</span><br><span class="line">    &#125;</span><br><span class="line">&#125; comb;</span><br><span class="line"></span><br><span class="line"><span class="function">Poly&lt;P&gt; <span class="title">get</span><span class="params">(<span class="type">int</span> n, <span class="type">int</span> m)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (m == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Poly</span>(n + <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (m % <span class="number">2</span> == <span class="number">1</span>) &#123;</span><br><span class="line">        <span class="keyword">auto</span> f = <span class="built_in">get</span>(n, m - <span class="number">1</span>);</span><br><span class="line">        Z p = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt;= n; i++) &#123;</span><br><span class="line">            f[n - i] += comb.<span class="built_in">binom</span>(n, i) * p;</span><br><span class="line">            p *= m;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> f;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">auto</span> f = <span class="built_in">get</span>(n, m / <span class="number">2</span>);</span><br><span class="line">    <span class="keyword">auto</span> fm = f;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        fm[i] *= comb.<span class="built_in">fac</span>(i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Poly <span class="title">pw</span><span class="params">(n + <span class="number">1</span>)</span></span>;</span><br><span class="line">    pw[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        pw[i] = pw[i - <span class="number">1</span>] * (m / <span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        pw[i] *= comb.<span class="built_in">invfac</span>(i);</span><br><span class="line">    &#125;</span><br><span class="line">    fm = fm.<span class="built_in">mulT</span>(pw);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        fm[i] *= comb.<span class="built_in">invfac</span>(i);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> f + fm;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></details><h1 id="四、数据结构">四、数据结构</h1><h2 id="01A-树状数组（Fenwick-旧版）">01A - 树状数组（Fenwick 旧版）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63382128">2023-08-11</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">template &lt;typename T&gt;</span><br><span class="line">struct Fenwick &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;T&gt; <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    Fenwick<span class="punctuation">(</span>int n = <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        this-&gt;n = n<span class="comment">;</span></span><br><span class="line">        <span class="keyword">a</span>.assign<span class="punctuation">(</span>n, T<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void add<span class="punctuation">(</span>int x, T v<span class="punctuation">)</span> &#123;</span><br><span class="line">        for <span class="punctuation">(</span>int i = x + <span class="number">1</span><span class="comment">; i &lt;= n; i += i &amp; -i) &#123;</span></span><br><span class="line">            <span class="keyword">a</span>[i - <span class="number">1</span>] += v<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    T sum<span class="punctuation">(</span>int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        auto ans = T<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = x<span class="comment">; i &gt; 0; i -= i &amp; -i) &#123;</span></span><br><span class="line">            ans += <span class="keyword">a</span>[i - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return ans<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    T rangeSum<span class="punctuation">(</span>int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">        return sum<span class="punctuation">(</span>r<span class="punctuation">)</span> - sum<span class="punctuation">(</span>l<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int kth<span class="punctuation">(</span>T k<span class="punctuation">)</span> &#123;</span><br><span class="line">        int x = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">1</span> &lt;&lt; st<span class="number">d::</span>__lg<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">; i; i /= 2) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>x + i &lt;= n &amp;&amp; k &gt;= <span class="keyword">a</span>[x + i - <span class="number">1</span>]<span class="punctuation">)</span> &#123;</span><br><span class="line">                x += i<span class="comment">;</span></span><br><span class="line">                k -= <span class="keyword">a</span>[x - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return x<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="01B-树状数组（Fenwick-新版）">01B - 树状数组（Fenwick 新版）</h2><p><a href="https://codeforces.com/contest/1915/submission/239262801">2023-12-28</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line">template &lt;typename T&gt;</span><br><span class="line">struct Fenwick &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;T&gt; <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    Fenwick<span class="punctuation">(</span>int n_ = <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n_<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span>int n_<span class="punctuation">)</span> &#123;</span><br><span class="line">        n = n_<span class="comment">;</span></span><br><span class="line">        <span class="keyword">a</span>.assign<span class="punctuation">(</span>n, T&#123;&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void add<span class="punctuation">(</span>int x, const T &amp;v<span class="punctuation">)</span> &#123;</span><br><span class="line">        for <span class="punctuation">(</span>int i = x + <span class="number">1</span><span class="comment">; i &lt;= n; i += i &amp; -i) &#123;</span></span><br><span class="line">            <span class="keyword">a</span>[i - <span class="number">1</span>] = <span class="keyword">a</span>[i - <span class="number">1</span>] + v<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    T sum<span class="punctuation">(</span>int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        T ans&#123;&#125;<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = x<span class="comment">; i &gt; 0; i -= i &amp; -i) &#123;</span></span><br><span class="line">            ans = ans + <span class="keyword">a</span>[i - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return ans<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    T rangeSum<span class="punctuation">(</span>int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">        return sum<span class="punctuation">(</span>r<span class="punctuation">)</span> - sum<span class="punctuation">(</span>l<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int select<span class="punctuation">(</span>const T &amp;k<span class="punctuation">)</span> &#123;</span><br><span class="line">        int x = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        T cur&#123;&#125;<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">1</span> &lt;&lt; st<span class="number">d::</span>__lg<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">; i; i /= 2) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>x + i &lt;= n &amp;&amp; cur + <span class="keyword">a</span>[x + i - <span class="number">1</span>] &lt;= k<span class="punctuation">)</span> &#123;</span><br><span class="line">                x += i<span class="comment">;</span></span><br><span class="line">                cur = cur + <span class="keyword">a</span>[x - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return x<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="02-并查集（DSU）">02 - 并查集（DSU）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63239142">2023-08-04</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">struct DSU &#123;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; f, siz<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    DSU<span class="punctuation">(</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    DSU<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">        f.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>iota<span class="punctuation">(</span>f.begin<span class="punctuation">(</span><span class="punctuation">)</span>, f.end<span class="punctuation">(</span><span class="punctuation">)</span>, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        siz.assign<span class="punctuation">(</span>n, <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int find<span class="punctuation">(</span>int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        while <span class="punctuation">(</span>x != f[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">            x = f[x] = f[f[x]]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return x<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    bool same<span class="punctuation">(</span>int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">        return find<span class="punctuation">(</span>x<span class="punctuation">)</span> == find<span class="punctuation">(</span>y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    bool merge<span class="punctuation">(</span>int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">        x = find<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        y = find<span class="punctuation">(</span>y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>x == y<span class="punctuation">)</span> &#123;</span><br><span class="line">            return false<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        siz[x] += siz[y]<span class="comment">;</span></span><br><span class="line">        f[y] = x<span class="comment">;</span></span><br><span class="line">        return true<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int size<span class="punctuation">(</span>int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        return siz[find<span class="punctuation">(</span>x<span class="punctuation">)</span>]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="03A-线段树（SegmentTree-基础区间加乘）">03A - 线段树（SegmentTree 基础区间加乘）</h2><p><a href="https://cf.dianhsu.com/gym/104417/submission/223800089">2023-10-18</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line">struct SegmentTree &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; tag, sum<span class="comment">;</span></span><br><span class="line">    SegmentTree<span class="punctuation">(</span>int n_<span class="punctuation">)</span> : n<span class="punctuation">(</span>n_<span class="punctuation">)</span>, tag<span class="punctuation">(</span><span class="number">4</span> * n, <span class="number">1</span><span class="punctuation">)</span>, sum<span class="punctuation">(</span><span class="number">4</span> * n<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line"></span><br><span class="line">    void pull<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        sum[p] = <span class="punctuation">(</span>sum[<span class="number">2</span> * p] + sum[<span class="number">2</span> * p + <span class="number">1</span>]<span class="punctuation">)</span> % P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    void mul<span class="punctuation">(</span>int p, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        tag[p] = <span class="number">1</span>LL * tag[p] * v % P<span class="comment">;</span></span><br><span class="line">        sum[p] = <span class="number">1</span>LL * sum[p] * v % P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    void push<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        mul<span class="punctuation">(</span><span class="number">2</span> * p, tag[p]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        mul<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, tag[p]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        tag[p] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int query<span class="punctuation">(</span>int p, int l, int r, int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">            return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= x &amp;&amp; r &lt;= y<span class="punctuation">)</span> &#123;</span><br><span class="line">            return sum[p]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        push<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return <span class="punctuation">(</span>query<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y<span class="punctuation">)</span> + query<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y<span class="punctuation">)</span><span class="punctuation">)</span> % P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int query<span class="punctuation">(</span>int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">        return query<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void rangeMul<span class="punctuation">(</span>int p, int l, int r, int x, int y, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">            return<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= x &amp;&amp; r &lt;= y<span class="punctuation">)</span> &#123;</span><br><span class="line">            return mul<span class="punctuation">(</span>p, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        push<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        rangeMul<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        rangeMul<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        pull<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void rangeMul<span class="punctuation">(</span>int x, int y, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        rangeMul<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, x, y, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void add<span class="punctuation">(</span>int p, int l, int r, int x, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            sum[p] = <span class="punctuation">(</span>sum[p] + v<span class="punctuation">)</span> % P<span class="comment">;</span></span><br><span class="line">            return<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        push<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>x &lt; m<span class="punctuation">)</span> &#123;</span><br><span class="line">            add<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            add<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        pull<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void add<span class="punctuation">(</span>int x, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">        add<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, x, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="03B-线段树（SegmentTree-Info-查找前驱后继）">03B - 线段树（SegmentTree+Info 查找前驱后继）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63382128">2023-08-11</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br></pre></td><td class="code"><pre><span class="line">template&lt;class Info&gt;</span><br><span class="line">struct SegmentTree &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Info&gt; info<span class="comment">;</span></span><br><span class="line">    SegmentTree<span class="punctuation">(</span><span class="punctuation">)</span> : n<span class="punctuation">(</span><span class="number">0</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    SegmentTree<span class="punctuation">(</span>int n_, Info v_ = Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n_, v_<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class T&gt;</span><br><span class="line">    SegmentTree<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;T&gt; init_<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>init_<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void init<span class="punctuation">(</span>int n_, Info v_ = Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>st<span class="number">d::</span>vector<span class="punctuation">(</span>n_, v_<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class T&gt;</span><br><span class="line">    void init<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;T&gt; init_<span class="punctuation">)</span> &#123;</span><br><span class="line">        n = init_.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        info.assign<span class="punctuation">(</span><span class="number">4</span> &lt;&lt; st<span class="number">d::</span>__lg<span class="punctuation">(</span>n<span class="punctuation">)</span>, Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::f</span>unction&lt;void<span class="punctuation">(</span>int, int, int<span class="punctuation">)</span>&gt; build = [&amp;]<span class="punctuation">(</span>int p, int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                info[p] = init_[l]<span class="comment">;</span></span><br><span class="line">                return<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">            build<span class="punctuation">(</span><span class="number">2</span> * p, l, m<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            build<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            pull<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        build<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void pull<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        info[p] = info[<span class="number">2</span> * p] + info[<span class="number">2</span> * p + <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void modify<span class="punctuation">(</span>int p, int l, int r, int x, const Info &amp;v<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            info[p] = v<span class="comment">;</span></span><br><span class="line">            return<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>x &lt; m<span class="punctuation">)</span> &#123;</span><br><span class="line">            modify<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            modify<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        pull<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void modify<span class="punctuation">(</span>int p, const Info &amp;v<span class="punctuation">)</span> &#123;</span><br><span class="line">        modify<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, p, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Info rangeQuery<span class="punctuation">(</span>int p, int l, int r, int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">            return Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= x &amp;&amp; r &lt;= y<span class="punctuation">)</span> &#123;</span><br><span class="line">            return info[p]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        return rangeQuery<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y<span class="punctuation">)</span> + rangeQuery<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Info rangeQuery<span class="punctuation">(</span>int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">        return rangeQuery<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, l, r<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findFirst<span class="punctuation">(</span>int p, int l, int r, int x, int y, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x || !pred<span class="punctuation">(</span>info[p]<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return l<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        int res = findFirst<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>res == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res = findFirst<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findFirst<span class="punctuation">(</span>int l, int r, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        return findFirst<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, l, r, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findLast<span class="punctuation">(</span>int p, int l, int r, int x, int y, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x || !pred<span class="punctuation">(</span>info[p]<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return l<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        int res = findLast<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>res == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res = findLast<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findLast<span class="punctuation">(</span>int l, int r, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        return findLast<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, l, r, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line">struct Info &#123;</span><br><span class="line">    int cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 sum = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 ans = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line">Info operator+<span class="punctuation">(</span>Info <span class="keyword">a</span>, Info b<span class="punctuation">)</span> &#123;</span><br><span class="line">    Info c<span class="comment">;</span></span><br><span class="line">    c.cnt = <span class="keyword">a</span>.cnt + b.cnt<span class="comment">;</span></span><br><span class="line">    c.sum = <span class="keyword">a</span>.sum + b.sum<span class="comment">;</span></span><br><span class="line">    c.ans = <span class="keyword">a</span>.ans + b.ans + <span class="keyword">a</span>.cnt * b.sum - <span class="keyword">a</span>.sum * b.cnt<span class="comment">;</span></span><br><span class="line">    return c<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="03C-线段树（SegmentTree-Info-Merge-区间合并）">03C - 线段树（SegmentTree+Info+Merge 区间合并）</h2><p><a href="https://codeforces.com/contest/1672/submission/154766851">2022-04-23</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br></pre></td><td class="code"><pre><span class="line">template&lt;class Info&gt;</span><br><span class="line">struct SegmentTree &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Info&gt; info<span class="comment">;</span></span><br><span class="line">    SegmentTree<span class="punctuation">(</span><span class="punctuation">)</span> : n<span class="punctuation">(</span><span class="number">0</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    SegmentTree<span class="punctuation">(</span>int n_, Info v_ = Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>n_, v_<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class T&gt;</span><br><span class="line">    SegmentTree<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;T&gt; init_<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>init_<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void init<span class="punctuation">(</span>int n_, Info v_ = Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>st<span class="number">d::</span>vector<span class="punctuation">(</span>n_, v_<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class T&gt;</span><br><span class="line">    void init<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;T&gt; init_<span class="punctuation">)</span> &#123;</span><br><span class="line">        n = init_.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        info.assign<span class="punctuation">(</span><span class="number">4</span> &lt;&lt; st<span class="number">d::</span>__lg<span class="punctuation">(</span>n<span class="punctuation">)</span>, Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::f</span>unction&lt;void<span class="punctuation">(</span>int, int, int<span class="punctuation">)</span>&gt; build = [&amp;]<span class="punctuation">(</span>int p, int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                info[p] = init_[l]<span class="comment">;</span></span><br><span class="line">                return<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">            build<span class="punctuation">(</span><span class="number">2</span> * p, l, m<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            build<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            pull<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;<span class="comment">;</span></span><br><span class="line">        build<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void pull<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        info[p] = info[<span class="number">2</span> * p] + info[<span class="number">2</span> * p + <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void modify<span class="punctuation">(</span>int p, int l, int r, int x, const Info &amp;v<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            info[p] = v<span class="comment">;</span></span><br><span class="line">            return<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>x &lt; m<span class="punctuation">)</span> &#123;</span><br><span class="line">            modify<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            modify<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        pull<span class="punctuation">(</span>p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void modify<span class="punctuation">(</span>int p, const Info &amp;v<span class="punctuation">)</span> &#123;</span><br><span class="line">        modify<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, p, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Info rangeQuery<span class="punctuation">(</span>int p, int l, int r, int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">            return Info<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= x &amp;&amp; r &lt;= y<span class="punctuation">)</span> &#123;</span><br><span class="line">            return info[p]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        return rangeQuery<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y<span class="punctuation">)</span> + rangeQuery<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Info rangeQuery<span class="punctuation">(</span>int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">        return rangeQuery<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, l, r<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findFirst<span class="punctuation">(</span>int p, int l, int r, int x, int y, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x || !pred<span class="punctuation">(</span>info[p]<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return l<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        int res = findFirst<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>res == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res = findFirst<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findFirst<span class="punctuation">(</span>int l, int r, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        return findFirst<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, l, r, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findLast<span class="punctuation">(</span>int p, int l, int r, int x, int y, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l &gt;= y || r &lt;= x || !pred<span class="punctuation">(</span>info[p]<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return l<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        int res = findLast<span class="punctuation">(</span><span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>res == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res = findLast<span class="punctuation">(</span><span class="number">2</span> * p, l, m, x, y, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    template&lt;class F&gt;</span><br><span class="line">    int findLast<span class="punctuation">(</span>int l, int r, F pred<span class="punctuation">)</span> &#123;</span><br><span class="line">        return findLast<span class="punctuation">(</span><span class="number">1</span>, <span class="number">0</span>, n, l, r, pred<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">struct Info &#123;</span><br><span class="line">    int x = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    int cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">Info operator+<span class="punctuation">(</span>Info <span class="keyword">a</span>, Info b<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span><span class="keyword">a</span>.x == b.x<span class="punctuation">)</span> &#123;</span><br><span class="line">        return &#123;<span class="keyword">a</span>.x, <span class="keyword">a</span>.cnt + b.cnt&#125;<span class="comment">;</span></span><br><span class="line">    &#125; else if <span class="punctuation">(</span><span class="keyword">a</span>.cnt &gt; b.cnt<span class="punctuation">)</span> &#123;</span><br><span class="line">        return &#123;<span class="keyword">a</span>.x, <span class="keyword">a</span>.cnt - b.cnt&#125;<span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        return &#123;b.x, b.cnt - <span class="keyword">a</span>.cnt&#125;<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="04A-懒标记线段树（LazySegmentTree-基础区间修改）">04A - 懒标记线段树（LazySegmentTree 基础区间修改）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=62804432">2023-07-17</a></p><details><summary>长度过长，点击查看</summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">Info</span>, <span class="keyword">class</span> <span class="title class_">Tag</span>&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">LazySegmentTree</span> &#123;</span><br><span class="line">    <span class="type">const</span> <span class="type">int</span> n;</span><br><span class="line">    std::vector&lt;Info&gt; info;</span><br><span class="line">    std::vector&lt;Tag&gt; tag;</span><br><span class="line">    <span class="built_in">LazySegmentTree</span>(<span class="type">int</span> n) : <span class="built_in">n</span>(n), <span class="built_in">info</span>(<span class="number">4</span> &lt;&lt; std::__lg(n)), <span class="built_in">tag</span>(<span class="number">4</span> &lt;&lt; std::__lg(n)) &#123;&#125;</span><br><span class="line">    <span class="built_in">LazySegmentTree</span>(std::vector&lt;Info&gt; init) : <span class="built_in">LazySegmentTree</span>(init.<span class="built_in">size</span>()) &#123;</span><br><span class="line">        std::function&lt;<span class="type">void</span>(<span class="type">int</span>, <span class="type">int</span>, <span class="type">int</span>)&gt; build = [&amp;](<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r) &#123;</span><br><span class="line">            <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">                info[p] = init[l];</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">            <span class="built_in">build</span>(<span class="number">2</span> * p, l, m);</span><br><span class="line">            <span class="built_in">build</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r);</span><br><span class="line">            <span class="built_in">pull</span>(p);</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">build</span>(<span class="number">1</span>, <span class="number">0</span>, n);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">pull</span><span class="params">(<span class="type">int</span> p)</span> </span>&#123;</span><br><span class="line">        info[p] = info[<span class="number">2</span> * p] + info[<span class="number">2</span> * p + <span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(<span class="type">int</span> p, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        info[p].<span class="built_in">apply</span>(v);</span><br><span class="line">        tag[p].<span class="built_in">apply</span>(v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">push</span><span class="params">(<span class="type">int</span> p)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">apply</span>(<span class="number">2</span> * p, tag[p]);</span><br><span class="line">        <span class="built_in">apply</span>(<span class="number">2</span> * p + <span class="number">1</span>, tag[p]);</span><br><span class="line">        tag[p] = <span class="built_in">Tag</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">modify</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">const</span> Info &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">            info[p] = v;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="keyword">if</span> (x &lt; m) &#123;</span><br><span class="line">            <span class="built_in">modify</span>(<span class="number">2</span> * p, l, m, x, v);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="built_in">modify</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, v);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">modify</span><span class="params">(<span class="type">int</span> p, <span class="type">const</span> Info &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">modify</span>(<span class="number">1</span>, <span class="number">0</span>, n, p, v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Info <span class="title">rangeQuery</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Info</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= x &amp;&amp; r &lt;= y) &#123;</span><br><span class="line">            <span class="keyword">return</span> info[p];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeQuery</span>(<span class="number">2</span> * p, l, m, x, y) + <span class="built_in">rangeQuery</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Info <span class="title">rangeQuery</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeQuery</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">rangeApply</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= x &amp;&amp; r &lt;= y) &#123;</span><br><span class="line">            <span class="built_in">apply</span>(p, v);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="built_in">rangeApply</span>(<span class="number">2</span> * p, l, m, x, y, v);</span><br><span class="line">        <span class="built_in">rangeApply</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, v);</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">rangeApply</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeApply</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r, v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">half</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (info[p].act == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> ((info[p].min + <span class="number">1</span>) / <span class="number">2</span> == (info[p].max + <span class="number">1</span>) / <span class="number">2</span>) &#123;</span><br><span class="line">            <span class="built_in">apply</span>(p, &#123;-(info[p].min + <span class="number">1</span>) / <span class="number">2</span>&#125;);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="built_in">half</span>(<span class="number">2</span> * p, l, m);</span><br><span class="line">        <span class="built_in">half</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r);</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">half</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="built_in">half</span>(<span class="number">1</span>, <span class="number">0</span>, n);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">constexpr</span> i64 inf = <span class="number">1E18</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Tag</span> &#123;</span><br><span class="line">    i64 add = <span class="number">0</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(Tag t)</span> </span>&#123;</span><br><span class="line">        add += t.add;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Info</span> &#123;</span><br><span class="line">    i64 min = inf;</span><br><span class="line">    i64 max = -inf;</span><br><span class="line">    i64 sum = <span class="number">0</span>;</span><br><span class="line">    i64 act = <span class="number">0</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(Tag t)</span> </span>&#123;</span><br><span class="line">        min += t.add;</span><br><span class="line">        max += t.add;</span><br><span class="line">        sum += act * t.add;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Info <span class="keyword">operator</span>+(Info a, Info b) &#123;</span><br><span class="line">    Info c;</span><br><span class="line">    c.min = std::<span class="built_in">min</span>(a.min, b.min);</span><br><span class="line">    c.max = std::<span class="built_in">max</span>(a.max, b.max);</span><br><span class="line">    c.sum = a.sum + b.sum;</span><br><span class="line">    c.act = a.act + b.act;</span><br><span class="line">    <span class="keyword">return</span> c;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></details><h2 id="04B-懒标记线段树（LazySegmentTree-查找前驱后继）">04B - 懒标记线段树（LazySegmentTree 查找前驱后继）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=62804432">2023-07-17</a></p><details><summary>长度过长，点击查看</summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">Info</span>, <span class="keyword">class</span> <span class="title class_">Tag</span>&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">LazySegmentTree</span> &#123;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    std::vector&lt;Info&gt; info;</span><br><span class="line">    std::vector&lt;Tag&gt; tag;</span><br><span class="line">    <span class="built_in">LazySegmentTree</span>() : <span class="built_in">n</span>(<span class="number">0</span>) &#123;&#125;</span><br><span class="line">    <span class="built_in">LazySegmentTree</span>(<span class="type">int</span> n_, Info v_ = <span class="built_in">Info</span>()) &#123;</span><br><span class="line">        <span class="built_in">init</span>(n_, v_);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function">    <span class="title">LazySegmentTree</span><span class="params">(std::vector&lt;T&gt; init_)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">init</span>(init_);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">init</span><span class="params">(<span class="type">int</span> n_, Info v_ = Info())</span> </span>&#123;</span><br><span class="line">        <span class="built_in">init</span>(std::<span class="built_in">vector</span>(n_, v_));</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function">    <span class="type">void</span> <span class="title">init</span><span class="params">(std::vector&lt;T&gt; init_)</span> </span>&#123;</span><br><span class="line">        n = init_.<span class="built_in">size</span>();</span><br><span class="line">        info.<span class="built_in">assign</span>(<span class="number">4</span> &lt;&lt; std::__lg(n), <span class="built_in">Info</span>());</span><br><span class="line">        tag.<span class="built_in">assign</span>(<span class="number">4</span> &lt;&lt; std::__lg(n), <span class="built_in">Tag</span>());</span><br><span class="line">        std::function&lt;<span class="type">void</span>(<span class="type">int</span>, <span class="type">int</span>, <span class="type">int</span>)&gt; build = [&amp;](<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r) &#123;</span><br><span class="line">            <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">                info[p] = init_[l];</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">            <span class="built_in">build</span>(<span class="number">2</span> * p, l, m);</span><br><span class="line">            <span class="built_in">build</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r);</span><br><span class="line">            <span class="built_in">pull</span>(p);</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">build</span>(<span class="number">1</span>, <span class="number">0</span>, n);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">pull</span><span class="params">(<span class="type">int</span> p)</span> </span>&#123;</span><br><span class="line">        info[p] = info[<span class="number">2</span> * p] + info[<span class="number">2</span> * p + <span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(<span class="type">int</span> p, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        info[p].<span class="built_in">apply</span>(v);</span><br><span class="line">        tag[p].<span class="built_in">apply</span>(v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">push</span><span class="params">(<span class="type">int</span> p)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">apply</span>(<span class="number">2</span> * p, tag[p]);</span><br><span class="line">        <span class="built_in">apply</span>(<span class="number">2</span> * p + <span class="number">1</span>, tag[p]);</span><br><span class="line">        tag[p] = <span class="built_in">Tag</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">modify</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">const</span> Info &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">            info[p] = v;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="keyword">if</span> (x &lt; m) &#123;</span><br><span class="line">            <span class="built_in">modify</span>(<span class="number">2</span> * p, l, m, x, v);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="built_in">modify</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, v);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">modify</span><span class="params">(<span class="type">int</span> p, <span class="type">const</span> Info &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">modify</span>(<span class="number">1</span>, <span class="number">0</span>, n, p, v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Info <span class="title">rangeQuery</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Info</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= x &amp;&amp; r &lt;= y) &#123;</span><br><span class="line">            <span class="keyword">return</span> info[p];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeQuery</span>(<span class="number">2</span> * p, l, m, x, y) + <span class="built_in">rangeQuery</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Info <span class="title">rangeQuery</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeQuery</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">rangeApply</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= x &amp;&amp; r &lt;= y) &#123;</span><br><span class="line">            <span class="built_in">apply</span>(p, v);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="built_in">rangeApply</span>(<span class="number">2</span> * p, l, m, x, y, v);</span><br><span class="line">        <span class="built_in">rangeApply</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, v);</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">rangeApply</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeApply</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r, v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt;</span></span><br><span class="line"><span class="function">    <span class="type">int</span> <span class="title">findFirst</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y, F pred)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x || !<span class="built_in">pred</span>(info[p])) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> l;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="type">int</span> res = <span class="built_in">findFirst</span>(<span class="number">2</span> * p, l, m, x, y, pred);</span><br><span class="line">        <span class="keyword">if</span> (res == <span class="number">-1</span>) &#123;</span><br><span class="line">            res = <span class="built_in">findFirst</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, pred);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt;</span></span><br><span class="line"><span class="function">    <span class="type">int</span> <span class="title">findFirst</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r, F pred)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">findFirst</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r, pred);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt;</span></span><br><span class="line"><span class="function">    <span class="type">int</span> <span class="title">findLast</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y, F pred)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x || !<span class="built_in">pred</span>(info[p])) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> l;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="type">int</span> res = <span class="built_in">findLast</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, pred);</span><br><span class="line">        <span class="keyword">if</span> (res == <span class="number">-1</span>) &#123;</span><br><span class="line">            res = <span class="built_in">findLast</span>(<span class="number">2</span> * p, l, m, x, y, pred);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> F&gt;</span></span><br><span class="line"><span class="function">    <span class="type">int</span> <span class="title">findLast</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r, F pred)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">findLast</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r, pred);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Tag</span> &#123;</span><br><span class="line">    i64 a = <span class="number">0</span>, b = <span class="number">0</span>;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(Tag t)</span> </span>&#123;</span><br><span class="line">        a = std::<span class="built_in">min</span>(a, b + t.a);</span><br><span class="line">        b += t.b;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> k;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Info</span> &#123;</span><br><span class="line">    i64 x = <span class="number">0</span>;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(Tag t)</span> </span>&#123;</span><br><span class="line">        x += t.a;</span><br><span class="line">        <span class="keyword">if</span> (x &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            x = (x % k + k) % k;</span><br><span class="line">        &#125;</span><br><span class="line">        x += t.b - t.a;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line">Info <span class="keyword">operator</span>+(Info a, Info b) &#123;</span><br><span class="line">    <span class="keyword">return</span> &#123;a.x + b.x&#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></details><h2 id="04C-懒标记线段树（LazySegmentTree-二分修改）">04C - 懒标记线段树（LazySegmentTree 二分修改）</h2><p><a href="https://atcoder.jp/contests/joi2023yo2/submissions/39363123">2023-03-03</a></p><details><summary>长度过长，点击查看</summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> inf = <span class="number">1E9</span> + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">template</span>&lt;<span class="keyword">class</span> <span class="title class_">Info</span>, <span class="keyword">class</span> <span class="title class_">Tag</span>&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">LazySegmentTree</span> &#123;</span><br><span class="line">    <span class="type">const</span> <span class="type">int</span> n;</span><br><span class="line">    std::vector&lt;Info&gt; info;</span><br><span class="line">    std::vector&lt;Tag&gt; tag;</span><br><span class="line">    <span class="built_in">LazySegmentTree</span>(<span class="type">int</span> n) : <span class="built_in">n</span>(n), <span class="built_in">info</span>(<span class="number">4</span> &lt;&lt; std::__lg(n)), <span class="built_in">tag</span>(<span class="number">4</span> &lt;&lt; std::__lg(n)) &#123;&#125;</span><br><span class="line">    <span class="built_in">LazySegmentTree</span>(std::vector&lt;Info&gt; init) : <span class="built_in">LazySegmentTree</span>(init.<span class="built_in">size</span>()) &#123;</span><br><span class="line">        std::function&lt;<span class="type">void</span>(<span class="type">int</span>, <span class="type">int</span>, <span class="type">int</span>)&gt; build = [&amp;](<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r) &#123;</span><br><span class="line">            <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">                info[p] = init[l];</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">            <span class="built_in">build</span>(<span class="number">2</span> * p, l, m);</span><br><span class="line">            <span class="built_in">build</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r);</span><br><span class="line">            <span class="built_in">pull</span>(p);</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">build</span>(<span class="number">1</span>, <span class="number">0</span>, n);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">pull</span><span class="params">(<span class="type">int</span> p)</span> </span>&#123;</span><br><span class="line">        info[p] = info[<span class="number">2</span> * p] + info[<span class="number">2</span> * p + <span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(<span class="type">int</span> p, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        info[p].<span class="built_in">apply</span>(v);</span><br><span class="line">        tag[p].<span class="built_in">apply</span>(v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">push</span><span class="params">(<span class="type">int</span> p)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">apply</span>(<span class="number">2</span> * p, tag[p]);</span><br><span class="line">        <span class="built_in">apply</span>(<span class="number">2</span> * p + <span class="number">1</span>, tag[p]);</span><br><span class="line">        tag[p] = <span class="built_in">Tag</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">modify</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">const</span> Info &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">            info[p] = v;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="keyword">if</span> (x &lt; m) &#123;</span><br><span class="line">            <span class="built_in">modify</span>(<span class="number">2</span> * p, l, m, x, v);</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="built_in">modify</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, v);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">modify</span><span class="params">(<span class="type">int</span> p, <span class="type">const</span> Info &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="built_in">modify</span>(<span class="number">1</span>, <span class="number">0</span>, n, p, v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Info <span class="title">rangeQuery</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">Info</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= x &amp;&amp; r &lt;= y) &#123;</span><br><span class="line">            <span class="keyword">return</span> info[p];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeQuery</span>(<span class="number">2</span> * p, l, m, x, y) + <span class="built_in">rangeQuery</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function">Info <span class="title">rangeQuery</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeQuery</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">rangeApply</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> x, <span class="type">int</span> y, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= y || r &lt;= x) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (l &gt;= x &amp;&amp; r &lt;= y) &#123;</span><br><span class="line">            <span class="built_in">apply</span>(p, v);</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="built_in">rangeApply</span>(<span class="number">2</span> * p, l, m, x, y, v);</span><br><span class="line">        <span class="built_in">rangeApply</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, x, y, v);</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">rangeApply</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r, <span class="type">const</span> Tag &amp;v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">rangeApply</span>(<span class="number">1</span>, <span class="number">0</span>, n, l, r, v);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">maintainL</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> pre)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (info[p].difl &gt; <span class="number">0</span> &amp;&amp; info[p].maxlowl &lt; pre) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">            info[p].max = info[p].maxlowl;</span><br><span class="line">            info[p].maxl = info[p].maxr = l;</span><br><span class="line">            info[p].maxlowl = info[p].maxlowr = -inf;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="built_in">maintainL</span>(<span class="number">2</span> * p, l, m, pre);</span><br><span class="line">        pre = std::<span class="built_in">max</span>(pre, info[<span class="number">2</span> * p].max);</span><br><span class="line">        <span class="built_in">maintainL</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, pre);</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">maintainL</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="built_in">maintainL</span>(<span class="number">1</span>, <span class="number">0</span>, n, <span class="number">-1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">maintainR</span><span class="params">(<span class="type">int</span> p, <span class="type">int</span> l, <span class="type">int</span> r, <span class="type">int</span> suf)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (info[p].difr &gt; <span class="number">0</span> &amp;&amp; info[p].maxlowr &lt; suf) &#123;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">            info[p].max = info[p].maxlowl;</span><br><span class="line">            info[p].maxl = info[p].maxr = l;</span><br><span class="line">            info[p].maxlowl = info[p].maxlowr = -inf;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="type">int</span> m = (l + r) / <span class="number">2</span>;</span><br><span class="line">        <span class="built_in">push</span>(p);</span><br><span class="line">        <span class="built_in">maintainR</span>(<span class="number">2</span> * p + <span class="number">1</span>, m, r, suf);</span><br><span class="line">        suf = std::<span class="built_in">max</span>(suf, info[<span class="number">2</span> * p + <span class="number">1</span>].max);</span><br><span class="line">        <span class="built_in">maintainR</span>(<span class="number">2</span> * p, l, m, suf);</span><br><span class="line">        <span class="built_in">pull</span>(p);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">maintainR</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="built_in">maintainR</span>(<span class="number">1</span>, <span class="number">0</span>, n, <span class="number">-1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Tag</span> &#123;</span><br><span class="line">    <span class="type">int</span> add = <span class="number">0</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(Tag t)</span> &amp; </span>&#123;</span><br><span class="line">        add += t.add;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Info</span> &#123;</span><br><span class="line">    <span class="type">int</span> max = <span class="number">-1</span>;</span><br><span class="line">    <span class="type">int</span> maxl = <span class="number">-1</span>;</span><br><span class="line">    <span class="type">int</span> maxr = <span class="number">-1</span>;</span><br><span class="line">    <span class="type">int</span> difl = inf;</span><br><span class="line">    <span class="type">int</span> difr = inf;</span><br><span class="line">    <span class="type">int</span> maxlowl = -inf;</span><br><span class="line">    <span class="type">int</span> maxlowr = -inf;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="type">void</span> <span class="title">apply</span><span class="params">(Tag t)</span> &amp; </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (max != <span class="number">-1</span>) &#123;</span><br><span class="line">            max += t.add;</span><br><span class="line">        &#125;</span><br><span class="line">        difl += t.add;</span><br><span class="line">        difr += t.add;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Info <span class="keyword">operator</span>+(Info a, Info b) &#123;</span><br><span class="line">    Info c;</span><br><span class="line">    <span class="keyword">if</span> (a.max &gt; b.max) &#123;</span><br><span class="line">        c.max = a.max;</span><br><span class="line">        c.maxl = a.maxl;</span><br><span class="line">        c.maxr = a.maxr;</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (a.max &lt; b.max) &#123;</span><br><span class="line">        c.max = b.max;</span><br><span class="line">        c.maxl = b.maxl;</span><br><span class="line">        c.maxr = b.maxr;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        c.max = a.max;</span><br><span class="line">        c.maxl = a.maxl;</span><br><span class="line">        c.maxr = b.maxr;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    c.difl = std::<span class="built_in">min</span>(a.difl, b.difl);</span><br><span class="line">    c.difr = std::<span class="built_in">min</span>(a.difr, b.difr);</span><br><span class="line">    <span class="keyword">if</span> (a.max != <span class="number">-1</span>) &#123;</span><br><span class="line">        c.difl = std::<span class="built_in">min</span>(c.difl, a.max - b.maxlowl);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (b.max != <span class="number">-1</span>) &#123;</span><br><span class="line">        c.difr = std::<span class="built_in">min</span>(c.difr, b.max - a.maxlowr);</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (a.max == <span class="number">-1</span>) &#123;</span><br><span class="line">        c.maxlowl = std::<span class="built_in">max</span>(a.maxlowl, b.maxlowl);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        c.maxlowl = a.maxlowl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (b.max == <span class="number">-1</span>) &#123;</span><br><span class="line">        c.maxlowr = std::<span class="built_in">max</span>(a.maxlowr, b.maxlowr);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        c.maxlowr = b.maxlowr;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> c;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></details><h2 id="05A-取模类（MLong-MInt）">05A - 取模类（MLong &amp; MInt）</h2><p><a href="https://codeforces.com/contest/1697/submission/160317720">2022-06-12</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line">constexpr int P = <span class="number">998244353</span><span class="comment">;</span></span><br><span class="line">using i64 = long long<span class="comment">;</span></span><br><span class="line">// assume -P &lt;= x &lt; <span class="number">2</span>P</span><br><span class="line">int norm<span class="punctuation">(</span>int x<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>x &lt; <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        x += P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>x &gt;= P<span class="punctuation">)</span> &#123;</span><br><span class="line">        x -= P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return x<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">template&lt;class T&gt;</span><br><span class="line">T power<span class="punctuation">(</span>T <span class="keyword">a</span>, i64 b<span class="punctuation">)</span> &#123;</span><br><span class="line">    T res = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span><span class="comment">; b; b /= 2, a *= a) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>b % <span class="number">2</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            res *= <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">struct Z &#123;</span><br><span class="line">    int x<span class="comment">;</span></span><br><span class="line">    Z<span class="punctuation">(</span>int x = <span class="number">0</span><span class="punctuation">)</span> : x<span class="punctuation">(</span>norm<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    Z<span class="punctuation">(</span>i64 x<span class="punctuation">)</span> : x<span class="punctuation">(</span>norm<span class="punctuation">(</span>x % P<span class="punctuation">)</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    int val<span class="punctuation">(</span><span class="punctuation">)</span> const &#123;</span><br><span class="line">        return x<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z operator-<span class="punctuation">(</span><span class="punctuation">)</span> const &#123;</span><br><span class="line">        return Z<span class="punctuation">(</span>norm<span class="punctuation">(</span>P - x<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z inv<span class="punctuation">(</span><span class="punctuation">)</span> const &#123;</span><br><span class="line">        assert<span class="punctuation">(</span>x != <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return power<span class="punctuation">(</span>*this, P - <span class="number">2</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z &amp;operator*=<span class="punctuation">(</span>const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        x = i64<span class="punctuation">(</span>x<span class="punctuation">)</span> * rhs.x % P<span class="comment">;</span></span><br><span class="line">        return *this<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z &amp;operator+=<span class="punctuation">(</span>const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        x = norm<span class="punctuation">(</span>x + rhs.x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return *this<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z &amp;operator-=<span class="punctuation">(</span>const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        x = norm<span class="punctuation">(</span>x - rhs.x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return *this<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Z &amp;operator/=<span class="punctuation">(</span>const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        return *this *= rhs.inv<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    friend Z operator*<span class="punctuation">(</span>const Z &amp;lhs, const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        Z res = lhs<span class="comment">;</span></span><br><span class="line">        res *= rhs<span class="comment">;</span></span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    friend Z operator+<span class="punctuation">(</span>const Z &amp;lhs, const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        Z res = lhs<span class="comment">;</span></span><br><span class="line">        res += rhs<span class="comment">;</span></span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    friend Z operator-<span class="punctuation">(</span>const Z &amp;lhs, const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        Z res = lhs<span class="comment">;</span></span><br><span class="line">        res -= rhs<span class="comment">;</span></span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    friend Z operator/<span class="punctuation">(</span>const Z &amp;lhs, const Z &amp;rhs<span class="punctuation">)</span> &#123;</span><br><span class="line">        Z res = lhs<span class="comment">;</span></span><br><span class="line">        res /= rhs<span class="comment">;</span></span><br><span class="line">        return res<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    friend st<span class="number">d::</span>istream &amp;operator&gt;&gt;<span class="punctuation">(</span>st<span class="number">d::</span>istream &amp;is, Z &amp;<span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        i64 v<span class="comment">;</span></span><br><span class="line">        is &gt;&gt; v<span class="comment">;</span></span><br><span class="line">        <span class="keyword">a</span> = Z<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return is<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    friend st<span class="number">d::</span>ostream &amp;operator&lt;&lt;<span class="punctuation">(</span>st<span class="number">d::</span>ostream &amp;os, const Z &amp;<span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return os &lt;&lt; <span class="keyword">a</span>.val<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="05B-取模类（MLong-MInt-新版）">05B - 取模类（MLong &amp; MInt 新版）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63433564">2023-08-14</a></p><p>根据输入内容动态修改 MOD 的方法：<code>Z::setMod(p)</code>; 。</p><details><summary>长度过长，点击查看</summary><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">template</span>&lt;<span class="keyword">class</span> T&gt;</span></span><br><span class="line"><span class="function"><span class="keyword">constexpr</span> T <span class="title">power</span><span class="params">(T a, i64 b)</span> </span>&#123;</span><br><span class="line">    T res = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (; b; b /= <span class="number">2</span>, a *= a) &#123;</span><br><span class="line">        <span class="keyword">if</span> (b % <span class="number">2</span>) &#123;</span><br><span class="line">            res *= a;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">constexpr</span> i64 <span class="title">mul</span><span class="params">(i64 a, i64 b, i64 p)</span> </span>&#123;</span><br><span class="line">    i64 res = a * b - <span class="built_in">i64</span>(<span class="number">1.L</span> * a * b / p) * p;</span><br><span class="line">    res %= p;</span><br><span class="line">    <span class="keyword">if</span> (res &lt; <span class="number">0</span>) &#123;</span><br><span class="line">        res += p;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">template</span>&lt;i64 P&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">MLong</span> &#123;</span><br><span class="line">    i64 x;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="title">MLong</span><span class="params">()</span> : x&#123;</span>&#125; &#123;&#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="title">MLong</span><span class="params">(i64 x)</span> : x&#123;</span><span class="built_in">norm</span>(x % <span class="built_in">getMod</span>())&#125; &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="type">static</span> i64 Mod;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="type">static</span> i64 <span class="title">getMod</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (P &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> P;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> Mod;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="type">static</span> <span class="type">void</span> <span class="title">setMod</span><span class="params">(i64 Mod_)</span> </span>&#123;</span><br><span class="line">        Mod = Mod_;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> i64 <span class="title">norm</span><span class="params">(i64 x)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (x &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            x += <span class="built_in">getMod</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (x &gt;= <span class="built_in">getMod</span>()) &#123;</span><br><span class="line">            x -= <span class="built_in">getMod</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> i64 <span class="title">val</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="keyword">operator</span> <span class="title">i64</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MLong <span class="keyword">operator</span>-() <span class="type">const</span> &#123;</span><br><span class="line">        MLong res;</span><br><span class="line">        res.x = <span class="built_in">norm</span>(<span class="built_in">getMod</span>() - x);</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> MLong <span class="title">inv</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="built_in">assert</span>(x != <span class="number">0</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">power</span>(*<span class="keyword">this</span>, <span class="built_in">getMod</span>() - <span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MLong &amp;<span class="keyword">operator</span>*=(MLong rhs) &amp; &#123;</span><br><span class="line">        x = <span class="built_in">mul</span>(x, rhs.x, <span class="built_in">getMod</span>());</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MLong &amp;<span class="keyword">operator</span>+=(MLong rhs) &amp; &#123;</span><br><span class="line">        x = <span class="built_in">norm</span>(x + rhs.x);</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MLong &amp;<span class="keyword">operator</span>-=(MLong rhs) &amp; &#123;</span><br><span class="line">        x = <span class="built_in">norm</span>(x - rhs.x);</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MLong &amp;<span class="keyword">operator</span>/=(MLong rhs) &amp; &#123;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span> *= rhs.<span class="built_in">inv</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MLong <span class="keyword">operator</span>*(MLong lhs, MLong rhs) &#123;</span><br><span class="line">        MLong res = lhs;</span><br><span class="line">        res *= rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MLong <span class="keyword">operator</span>+(MLong lhs, MLong rhs) &#123;</span><br><span class="line">        MLong res = lhs;</span><br><span class="line">        res += rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MLong <span class="keyword">operator</span>-(MLong lhs, MLong rhs) &#123;</span><br><span class="line">        MLong res = lhs;</span><br><span class="line">        res -= rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MLong <span class="keyword">operator</span>/(MLong lhs, MLong rhs) &#123;</span><br><span class="line">        MLong res = lhs;</span><br><span class="line">        res /= rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> std::istream &amp;<span class="keyword">operator</span>&gt;&gt;(std::istream &amp;is, MLong &amp;a) &#123;</span><br><span class="line">        i64 v;</span><br><span class="line">        is &gt;&gt; v;</span><br><span class="line">        a = <span class="built_in">MLong</span>(v);</span><br><span class="line">        <span class="keyword">return</span> is;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> std::ostream &amp;<span class="keyword">operator</span>&lt;&lt;(std::ostream &amp;os, <span class="type">const</span> MLong &amp;a) &#123;</span><br><span class="line">        <span class="keyword">return</span> os &lt;&lt; a.<span class="built_in">val</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="type">bool</span> <span class="keyword">operator</span>==(MLong lhs, MLong rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">val</span>() == rhs.<span class="built_in">val</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="type">bool</span> <span class="keyword">operator</span>!=(MLong lhs, MLong rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">val</span>() != rhs.<span class="built_in">val</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;&gt;</span><br><span class="line">i64 MLong&lt;<span class="number">0LL</span>&gt;::Mod = <span class="built_in">i64</span>(<span class="number">1E18</span>) + <span class="number">9</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="type">int</span> P&gt;</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">MInt</span> &#123;</span><br><span class="line">    <span class="type">int</span> x;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="title">MInt</span><span class="params">()</span> : x&#123;</span>&#125; &#123;&#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="title">MInt</span><span class="params">(i64 x)</span> : x&#123;</span><span class="built_in">norm</span>(x % <span class="built_in">getMod</span>())&#125; &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="type">static</span> <span class="type">int</span> Mod;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="type">static</span> <span class="type">int</span> <span class="title">getMod</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (P &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> P;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> Mod;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="type">static</span> <span class="type">void</span> <span class="title">setMod</span><span class="params">(<span class="type">int</span> Mod_)</span> </span>&#123;</span><br><span class="line">        Mod = Mod_;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="type">int</span> <span class="title">norm</span><span class="params">(<span class="type">int</span> x)</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (x &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            x += <span class="built_in">getMod</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (x &gt;= <span class="built_in">getMod</span>()) &#123;</span><br><span class="line">            x -= <span class="built_in">getMod</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> <span class="type">int</span> <span class="title">val</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">explicit</span> <span class="keyword">constexpr</span> <span class="keyword">operator</span> <span class="title">int</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MInt <span class="keyword">operator</span>-() <span class="type">const</span> &#123;</span><br><span class="line">        MInt res;</span><br><span class="line">        res.x = <span class="built_in">norm</span>(<span class="built_in">getMod</span>() - x);</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">constexpr</span> MInt <span class="title">inv</span><span class="params">()</span> <span class="type">const</span> </span>&#123;</span><br><span class="line">        <span class="built_in">assert</span>(x != <span class="number">0</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">power</span>(*<span class="keyword">this</span>, <span class="built_in">getMod</span>() - <span class="number">2</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MInt &amp;<span class="keyword">operator</span>*=(MInt rhs) &amp; &#123;</span><br><span class="line">        x = <span class="number">1LL</span> * x * rhs.x % <span class="built_in">getMod</span>();</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MInt &amp;<span class="keyword">operator</span>+=(MInt rhs) &amp; &#123;</span><br><span class="line">        x = <span class="built_in">norm</span>(x + rhs.x);</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MInt &amp;<span class="keyword">operator</span>-=(MInt rhs) &amp; &#123;</span><br><span class="line">        x = <span class="built_in">norm</span>(x - rhs.x);</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">constexpr</span> MInt &amp;<span class="keyword">operator</span>/=(MInt rhs) &amp; &#123;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span> *= rhs.<span class="built_in">inv</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MInt <span class="keyword">operator</span>*(MInt lhs, MInt rhs) &#123;</span><br><span class="line">        MInt res = lhs;</span><br><span class="line">        res *= rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MInt <span class="keyword">operator</span>+(MInt lhs, MInt rhs) &#123;</span><br><span class="line">        MInt res = lhs;</span><br><span class="line">        res += rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MInt <span class="keyword">operator</span>-(MInt lhs, MInt rhs) &#123;</span><br><span class="line">        MInt res = lhs;</span><br><span class="line">        res -= rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> MInt <span class="keyword">operator</span>/(MInt lhs, MInt rhs) &#123;</span><br><span class="line">        MInt res = lhs;</span><br><span class="line">        res /= rhs;</span><br><span class="line">        <span class="keyword">return</span> res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> std::istream &amp;<span class="keyword">operator</span>&gt;&gt;(std::istream &amp;is, MInt &amp;a) &#123;</span><br><span class="line">        i64 v;</span><br><span class="line">        is &gt;&gt; v;</span><br><span class="line">        a = <span class="built_in">MInt</span>(v);</span><br><span class="line">        <span class="keyword">return</span> is;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> std::ostream &amp;<span class="keyword">operator</span>&lt;&lt;(std::ostream &amp;os, <span class="type">const</span> MInt &amp;a) &#123;</span><br><span class="line">        <span class="keyword">return</span> os &lt;&lt; a.<span class="built_in">val</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="type">bool</span> <span class="keyword">operator</span>==(MInt lhs, MInt rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">val</span>() == rhs.<span class="built_in">val</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">friend</span> <span class="keyword">constexpr</span> <span class="type">bool</span> <span class="keyword">operator</span>!=(MInt lhs, MInt rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">val</span>() != rhs.<span class="built_in">val</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;&gt;</span><br><span class="line"><span class="type">int</span> MInt&lt;<span class="number">0</span>&gt;::Mod = <span class="number">998244353</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span>&lt;<span class="type">int</span> V, <span class="type">int</span> P&gt;</span><br><span class="line"><span class="keyword">constexpr</span> MInt&lt;P&gt; CInv = <span class="built_in">MInt</span>&lt;P&gt;(V).<span class="built_in">inv</span>();</span><br><span class="line"></span><br><span class="line"><span class="keyword">constexpr</span> <span class="type">int</span> P = <span class="number">1000000007</span>;</span><br><span class="line"><span class="keyword">using</span> Z = MInt&lt;P&gt;;</span><br></pre></td></tr></table></figure></details><h2 id="06-状压RMQ（RMQ）">06 - 状压RMQ（RMQ）</h2><p><a href="https://atcoder.jp/contests/joi2022ho/submissions/39351739">2023-03-02</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">template&lt;class T,</span><br><span class="line">    class Cmp = st<span class="number">d::</span>less&lt;T&gt;&gt;</span><br><span class="line">struct RMQ &#123;</span><br><span class="line">    const Cmp cmp = Cmp<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    static constexpr unsigned B = <span class="number">64</span><span class="comment">;</span></span><br><span class="line">    using u64 = unsigned long long<span class="comment">;</span></span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>vector&lt;T&gt;&gt; <span class="keyword">a</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;T&gt; pre, suf, ini<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;u64&gt; stk<span class="comment">;</span></span><br><span class="line">    RMQ<span class="punctuation">(</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    RMQ<span class="punctuation">(</span>const st<span class="number">d::</span>vector&lt;T&gt; &amp;v<span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void init<span class="punctuation">(</span>const st<span class="number">d::</span>vector&lt;T&gt; &amp;v<span class="punctuation">)</span> &#123;</span><br><span class="line">        n = v.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        pre = suf = ini = v<span class="comment">;</span></span><br><span class="line">        stk.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>!n<span class="punctuation">)</span> &#123;</span><br><span class="line">            return<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        const int M = <span class="punctuation">(</span>n - <span class="number">1</span><span class="punctuation">)</span> / B + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        const int lg = st<span class="number">d::</span>__lg<span class="punctuation">(</span>M<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        <span class="keyword">a</span>.assign<span class="punctuation">(</span>lg + <span class="number">1</span>, st<span class="number">d::</span>vector&lt;T&gt;<span class="punctuation">(</span>M<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; M; i++) &#123;</span></span><br><span class="line">            <span class="keyword">a</span>[<span class="number">0</span>][i] = v[i * B]<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int j = <span class="number">1</span><span class="comment">; j &lt; B &amp;&amp; i * B + j &lt; n; j++) &#123;</span></span><br><span class="line">                <span class="keyword">a</span>[<span class="number">0</span>][i] = st<span class="number">d::</span>min<span class="punctuation">(</span><span class="keyword">a</span>[<span class="number">0</span>][i], v[i * B + j], cmp<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">1</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>i % B<span class="punctuation">)</span> &#123;</span><br><span class="line">                pre[i] = st<span class="number">d::</span>min<span class="punctuation">(</span>pre[i], pre[i - <span class="number">1</span>], cmp<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        for <span class="punctuation">(</span>int i = n - <span class="number">2</span><span class="comment">; i &gt;= 0; i--) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>i % B != B - <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                suf[i] = st<span class="number">d::</span>min<span class="punctuation">(</span>suf[i], suf[i + <span class="number">1</span>], cmp<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        for <span class="punctuation">(</span>int j = <span class="number">0</span><span class="comment">; j &lt; lg; j++) &#123;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i + (2 &lt;&lt; j) &lt;= M; i++) &#123;</span></span><br><span class="line">                <span class="keyword">a</span>[j + <span class="number">1</span>][i] = st<span class="number">d::</span>min<span class="punctuation">(</span><span class="keyword">a</span>[j][i], <span class="keyword">a</span>[j][i + <span class="punctuation">(</span><span class="number">1</span> &lt;&lt; j<span class="punctuation">)</span>], cmp<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; M; i++) &#123;</span></span><br><span class="line">            const int l = i * B<span class="comment">;</span></span><br><span class="line">            const int r = st<span class="number">d::</span>min<span class="punctuation">(</span><span class="number">1</span>U * n, l + B<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            u64 s = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int j = l<span class="comment">; j &lt; r; j++) &#123;</span></span><br><span class="line">                while <span class="punctuation">(</span>s &amp;&amp; cmp<span class="punctuation">(</span>v[j], v[st<span class="number">d::</span>__lg<span class="punctuation">(</span>s<span class="punctuation">)</span> + l]<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    s ^= <span class="number">1</span>ULL &lt;&lt; st<span class="number">d::</span>__lg<span class="punctuation">(</span>s<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">                s |= <span class="number">1</span>ULL &lt;&lt; <span class="punctuation">(</span>j - l<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                stk[j] = s<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; </span><br><span class="line">    T operator<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">(</span>int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>l / B != <span class="punctuation">(</span>r - <span class="number">1</span><span class="punctuation">)</span> / B<span class="punctuation">)</span> &#123;</span><br><span class="line">            T ans = st<span class="number">d::</span>min<span class="punctuation">(</span>suf[l], pre[r - <span class="number">1</span>], cmp<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            l = l / B + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            r = r / B<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>l &lt; r<span class="punctuation">)</span> &#123;</span><br><span class="line">                int k = st<span class="number">d::</span>__lg<span class="punctuation">(</span>r - l<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                ans = st<span class="number">d::</span>min<span class="punctuation">(</span>&#123;ans, <span class="keyword">a</span>[k][l], <span class="keyword">a</span>[k][r - <span class="punctuation">(</span><span class="number">1</span> &lt;&lt; k<span class="punctuation">)</span>]&#125;, cmp<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            return ans<span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            int x = B * <span class="punctuation">(</span>l / B<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            return ini[__builtin_ctzll<span class="punctuation">(</span>stk[r - <span class="number">1</span>] &gt;&gt; <span class="punctuation">(</span>l - x<span class="punctuation">)</span><span class="punctuation">)</span> + l]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="07-Splay">07 - Splay</h2><p><a href="https://atcoder.jp/contests/joi2023ho/submissions/38901674">2023-02-15</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br></pre></td><td class="code"><pre><span class="line">struct Node &#123;</span><br><span class="line">    Node *l = nullptr<span class="comment">;</span></span><br><span class="line">    Node *r = nullptr<span class="comment">;</span></span><br><span class="line">    int cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 sum = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">Node *add<span class="punctuation">(</span>Node *t, int l, int r, int p, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">    Node *x = new Node<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>t<span class="punctuation">)</span> &#123;</span><br><span class="line">        *x = *t<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    x-&gt;cnt += <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    x-&gt;sum += v<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return x<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>p &lt; m<span class="punctuation">)</span> &#123;</span><br><span class="line">        x-&gt;l = add<span class="punctuation">(</span>x-&gt;l, l, m, p, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        x-&gt;r = add<span class="punctuation">(</span>x-&gt;r, m, r, p, v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return x<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int find<span class="punctuation">(</span>Node *tl, Node *tr, int l, int r, int x<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>r &lt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">        return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>l &gt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">        int cnt = <span class="punctuation">(</span>tr ? tr-&gt;cnt : <span class="number">0</span><span class="punctuation">)</span> - <span class="punctuation">(</span>tl ? tl-&gt;cnt : <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>cnt == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return l<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">    int res = find<span class="punctuation">(</span>tl ? tl-&gt;l : tl, tr ? tr-&gt;l : tr, l, m, x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>res == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        res = find<span class="punctuation">(</span>tl ? tl-&gt;r : tl, tr ? tr-&gt;r : tr, m, r, x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">st<span class="number">d::</span>pair&lt;int, i64&gt; get<span class="punctuation">(</span>Node *t, int l, int r, int x, int y<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>l &gt;= y || r &lt;= x || !t<span class="punctuation">)</span> &#123;</span><br><span class="line">        return &#123;<span class="number">0</span>, <span class="number">0</span>LL&#125;<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>l &gt;= x &amp;&amp; r &lt;= y<span class="punctuation">)</span> &#123;</span><br><span class="line">        return &#123;t-&gt;cnt, t-&gt;sum&#125;<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">    auto [cl, sl] = get<span class="punctuation">(</span>t-&gt;l, l, m, x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    auto [cr, sr] = get<span class="punctuation">(</span>t-&gt;r, m, r, x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return &#123;cl + cr, sl + sr&#125;<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">struct Tree &#123;</span><br><span class="line">    int add = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    int val = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    int id = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    Tree *<span class="type">ch</span>[<span class="number">2</span>] = &#123;&#125;<span class="comment">;</span></span><br><span class="line">    Tree *p = nullptr<span class="comment">;</span></span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">int pos<span class="punctuation">(</span>Tree *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    return t-&gt;p-&gt;<span class="type">ch</span>[<span class="number">1</span>] == t<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void add<span class="punctuation">(</span>Tree *t, int v<span class="punctuation">)</span> &#123;</span><br><span class="line">    t-&gt;val += v<span class="comment">;</span></span><br><span class="line">    t-&gt;add += v<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void push<span class="punctuation">(</span>Tree *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>]<span class="punctuation">)</span> &#123;</span><br><span class="line">        add<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>], t-&gt;add<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="punctuation">)</span> &#123;</span><br><span class="line">        add<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">1</span>], t-&gt;add<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    t-&gt;add = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void rotate<span class="punctuation">(</span>Tree *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    Tree *q = t-&gt;p<span class="comment">;</span></span><br><span class="line">    int x = !pos<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    q-&gt;<span class="type">ch</span>[!x] = t-&gt;<span class="type">ch</span>[x]<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[x]<span class="punctuation">)</span> t-&gt;<span class="type">ch</span>[x]-&gt;p = q<span class="comment">;</span></span><br><span class="line">    t-&gt;p = q-&gt;p<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>q-&gt;p<span class="punctuation">)</span> q-&gt;p-&gt;<span class="type">ch</span>[pos<span class="punctuation">(</span>q<span class="punctuation">)</span>] = t<span class="comment">;</span></span><br><span class="line">    t-&gt;<span class="type">ch</span>[x] = q<span class="comment">;</span></span><br><span class="line">    q-&gt;p = t<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void splay<span class="punctuation">(</span>Tree *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;Tree *&gt; s<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>Tree *i = t<span class="comment">; i-&gt;p; i = i-&gt;p) s.push_back(i-&gt;p);</span></span><br><span class="line">    while <span class="punctuation">(</span>!s.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        push<span class="punctuation">(</span>s.back<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        s.pop_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    push<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    while <span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>t-&gt;p-&gt;p<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>pos<span class="punctuation">(</span>t<span class="punctuation">)</span> == pos<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="punctuation">)</span> rotate<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            else rotate<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        rotate<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void insert<span class="punctuation">(</span>Tree *&amp;t, Tree *x, Tree *p = nullptr<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>!t<span class="punctuation">)</span> &#123;</span><br><span class="line">        t = x<span class="comment">;</span></span><br><span class="line">        x-&gt;p = p<span class="comment">;</span></span><br><span class="line">        return<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    push<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>x-&gt;val &lt; t-&gt;val<span class="punctuation">)</span> &#123;</span><br><span class="line">        insert<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>], x, t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        insert<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">1</span>], x, t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void dfs<span class="punctuation">(</span>Tree *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>!t<span class="punctuation">)</span> &#123;</span><br><span class="line">        return<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    push<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    dfs<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::ce</span>rr &lt;&lt; t-&gt;val &lt;&lt; <span class="string">&quot; &quot;</span><span class="comment">;</span></span><br><span class="line">    dfs<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">st<span class="number">d::</span>pair&lt;Tree *, Tree *&gt; split<span class="punctuation">(</span>Tree *t, int x<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>!t<span class="punctuation">)</span> &#123;</span><br><span class="line">        return &#123;t, t&#125;<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Tree *v = nullptr<span class="comment">;</span></span><br><span class="line">    Tree *j = t<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>Tree *i = t<span class="comment">; i; ) &#123;</span></span><br><span class="line">        push<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        j = i<span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>i-&gt;val &gt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">            v = i<span class="comment">;</span></span><br><span class="line">            i = i-&gt;<span class="type">ch</span>[<span class="number">0</span>]<span class="comment">;</span></span><br><span class="line">        &#125; else &#123;</span><br><span class="line">            i = i-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    splay<span class="punctuation">(</span>j<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>!v<span class="punctuation">)</span> &#123;</span><br><span class="line">        return &#123;j, nullptr&#125;<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    splay<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    Tree *u = v-&gt;<span class="type">ch</span>[<span class="number">0</span>]<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>u<span class="punctuation">)</span> &#123;</span><br><span class="line">        v-&gt;<span class="type">ch</span>[<span class="number">0</span>] = u-&gt;p = nullptr<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    // st<span class="number">d::ce</span>rr &lt;&lt; <span class="string">&quot;split &quot;</span> &lt;&lt; x &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">    // dfs<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    // st<span class="number">d::ce</span>rr &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">    // dfs<span class="punctuation">(</span>v<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    // st<span class="number">d::ce</span>rr &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">    return &#123;u, v&#125;<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Tree *merge<span class="punctuation">(</span>Tree *l, Tree *r<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>!l<span class="punctuation">)</span> &#123;</span><br><span class="line">        return r<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>!r<span class="punctuation">)</span> &#123;</span><br><span class="line">        return l<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    Tree *i = l<span class="comment">;</span></span><br><span class="line">    while <span class="punctuation">(</span>i-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="punctuation">)</span> &#123;</span><br><span class="line">        i = i-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    splay<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    i-&gt;<span class="type">ch</span>[<span class="number">1</span>] = r<span class="comment">;</span></span><br><span class="line">    r-&gt;p = i<span class="comment">;</span></span><br><span class="line">    return i<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><a href="https://cf.dianhsu.com/gym/104479/submission/221036520">2023-09-30</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line">struct Node &#123;</span><br><span class="line">    Node *<span class="type">ch</span>[<span class="number">2</span>], *p<span class="comment">;</span></span><br><span class="line">    bool rev<span class="comment">;</span></span><br><span class="line">    int siz = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    Node<span class="punctuation">(</span><span class="punctuation">)</span> : <span class="type">ch</span>&#123;nullptr, nullptr&#125;, p<span class="punctuation">(</span>nullptr<span class="punctuation">)</span>, rev<span class="punctuation">(</span>false<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line">void reverse<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>t<span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>swap<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>], t-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t-&gt;rev ^= <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">void push<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>t-&gt;rev<span class="punctuation">)</span> &#123;</span><br><span class="line">        reverse<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        reverse<span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t-&gt;rev = false<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">void pull<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    t-&gt;siz = <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>] ? t-&gt;<span class="type">ch</span>[<span class="number">0</span>]-&gt;siz : <span class="number">0</span><span class="punctuation">)</span> + <span class="number">1</span> + <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">1</span>] ? t-&gt;<span class="type">ch</span>[<span class="number">1</span>]-&gt;siz : <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">bool isroot<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    return t-&gt;p == nullptr || <span class="punctuation">(</span>t-&gt;p-&gt;<span class="type">ch</span>[<span class="number">0</span>] != t &amp;&amp; t-&gt;p-&gt;<span class="type">ch</span>[<span class="number">1</span>] != t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">int pos<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    return t-&gt;p-&gt;<span class="type">ch</span>[<span class="number">1</span>] == t<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void pushAll<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        pushAll<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    push<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void rotate<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    Node *q = t-&gt;p<span class="comment">;</span></span><br><span class="line">    int x = !pos<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    q-&gt;<span class="type">ch</span>[!x] = t-&gt;<span class="type">ch</span>[x]<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">        t-&gt;<span class="type">ch</span>[x]-&gt;p = q<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    t-&gt;p = q-&gt;p<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>q<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        q-&gt;p-&gt;<span class="type">ch</span>[pos<span class="punctuation">(</span>q<span class="punctuation">)</span>] = t<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    t-&gt;<span class="type">ch</span>[x] = q<span class="comment">;</span></span><br><span class="line">    q-&gt;p = t<span class="comment">;</span></span><br><span class="line">    pull<span class="punctuation">(</span>q<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void splay<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    pushAll<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    while <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>pos<span class="punctuation">(</span>t<span class="punctuation">)</span> == pos<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                rotate<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                rotate<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        rotate<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    pull<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void access<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    for <span class="punctuation">(</span>Node *i = t, *q = nullptr<span class="comment">; i; q = i, i = i-&gt;p) &#123;</span></span><br><span class="line">        splay<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        i-&gt;<span class="type">ch</span>[<span class="number">1</span>] = q<span class="comment">;</span></span><br><span class="line">        pull<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    splay<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void makeroot<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    access<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    reverse<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void link<span class="punctuation">(</span>Node *x, Node *y<span class="punctuation">)</span> &#123;</span><br><span class="line">    makeroot<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    x-&gt;p = y<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void split<span class="punctuation">(</span>Node *x, Node *y<span class="punctuation">)</span> &#123;</span><br><span class="line">    makeroot<span class="punctuation">(</span>x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    access<span class="punctuation">(</span>y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void cut<span class="punctuation">(</span>Node *x, Node *y<span class="punctuation">)</span> &#123;</span><br><span class="line">    split<span class="punctuation">(</span>x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    x-&gt;p = y-&gt;<span class="type">ch</span>[<span class="number">0</span>] = nullptr<span class="comment">;</span></span><br><span class="line">    pull<span class="punctuation">(</span>y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">int dist<span class="punctuation">(</span>Node *x, Node *y<span class="punctuation">)</span> &#123;</span><br><span class="line">    split<span class="punctuation">(</span>x, y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return y-&gt;siz - <span class="number">1</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><a href="https://codeforces.com/contest/1942/submission/254202464">2024-03-30</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br></pre></td><td class="code"><pre><span class="line">struct Matrix : st<span class="number">d::a</span>rray&lt;st<span class="number">d::a</span>rray&lt;i64, <span class="number">4</span>&gt;, <span class="number">4</span>&gt; &#123;</span><br><span class="line">    Matrix<span class="punctuation">(</span>i64 v = <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; 4; i++) &#123;</span></span><br><span class="line">            for <span class="punctuation">(</span>int j = <span class="number">0</span><span class="comment">; j &lt; 4; j++) &#123;</span></span><br><span class="line">                <span class="punctuation">(</span>*this<span class="punctuation">)</span>[i][j] = <span class="punctuation">(</span>i == j ? v : inf<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line"> </span><br><span class="line">Matrix operator*<span class="punctuation">(</span>const Matrix &amp;<span class="keyword">a</span>, const Matrix &amp;b<span class="punctuation">)</span> &#123;</span><br><span class="line">    Matrix c<span class="punctuation">(</span>inf<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; 3; i++) &#123;</span></span><br><span class="line">        for <span class="punctuation">(</span>int j = <span class="number">0</span><span class="comment">; j &lt; 3; j++) &#123;</span></span><br><span class="line">            for <span class="punctuation">(</span>int k = <span class="number">0</span><span class="comment">; k &lt; 4; k++) &#123;</span></span><br><span class="line">                c[i][k] = st<span class="number">d::</span>min<span class="punctuation">(</span>c[i][k], <span class="keyword">a</span>[i][j] + b[j][k]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        c[i][<span class="number">3</span>] = st<span class="number">d::</span>min<span class="punctuation">(</span>c[i][<span class="number">3</span>], <span class="keyword">a</span>[i][<span class="number">3</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    c[<span class="number">3</span>][<span class="number">3</span>] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    return c<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line">struct Node &#123;</span><br><span class="line">    Node *<span class="type">ch</span>[<span class="number">2</span>], *p<span class="comment">;</span></span><br><span class="line">    i64 sumg = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 sumh = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 sumb = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 g = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 h = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    i64 b = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    Matrix mat<span class="comment">;</span></span><br><span class="line">    Matrix prd<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::a</span>rray&lt;i64, <span class="number">4</span>&gt; ans&#123;&#125;<span class="comment">;</span></span><br><span class="line">    Node<span class="punctuation">(</span><span class="punctuation">)</span> : <span class="type">ch</span>&#123;nullptr, nullptr&#125;, p<span class="punctuation">(</span>nullptr<span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    </span><br><span class="line">    void update<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        mat = Matrix<span class="punctuation">(</span>inf<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        mat[<span class="number">0</span>][<span class="number">0</span>] = b + h - g + sumg<span class="comment">;</span></span><br><span class="line">        mat[<span class="number">1</span>][<span class="number">1</span>] = mat[<span class="number">1</span>][<span class="number">2</span>] = mat[<span class="number">1</span>][<span class="number">3</span>] = h + sumh<span class="comment">;</span></span><br><span class="line">        mat[<span class="number">2</span>][<span class="number">0</span>] = mat[<span class="number">2</span>][<span class="number">1</span>] = mat[<span class="number">2</span>][<span class="number">2</span>] = mat[<span class="number">2</span>][<span class="number">3</span>] = b + h + sumb<span class="comment">;</span></span><br><span class="line">        mat[<span class="number">3</span>][<span class="number">3</span>] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line">void push<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    </span><br><span class="line">&#125;</span><br><span class="line">void pull<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    t-&gt;prd = <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">0</span>] ? t-&gt;<span class="type">ch</span>[<span class="number">0</span>]-&gt;prd : Matrix<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> * t-&gt;mat * <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[<span class="number">1</span>] ? t-&gt;<span class="type">ch</span>[<span class="number">1</span>]-&gt;prd : Matrix<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">bool isroot<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    return t-&gt;p == nullptr || <span class="punctuation">(</span>t-&gt;p-&gt;<span class="type">ch</span>[<span class="number">0</span>] != t &amp;&amp; t-&gt;p-&gt;<span class="type">ch</span>[<span class="number">1</span>] != t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">int pos<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    return t-&gt;p-&gt;<span class="type">ch</span>[<span class="number">1</span>] == t<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void pushAll<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        pushAll<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    push<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void rotate<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    Node *q = t-&gt;p<span class="comment">;</span></span><br><span class="line">    int x = !pos<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    q-&gt;<span class="type">ch</span>[!x] = t-&gt;<span class="type">ch</span>[x]<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>t-&gt;<span class="type">ch</span>[x]<span class="punctuation">)</span> &#123;</span><br><span class="line">        t-&gt;<span class="type">ch</span>[x]-&gt;p = q<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    t-&gt;p = q-&gt;p<span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>q<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        q-&gt;p-&gt;<span class="type">ch</span>[pos<span class="punctuation">(</span>q<span class="punctuation">)</span>] = t<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    t-&gt;<span class="type">ch</span>[x] = q<span class="comment">;</span></span><br><span class="line">    q-&gt;p = t<span class="comment">;</span></span><br><span class="line">    pull<span class="punctuation">(</span>q<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line">void splay<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    pushAll<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    while <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>!isroot<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>pos<span class="punctuation">(</span>t<span class="punctuation">)</span> == pos<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                rotate<span class="punctuation">(</span>t-&gt;p<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                rotate<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        rotate<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    pull<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line">st<span class="number">d::a</span>rray&lt;i64, <span class="number">4</span>&gt; get<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::a</span>rray&lt;i64, <span class="number">4</span>&gt; ans<span class="comment">;</span></span><br><span class="line">    ans.fill<span class="punctuation">(</span>inf<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    ans[<span class="number">3</span>] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; 3; i++) &#123;</span></span><br><span class="line">        for <span class="punctuation">(</span>int j = <span class="number">0</span><span class="comment">; j &lt; 4; j++) &#123;</span></span><br><span class="line">            ans[i] = st<span class="number">d::</span>min<span class="punctuation">(</span>ans[i], t-&gt;prd[i][j]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return ans<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line">void access<span class="punctuation">(</span>Node *t<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::a</span>rray&lt;i64, <span class="number">4</span>&gt; old&#123;&#125;<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>Node *i = t, *q = nullptr<span class="comment">; i; q = i, i = i-&gt;p) &#123;</span></span><br><span class="line">        splay<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        if <span class="punctuation">(</span>i-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="punctuation">)</span> &#123;</span><br><span class="line">            auto res = get<span class="punctuation">(</span>i-&gt;<span class="type">ch</span>[<span class="number">1</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            i-&gt;sumg += res[<span class="number">0</span>]<span class="comment">;</span></span><br><span class="line">            i-&gt;sumh += st<span class="number">d::</span>min<span class="punctuation">(</span>&#123;res[<span class="number">1</span>], res[<span class="number">2</span>], res[<span class="number">3</span>]&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            i-&gt;sumb += st<span class="number">d::</span>min<span class="punctuation">(</span>&#123;res[<span class="number">0</span>], res[<span class="number">1</span>], res[<span class="number">2</span>], res[<span class="number">3</span>]&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        i-&gt;<span class="type">ch</span>[<span class="number">1</span>] = q<span class="comment">;</span></span><br><span class="line">        i-&gt;sumg -= old[<span class="number">0</span>]<span class="comment">;</span></span><br><span class="line">        i-&gt;sumh -= st<span class="number">d::</span>min<span class="punctuation">(</span>&#123;old[<span class="number">1</span>], old[<span class="number">2</span>], old[<span class="number">3</span>]&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        i-&gt;sumb -= st<span class="number">d::</span>min<span class="punctuation">(</span>&#123;old[<span class="number">0</span>], old[<span class="number">1</span>], old[<span class="number">2</span>], old[<span class="number">3</span>]&#125;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        old = get<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        i-&gt;update<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        pull<span class="punctuation">(</span>i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    splay<span class="punctuation">(</span>t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="08-其他平衡树">08 - 其他平衡树</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63246177">2023-08-04</a></p><figure class="highlight xl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line">struct Node &#123;</span><br><span class="line">    Node *l = nullptr;</span><br><span class="line">    Node *r = nullptr;</span><br><span class="line">    int sum = <span class="number">0</span>;</span><br><span class="line">    int sumodd = <span class="number">0</span>;</span><br><span class="line">    </span><br><span class="line">    Node(Node *t) &#123;</span><br><span class="line">        <span class="keyword">if</span> (t) &#123;</span><br><span class="line">            *this = *t;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Node *add(Node *t, int l, int r, int x, int v) &#123;</span><br><span class="line">    t = new Node(t);</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span>sum += v;</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span>sumodd += (x % <span class="number">2</span>) * v;</span><br><span class="line">    <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">        return t;</span><br><span class="line">    &#125;</span><br><span class="line">    int m = (l + r) / <span class="number">2</span>;</span><br><span class="line">    <span class="keyword">if</span> (x &lt; m) &#123;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">l</span> = add(t-&gt;</span>l, l, m, x, v);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">r</span> = add(t-&gt;</span>r, m, r, x, v);</span><br><span class="line">    &#125;</span><br><span class="line">    return t;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int query1(Node *t1, Node *t2, int l, int r, int k) &#123;</span><br><span class="line">    <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">        return l;</span><br><span class="line">    &#125;</span><br><span class="line">    int m = (l + r) / <span class="number">2</span>;</span><br><span class="line">    <span class="function"><span class="title">int</span> odd = (t1 &amp;&amp; t1-&gt;</span><span class="function"><span class="title">r</span> ? t1-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span><span class="function"><span class="title">sumodd</span> : 0) - (t2 &amp;&amp; t2-&gt;</span><span class="function"><span class="title">r</span> ? t2-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>sumodd : <span class="number">0</span>);</span><br><span class="line">    <span class="function"><span class="title">int</span> cnt = (t1 &amp;&amp; t1-&gt;</span><span class="function"><span class="title">r</span> ? t1-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span><span class="function"><span class="title">sum</span> : 0) - (t2 &amp;&amp; t2-&gt;</span><span class="function"><span class="title">r</span> ? t2-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>sum : <span class="number">0</span>);</span><br><span class="line">    <span class="keyword">if</span> (odd &gt; <span class="number">0</span> || cnt &gt; k) &#123;</span><br><span class="line">        <span class="function"><span class="title">return</span> query1(t1 ? t1-&gt;</span><span class="function"><span class="title">r</span> : t1, t2 ? t2-&gt;</span>r : t2, m, r, k);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">return</span> query1(t1 ? t1-&gt;</span><span class="function"><span class="title">l</span> : t1, t2 ? t2-&gt;</span>l : t2, l, m, k - cnt);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">std::array&lt;int, <span class="number">3</span>&gt; query2(Node *t1, Node *t2, int l, int r, int k) &#123;</span><br><span class="line">    <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">        <span class="function"><span class="title">int</span> cnt = (t1 ? t1-&gt;</span><span class="function"><span class="title">sumodd</span> : 0) - (t2 ? t2-&gt;</span>sumodd : <span class="number">0</span>);</span><br><span class="line">        return &#123;l, cnt, k&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    int m = (l + r) / <span class="number">2</span>;</span><br><span class="line">    <span class="function"><span class="title">int</span> cnt = (t1 &amp;&amp; t1-&gt;</span><span class="function"><span class="title">r</span> ? t1-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span><span class="function"><span class="title">sumodd</span> : 0) - (t2 &amp;&amp; t2-&gt;</span><span class="function"><span class="title">r</span> ? t2-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>sumodd : <span class="number">0</span>);</span><br><span class="line">    <span class="keyword">if</span> (cnt &gt; k) &#123;</span><br><span class="line">        <span class="function"><span class="title">return</span> query2(t1 ? t1-&gt;</span><span class="function"><span class="title">r</span> : t1, t2 ? t2-&gt;</span>r : t2, m, r, k);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">return</span> query2(t1 ? t1-&gt;</span><span class="function"><span class="title">l</span> : t1, t2 ? t2-&gt;</span>l : t2, l, m, k - cnt);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><a href="https://codeforces.com/contest/1864/submission/220558951">2023-08-26</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">struct Node &#123;</span><br><span class="line">    Node *l = nullptr<span class="comment">;</span></span><br><span class="line">    Node *r = nullptr<span class="comment">;</span></span><br><span class="line">    int cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">&#125;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">Node *add<span class="punctuation">(</span>Node *t, int l, int r, int x<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>t<span class="punctuation">)</span> &#123;</span><br><span class="line">        t = new Node<span class="punctuation">(</span>*t<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        t = new Node<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    t-&gt;cnt += <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return t<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>x &lt; m<span class="punctuation">)</span> &#123;</span><br><span class="line">        t-&gt;l = add<span class="punctuation">(</span>t-&gt;l, l, m, x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125; else &#123;</span><br><span class="line">        t-&gt;r = add<span class="punctuation">(</span>t-&gt;r, m, r, x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return t<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int query<span class="punctuation">(</span>Node *t1, Node *t2, int l, int r, int x<span class="punctuation">)</span> &#123;</span><br><span class="line">    int cnt = <span class="punctuation">(</span>t2 ? t2-&gt;cnt : <span class="number">0</span><span class="punctuation">)</span> - <span class="punctuation">(</span>t1 ? t1-&gt;cnt : <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>cnt == <span class="number">0</span> || l &gt;= x<span class="punctuation">)</span> &#123;</span><br><span class="line">        return -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    if <span class="punctuation">(</span>r - l == <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return l<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int m = <span class="punctuation">(</span>l + r<span class="punctuation">)</span> / <span class="number">2</span><span class="comment">;</span></span><br><span class="line">    int res = query<span class="punctuation">(</span>t1 ? t1-&gt;r : t1, t2 ? t2-&gt;r : t2, m, r, x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    if <span class="punctuation">(</span>res == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        res = query<span class="punctuation">(</span>t1 ? t1-&gt;l : t1, t2 ? t2-&gt;l : t2, l, m, x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return res<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><a href="https://codeforces.com/contest/38/submission/200537139">2023-04-03</a></p><figure class="highlight xl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br></pre></td><td class="code"><pre><span class="line">struct Info &#123;</span><br><span class="line">    int imp = <span class="number">0</span>;</span><br><span class="line">    int id = <span class="number">0</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Info operator+(Info a, Info b) &#123;</span><br><span class="line">    return &#123;std::max(a.imp, b.imp), <span class="number">0</span>&#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">struct Node &#123;</span><br><span class="line">    int w = rng();</span><br><span class="line">    Info info;</span><br><span class="line">    Info sum;</span><br><span class="line">    int siz = <span class="number">1</span>;</span><br><span class="line">    Node *l = nullptr;</span><br><span class="line">    Node *r = nullptr;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">void pull(Node *t) &#123;</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">sum</span> = t-&gt;</span>info;</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span>siz = <span class="number">1</span>;</span><br><span class="line">    <span class="function"><span class="title">if</span> (t-&gt;</span>l) &#123;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">sum</span> = t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span><span class="function"><span class="title">sum</span> + t-&gt;</span>sum;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">siz</span> += t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span>siz;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">if</span> (t-&gt;</span>r) &#123;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">sum</span> = t-&gt;</span><span class="function"><span class="title">sum</span> + t-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>sum;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">siz</span> += t-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>siz;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">std::pair&lt;Node *, Node *&gt; splitAt(Node *t, int p) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!t) &#123;</span><br><span class="line">        return &#123;t, t&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">if</span> (p &lt;= (t-&gt;</span><span class="function"><span class="title">l</span> ? t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span>siz : <span class="number">0</span>)) &#123;</span><br><span class="line">        <span class="function"><span class="title">auto</span> [l, r] = splitAt(t-&gt;</span>l, p);</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span>l = r;</span><br><span class="line">        pull(t);</span><br><span class="line">        return &#123;l, t&#125;;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">auto</span> [l, r] = splitAt(t-&gt;</span><span class="function"><span class="title">r</span>, p - 1 - (t-&gt;</span><span class="function"><span class="title">l</span> ? t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span>siz : <span class="number">0</span>));</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span>r = l;</span><br><span class="line">        pull(t);</span><br><span class="line">        return &#123;t, r&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void insertAt(Node *&amp;t, int p, Node *x) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!t) &#123;</span><br><span class="line">        t = x;</span><br><span class="line">        return;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">if</span> (x-&gt;</span><span class="function"><span class="title">w</span> &lt; t-&gt;</span>w) &#123;</span><br><span class="line">        auto [l, r] = splitAt(t, p);</span><br><span class="line">        t = x;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span>l = l;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span>r = r;</span><br><span class="line">        pull(t);</span><br><span class="line">        return;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">if</span> (p &lt;= (t-&gt;</span><span class="function"><span class="title">l</span> ? t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span>siz : <span class="number">0</span>)) &#123;</span><br><span class="line">        <span class="function"><span class="title">insertAt</span>(t-&gt;</span>l, p, x);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">insertAt</span>(t-&gt;</span><span class="function"><span class="title">r</span>, p - 1 - (t-&gt;</span><span class="function"><span class="title">l</span> ? t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span>siz : <span class="number">0</span>), x);</span><br><span class="line">    &#125;</span><br><span class="line">    pull(t);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Node *merge(Node *a, Node *b) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!a) &#123;</span><br><span class="line">        return b;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (!b) &#123;</span><br><span class="line">        return a;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="title">if</span> (a-&gt;</span><span class="function"><span class="title">w</span> &lt; b-&gt;</span>w) &#123;</span><br><span class="line">        <span class="function"><span class="title">a</span>-&gt;</span><span class="function"><span class="title">r</span> = merge(a-&gt;</span>r, b);</span><br><span class="line">        pull(a);</span><br><span class="line">        return a;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">b</span>-&gt;</span><span class="function"><span class="title">l</span> = merge(a, b-&gt;</span>l);</span><br><span class="line">        pull(b);</span><br><span class="line">        return b;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int query(Node *t, int v) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!t) &#123;</span><br><span class="line">        return <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">if</span> (t-&gt;</span>sum.imp &lt; v) &#123;</span><br><span class="line">        <span class="function"><span class="title">return</span> t-&gt;</span>siz;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">int</span> res = query(t-&gt;</span>r, v);</span><br><span class="line">    <span class="function"><span class="title">if</span> (res != (t-&gt;</span><span class="function"><span class="title">r</span> ? t-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>siz : <span class="number">0</span>)) &#123;</span><br><span class="line">        return res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">if</span> (t-&gt;</span>info.imp &gt; v) &#123;</span><br><span class="line">        return res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">return</span> res + 1 + query(t-&gt;</span>l, v);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">void dfs(Node *t) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!t) &#123;</span><br><span class="line">        return;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">dfs</span>(t-&gt;</span>l);</span><br><span class="line">    <span class="function"><span class="title">std</span>::cout &lt;&lt; t-&gt;</span>info.id <span class="string">&lt;&lt; &quot; &quot;;</span></span><br><span class="line"><span class="string">    dfs(t-&gt;r);</span></span><br><span class="line"><span class="string">&#125;</span></span><br></pre></td></tr></table></figure><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63162242">2023-07-31</a></p><figure class="highlight xl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br></pre></td><td class="code"><pre><span class="line">struct Node &#123;</span><br><span class="line">    Node *l = nullptr;</span><br><span class="line">    Node *r = nullptr;</span><br><span class="line">    int cnt = <span class="number">0</span>;</span><br><span class="line">    int cntnew = <span class="number">0</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Node *add(int l, int r, int x, int isnew) &#123;</span><br><span class="line">    Node *t = new Node;</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span>cnt = <span class="number">1</span>;</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span>cntnew = isnew;</span><br><span class="line">    <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">        return t;</span><br><span class="line">    &#125;</span><br><span class="line">    int m = (l + r) / <span class="number">2</span>;</span><br><span class="line">    <span class="keyword">if</span> (x &lt; m) &#123;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span>l = add(l, m, x, isnew);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span>r = add(m, r, x, isnew);</span><br><span class="line">    &#125;</span><br><span class="line">    return t;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">struct Info &#123;</span><br><span class="line">    Node *t = nullptr;</span><br><span class="line">    int psum = <span class="number">0</span>;</span><br><span class="line">    bool rev = <span class="literal">false</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">void pull(Node *t) &#123;</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">cnt</span> = (t-&gt;</span><span class="function"><span class="title">l</span> ? t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span><span class="function"><span class="title">cnt</span> : 0) + (t-&gt;</span><span class="function"><span class="title">r</span> ? t-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>cnt : <span class="number">0</span>);</span><br><span class="line">    <span class="function"><span class="title">t</span>-&gt;</span><span class="function"><span class="title">cntnew</span> = (t-&gt;</span><span class="function"><span class="title">l</span> ? t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span><span class="function"><span class="title">cntnew</span> : 0) + (t-&gt;</span><span class="function"><span class="title">r</span> ? t-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>cntnew : <span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">std::pair&lt;Node *, Node *&gt; split(Node *t, int l, int r, int x, bool rev) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!t) &#123;</span><br><span class="line">        return &#123;t, t&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (x == <span class="number">0</span>) &#123;</span><br><span class="line">        return &#123;nullptr, t&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="title">if</span> (x == t-&gt;</span>cnt) &#123;</span><br><span class="line">        return &#123;t, nullptr&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">        Node *t2 = new Node;</span><br><span class="line">        <span class="function"><span class="title">t2</span>-&gt;</span><span class="function"><span class="title">cnt</span> = t-&gt;</span>cnt - x;</span><br><span class="line">        <span class="function"><span class="title">t</span>-&gt;</span>cnt = x;</span><br><span class="line">        return &#123;t, t2&#125;;</span><br><span class="line">    &#125;</span><br><span class="line">    Node *t2 = new Node;</span><br><span class="line">    int m = (l + r) / <span class="number">2</span>;</span><br><span class="line">    <span class="keyword">if</span> (!rev) &#123;</span><br><span class="line">        <span class="function"><span class="title">if</span> (t-&gt;</span><span class="function"><span class="title">l</span> &amp;&amp; x &lt;= t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span>cnt) &#123;</span><br><span class="line">            <span class="function"><span class="title">std</span>::tie(t-&gt;</span><span class="function"><span class="title">l</span>, t2-&gt;</span><span class="function"><span class="title">l</span>) = split(t-&gt;</span>l, l, m, x, rev);</span><br><span class="line">            <span class="function"><span class="title">t2</span>-&gt;</span><span class="function"><span class="title">r</span> = t-&gt;</span>r;</span><br><span class="line">            <span class="function"><span class="title">t</span>-&gt;</span>r = nullptr;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="function"><span class="title">std</span>::tie(t-&gt;</span><span class="function"><span class="title">r</span>, t2-&gt;</span><span class="function"><span class="title">r</span>) = split(t-&gt;</span><span class="function"><span class="title">r</span>, m, r, x - (t-&gt;</span><span class="function"><span class="title">l</span> ? t-&gt;</span><span class="function"><span class="title">l</span>-&gt;</span>cnt : <span class="number">0</span>), rev);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="function"><span class="title">if</span> (t-&gt;</span><span class="function"><span class="title">r</span> &amp;&amp; x &lt;= t-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>cnt) &#123;</span><br><span class="line">            <span class="function"><span class="title">std</span>::tie(t-&gt;</span><span class="function"><span class="title">r</span>, t2-&gt;</span><span class="function"><span class="title">r</span>) = split(t-&gt;</span>r, m, r, x, rev);</span><br><span class="line">            <span class="function"><span class="title">t2</span>-&gt;</span><span class="function"><span class="title">l</span> = t-&gt;</span>l;</span><br><span class="line">            <span class="function"><span class="title">t</span>-&gt;</span>l = nullptr;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="function"><span class="title">std</span>::tie(t-&gt;</span><span class="function"><span class="title">l</span>, t2-&gt;</span><span class="function"><span class="title">l</span>) = split(t-&gt;</span><span class="function"><span class="title">l</span>, l, m, x - (t-&gt;</span><span class="function"><span class="title">r</span> ? t-&gt;</span><span class="function"><span class="title">r</span>-&gt;</span>cnt : <span class="number">0</span>), rev);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    pull(t);</span><br><span class="line">    pull(t2);</span><br><span class="line">    return &#123;t, t2&#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Node *merge(Node *t1, Node *t2, int l, int r) &#123;</span><br><span class="line">    <span class="keyword">if</span> (!t1) &#123;</span><br><span class="line">        return t2;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (!t2) &#123;</span><br><span class="line">        return t1;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (r - l == <span class="number">1</span>) &#123;</span><br><span class="line">        <span class="function"><span class="title">t1</span>-&gt;</span><span class="function"><span class="title">cnt</span> += t2-&gt;</span>cnt;</span><br><span class="line">        <span class="function"><span class="title">t1</span>-&gt;</span><span class="function"><span class="title">cntnew</span> += t2-&gt;</span>cntnew;</span><br><span class="line">        delete t2;</span><br><span class="line">        return t1;</span><br><span class="line">    &#125;</span><br><span class="line">    int m = (l + r) / <span class="number">2</span>;</span><br><span class="line">    <span class="function"><span class="title">t1</span>-&gt;</span><span class="function"><span class="title">l</span> = merge(t1-&gt;</span><span class="function"><span class="title">l</span>, t2-&gt;</span>l, l, m);</span><br><span class="line">    <span class="function"><span class="title">t1</span>-&gt;</span><span class="function"><span class="title">r</span> = merge(t1-&gt;</span><span class="function"><span class="title">r</span>, t2-&gt;</span>r, m, r);</span><br><span class="line">    delete t2;</span><br><span class="line">    pull(t1);</span><br><span class="line">    return t1;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="09-分数四则运算（Frac）">09 - 分数四则运算（Frac）</h2><p><a href="https://codeforces.com/contest/598/submission/203186397">2023-04-23</a></p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line">template&lt;<span class="class"><span class="keyword">class</span> <span class="title">T</span>&gt;</span></span><br><span class="line"><span class="class"><span class="title">struct</span> <span class="title">Frac</span> </span>&#123;</span><br><span class="line">    T <span class="built_in">num</span>;</span><br><span class="line">    T den;</span><br><span class="line">    <span class="title class_">Frac</span>(T num_, T den_) : <span class="title function_">num</span>(num_), <span class="title function_">den</span>(den_) &#123;</span><br><span class="line">        <span class="keyword">if</span> (den &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            den = -den;</span><br><span class="line">            <span class="built_in">num</span> = -<span class="built_in">num</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title class_">Frac</span>() : <span class="title class_">Frac</span>(<span class="number">0</span>, <span class="number">1</span>) &#123;&#125;</span><br><span class="line">    <span class="title class_">Frac</span>(T num_) : <span class="title class_">Frac</span>(num_, <span class="number">1</span>) &#123;&#125;</span><br><span class="line">    explicit <span class="keyword">operator</span> <span class="title function_">double</span>() <span class="keyword">const</span> &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">1</span>. * <span class="built_in">num</span> / den;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title class_">Frac</span> &amp;<span class="keyword">operator</span>+=(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="built_in">num</span> = <span class="built_in">num</span> * rhs.den + rhs.<span class="built_in">num</span> * den;</span><br><span class="line">        den *= rhs.den;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title class_">Frac</span> &amp;<span class="keyword">operator</span>-=(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="built_in">num</span> = <span class="built_in">num</span> * rhs.den - rhs.<span class="built_in">num</span> * den;</span><br><span class="line">        den *= rhs.den;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title class_">Frac</span> &amp;<span class="keyword">operator</span>*=(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="built_in">num</span> *= rhs.<span class="built_in">num</span>;</span><br><span class="line">        den *= rhs.den;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="title class_">Frac</span> &amp;<span class="keyword">operator</span>/=(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="built_in">num</span> *= rhs.den;</span><br><span class="line">        den *= rhs.<span class="built_in">num</span>;</span><br><span class="line">        <span class="keyword">if</span> (den &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="built_in">num</span> = -<span class="built_in">num</span>;</span><br><span class="line">            den = -den;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> *<span class="keyword">this</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="title class_">Frac</span> <span class="keyword">operator</span>+(<span class="title class_">Frac</span> lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs += rhs;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="title class_">Frac</span> <span class="keyword">operator</span>-(<span class="title class_">Frac</span> lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs -= rhs;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="title class_">Frac</span> <span class="keyword">operator</span>*(<span class="title class_">Frac</span> lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs *= rhs;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="title class_">Frac</span> <span class="keyword">operator</span>/(<span class="title class_">Frac</span> lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs /= rhs;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="title class_">Frac</span> <span class="keyword">operator</span>-(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;a) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Frac</span>(-a.<span class="built_in">num</span>, a.den);</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="built_in">bool</span> <span class="keyword">operator</span>==(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">num</span> * rhs.den == rhs.<span class="built_in">num</span> * lhs.den;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="built_in">bool</span> <span class="keyword">operator</span>!=(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">num</span> * rhs.den != rhs.<span class="built_in">num</span> * lhs.den;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="built_in">bool</span> <span class="keyword">operator</span>&lt;(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">num</span> * rhs.den &lt; rhs.<span class="built_in">num</span> * lhs.den;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="built_in">bool</span> <span class="keyword">operator</span>&gt;(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">num</span> * rhs.den &gt; rhs.<span class="built_in">num</span> * lhs.den;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="built_in">bool</span> <span class="keyword">operator</span>&lt;=(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">num</span> * rhs.den &lt;= rhs.<span class="built_in">num</span> * lhs.den;</span><br><span class="line">    &#125;</span><br><span class="line">    friend <span class="built_in">bool</span> <span class="keyword">operator</span>&gt;=(<span class="keyword">const</span> <span class="title class_">Frac</span> &amp;lhs, <span class="keyword">const</span> <span class="title class_">Frac</span> &amp;rhs) &#123;</span><br><span class="line">        <span class="keyword">return</span> lhs.<span class="built_in">num</span> * rhs.den &gt;= rhs.<span class="built_in">num</span> * lhs.den;</span><br><span class="line">    &#125;</span><br><span class="line">    friend std::ostream &amp;<span class="keyword">operator</span>&lt;&lt;(std::ostream &amp;os, <span class="title class_">Frac</span> x) &#123;</span><br><span class="line">        T g = std::<span class="title function_">gcd</span>(x.<span class="built_in">num</span>, x.den);</span><br><span class="line">        <span class="keyword">if</span> (x.den == g) &#123;</span><br><span class="line">            <span class="keyword">return</span> os &lt;&lt; x.<span class="built_in">num</span> / g;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> os &lt;&lt; x.<span class="built_in">num</span> / g &lt;&lt; <span class="string">&quot;/&quot;</span> &lt;&lt; x.den / g;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="10-线性基（Basis）">10 - 线性基（Basis）</h2><p><a href="https://codeforces.com/contest/1902/submission/235594491">2023-12-03</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">struct Basis &#123;</span><br><span class="line">    int <span class="keyword">a</span>[<span class="number">20</span>] &#123;&#125;<span class="comment">;</span></span><br><span class="line">    int t[<span class="number">20</span>] &#123;&#125;<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    Basis<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::f</span>ill<span class="punctuation">(</span>t, t + <span class="number">20</span>, -<span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void add<span class="punctuation">(</span>int x, int y = <span class="number">1</span>E9<span class="punctuation">)</span> &#123;</span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; 20; i++) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>x &gt;&gt; i &amp; <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                if <span class="punctuation">(</span>y &gt; t[i]<span class="punctuation">)</span> &#123;</span><br><span class="line">                    st<span class="number">d::</span>swap<span class="punctuation">(</span><span class="keyword">a</span>[i], x<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    st<span class="number">d::</span>swap<span class="punctuation">(</span>t[i], y<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">                x ^= <span class="keyword">a</span>[i]<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    bool query<span class="punctuation">(</span>int x, int y = <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; 20; i++) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span><span class="punctuation">(</span>x &gt;&gt; i &amp; <span class="number">1</span><span class="punctuation">)</span> &amp;&amp; t[i] &gt;= y<span class="punctuation">)</span> &#123;</span><br><span class="line">                x ^= <span class="keyword">a</span>[i]<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        return x == <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h1 id="五、字符串">五、字符串</h1><h2 id="01A-马拉车（Manacher-旧版）">01A - 马拉车（Manacher 旧版）</h2><p><a href="https://codeforces.com/contest/1827/submission/205865086">2023-05-14</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">st<span class="number">d::</span>vector&lt;int&gt; manacher<span class="punctuation">(</span>st<span class="number">d::</span>string s<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>string t = <span class="string">&quot;#&quot;</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>auto c : s<span class="punctuation">)</span> &#123;</span><br><span class="line">        t += c<span class="comment">;</span></span><br><span class="line">        t += &#x27;#&#x27;<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int n = t.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; r<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span>, j = <span class="number">0</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span><span class="number">2</span> * j - i &gt;= <span class="number">0</span> &amp;&amp; j + r[j] &gt; i<span class="punctuation">)</span> &#123;</span><br><span class="line">            r[i] = st<span class="number">d::</span>min<span class="punctuation">(</span>r[<span class="number">2</span> * j - i], j + r[j] - i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        while <span class="punctuation">(</span>i - r[i] &gt;= <span class="number">0</span> &amp;&amp; i + r[i] &lt; n &amp;&amp; t[i - r[i]] == t[i + r[i]]<span class="punctuation">)</span> &#123;</span><br><span class="line">            r[i] += <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>i + r[i] &gt; j + r[j]<span class="punctuation">)</span> &#123;</span><br><span class="line">            j = i<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return r<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="01B-马拉车（Manacher-新版）">01B - 马拉车（Manacher 新版）</h2><p><a href="https://atcoder.jp/contests/abc349/submissions/52365777">2024-04-14</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">st<span class="number">d::</span>vector&lt;int&gt; manacher<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;int&gt; s<span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; t&#123;<span class="number">0</span>&#125;<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>auto c : s<span class="punctuation">)</span> &#123;</span><br><span class="line">        t.push_back<span class="punctuation">(</span>c<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t.push_back<span class="punctuation">(</span><span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int n = t.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; r<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span>, j = <span class="number">0</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span><span class="number">2</span> * j - i &gt;= <span class="number">0</span> &amp;&amp; j + r[j] &gt; i<span class="punctuation">)</span> &#123;</span><br><span class="line">            r[i] = st<span class="number">d::</span>min<span class="punctuation">(</span>r[<span class="number">2</span> * j - i], j + r[j] - i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        while <span class="punctuation">(</span>i - r[i] &gt;= <span class="number">0</span> &amp;&amp; i + r[i] &lt; n &amp;&amp; t[i - r[i]] == t[i + r[i]]<span class="punctuation">)</span> &#123;</span><br><span class="line">            r[i] += <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>i + r[i] &gt; j + r[j]<span class="punctuation">)</span> &#123;</span><br><span class="line">            j = i<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return r<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="02-Z函数">02 - Z函数</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=63378373">2023-08-11</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">st<span class="number">d::</span>vector&lt;int&gt; zFunction<span class="punctuation">(</span>st<span class="number">d::</span>string s<span class="punctuation">)</span> &#123;</span><br><span class="line">    int n = s.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; z<span class="punctuation">(</span>n + <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    z[<span class="number">0</span>] = n<span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">1</span>, j = <span class="number">1</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">        z[i] = st<span class="number">d::</span>max<span class="punctuation">(</span><span class="number">0</span>, st<span class="number">d::</span>min<span class="punctuation">(</span>j + z[j] - i, z[i - j]<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>i + z[i] &lt; n &amp;&amp; s[z[i]] == s[i + z[i]]<span class="punctuation">)</span> &#123;</span><br><span class="line">            z[i]++<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>i + z[i] &gt; j + z[j]<span class="punctuation">)</span> &#123;</span><br><span class="line">            j = i<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return z<span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="03-后缀数组（SA）">03 - 后缀数组（SA）</h2><p><a href="https://atcoder.jp/contests/discovery2016-qual/submissions/39727257">2023-03-14</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line">struct SuffixArray &#123;</span><br><span class="line">    int n<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; sa, rk, lc<span class="comment">;</span></span><br><span class="line">    SuffixArray<span class="punctuation">(</span>const st<span class="number">d::</span>string &amp;s<span class="punctuation">)</span> &#123;</span><br><span class="line">        n = s.length<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        sa.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        lc.resize<span class="punctuation">(</span>n - <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        rk.resize<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>iota<span class="punctuation">(</span>sa.begin<span class="punctuation">(</span><span class="punctuation">)</span>, sa.end<span class="punctuation">(</span><span class="punctuation">)</span>, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>sort<span class="punctuation">(</span>sa.begin<span class="punctuation">(</span><span class="punctuation">)</span>, sa.end<span class="punctuation">(</span><span class="punctuation">)</span>, [&amp;]<span class="punctuation">(</span>int <span class="keyword">a</span>, int b<span class="punctuation">)</span> &#123;return s[<span class="keyword">a</span>] &lt; s[b]<span class="comment">;&#125;);</span></span><br><span class="line">        rk[sa[<span class="number">0</span>]] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">1</span><span class="comment">; i &lt; n; ++i)</span></span><br><span class="line">            rk[sa[i]] = rk[sa[i - <span class="number">1</span>]] + <span class="punctuation">(</span>s[sa[i]] != s[sa[i - <span class="number">1</span>]]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        int k = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; tmp, cnt<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        tmp.reserve<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>rk[sa[n - <span class="number">1</span>]] &lt; n - <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            tmp.clear<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; k; ++i)</span></span><br><span class="line">                tmp.push_back<span class="punctuation">(</span>n - k + i<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>auto i : sa<span class="punctuation">)</span></span><br><span class="line">                if <span class="punctuation">(</span>i &gt;= k<span class="punctuation">)</span></span><br><span class="line">                    tmp.push_back<span class="punctuation">(</span>i - k<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            st<span class="number">d::f</span>ill<span class="punctuation">(</span>cnt.begin<span class="punctuation">(</span><span class="punctuation">)</span>, cnt.end<span class="punctuation">(</span><span class="punctuation">)</span>, <span class="number">0</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; ++i)</span></span><br><span class="line">                ++cnt[rk[i]]<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">1</span><span class="comment">; i &lt; n; ++i)</span></span><br><span class="line">                cnt[i] += cnt[i - <span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = n - <span class="number">1</span><span class="comment">; i &gt;= 0; --i)</span></span><br><span class="line">                sa[--cnt[rk[tmp[i]]]] = tmp[i]<span class="comment">;</span></span><br><span class="line">            st<span class="number">d::</span>swap<span class="punctuation">(</span>rk, tmp<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            rk[sa[<span class="number">0</span>]] = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">1</span><span class="comment">; i &lt; n; ++i)</span></span><br><span class="line">                rk[sa[i]] = rk[sa[i - <span class="number">1</span>]] + <span class="punctuation">(</span>tmp[sa[i - <span class="number">1</span>]] &lt; tmp[sa[i]] || sa[i - <span class="number">1</span>] + k == n || tmp[sa[i - <span class="number">1</span>] + k] &lt; tmp[sa[i] + k]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            k *= <span class="number">2</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span>, j = <span class="number">0</span><span class="comment">; i &lt; n; ++i) &#123;</span></span><br><span class="line">            if <span class="punctuation">(</span>rk[i] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                j = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            &#125; else &#123;</span><br><span class="line">                for <span class="punctuation">(</span>j -= j &gt; <span class="number">0</span><span class="comment">; i + j &lt; n &amp;&amp; sa[rk[i] - 1] + j &lt; n &amp;&amp; s[i + j] == s[sa[rk[i] - 1] + j]; )</span></span><br><span class="line">                    ++j<span class="comment">;</span></span><br><span class="line">                lc[rk[i] - <span class="number">1</span>] = j<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="04A-后缀自动机（SuffixAutomaton-旧版）">04A - 后缀自动机（SuffixAutomaton 旧版）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=53409023&amp;returnHomeType=1&amp;uid=329687984">2022-08-17</a></p><figure class="highlight inform7"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">struct SuffixAutomaton &#123;</span><br><span class="line">    static constexpr int ALPHABET_SIZE = 26, N = 5e5;</span><br><span class="line">    struct Node &#123;</span><br><span class="line">        int len;</span><br><span class="line">        int link;</span><br><span class="line">        int next<span class="comment">[ALPHABET_SIZE]</span>;</span><br><span class="line">        Node() : len(0), link(0), next&#123;&#125; &#123;&#125;</span><br><span class="line">    &#125; t<span class="comment">[2 * N]</span>;</span><br><span class="line">    int cntNodes;</span><br><span class="line">    SuffixAutomaton() &#123;</span><br><span class="line">        cntNodes = 1;</span><br><span class="line">        std::fill(t<span class="comment">[0]</span>.next, t<span class="comment">[0]</span>.next + ALPHABET_SIZE, 1);</span><br><span class="line">        t<span class="comment">[0]</span>.len = -1;</span><br><span class="line">    &#125;</span><br><span class="line">    int extend(int p, int c) &#123;</span><br><span class="line">        if (t<span class="comment">[p]</span>.next<span class="comment">[c]</span>) &#123;</span><br><span class="line">            int q = t<span class="comment">[p]</span>.next<span class="comment">[c]</span>;</span><br><span class="line">            if (t<span class="comment">[q]</span>.len == t<span class="comment">[p]</span>.len + 1)</span><br><span class="line">                return q;</span><br><span class="line">            int r = ++cntNodes;</span><br><span class="line">            t<span class="comment">[r]</span>.len = t<span class="comment">[p]</span>.len + 1;</span><br><span class="line">            t<span class="comment">[r]</span>.link = t<span class="comment">[q]</span>.link;</span><br><span class="line">            std::copy(t<span class="comment">[q]</span>.next, t<span class="comment">[q]</span>.next + ALPHABET_SIZE, t<span class="comment">[r]</span>.next);</span><br><span class="line">            t<span class="comment">[q]</span>.link = r;</span><br><span class="line">            while (t<span class="comment">[p]</span>.next<span class="comment">[c]</span> == q) &#123;</span><br><span class="line">                t<span class="comment">[p]</span>.next<span class="comment">[c]</span> = r;</span><br><span class="line">                p = t<span class="comment">[p]</span>.link;</span><br><span class="line">            &#125;</span><br><span class="line">            return r;</span><br><span class="line">        &#125;</span><br><span class="line">        int cur = ++cntNodes;</span><br><span class="line">        t<span class="comment">[cur]</span>.len = t<span class="comment">[p]</span>.len + 1;</span><br><span class="line">        while (!t<span class="comment">[p]</span>.next<span class="comment">[c]</span>) &#123;</span><br><span class="line">            t<span class="comment">[p]</span>.next<span class="comment">[c]</span> = cur;</span><br><span class="line">            p = t<span class="comment">[p]</span>.link;</span><br><span class="line">        &#125;</span><br><span class="line">        t<span class="comment">[cur]</span>.link = extend(p, c);</span><br><span class="line">        return cur;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h2 id="04B-后缀自动机（SAM-新版）">04B - 后缀自动机（SAM 新版）</h2><p><a href="https://cf.dianhsu.com/gym/104353/submission/207318083">2023-05-27</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line">struct SAM &#123;</span><br><span class="line">    static constexpr int ALPHABET_SIZE = <span class="number">26</span><span class="comment">;</span></span><br><span class="line">    struct Node &#123;</span><br><span class="line">        int len<span class="comment">;</span></span><br><span class="line">        int link<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::a</span>rray&lt;int, ALPHABET_SIZE&gt; next<span class="comment">;</span></span><br><span class="line">        Node<span class="punctuation">(</span><span class="punctuation">)</span> : len&#123;&#125;, link&#123;&#125;, next&#123;&#125; &#123;&#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::</span>vector&lt;Node&gt; t<span class="comment">;</span></span><br><span class="line">    SAM<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    void init<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        t.assign<span class="punctuation">(</span><span class="number">2</span>, Node<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t[<span class="number">0</span>].next.fill<span class="punctuation">(</span><span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t[<span class="number">0</span>].len = -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int newNode<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        t.emplace_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return t.size<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int extend<span class="punctuation">(</span>int p, int c<span class="punctuation">)</span> &#123;</span><br><span class="line">        if <span class="punctuation">(</span>t[p].next[c]<span class="punctuation">)</span> &#123;</span><br><span class="line">            int q = t[p].next[c]<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>t[q].len == t[p].len + <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                return q<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            int r = newNode<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            t[r].len = t[p].len + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            t[r].link = t[q].link<span class="comment">;</span></span><br><span class="line">            t[r].next = t[q].next<span class="comment">;</span></span><br><span class="line">            t[q].link = r<span class="comment">;</span></span><br><span class="line">            while <span class="punctuation">(</span>t[p].next[c] == q<span class="punctuation">)</span> &#123;</span><br><span class="line">                t[p].next[c] = r<span class="comment">;</span></span><br><span class="line">                p = t[p].link<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            return r<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        int cur = newNode<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t[cur].len = t[p].len + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>!t[p].next[c]<span class="punctuation">)</span> &#123;</span><br><span class="line">            t[p].next[c] = cur<span class="comment">;</span></span><br><span class="line">            p = t[p].link<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        t[cur].link = extend<span class="punctuation">(</span>p, c<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return cur<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    int extend<span class="punctuation">(</span>int p, char c, char offset = &#x27;<span class="keyword">a</span>&#x27;<span class="punctuation">)</span> &#123;</span><br><span class="line">        return extend<span class="punctuation">(</span>p, c - offset<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int next<span class="punctuation">(</span>int p, int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].next[x]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int next<span class="punctuation">(</span>int p, char c, char offset = &#x27;<span class="keyword">a</span>&#x27;<span class="punctuation">)</span> &#123;</span><br><span class="line">        return next<span class="punctuation">(</span>p, c - &#x27;<span class="keyword">a</span>&#x27;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int link<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].link<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int len<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].len<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int size<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return t.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="05-回文自动机（PAM）">05 - 回文自动机（PAM）</h2><p><a href="https://ac.nowcoder.com/acm/contest/view-submission?submissionId=62237107&amp;returnHomeType=1&amp;uid=329687984">2023-05-19</a></p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line">struct PAM &#123;</span><br><span class="line">    <span class="keyword">static</span> constexpr <span class="built_in">int</span> ALPHABET_SIZE = <span class="number">28</span>;</span><br><span class="line">    struct <span class="title class_">Node</span> &#123;</span><br><span class="line">        <span class="built_in">int</span> len;</span><br><span class="line">        <span class="built_in">int</span> link;</span><br><span class="line">        <span class="built_in">int</span> cnt;</span><br><span class="line">        std::array&lt;<span class="built_in">int</span>, ALPHABET_SIZE&gt; next;</span><br><span class="line">        <span class="title class_">Node</span>() : len&#123;&#125;, link&#123;&#125;, cnt&#123;&#125;, next&#123;&#125; &#123;&#125;</span><br><span class="line">    &#125;;</span><br><span class="line">    std::vector&lt;<span class="title class_">Node</span>&gt; t;</span><br><span class="line">    <span class="built_in">int</span> suff;</span><br><span class="line">    std::string s;</span><br><span class="line">    PAM() &#123;</span><br><span class="line">        <span class="title function_">init</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">void</span> <span class="title function_">init</span>() &#123;</span><br><span class="line">        t.<span class="title function_">assign</span>(<span class="number">2</span>, <span class="title class_">Node</span>());</span><br><span class="line">        t[<span class="number">0</span>].len = -<span class="number">1</span>;</span><br><span class="line">        suff = <span class="number">1</span>;</span><br><span class="line">        s.<span class="title function_">clear</span>();</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">int</span> <span class="title function_">newNode</span>() &#123;</span><br><span class="line">        t.<span class="title function_">emplace_back</span>();</span><br><span class="line">        <span class="keyword">return</span> t.<span class="title function_">size</span>() - <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="built_in">bool</span> <span class="title function_">add</span>(char c, char offset = <span class="string">&#x27;a&#x27;</span>) &#123;</span><br><span class="line">        <span class="built_in">int</span> pos = s.<span class="title function_">size</span>();</span><br><span class="line">        s += c;</span><br><span class="line">        <span class="built_in">int</span> let = c - offset;</span><br><span class="line">        <span class="built_in">int</span> cur = suff, curlen = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">while</span> (<span class="keyword">true</span>) &#123;</span><br><span class="line">            curlen = t[cur].len;</span><br><span class="line">            <span class="keyword">if</span> (pos - <span class="number">1</span> - curlen &gt;= <span class="number">0</span> &amp;&amp; s[pos - <span class="number">1</span> - curlen] == s[pos])</span><br><span class="line">                <span class="keyword">break</span>;  </span><br><span class="line">            cur = t[cur].link;</span><br><span class="line">        &#125;       </span><br><span class="line">        <span class="keyword">if</span> (t[cur].next[let]) &#123;  </span><br><span class="line">            suff = t[cur].next[let];</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">         </span><br><span class="line">        <span class="built_in">int</span> <span class="built_in">num</span> = <span class="title function_">newNode</span>();</span><br><span class="line">        suff = <span class="built_in">num</span>;</span><br><span class="line">        t[<span class="built_in">num</span>].len = t[cur].len + <span class="number">2</span>;</span><br><span class="line">        t[cur].next[let] = <span class="built_in">num</span>;</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">if</span> (t[<span class="built_in">num</span>].len == <span class="number">1</span>) &#123;</span><br><span class="line">            t[<span class="built_in">num</span>].link = <span class="number">1</span>;</span><br><span class="line">            t[<span class="built_in">num</span>].cnt = <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">while</span> (<span class="keyword">true</span>) &#123;</span><br><span class="line">            cur = t[cur].link;</span><br><span class="line">            curlen = t[cur].len;</span><br><span class="line">            <span class="keyword">if</span> (pos - <span class="number">1</span> - curlen &gt;= <span class="number">0</span> &amp;&amp; s[pos - <span class="number">1</span> - curlen] == s[pos]) &#123;</span><br><span class="line">                t[<span class="built_in">num</span>].link = t[cur].next[let];</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;       </span><br><span class="line">        &#125;           </span><br><span class="line"> </span><br><span class="line">        t[<span class="built_in">num</span>].cnt = <span class="number">1</span> + t[t[<span class="built_in">num</span>].link].cnt;</span><br><span class="line"> </span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">PAM pam;</span><br></pre></td></tr></table></figure><h2 id="06A-AC自动机（AC-旧版）">06A - AC自动机（AC 旧版）</h2><p><a href="https://codeforces.com/contest/710/submission/121661266">2021-07-07</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line">constexpr int N = <span class="number">3</span>e5 + <span class="number">30</span>, <span class="keyword">A</span> = <span class="number">26</span><span class="comment">;</span></span><br><span class="line"></span><br><span class="line">struct Node &#123;</span><br><span class="line">    int fail<span class="comment">;</span></span><br><span class="line">    int sum<span class="comment">;</span></span><br><span class="line">    int next[<span class="keyword">A</span>]<span class="comment">;</span></span><br><span class="line">    Node<span class="punctuation">(</span><span class="punctuation">)</span> : fail<span class="punctuation">(</span>-<span class="number">1</span><span class="punctuation">)</span>, sum<span class="punctuation">(</span><span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>memset<span class="punctuation">(</span>next, -<span class="number">1</span>, sizeof<span class="punctuation">(</span>next<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125; node[N]<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">int cnt = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">int bin[N]<span class="comment">;</span></span><br><span class="line">int nBin = <span class="number">0</span><span class="comment">;</span></span><br><span class="line"></span><br><span class="line">int newNode<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">    int p = nBin &gt; <span class="number">0</span> ? bin[--nBin] : cnt++<span class="comment">;</span></span><br><span class="line">    node[p] = Node<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    return p<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">struct AC &#123;</span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; x<span class="comment">;</span></span><br><span class="line">    AC<span class="punctuation">(</span>AC &amp;&amp;<span class="keyword">a</span><span class="punctuation">)</span> : x<span class="punctuation">(</span>st<span class="number">d::</span>move<span class="punctuation">(</span><span class="keyword">a</span>.x<span class="punctuation">)</span><span class="punctuation">)</span> &#123;&#125;</span><br><span class="line">    AC<span class="punctuation">(</span>st<span class="number">d::</span>vector&lt;st<span class="number">d::</span>string&gt; s, st<span class="number">d::</span>vector&lt;int&gt; w<span class="punctuation">)</span> &#123;</span><br><span class="line">        x = &#123;newNode<span class="punctuation">(</span><span class="punctuation">)</span>, newNode<span class="punctuation">(</span><span class="punctuation">)</span>&#125;<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::f</span>ill<span class="punctuation">(</span>node[x[<span class="number">0</span>]].next, node[x[<span class="number">0</span>]].next + <span class="keyword">A</span>, x[<span class="number">1</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        node[x[<span class="number">1</span>]].fail = x[<span class="number">0</span>]<span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; int(s.size()); i++) &#123;</span></span><br><span class="line">            int p = x[<span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int j = <span class="number">0</span><span class="comment">; j &lt; int(s[i].length()); j++) &#123;</span></span><br><span class="line">                int c = s[i][j] - &#x27;<span class="keyword">a</span>&#x27;<span class="comment">;</span></span><br><span class="line">                if <span class="punctuation">(</span>node[p].next[c] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    int u = newNode<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    x.push_back<span class="punctuation">(</span>u<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                    node[p].next[c] = u<span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">                p = node[p].next[c]<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            node[p].sum += w[i]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        st<span class="number">d::</span>queue&lt;int&gt; que<span class="comment">;</span></span><br><span class="line">        que.push<span class="punctuation">(</span>x[<span class="number">1</span>]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        while <span class="punctuation">(</span>!que.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            int u = que.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            que.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            node[u].sum += node[node[u].fail].sum<span class="comment">;</span></span><br><span class="line">            for <span class="punctuation">(</span>int c = <span class="number">0</span><span class="comment">; c &lt; A; c++) &#123;</span></span><br><span class="line">                if <span class="punctuation">(</span>node[u].next[c] == -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    node[u].next[c] = node[node[u].fail].next[c]<span class="comment">;</span></span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                    node[node[u].next[c]].fail = node[node[u].fail].next[c]<span class="comment">;</span></span><br><span class="line">                    que.push<span class="punctuation">(</span>node[u].next[c]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    ~AC<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        for <span class="punctuation">(</span>auto p : x<span class="punctuation">)</span> &#123;</span><br><span class="line">            bin[nBin++] = p<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    i64 query<span class="punctuation">(</span>const st<span class="number">d::</span>string &amp;s<span class="punctuation">)</span> const &#123;</span><br><span class="line">        i64 ans = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        int p = x[<span class="number">1</span>]<span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; int(s.length()); i++)  &#123;</span></span><br><span class="line">            int c = s[i] - &#x27;<span class="keyword">a</span>&#x27;<span class="comment">;</span></span><br><span class="line">            p = node[p].next[c]<span class="comment">;</span></span><br><span class="line">            ans += node[p].sum<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return ans<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="06B-AC自动机（AhoCorasick-新版）">06B - AC自动机（AhoCorasick 新版）</h2><p><a href="https://codeforces.com/contest/1801/submission/201155712">2023-04-07</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br></pre></td><td class="code"><pre><span class="line">struct AhoCorasick &#123;</span><br><span class="line">    static constexpr int ALPHABET = <span class="number">26</span><span class="comment">;</span></span><br><span class="line">    struct Node &#123;</span><br><span class="line">        int len<span class="comment">;</span></span><br><span class="line">        int link<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::a</span>rray&lt;int, ALPHABET&gt; next<span class="comment">;</span></span><br><span class="line">        Node<span class="punctuation">(</span><span class="punctuation">)</span> : link&#123;&#125;, next&#123;&#125; &#123;&#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>vector&lt;Node&gt; t<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    AhoCorasick<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        t.assign<span class="punctuation">(</span><span class="number">2</span>, Node<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t[<span class="number">0</span>].next.fill<span class="punctuation">(</span><span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t[<span class="number">0</span>].len = -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int newNode<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        t.emplace_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return t.size<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int add<span class="punctuation">(</span>const st<span class="number">d::</span>vector&lt;int&gt; &amp;<span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        int p = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>auto x : <span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>t[p].next[x] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                t[p].next[x] = newNode<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                t[t[p].next[x]].len = t[p].len + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            p = t[p].next[x]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return p<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int add<span class="punctuation">(</span>const st<span class="number">d::</span>string &amp;<span class="keyword">a</span>, char offset = &#x27;<span class="keyword">a</span>&#x27;<span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>vector&lt;int&gt; b<span class="punctuation">(</span><span class="keyword">a</span>.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; a.size(); i++) &#123;</span></span><br><span class="line">            b[i] = <span class="keyword">a</span>[i] - offset<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return add<span class="punctuation">(</span>b<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void work<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>queue&lt;int&gt; q<span class="comment">;</span></span><br><span class="line">        q.push<span class="punctuation">(</span><span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        while <span class="punctuation">(</span>!q.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            int x = q.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            q.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            </span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; ALPHABET; i++) &#123;</span></span><br><span class="line">                if <span class="punctuation">(</span>t[x].next[i] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    t[x].next[i] = t[t[x].link].next[i]<span class="comment">;</span></span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                    t[t[x].next[i]].link = t[t[x].link].next[i]<span class="comment">;</span></span><br><span class="line">                    q.push<span class="punctuation">(</span>t[x].next[i]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int next<span class="punctuation">(</span>int p, int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].next[x]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int next<span class="punctuation">(</span>int p, char c, char offset = &#x27;<span class="keyword">a</span>&#x27;<span class="punctuation">)</span> &#123;</span><br><span class="line">        return next<span class="punctuation">(</span>p, c - &#x27;<span class="keyword">a</span>&#x27;<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int link<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].link<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int len<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].len<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int size<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return t.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="06C-AC自动机（AhoCorasick-新新版）">06C - AC自动机（AhoCorasick 新新版）</h2><p><a href="https://www.luogu.com.cn/record/155114676">2024-04-09</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">struct AhoCorasick &#123;</span><br><span class="line">    static constexpr int ALPHABET = <span class="number">26</span><span class="comment">;</span></span><br><span class="line">    struct Node &#123;</span><br><span class="line">        int len<span class="comment">;</span></span><br><span class="line">        int link<span class="comment">;</span></span><br><span class="line">        st<span class="number">d::a</span>rray&lt;int, ALPHABET&gt; next<span class="comment">;</span></span><br><span class="line">        Node<span class="punctuation">(</span><span class="punctuation">)</span> : len&#123;<span class="number">0</span>&#125;, link&#123;<span class="number">0</span>&#125;, next&#123;&#125; &#123;&#125;</span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>vector&lt;Node&gt; t<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    AhoCorasick<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        init<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void init<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        t.assign<span class="punctuation">(</span><span class="number">2</span>, Node<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t[<span class="number">0</span>].next.fill<span class="punctuation">(</span><span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        t[<span class="number">0</span>].len = -<span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int newNode<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        t.emplace_back<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        return t.size<span class="punctuation">(</span><span class="punctuation">)</span> - <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int add<span class="punctuation">(</span>const st<span class="number">d::</span>string &amp;<span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        int p = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">        for <span class="punctuation">(</span>auto c : <span class="keyword">a</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            int x = c - &#x27;<span class="keyword">a</span>&#x27;<span class="comment">;</span></span><br><span class="line">            if <span class="punctuation">(</span>t[p].next[x] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                t[p].next[x] = newNode<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                t[t[p].next[x]].len = t[p].len + <span class="number">1</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            p = t[p].next[x]<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        return p<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    void work<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        st<span class="number">d::</span>queue&lt;int&gt; q<span class="comment">;</span></span><br><span class="line">        q.push<span class="punctuation">(</span><span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        while <span class="punctuation">(</span>!q.empty<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            int x = q.front<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            q.pop<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">            </span><br><span class="line">            for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; ALPHABET; i++) &#123;</span></span><br><span class="line">                if <span class="punctuation">(</span>t[x].next[i] == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                    t[x].next[i] = t[t[x].link].next[i]<span class="comment">;</span></span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                    t[t[x].next[i]].link = t[t[x].link].next[i]<span class="comment">;</span></span><br><span class="line">                    q.push<span class="punctuation">(</span>t[x].next[i]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int next<span class="punctuation">(</span>int p, int x<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].next[x]<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int link<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].link<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int len<span class="punctuation">(</span>int p<span class="punctuation">)</span> &#123;</span><br><span class="line">        return t[p].len<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    int size<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return t.size<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="comment">;</span></span><br></pre></td></tr></table></figure><h2 id="07-随机生成模底-字符串哈希（例题）">07 - 随机生成模底 字符串哈希（例题）</h2><p><a href="https://codeforces.com/contest/1598/submission/160006998">2022-06-09</a></p><figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br></pre></td><td class="code"><pre><span class="line">#include &lt;bits/stdc++.h&gt;</span><br><span class="line"></span><br><span class="line">using i64 = long long<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">bool isprime<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">    if <span class="punctuation">(</span>n &lt;= <span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        return false<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">2</span><span class="comment">; i * i &lt;= n; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>n % i == <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            return false<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    return true<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">int findPrime<span class="punctuation">(</span>int n<span class="punctuation">)</span> &#123;</span><br><span class="line">    while <span class="punctuation">(</span>!isprime<span class="punctuation">(</span>n<span class="punctuation">)</span><span class="punctuation">)</span> &#123;</span><br><span class="line">        n++<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    return n<span class="comment">;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">using Hash = st<span class="number">d::a</span>rray&lt;int, <span class="number">2</span>&gt;<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">int main<span class="punctuation">(</span><span class="punctuation">)</span> &#123;</span><br><span class="line">    st<span class="number">d::</span>ios<span class="number">::</span>sync_with_stdio<span class="punctuation">(</span>false<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    st<span class="number">d::c</span>in.tie<span class="punctuation">(</span>nullptr<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>mt19937 rng<span class="punctuation">(</span>st<span class="number">d::c</span>hrono<span class="number">::</span>steady_clock<span class="number">::</span>now<span class="punctuation">(</span><span class="punctuation">)</span>.time_since_epoch<span class="punctuation">(</span><span class="punctuation">)</span>.count<span class="punctuation">(</span><span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    const int P = findPrime<span class="punctuation">(</span>rng<span class="punctuation">(</span><span class="punctuation">)</span> % <span class="number">900000000</span> + <span class="number">100000000</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>string s, x<span class="comment">;</span></span><br><span class="line">    st<span class="number">d::c</span>in &gt;&gt; s &gt;&gt; x<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    int n = s.length<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    int m = x.length<span class="punctuation">(</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; h<span class="punctuation">(</span>n + <span class="number">1</span><span class="punctuation">)</span>, p<span class="punctuation">(</span>n + <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">        h[i + <span class="number">1</span>] = <span class="punctuation">(</span><span class="number">10</span>LL * h[i] + s[i] - &#x27;<span class="number">0</span>&#x27;<span class="punctuation">)</span> % P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    p[<span class="number">0</span>] = <span class="number">1</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">        p[i + <span class="number">1</span>] = <span class="number">10</span>LL * p[i] % P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    auto get = [&amp;]<span class="punctuation">(</span>int l, int r<span class="punctuation">)</span> &#123;</span><br><span class="line">        return <span class="punctuation">(</span>h[r] + <span class="number">1</span>LL * <span class="punctuation">(</span>P - h[l]<span class="punctuation">)</span> * p[r - l]<span class="punctuation">)</span> % P<span class="comment">;</span></span><br><span class="line">    &#125;<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    int px = <span class="number">0</span><span class="comment">;</span></span><br><span class="line">    for <span class="punctuation">(</span>auto c : x<span class="punctuation">)</span> &#123;</span><br><span class="line">        px = <span class="punctuation">(</span><span class="number">10</span>LL * px + c - &#x27;<span class="number">0</span>&#x27;<span class="punctuation">)</span> % P<span class="comment">;</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i &lt;= n - 2 * (m - 1); i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span><span class="punctuation">(</span>get<span class="punctuation">(</span>i, i + m - <span class="number">1</span><span class="punctuation">)</span> + get<span class="punctuation">(</span>i + m - <span class="number">1</span>, i + <span class="number">2</span> * m - <span class="number">2</span><span class="punctuation">)</span><span class="punctuation">)</span> % P == px<span class="punctuation">)</span> &#123;</span><br><span class="line">            st<span class="number">d::c</span>out &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; i + m - <span class="number">1</span> &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">            st<span class="number">d::c</span>out &lt;&lt; i + m &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; i + <span class="number">2</span> * m - <span class="number">2</span> &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">            return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    st<span class="number">d::</span>vector&lt;int&gt; z<span class="punctuation">(</span>m + <span class="number">1</span><span class="punctuation">)</span>, f<span class="punctuation">(</span>n + <span class="number">1</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">    z[<span class="number">0</span>] = m<span class="comment">;</span></span><br><span class="line">    </span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">1</span>, j = -<span class="number">1</span><span class="comment">; i &lt; m; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>j != -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            z[i] = st<span class="number">d::</span>max<span class="punctuation">(</span><span class="number">0</span>, st<span class="number">d::</span>min<span class="punctuation">(</span>j + z[j] - i, z[i - j]<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        while <span class="punctuation">(</span>z[i] + i &lt; m &amp;&amp; x[z[i]] == x[z[i] + i]<span class="punctuation">)</span> &#123;</span><br><span class="line">            z[i]++<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>j == -<span class="number">1</span> || i + z[i] &gt; j + z[j]<span class="punctuation">)</span> &#123;</span><br><span class="line">            j = i<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span>, j = -<span class="number">1</span><span class="comment">; i &lt; n; i++) &#123;</span></span><br><span class="line">        if <span class="punctuation">(</span>j != -<span class="number">1</span><span class="punctuation">)</span> &#123;</span><br><span class="line">            f[i] = st<span class="number">d::</span>max<span class="punctuation">(</span><span class="number">0</span>, st<span class="number">d::</span>min<span class="punctuation">(</span>j + f[j] - i, z[i - j]<span class="punctuation">)</span><span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        while <span class="punctuation">(</span>f[i] + i &lt; n &amp;&amp; f[i] &lt; m &amp;&amp; x[f[i]] == s[f[i] + i]<span class="punctuation">)</span> &#123;</span><br><span class="line">            f[i]++<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">        if <span class="punctuation">(</span>j == -<span class="number">1</span> || i + f[i] &gt; j + f[j]<span class="punctuation">)</span> &#123;</span><br><span class="line">            j = i<span class="comment">;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    for <span class="punctuation">(</span>int i = <span class="number">0</span><span class="comment">; i + m &lt;= n; i++) &#123;</span></span><br><span class="line">        int l = st<span class="number">d::</span>min<span class="punctuation">(</span>m, f[i]<span class="punctuation">)</span><span class="comment">;</span></span><br><span class="line">        </span><br><span class="line">        for <span class="punctuation">(</span>auto j : &#123; m - l, m - l - <span class="number">1</span> &#125;<span class="punctuation">)</span> &#123;</span><br><span class="line">            if <span class="punctuation">(</span>j &lt;= <span class="number">0</span><span class="punctuation">)</span> &#123;</span><br><span class="line">                continue<span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            if <span class="punctuation">(</span>j &lt;= i &amp;&amp; <span class="punctuation">(</span>get<span class="punctuation">(</span>i - j, i<span class="punctuation">)</span> + get<span class="punctuation">(</span>i, i + m<span class="punctuation">)</span><span class="punctuation">)</span> % P == px<span class="punctuation">)</span> &#123;</span><br><span class="line">                st<span class="number">d::c</span>out &lt;&lt; i - j + <span class="number">1</span> &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; i &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">                st<span class="number">d::c</span>out &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; i + m &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">                return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">            if <span class="punctuation">(</span>i + m + j &lt;= n &amp;&amp; <span class="punctuation">(</span>get<span class="punctuation">(</span>i, i + m<span class="punctuation">)</span> + get<span class="punctuation">(</span>i + m, i + m + j<span class="punctuation">)</span><span class="punctuation">)</span> % P == px<span class="punctuation">)</span> &#123;</span><br><span class="line">                st<span class="number">d::c</span>out &lt;&lt; i + <span class="number">1</span> &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; i + m &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">                st<span class="number">d::c</span>out &lt;&lt; i + m + <span class="number">1</span> &lt;&lt; <span class="string">&quot; &quot;</span> &lt;&lt; i + m + j &lt;&lt; <span class="string">&quot;<span class="char escape_">\n</span>&quot;</span><span class="comment">;</span></span><br><span class="line">                return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    return <span class="number">0</span><span class="comment">;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">Jiangly算法模板收集</summary>
    
    
    
    <category term="算法" scheme="http://265832.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="算法模板" scheme="http://265832.xyz/tags/%E7%AE%97%E6%B3%95%E6%A8%A1%E6%9D%BF/"/>
    
  </entry>
  
  <entry>
    <title>SQL</title>
    <link href="http://265832.xyz/posts/4d712855.html"/>
    <id>http://265832.xyz/posts/4d712855.html</id>
    <published>2024-09-14T13:03:44.000Z</published>
    <updated>2024-09-16T16:06:54.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="创建数据表">创建数据表</h1><h2 id="学生基本信息表student">学生基本信息表student</h2><table><thead><tr><th>字段名</th><th>字段类型</th><th>约束条件</th><th>字段含义说明</th></tr></thead><tbody><tr><td>sno</td><td>Varchar2(8)</td><td>Primary key</td><td>学号</td></tr><tr><td>sname</td><td>Varchar2(8)</td><td>Not null</td><td>姓名</td></tr><tr><td>ssex</td><td>Varchar2(2)</td><td>‘男’或’女’</td><td>性别</td></tr><tr><td>sbirthday</td><td>date</td><td></td><td>出生日期</td></tr><tr><td>classno</td><td>Varchar2(6)</td><td>Foreign key</td><td>班级号</td></tr><tr><td>Totalcredit</td><td>Smallint</td><td>初值为0</td><td>已选修的总学分</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> student (</span><br><span class="line">    sno <span class="type">VARCHAR</span>(<span class="number">8</span>) <span class="keyword">PRIMARY KEY</span> COMMENT <span class="string">&#x27;学号&#x27;</span>,</span><br><span class="line">    sname <span class="type">VARCHAR</span>(<span class="number">8</span>) <span class="keyword">NOT NULL</span> COMMENT <span class="string">&#x27;姓名&#x27;</span>,</span><br><span class="line">    ssex <span class="type">VARCHAR</span>(<span class="number">2</span>) <span class="keyword">CHECK</span> (ssex <span class="keyword">IN</span> (<span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;女&#x27;</span>)) COMMENT <span class="string">&#x27;性别&#x27;</span>,</span><br><span class="line">    sbirthday <span class="type">DATE</span> COMMENT <span class="string">&#x27;出生日期&#x27;</span>,</span><br><span class="line">    classno <span class="type">VARCHAR</span>(<span class="number">6</span>) COMMENT <span class="string">&#x27;班级号&#x27;</span>,</span><br><span class="line">    Totalcredit <span class="type">SMALLINT</span> <span class="keyword">DEFAULT</span> <span class="number">0</span> COMMENT <span class="string">&#x27;已选修的总学分&#x27;</span>,</span><br><span class="line">    <span class="keyword">FOREIGN KEY</span> (classno) <span class="keyword">REFERENCES</span> class(classno)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="班级信息表class">班级信息表class</h2><table><thead><tr><th>字段名</th><th>字段类型</th><th>约束条件</th><th>字段含义说明</th></tr></thead><tbody><tr><td>classno</td><td>Varchar2(6)</td><td>Primary key</td><td>班级号</td></tr><tr><td>classname</td><td>Varchar(20)</td><td>Not null</td><td>班级名称</td></tr><tr><td>classmajor</td><td>Varchar2(20)</td><td></td><td>所属专业</td></tr><tr><td>classdept</td><td>Varchar2(20)</td><td></td><td>所属系别</td></tr><tr><td>studentnumber</td><td>smallint</td><td>[20…40]</td><td>学生数</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> class (</span><br><span class="line">    classno <span class="type">VARCHAR</span>(<span class="number">6</span>) <span class="keyword">PRIMARY KEY</span> COMMENT <span class="string">&#x27;班级号&#x27;</span>,</span><br><span class="line">    classname <span class="type">VARCHAR</span>(<span class="number">20</span>) <span class="keyword">NOT NULL</span> COMMENT <span class="string">&#x27;班级名称&#x27;</span>,</span><br><span class="line">    classmajor <span class="type">VARCHAR</span>(<span class="number">20</span>) COMMENT <span class="string">&#x27;所属专业&#x27;</span>,</span><br><span class="line">    classdept <span class="type">VARCHAR</span>(<span class="number">20</span>) COMMENT <span class="string">&#x27;所属系别&#x27;</span>,</span><br><span class="line">    studentnumber <span class="type">SMALLINT</span> <span class="keyword">CHECK</span> (studentnumber <span class="keyword">BETWEEN</span> <span class="number">20</span> <span class="keyword">AND</span> <span class="number">40</span>) COMMENT <span class="string">&#x27;学生数&#x27;</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="课程信息表course">课程信息表course</h2><table><thead><tr><th>字段名</th><th>字段类型</th><th>约束条件</th><th>字段含义说明</th></tr></thead><tbody><tr><td>cno</td><td>Varchar2 (6)</td><td>Primary key</td><td>课程号</td></tr><tr><td>cname</td><td>Varchar(30) Not null</td><td>课程名称</td><td></td></tr><tr><td>ccredit</td><td>smallint</td><td>[1…4]</td><td>学分</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> course (</span><br><span class="line">    cno <span class="type">VARCHAR</span>(<span class="number">6</span>) <span class="keyword">PRIMARY KEY</span> COMMENT <span class="string">&#x27;课程号&#x27;</span>,</span><br><span class="line">    cname <span class="type">VARCHAR</span>(<span class="number">30</span>) <span class="keyword">NOT NULL</span> COMMENT <span class="string">&#x27;课程名称&#x27;</span>,</span><br><span class="line">    ccredit <span class="type">SMALLINT</span> <span class="keyword">CHECK</span> (ccredit <span class="keyword">BETWEEN</span> <span class="number">1</span> <span class="keyword">AND</span> <span class="number">4</span>) COMMENT <span class="string">&#x27;学分&#x27;</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="选修课程信息表sc">选修课程信息表sc</h2><table><thead><tr><th>字段名</th><th>字段类型</th><th>约束条件</th><th>字段含义说明</th></tr></thead><tbody><tr><td>sno</td><td>varchar (8)</td><td>Foreign key</td><td>学号</td></tr><tr><td>cno</td><td>varchar (6)</td><td>Foreign key</td><td>课程号</td></tr><tr><td>grade</td><td>integer</td><td>[0…100]</td><td>成绩</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> sc (</span><br><span class="line">    sno <span class="type">VARCHAR</span>(<span class="number">8</span>) COMMENT <span class="string">&#x27;学号&#x27;</span>,</span><br><span class="line">    cno <span class="type">VARCHAR</span>(<span class="number">6</span>) COMMENT <span class="string">&#x27;课程号&#x27;</span>,</span><br><span class="line">    grade <span class="type">INTEGER</span> <span class="keyword">CHECK</span> (grade <span class="keyword">BETWEEN</span> <span class="number">0</span> <span class="keyword">AND</span> <span class="number">100</span>) COMMENT <span class="string">&#x27;成绩&#x27;</span>,</span><br><span class="line">    <span class="keyword">FOREIGN KEY</span> (sno) <span class="keyword">REFERENCES</span> student(sno),</span><br><span class="line">    <span class="keyword">FOREIGN KEY</span> (cno) <span class="keyword">REFERENCES</span> course(cno)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="教师信息表teacher">教师信息表teacher</h2><table><thead><tr><th>字段名</th><th>字段类型</th><th>约束条件</th><th>字段含义说明</th></tr></thead><tbody><tr><td>tno</td><td>Number(6)</td><td>Primary key</td><td>教师号</td></tr><tr><td>tname</td><td>Varchar2(8)</td><td>Not null</td><td>教师姓名</td></tr><tr><td>tsex</td><td>Varchar2(2)</td><td>‘男’或’女’</td><td>性别</td></tr><tr><td>tbirthday</td><td>date</td><td></td><td>出生日期</td></tr><tr><td>ttitle</td><td>Varchar2(20)</td><td></td><td>职称</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> teacher (</span><br><span class="line">    tno <span class="type">INT</span>(<span class="number">6</span>) <span class="keyword">PRIMARY KEY</span> COMMENT <span class="string">&#x27;教师号&#x27;</span>,</span><br><span class="line">    tname <span class="type">VARCHAR</span>(<span class="number">8</span>) <span class="keyword">NOT NULL</span> COMMENT <span class="string">&#x27;教师姓名&#x27;</span>,</span><br><span class="line">    tsex <span class="type">VARCHAR</span>(<span class="number">2</span>) <span class="keyword">CHECK</span> (tsex <span class="keyword">IN</span> (<span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;女&#x27;</span>)) COMMENT <span class="string">&#x27;性别&#x27;</span>,</span><br><span class="line">    tbirthday <span class="type">DATE</span> COMMENT <span class="string">&#x27;出生日期&#x27;</span>,</span><br><span class="line">    ttitle <span class="type">VARCHAR</span>(<span class="number">20</span>) COMMENT <span class="string">&#x27;职称&#x27;</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="教师任课情况表teaching">教师任课情况表teaching</h2><table><thead><tr><th>字段名</th><th>字段类型</th><th>约束条件</th><th>字段含义说明</th></tr></thead><tbody><tr><td>tno</td><td>Number(6)</td><td>Foreign key</td><td>教师号</td></tr><tr><td>cno</td><td>Varchar (6)</td><td>Foreign key</td><td>课程号</td></tr><tr><td>language</td><td>Varchar2 (10)</td><td>Chinese, Bilingual, English</td><td>授课语言</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE TABLE</span> teaching (</span><br><span class="line">    tno <span class="type">INT</span>(<span class="number">6</span>) COMMENT <span class="string">&#x27;教师号&#x27;</span>,</span><br><span class="line">    cno <span class="type">VARCHAR</span>(<span class="number">6</span>) COMMENT <span class="string">&#x27;课程号&#x27;</span>,</span><br><span class="line">    <span class="keyword">language</span> <span class="type">VARCHAR</span>(<span class="number">10</span>) <span class="keyword">CHECK</span> (<span class="keyword">language</span> <span class="keyword">IN</span> (<span class="string">&#x27;Chinese&#x27;</span>, <span class="string">&#x27;Bilingual&#x27;</span>, <span class="string">&#x27;English&#x27;</span>)) COMMENT <span class="string">&#x27;授课语言&#x27;</span>,</span><br><span class="line">    <span class="keyword">FOREIGN KEY</span> (tno) <span class="keyword">REFERENCES</span> teacher(tno),</span><br><span class="line">    <span class="keyword">FOREIGN KEY</span> (cno) <span class="keyword">REFERENCES</span> course(cno)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h1 id="插入数据">插入数据</h1><h2 id="表student">表student</h2><table><thead><tr><th>sno</th><th>sname</th><th>ssex</th><th>sbirthday</th><th>classno</th></tr></thead><tbody><tr><td>08300010</td><td>李在</td><td>男</td><td>1991-10-1</td><td>Rj0801</td></tr><tr><td>08300012</td><td>葛畅</td><td>男</td><td>1990-8-8</td><td>Rj0801</td></tr><tr><td>08300015</td><td>刘晶</td><td>女</td><td>1990-5-22</td><td>Rj0801</td></tr><tr><td>08300020</td><td>杨敏</td><td>女</td><td>1989-1-8</td><td>Rj0801</td></tr><tr><td>08300030</td><td>胡贤斌</td><td>男</td><td>1990-10-8</td><td>Rj0801</td></tr><tr><td>08300048</td><td>赵鸿泽</td><td>男</td><td>1989-6-6</td><td>Rj0802</td></tr><tr><td>08300050</td><td>王威</td><td>男</td><td>1990-6-10</td><td>Rj0802</td></tr><tr><td>08300067</td><td>赵玮</td><td>女</td><td>1990-8-21</td><td>Rj0803</td></tr><tr><td>08300075</td><td>王娜娜</td><td>女</td><td>1991-9-23</td><td>Rj0803</td></tr><tr><td>08300088</td><td>秦键</td><td>男</td><td>1989-3-1</td><td>Rj0803</td></tr><tr><td>08300100</td><td>田邦仪</td><td>女</td><td>1990-2-26</td><td>Rj0804</td></tr><tr><td>08300148</td><td>赵心砚</td><td>男</td><td>1991-4-25</td><td>Rj0805</td></tr><tr><td>08300150</td><td>杨青</td><td>女</td><td>1989-11-15</td><td>Rj0805</td></tr><tr><td>08300160</td><td>杨玲玲</td><td>女</td><td>1990-12-12</td><td>Rj0806</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT INTO</span> student (sno, sname, ssex, sbirthday, classno) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="string">&#x27;08300010&#x27;</span>, <span class="string">&#x27;李在&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1991-10-1&#x27;</span>, <span class="string">&#x27;Rj0801&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300012&#x27;</span>, <span class="string">&#x27;葛畅&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1990-8-8&#x27;</span>, <span class="string">&#x27;Rj0801&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300015&#x27;</span>, <span class="string">&#x27;刘晶&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1990-5-22&#x27;</span>, <span class="string">&#x27;Rj0801&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300020&#x27;</span>, <span class="string">&#x27;杨敏&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1989-1-8&#x27;</span>, <span class="string">&#x27;Rj0801&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300030&#x27;</span>, <span class="string">&#x27;胡贤斌&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1990-10-8&#x27;</span>, <span class="string">&#x27;Rj0801&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300048&#x27;</span>, <span class="string">&#x27;赵鸿泽&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1989-6-6&#x27;</span>, <span class="string">&#x27;Rj0802&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300050&#x27;</span>, <span class="string">&#x27;王威&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1990-6-10&#x27;</span>, <span class="string">&#x27;Rj0802&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300067&#x27;</span>, <span class="string">&#x27;赵玮&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1990-8-21&#x27;</span>, <span class="string">&#x27;Rj0803&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300075&#x27;</span>, <span class="string">&#x27;王娜娜&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1991-9-23&#x27;</span>, <span class="string">&#x27;Rj0803&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300088&#x27;</span>, <span class="string">&#x27;秦键&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1989-3-1&#x27;</span>, <span class="string">&#x27;Rj0803&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300100&#x27;</span>, <span class="string">&#x27;田邦仪&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1990-2-26&#x27;</span>, <span class="string">&#x27;Rj0804&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300148&#x27;</span>, <span class="string">&#x27;赵心砚&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1991-4-25&#x27;</span>, <span class="string">&#x27;Rj0805&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300150&#x27;</span>, <span class="string">&#x27;杨青&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1989-11-15&#x27;</span>, <span class="string">&#x27;Rj0805&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;08300160&#x27;</span>, <span class="string">&#x27;杨玲玲&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1990-12-12&#x27;</span>, <span class="string">&#x27;Rj0806&#x27;</span>);</span><br></pre></td></tr></table></figure><h2 id="表class">表class</h2><table><thead><tr><th>classno</th><th>classname</th><th>Classs-major</th><th>classdept</th><th>studentnumber</th></tr></thead><tbody><tr><td>Rj0801</td><td>软件0801</td><td>软件工程</td><td>软件开发</td><td>24</td></tr><tr><td>Rj0802</td><td>软件0802</td><td>软件工程</td><td>软件开发</td><td>26</td></tr><tr><td>Rj0803</td><td>软件0803</td><td>软件工程</td><td>数字媒体</td><td>25</td></tr><tr><td>Rj0804</td><td>软件0804</td><td>软件工程</td><td>软件开发</td><td>25</td></tr><tr><td>Rj0805</td><td>软件0805</td><td>软件工程</td><td>数字媒体</td><td>24</td></tr><tr><td>Rj0806</td><td>软件0806</td><td>软件工程</td><td>软件开发</td><td>24</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT INTO</span> class (classno, classname, Classs<span class="operator">-</span>major, classdept, studentnumber) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="string">&#x27;Rj0801&#x27;</span>, <span class="string">&#x27;软件0801&#x27;</span>, <span class="string">&#x27;软件工程&#x27;</span>, <span class="string">&#x27;软件开发&#x27;</span>, <span class="number">24</span>),</span><br><span class="line">(<span class="string">&#x27;Rj0802&#x27;</span>, <span class="string">&#x27;软件0802&#x27;</span>, <span class="string">&#x27;软件工程&#x27;</span>, <span class="string">&#x27;软件开发&#x27;</span>, <span class="number">26</span>),</span><br><span class="line">(<span class="string">&#x27;Rj0803&#x27;</span>, <span class="string">&#x27;软件0803&#x27;</span>, <span class="string">&#x27;软件工程&#x27;</span>, <span class="string">&#x27;数字媒体&#x27;</span>, <span class="number">25</span>),</span><br><span class="line">(<span class="string">&#x27;Rj0804&#x27;</span>, <span class="string">&#x27;软件0804&#x27;</span>, <span class="string">&#x27;软件工程&#x27;</span>, <span class="string">&#x27;软件开发&#x27;</span>, <span class="number">25</span>),</span><br><span class="line">(<span class="string">&#x27;Rj0805&#x27;</span>, <span class="string">&#x27;软件0805&#x27;</span>, <span class="string">&#x27;软件工程&#x27;</span>, <span class="string">&#x27;数字媒体&#x27;</span>, <span class="number">24</span>),</span><br><span class="line">(<span class="string">&#x27;Rj0806&#x27;</span>, <span class="string">&#x27;软件0806&#x27;</span>, <span class="string">&#x27;软件工程&#x27;</span>, <span class="string">&#x27;软件开发&#x27;</span>, <span class="number">24</span>);</span><br></pre></td></tr></table></figure><h2 id="表course">表course</h2><table><thead><tr><th>cno</th><th>cname</th><th>credit</th></tr></thead><tbody><tr><td>800001</td><td>计算机基础</td><td>4</td></tr><tr><td>800002</td><td>程序设计语言</td><td>4</td></tr><tr><td>800003</td><td>数据结构</td><td>4</td></tr><tr><td>810011</td><td>数据库系统</td><td>4</td></tr><tr><td>810013</td><td>计算机网络</td><td>3</td></tr><tr><td>810015</td><td>微机原理与应用</td><td>4</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT INTO</span> course (cno, cname, credit) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="number">800001</span>, <span class="string">&#x27;计算机基础&#x27;</span>, <span class="number">4</span>),</span><br><span class="line">(<span class="number">800002</span>, <span class="string">&#x27;程序设计语言&#x27;</span>, <span class="number">4</span>),</span><br><span class="line">(<span class="number">800003</span>, <span class="string">&#x27;数据结构&#x27;</span>, <span class="number">4</span>),</span><br><span class="line">(<span class="number">810011</span>, <span class="string">&#x27;数据库系统&#x27;</span>, <span class="number">4</span>),</span><br><span class="line">(<span class="number">810013</span>, <span class="string">&#x27;计算机网络&#x27;</span>, <span class="number">3</span>),</span><br><span class="line">(<span class="number">810015</span>, <span class="string">&#x27;微机原理与应用&#x27;</span>, <span class="number">4</span>);</span><br></pre></td></tr></table></figure><h2 id="表sc">表sc</h2><table><thead><tr><th>sno</th><th>cno</th><th>grade</th></tr></thead><tbody><tr><td>08300012</td><td>800003</td><td>88</td></tr><tr><td>08300015</td><td>800003</td><td></td></tr><tr><td>08300020</td><td>800003</td><td>91</td></tr><tr><td>08300030</td><td>800003</td><td>78</td></tr><tr><td>08300048</td><td>800003</td><td>95</td></tr><tr><td>08300100</td><td>810011</td><td>67</td></tr><tr><td>08300148</td><td>810011</td><td>58</td></tr><tr><td>08300150</td><td>810011</td><td>89</td></tr><tr><td>08300160</td><td>810011</td><td>71</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT INTO</span> sc (sno, cno, grade) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="string">&#x27;08300012&#x27;</span>, <span class="number">800003</span>, <span class="number">88</span>),</span><br><span class="line">(<span class="string">&#x27;08300015&#x27;</span>, <span class="number">800003</span>, <span class="keyword">NULL</span>),</span><br><span class="line">(<span class="string">&#x27;08300020&#x27;</span>, <span class="number">800003</span>, <span class="number">91</span>),</span><br><span class="line">(<span class="string">&#x27;08300030&#x27;</span>, <span class="number">800003</span>, <span class="number">78</span>),</span><br><span class="line">(<span class="string">&#x27;08300048&#x27;</span>, <span class="number">800003</span>, <span class="number">95</span>),</span><br><span class="line">(<span class="string">&#x27;08300100&#x27;</span>, <span class="number">810011</span>, <span class="number">67</span>),</span><br><span class="line">(<span class="string">&#x27;08300148&#x27;</span>, <span class="number">810011</span>, <span class="number">58</span>),</span><br><span class="line">(<span class="string">&#x27;08300150&#x27;</span>, <span class="number">810011</span>, <span class="number">89</span>),</span><br><span class="line">(<span class="string">&#x27;08300160&#x27;</span>, <span class="number">810011</span>, <span class="number">71</span>);</span><br></pre></td></tr></table></figure><h2 id="表teacher">表teacher</h2><table><thead><tr><th>tno</th><th>tname</th><th>tsex</th><th>tbirthday</th><th>ttitle</th></tr></thead><tbody><tr><td>000001</td><td>李英</td><td>女</td><td>1975-11-3</td><td>讲师</td></tr><tr><td>000002</td><td>王大山</td><td>男</td><td>1969-3-2</td><td>副教授</td></tr><tr><td>000003</td><td>张朋</td><td>男</td><td>1970-2-13</td><td>讲师</td></tr><tr><td>000004</td><td>陈为军</td><td>男</td><td>1985-8-14</td><td>助教</td></tr><tr><td>000005</td><td>宋浩然</td><td>男</td><td>1976-4-23</td><td>讲师</td></tr><tr><td>000006</td><td>许红霞</td><td>女</td><td>1966-2-12</td><td>副教授</td></tr><tr><td>000007</td><td>徐永军</td><td>男</td><td>1962-1-24</td><td>教授</td></tr><tr><td>000008</td><td>李桂菁</td><td>女</td><td>1960-12-15</td><td>教授</td></tr><tr><td>000009</td><td>王一凡</td><td>女</td><td>1974-12-8</td><td>讲师</td></tr><tr><td>000010</td><td>田峰</td><td>男</td><td>1988-1-18</td><td>助教</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT INTO</span> teacher (tno, tname, tsex, tbirthday, ttitle) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="string">&#x27;000001&#x27;</span>, <span class="string">&#x27;李英&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1975-11-3&#x27;</span>, <span class="string">&#x27;讲师&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000002&#x27;</span>, <span class="string">&#x27;王大山&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1969-3-2&#x27;</span>, <span class="string">&#x27;副教授&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000003&#x27;</span>, <span class="string">&#x27;张朋&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1970-2-13&#x27;</span>, <span class="string">&#x27;讲师&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000004&#x27;</span>, <span class="string">&#x27;陈为军&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1985-8-14&#x27;</span>, <span class="string">&#x27;助教&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000005&#x27;</span>, <span class="string">&#x27;宋浩然&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1976-4-23&#x27;</span>, <span class="string">&#x27;讲师&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000006&#x27;</span>, <span class="string">&#x27;许红霞&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1966-2-12&#x27;</span>, <span class="string">&#x27;副教授&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000007&#x27;</span>, <span class="string">&#x27;徐永军&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1962-1-24&#x27;</span>, <span class="string">&#x27;教授&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000008&#x27;</span>, <span class="string">&#x27;李桂菁&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1960-12-15&#x27;</span>, <span class="string">&#x27;教授&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000009&#x27;</span>, <span class="string">&#x27;王一凡&#x27;</span>, <span class="string">&#x27;女&#x27;</span>, <span class="string">&#x27;1974-12-8&#x27;</span>, <span class="string">&#x27;讲师&#x27;</span>),</span><br><span class="line">(<span class="string">&#x27;000010&#x27;</span>, <span class="string">&#x27;田峰&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;1988-1-18&#x27;</span>, <span class="string">&#x27;助教&#x27;</span>);</span><br></pre></td></tr></table></figure><h2 id="表teaching">表teaching</h2><table><thead><tr><th>cno</th><th>tno</th><th>Language</th></tr></thead><tbody><tr><td>800001</td><td>000001</td><td>English</td></tr><tr><td>800002</td><td>000002</td><td>Chinese</td></tr><tr><td>800003</td><td>000002</td><td>Bilingual</td></tr><tr><td>810011</td><td>000003</td><td>Chinese</td></tr><tr><td>810013</td><td>000004</td><td>English</td></tr><tr><td>800001</td><td>000005</td><td>Chinese</td></tr><tr><td>800002</td><td>000006</td><td>Chinese</td></tr><tr><td>800003</td><td>000007</td><td>English</td></tr><tr><td>810011</td><td>000007</td><td>English</td></tr><tr><td>810013</td><td>000008</td><td>Bilingual</td></tr></tbody></table><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">INSERT INTO</span> teaching (cno, tno, <span class="keyword">language</span>) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="number">800001</span>, <span class="number">1</span>, <span class="string">&#x27;English&#x27;</span>),</span><br><span class="line">(<span class="number">800002</span>, <span class="number">2</span>, <span class="string">&#x27;Chinese&#x27;</span>),</span><br><span class="line">(<span class="number">800003</span>, <span class="number">2</span>, <span class="string">&#x27;Bilingual&#x27;</span>),</span><br><span class="line">(<span class="number">810011</span>, <span class="number">3</span>, <span class="string">&#x27;Chinese&#x27;</span>),</span><br><span class="line">(<span class="number">810013</span>, <span class="number">4</span>, <span class="string">&#x27;English&#x27;</span>),</span><br><span class="line">(<span class="number">800001</span>, <span class="number">5</span>, <span class="string">&#x27;Chinese&#x27;</span>),</span><br><span class="line">(<span class="number">800002</span>, <span class="number">6</span>, <span class="string">&#x27;Chinese&#x27;</span>),</span><br><span class="line">(<span class="number">800003</span>, <span class="number">7</span>, <span class="string">&#x27;English&#x27;</span>),</span><br><span class="line">(<span class="number">810011</span>, <span class="number">7</span>, <span class="string">&#x27;English&#x27;</span>),</span><br><span class="line">(<span class="number">810013</span>, <span class="number">8</span>, <span class="string">&#x27;Bilingual&#x27;</span>);</span><br></pre></td></tr></table></figure><h1 id="简单的数据操作">简单的数据操作</h1><h2 id="1">1</h2><ul><li>[x] 查询所有同学的所有基本信息。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> student;</span><br></pre></td></tr></table></figure><h2 id="2">2</h2><ul><li>[x] 查询所有男同学的学号、姓名、出生日期。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sno, sname, sbirthday <span class="keyword">FROM</span> student <span class="keyword">WHERE</span> ssex <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="3">3</h2><ul><li>[x] 在基本表 <code>student</code> 中增加 <code>addr</code>：<code>varchar(20)</code> 列，然后将其长度由 20 改为 25。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER TABLE</span> student <span class="keyword">ADD</span> <span class="keyword">COLUMN</span> addr <span class="type">VARCHAR</span>(<span class="number">20</span>) comment &quot;地址&quot;;     <span class="comment">-- 添加</span></span><br><span class="line"><span class="keyword">ALTER TABLE</span> student MODIFY <span class="keyword">COLUMN</span> addr <span class="type">VARCHAR</span>(<span class="number">25</span>) comment &quot;地址&quot;;  <span class="comment">-- 修改</span></span><br><span class="line"><span class="keyword">ALTER TABLE</span> student <span class="keyword">DROP</span> <span class="keyword">COLUMN</span> addr;   <span class="comment">-- 删除</span></span><br></pre></td></tr></table></figure><h2 id="4">4</h2><ul><li>[x] 在基本表 <code>student</code> 中增加 <code>register_date</code>：<code>date</code> 列，并为其设置默认值为当前系统时间，再删除该列。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER TABLE</span> student <span class="keyword">ADD</span> register_date DATETIME <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> COMMENT <span class="string">&#x27;日期&#x27;</span>;</span><br><span class="line"><span class="keyword">ALTER TABLE</span> student <span class="keyword">DROP</span> <span class="keyword">COLUMN</span> register_date;</span><br></pre></td></tr></table></figure><h2 id="5">5</h2><ul><li>[x] 在基本表 <code>student</code> 中为 <code>age</code> 列，增加默认值为 <code>18</code>。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER TABLE</span> student MODIFY <span class="keyword">COLUMN</span> age <span class="type">INT</span> <span class="keyword">DEFAULT</span> <span class="number">18</span>;</span><br></pre></td></tr></table></figure><h2 id="6">6</h2><ul><li>[x] 在基本表 sc 中将 sname 设置为唯一值（unique）。（应该是student表）</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER TABLE</span> sc <span class="keyword">ADD CONSTRAINT</span> unique_sname <span class="keyword">UNIQUE</span> (sname);</span><br><span class="line"><span class="keyword">ALTER TABLE</span> sc <span class="keyword">ADD CONSTRAINT</span> unique_sname <span class="keyword">UNIQUE</span> (sname); <span class="comment">-- 删除唯一索引</span></span><br></pre></td></tr></table></figure><h2 id="7">7</h2><ul><li>[x] 在基本表 course 中创建索引：（sno，cno desc）。（应该是sc表）</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> INDEX idx_sno_cno_desc <span class="keyword">ON</span> course (sno, cno <span class="keyword">DESC</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除受到外键影响</span></span><br></pre></td></tr></table></figure><h2 id="8">8</h2><ul><li>[x] 在基本表 student 中增加约束条件：男生年龄小于 23 岁，女生年龄小于 21 岁。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER TABLE</span> student CHANGE sbirthday sage <span class="type">INT</span>;</span><br><span class="line"><span class="keyword">ALTER TABLE</span> student <span class="keyword">ADD CONSTRAINT</span> check_age <span class="keyword">CHECK</span> (</span><br><span class="line">    (ssex <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span> <span class="keyword">AND</span> sage <span class="operator">&lt;</span> <span class="number">23</span>) <span class="keyword">OR</span></span><br><span class="line">    (ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span> <span class="keyword">AND</span> sage <span class="operator">&lt;</span> <span class="number">21</span>)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="9">9</h2><ul><li>[x] 创建视图 View_80，存放成绩高于 80 分的选课信息，显示学号、课程号和成绩，使用 WITH CHECK OPTION 选项。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> View_80 <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> grade <span class="operator">&gt;</span> <span class="number">80</span></span><br><span class="line"><span class="keyword">WITH</span> <span class="keyword">CHECK</span> OPTION;</span><br></pre></td></tr></table></figure><h2 id="10">10</h2><ul><li>[x] 在视图 View_80 中查询成绩高于 90 的选课信息。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> View_80 <span class="keyword">WHERE</span> grade <span class="operator">&gt;</span> <span class="number">90</span>;</span><br></pre></td></tr></table></figure><h2 id="11">11</h2><ul><li>[x] 在视图 View_80 中依次插入如下元组：08301168，810011，87（可插入成功）</li></ul><p>这个错误是由于外键约束导致的。在尝试向View_80视图插入数据时，MySQL检查了sc表的外键约束sc_ibfk_1。这个约束要求，sc表中的sno字段的值必须在student表的sno字段的值中存在。换句话说，你不能为一个不存在的学生分配成绩。</p><p>错误信息表明，你尝试插入的sno值（‘08301168’）在student表中不存在。你需要先确保student表中存在这个学生号，然后再尝试插入数据。</p><p>你可以使用以下SQL查询来检查student表中是否存在这个学生号：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> student <span class="keyword">WHERE</span> sno <span class="operator">=</span> <span class="string">&#x27;08301168&#x27;</span>;</span><br></pre></td></tr></table></figure><p>如果这个查询没有返回任何结果，那么你需要先向student表中插入这个学生号，然后再尝试向View_80插入数据。</p><h2 id="12">12</h2><ul><li>[x] 在视图 View_80 中依次修改如下元组：将（08301168，810011）所对应的成绩改为 90（可修改成功）</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> View_80 <span class="keyword">SET</span> grade <span class="operator">=</span> <span class="number">90</span> <span class="keyword">WHERE</span> sno <span class="operator">=</span> <span class="string">&#x27;08301168&#x27;</span> <span class="keyword">AND</span> cno <span class="operator">=</span> <span class="string">&#x27;810011&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="13">13</h2><ul><li>[x] 在视图 View_80 中删除如下元组：sno=08301168，cno=810011</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> View_80 <span class="keyword">WHERE</span> sno <span class="operator">=</span> <span class="string">&#x27;08301168&#x27;</span> <span class="keyword">AND</span> cno <span class="operator">=</span> <span class="string">&#x27;810011&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="14">14</h2><ul><li>[x] 查询所有在“1980-01-01”之前出生的女同学的学号、姓名、性别、出生日期。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sno, sname, ssex, sbirthday </span><br><span class="line"><span class="keyword">FROM</span> student </span><br><span class="line"><span class="keyword">WHERE</span> sbirthday <span class="operator">&lt;</span> <span class="string">&#x27;1980-01-01&#x27;</span> <span class="keyword">AND</span> ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="15">15</h2><ul><li>[x] 查询所有姓“李”的男同学的学号、姓名、性别、出生日期。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sno, sname, ssex, sbirthday </span><br><span class="line"><span class="keyword">FROM</span> student </span><br><span class="line"><span class="keyword">WHERE</span> sname <span class="keyword">LIKE</span> <span class="string">&#x27;李%&#x27;</span> <span class="keyword">AND</span> ssex <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="16">16</h2><ul><li>[x] 查询所有用英文授课的教师号、姓名及英语授课的门数。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> t.tno, t.tname, <span class="built_in">COUNT</span>(te.cno) <span class="keyword">AS</span> <span class="string">&#x27;英语授课的门数&#x27;</span></span><br><span class="line"><span class="keyword">FROM</span> teacher t</span><br><span class="line"><span class="keyword">JOIN</span> teaching te <span class="keyword">ON</span> t.tno <span class="operator">=</span> te.tno</span><br><span class="line"><span class="keyword">WHERE</span> te.language <span class="operator">=</span> <span class="string">&#x27;English&#x27;</span></span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> t.tno, t.tname;</span><br></pre></td></tr></table></figure><h2 id="17">17</h2><ul><li>[x] 查询所有职称不是“讲师”的教师号、姓名、职称。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> tno, tname, ttitle </span><br><span class="line"><span class="keyword">FROM</span> teacher </span><br><span class="line"><span class="keyword">WHERE</span> ttitle <span class="operator">&lt;&gt;</span> <span class="string">&#x27;讲师&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> tno, tname, ttitle </span><br><span class="line"><span class="keyword">FROM</span> teacher </span><br><span class="line"><span class="keyword">WHERE</span> ttitle <span class="operator">!=</span> <span class="string">&#x27;讲师&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="18">18</h2><ul><li>[x] 查询虽然选修了课程，但未参加考试的所有同学的学号。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> sno </span><br><span class="line"><span class="keyword">from</span> sc </span><br><span class="line"><span class="keyword">where</span> grade <span class="keyword">is</span> <span class="keyword">null</span>;</span><br></pre></td></tr></table></figure><h2 id="19">19</h2><ul><li>[x] 查询所有考试不及格的同学的学号、成绩，并按成绩降序排列。（降序desc升序asc并且默认为升序）</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sno, grade </span><br><span class="line"><span class="keyword">FROM</span> sc </span><br><span class="line"><span class="keyword">WHERE</span> grade <span class="operator">&lt;</span> <span class="number">60</span> </span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> grade <span class="keyword">DESC</span>;</span><br></pre></td></tr></table></figure><h2 id="20">20</h2><ul><li>[x] 查询在1970年出生的教师号、姓名、出生日期。（也可以改成月份和年份）</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> tno, tname, tbirthday </span><br><span class="line"><span class="keyword">FROM</span> teacher </span><br><span class="line"><span class="keyword">WHERE</span> <span class="keyword">YEAR</span>(tbirthday) <span class="operator">=</span> <span class="number">1970</span>;</span><br></pre></td></tr></table></figure><h2 id="21">21</h2><ul><li>[x] 查询各个课程号的选课人数。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> cno, <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">AS</span> student_count</span><br><span class="line"><span class="keyword">FROM</span> sc</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> cno;</span><br></pre></td></tr></table></figure><h2 id="22">22</h2><ul><li>[x] 查询讲授2门课以上的教师号。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> tno</span><br><span class="line"><span class="keyword">FROM</span> teaching</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> tno</span><br><span class="line"><span class="keyword">HAVING</span> <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="operator">&gt;=</span> <span class="number">2</span>;</span><br></pre></td></tr></table></figure><h2 id="23">23</h2><ul><li>[x] 查询选修了 800001 课程的学生平均分数、最低分数和最高分数。（此处课程号应为810011）</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="built_in">avg</span>(grade), <span class="built_in">min</span>(grade), <span class="built_in">max</span>(grade)</span><br><span class="line"><span class="keyword">from</span> sc</span><br><span class="line"><span class="keyword">where</span> cno <span class="operator">=</span> <span class="string">&#x27;810011&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="24">24</h2><ul><li>[x] 查询1960年以后出生的，职称为讲师的教师的姓名、出生日期，并按出生日期升序排列。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> tname, tbirthday </span><br><span class="line"><span class="keyword">FROM</span> teacher </span><br><span class="line"><span class="keyword">WHERE</span> ttitle <span class="operator">=</span> <span class="string">&#x27;讲师&#x27;</span> <span class="keyword">AND</span> tbirthday <span class="operator">&gt;</span> <span class="string">&#x27;1960-01-01&#x27;</span> </span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> tbirthday <span class="keyword">ASC</span>;</span><br></pre></td></tr></table></figure><h1 id="复杂数据查询-3问题">复杂数据查询 3问题</h1><h2 id="1-2">1</h2><ul><li>[x] （1）创建视图 new_View 显示所有同学的选课及成绩情况，列出学生的学号、姓名、班号、课程名称和成绩。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 查看当前数据库中的所有视图</span></span><br><span class="line"><span class="keyword">SHOW</span> <span class="keyword">FULL</span> TABLES <span class="keyword">IN</span> your_database_name <span class="keyword">WHERE</span> TABLE_TYPE <span class="keyword">LIKE</span> <span class="string">&#x27;VIEW&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除视图</span></span><br><span class="line"><span class="keyword">DROP</span> <span class="keyword">VIEW</span> view_you_create;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- AS关键字于定义视图结构</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">VIEW</span> new_View <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> s.sno, s.sname, s.classno, c.cname, sc.grade</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">JOIN</span> course c <span class="keyword">ON</span> sc.cno <span class="operator">=</span> c.cno;</span><br></pre></td></tr></table></figure><h2 id="2-2">2</h2><ul><li>[x] （2）在视图 new_View 中查询“软件0801”班的同学的选课及成绩情况，显示学号、姓名、课程名称、成绩。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sno, sname, cname, grade</span><br><span class="line"><span class="keyword">FROM</span> new_View</span><br><span class="line"><span class="keyword">WHERE</span> classno <span class="operator">=</span> <span class="string">&#x27;Rj0801&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="3-2">3</h2><ul><li>[x] （3）在视图 new_View 中插入如下元组：08300010，李在，R,j0801，数据库系统，88（此为不成功的操作）</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">```</span><br><span class="line">## <span class="number">4</span></span><br><span class="line"><span class="operator">-</span> [x] （<span class="number">4</span>）查询所有同学的学分情况（假设课程成绩<span class="operator">&gt;=</span><span class="number">60</span>时可获得该门课程的学分），显示学号、姓名、总学分（用 <span class="keyword">JOIN</span>）。</span><br><span class="line">```<span class="keyword">SQL</span></span><br><span class="line"><span class="keyword">SELECT</span> s.sno, s.sname, <span class="built_in">SUM</span>(IF(sc.grade <span class="operator">&gt;=</span> <span class="number">60</span>, c.ccredit, <span class="number">0</span>)) <span class="keyword">AS</span> total_credit</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> course c <span class="keyword">ON</span> sc.cno <span class="operator">=</span> c.cno</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> s.sno, s.sname;</span><br></pre></td></tr></table></figure><h2 id="5-2">5</h2><ul><li>[x] （5）查询所有同学的平均成绩及选课门数，显示学号、姓名、平均成绩、选课门数。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> s.sno, s.sname, <span class="built_in">AVG</span>(sc.grade) <span class="keyword">AS</span> avg_grade, <span class="built_in">COUNT</span>(sc.cno) <span class="keyword">AS</span> course_count</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">LEFT</span> <span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> s.sno, s.sname;</span><br></pre></td></tr></table></figure><h2 id="6-2">6</h2><ul><li>[x] （6）查询所有选修了课程但未参加考试的所有同学及相应的课程，显示学号、姓名、课程号、课程名称。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> s.sno, s.sname, sc.cno, c.cname</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">JOIN</span> course c <span class="keyword">ON</span> sc.cno <span class="operator">=</span> c.cno</span><br><span class="line"><span class="keyword">WHERE</span> sc.grade <span class="keyword">IS</span> <span class="keyword">NULL</span>;</span><br></pre></td></tr></table></figure><h2 id="7-2">7</h2><ul><li>[x] （7）查询所有选修了课程但考试不及格的所有同学及相应的课程，显示学号、姓名、课程号、课程名称、成绩。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> s.sno, s.sname, sc.cno, c.cname, sc.grade</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">JOIN</span> course c <span class="keyword">ON</span> sc.cno <span class="operator">=</span> c.cno</span><br><span class="line"><span class="keyword">WHERE</span> sc.grade <span class="operator">&lt;</span> <span class="number">60</span>;</span><br></pre></td></tr></table></figure><h2 id="8-2">8</h2><ul><li>[x] （8）查询选修了课程名为“程序设计语言”的所有同学及成绩情况，显示学生姓名、课程成绩（用 ANY 运算符）。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> s.sname, sc.grade</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">WHERE</span> sc.cno <span class="operator">=</span> <span class="keyword">ANY</span> (<span class="keyword">SELECT</span> cno <span class="keyword">FROM</span> course <span class="keyword">WHERE</span> cname <span class="operator">=</span> <span class="string">&#x27;程序设计语言&#x27;</span>);</span><br></pre></td></tr></table></figure><h2 id="9-2">9</h2><ul><li>[x] （9）查询“软件开发系”的所有同学及成绩情况，显示学号、姓名、班级名称、课程号、课程名称、成绩。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> s.sno, s.sname, cl.classname, sc.cno, c.cname, sc.grade</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">JOIN</span> course c <span class="keyword">ON</span> sc.cno <span class="operator">=</span> c.cno</span><br><span class="line"><span class="keyword">JOIN</span> class cl <span class="keyword">ON</span> s.classno <span class="operator">=</span> cl.classno</span><br><span class="line"><span class="keyword">WHERE</span> cl.classdept <span class="operator">=</span> <span class="string">&#x27;软件开发&#x27;</span>;</span><br></pre></td></tr></table></figure><h1 id="10-2">10</h1><ul><li>[x] （10）查询所有教师的任课情况，显示教师姓名、课程名称。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> t.tname, c.cname</span><br><span class="line"><span class="keyword">FROM</span> teacher t</span><br><span class="line"><span class="keyword">JOIN</span> teaching tc <span class="keyword">ON</span> t.tno <span class="operator">=</span> tc.tno</span><br><span class="line"><span class="keyword">JOIN</span> course c <span class="keyword">ON</span> tc.cno <span class="operator">=</span> c.cno;</span><br></pre></td></tr></table></figure><h2 id="11-2">11</h2><ul><li>[x] （11）查询成绩低于同门课程平均成绩的信息，显示学生学号、姓名、课程名称及低于平均成绩的值（即比平均成绩低多少）。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line">    student.sno <span class="keyword">AS</span> <span class="string">&#x27;学号&#x27;</span>,</span><br><span class="line">    student.sname <span class="keyword">AS</span> <span class="string">&#x27;姓名&#x27;</span>,</span><br><span class="line">    course.cname <span class="keyword">AS</span> <span class="string">&#x27;课程名称&#x27;</span>,</span><br><span class="line">    (avg_grade <span class="operator">-</span> sc.grade) <span class="keyword">AS</span> <span class="string">&#x27;低于平均成绩的值&#x27;</span></span><br><span class="line"><span class="keyword">FROM</span> student </span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> student.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">JOIN</span> course <span class="keyword">ON</span> sc.cno <span class="operator">=</span> course.cno</span><br><span class="line"><span class="keyword">JOIN</span> (<span class="keyword">SELECT</span> cno, <span class="built_in">AVG</span>(grade) <span class="keyword">AS</span> avg_grade <span class="keyword">FROM</span> sc <span class="keyword">GROUP</span> <span class="keyword">BY</span> cno) <span class="keyword">AS</span> avg_sc <span class="keyword">ON</span> sc.cno <span class="operator">=</span> avg_sc.cno</span><br><span class="line"><span class="keyword">WHERE</span> sc.grade <span class="operator">&lt;</span> avg_sc.avg_grade;</span><br></pre></td></tr></table></figure><h2 id="12-2">12</h2><ul><li>[x] （12）查询和“葛畅”在同一班级的同学的姓名（使用子查询）。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> classno <span class="operator">=</span> (<span class="keyword">SELECT</span> classno <span class="keyword">FROM</span> student <span class="keyword">WHERE</span> sname <span class="operator">=</span> <span class="string">&#x27;葛畅&#x27;</span>);</span><br></pre></td></tr></table></figure><h2 id="13-2">13</h2><ul><li>[x] （13）查询没有选修“计算机基础”课程的学生姓名（用 NOT EXISTS）。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">WHERE</span> <span class="keyword">NOT</span> <span class="keyword">EXISTS</span> (<span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> s.sno <span class="operator">=</span> sc.sno <span class="keyword">AND</span> sc.cno <span class="operator">=</span> <span class="string">&#x27;800001&#x27;</span>);</span><br></pre></td></tr></table></figure><h2 id="14-2">14</h2><ul><li>[x] （14）查询主讲“数据库系统”和主讲“数据结构”的教师姓名（用 UNION）。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> tname</span><br><span class="line"><span class="keyword">FROM</span> teacher</span><br><span class="line"><span class="keyword">WHERE</span> tno <span class="keyword">IN</span> (<span class="keyword">SELECT</span> tno <span class="keyword">FROM</span> teaching <span class="keyword">WHERE</span> cno <span class="keyword">IN</span> (<span class="keyword">SELECT</span> cno <span class="keyword">FROM</span> course <span class="keyword">WHERE</span> cname <span class="operator">=</span> <span class="string">&#x27;数据库系统&#x27;</span>))</span><br><span class="line"></span><br><span class="line"><span class="keyword">UNION</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> tname</span><br><span class="line"><span class="keyword">FROM</span> teacher</span><br><span class="line"><span class="keyword">WHERE</span> tno <span class="keyword">IN</span> (<span class="keyword">SELECT</span> tno <span class="keyword">FROM</span> teaching <span class="keyword">WHERE</span> cno <span class="keyword">IN</span> (<span class="keyword">SELECT</span> cno <span class="keyword">FROM</span> course <span class="keyword">WHERE</span> cname <span class="operator">=</span> <span class="string">&#x27;数据结构&#x27;</span>));</span><br></pre></td></tr></table></figure><h2 id="15-2">15</h2><ul><li>[x] （15）查询讲授了所有课程的教师的姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> tname</span><br><span class="line"><span class="keyword">FROM</span> teacher</span><br><span class="line"><span class="keyword">WHERE</span> tno <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> tno</span><br><span class="line">    <span class="keyword">FROM</span> teaching</span><br><span class="line">    <span class="keyword">GROUP</span> <span class="keyword">BY</span> tno</span><br><span class="line">    <span class="keyword">HAVING</span> <span class="built_in">COUNT</span>(<span class="keyword">DISTINCT</span> cno</span><br><span class="line"></span><br><span class="line">) <span class="operator">=</span> (<span class="keyword">SELECT</span> <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">FROM</span> course)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="16-2">16</h2><ul><li>[x] （16）查询同时选修学课程800001和800002的女同学的姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc sc1 <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc1.sno <span class="keyword">AND</span> sc1.cno <span class="operator">=</span> <span class="string">&#x27;800001&#x27;</span></span><br><span class="line"><span class="keyword">JOIN</span> sc sc2 <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc2.sno <span class="keyword">AND</span> sc2.cno <span class="operator">=</span> <span class="string">&#x27;800002&#x27;</span></span><br><span class="line"><span class="keyword">WHERE</span> s.ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="17-2">17</h2><ul><li>[x] （17）查询既未选修课程800001又未选修课程800002的学生姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> sno <span class="keyword">NOT</span> <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> cno <span class="operator">=</span> <span class="string">&#x27;800001&#x27;</span></span><br><span class="line">) <span class="keyword">AND</span> sno <span class="keyword">NOT</span> <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> cno <span class="operator">=</span> <span class="string">&#x27;800002&#x27;</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="18-2">18</h2><ul><li>[x] （18）查询有一门课程成绩为95分的女同学的姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">WHERE</span> s.ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span> <span class="keyword">AND</span> sc.grade <span class="operator">=</span> <span class="number">95</span>;</span><br></pre></td></tr></table></figure><h2 id="19-2">19</h2><ul><li>[x] （19）查询选课数量大于3门的女同学的姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno, <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">AS</span> course_count</span><br><span class="line">    <span class="keyword">FROM</span> sc</span><br><span class="line">    <span class="keyword">GROUP</span> <span class="keyword">BY</span> sno</span><br><span class="line">) <span class="keyword">AS</span> course_counts</span><br><span class="line"><span class="keyword">JOIN</span> student <span class="keyword">ON</span> course_counts.sno <span class="operator">=</span> student.sno</span><br><span class="line"><span class="keyword">WHERE</span> ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span> <span class="keyword">AND</span> course_count <span class="operator">&gt;</span> <span class="number">3</span>;</span><br></pre></td></tr></table></figure><h2 id="20-2">20</h2><ul><li>[x] （20）查询平均成绩大于80分的男同学的姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line">    student.sname <span class="keyword">AS</span> <span class="string">&#x27;姓名&#x27;</span></span><br><span class="line"><span class="keyword">FROM</span> student </span><br><span class="line"><span class="keyword">JOIN</span> (<span class="keyword">SELECT</span> sno, <span class="built_in">AVG</span>(grade) <span class="keyword">AS</span> avg_grade <span class="keyword">FROM</span> sc <span class="keyword">GROUP</span> <span class="keyword">BY</span> sno) <span class="keyword">AS</span> avg_sc <span class="keyword">ON</span> student.sno <span class="operator">=</span> avg_sc.sno</span><br><span class="line"><span class="keyword">WHERE</span> avg_sc.avg_grade <span class="operator">&gt;</span> <span class="number">80</span> <span class="keyword">AND</span> student.ssex <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="21-2">21</h2><ul><li>[x] （21）查询徐永军老师所教的每一门课程的平均成绩。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> c.cname, <span class="built_in">AVG</span>(sc.grade) <span class="keyword">AS</span> avg_grade</span><br><span class="line"><span class="keyword">FROM</span> teaching t</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> t.cno <span class="operator">=</span> sc.cno</span><br><span class="line"><span class="keyword">JOIN</span> course c <span class="keyword">ON</span> t.cno <span class="operator">=</span> c.cno</span><br><span class="line"><span class="keyword">WHERE</span> t.tno <span class="operator">=</span> <span class="string">&#x27;000007&#x27;</span></span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> c.cname;</span><br></pre></td></tr></table></figure><h2 id="22-2">22</h2><ul><li>[x] （22）查询男同学每一个年龄组的人数，要求按人数升序输出人数超过20人的年龄组。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="built_in">FLOOR</span>((<span class="keyword">YEAR</span>(<span class="built_in">CURRENT_DATE</span>) <span class="operator">-</span> <span class="keyword">YEAR</span>(sbirthday)) <span class="operator">/</span> <span class="number">10</span>) <span class="keyword">AS</span> age_group, <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">AS</span> student_count</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> ssex <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span></span><br><span class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> age_group</span><br><span class="line"><span class="keyword">HAVING</span> student_count <span class="operator">&gt;</span> <span class="number">20</span></span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> student_count <span class="keyword">ASC</span>;</span><br></pre></td></tr></table></figure><h2 id="23-2">23</h2><ul><li>[x] （23）查询每门课程成绩都大于90分的学生姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">WHERE</span> <span class="keyword">NOT</span> <span class="keyword">EXISTS</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> <span class="operator">*</span></span><br><span class="line">    <span class="keyword">FROM</span> course c</span><br><span class="line">    <span class="keyword">WHERE</span> <span class="keyword">NOT</span> <span class="keyword">EXISTS</span> (</span><br><span class="line">        <span class="keyword">SELECT</span> <span class="operator">*</span></span><br><span class="line">        <span class="keyword">FROM</span> sc</span><br><span class="line">        <span class="keyword">WHERE</span> s.sno <span class="operator">=</span> sc.sno <span class="keyword">AND</span> c.cno <span class="operator">=</span> sc.cno <span class="keyword">AND</span> grade <span class="operator">&gt;</span> <span class="number">90</span></span><br><span class="line">    )</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="24-2">24</h2><ul><li>[x] （24）查询比所有女同学年龄要大的男同学的姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> ssex <span class="operator">=</span> <span class="string">&#x27;男&#x27;</span> <span class="keyword">AND</span> <span class="keyword">YEAR</span>(sbirthday) <span class="operator">&lt;</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> <span class="built_in">MIN</span>(<span class="keyword">YEAR</span>(sbirthday))</span><br><span class="line">    <span class="keyword">FROM</span> student</span><br><span class="line">    <span class="keyword">WHERE</span> ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="25">25</h2><ul><li>[x] （25）查询未选修 800002 课程的女同学的姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span> <span class="keyword">AND</span> sno <span class="keyword">NOT</span> <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> cno <span class="operator">=</span> <span class="string">&#x27;800002&#x27;</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="26">26</h2><ul><li>[x] （26）查询所有课程成绩都及格的学生姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> sno <span class="keyword">NOT</span> <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno</span><br><span class="line">    <span class="keyword">FROM</span> sc</span><br><span class="line">    <span class="keyword">WHERE</span> grade <span class="operator">&lt;</span> <span class="number">60</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="27">27</h2><ul><li>[x] （27）查询选修课所有课程的学生姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> sno <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno</span><br><span class="line">    <span class="keyword">FROM</span> sc</span><br><span class="line">    <span class="keyword">GROUP</span> <span class="keyword">BY</span> sno</span><br><span class="line">    <span class="keyword">HAVING</span> <span class="built_in">COUNT</span>(<span class="keyword">DISTINCT</span> cno) <span class="operator">=</span> (<span class="keyword">SELECT</span> <span class="built_in">COUNT</span>(<span class="operator">*</span>) <span class="keyword">FROM</span> course)</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="28">28</h2><ul><li>[x] （28）查询选修了葛畅同学所选修的所有课程的学生姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> student</span><br><span class="line"><span class="keyword">WHERE</span> sno <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> cno <span class="keyword">IN</span> (</span><br><span class="line">        <span class="keyword">SELECT</span> cno <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> sno <span class="operator">=</span> (<span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> student <span class="keyword">WHERE</span> sname <span class="operator">=</span> <span class="string">&#x27;葛畅&#x27;</span>)</span><br><span class="line">    )</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h2 id="29">29</h2><ul><li>[x] （29）查询平均成绩最高的学生姓名。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> sname</span><br><span class="line"><span class="keyword">FROM</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno, <span class="built_in">AVG</span>(grade) <span class="keyword">AS</span> avg_grade</span><br><span class="line">    <span class="keyword">FROM</span> sc</span><br><span class="line">    <span class="keyword">GROUP</span> <span class="keyword">BY</span> sno</span><br><span class="line">    <span class="keyword">ORDER</span> <span class="keyword">BY</span> avg_grade <span class="keyword">DESC</span></span><br><span class="line">    LIMIT <span class="number">1</span></span><br><span class="line">) <span class="keyword">AS</span> highest_avg_grade</span><br><span class="line"><span class="keyword">JOIN</span> student <span class="keyword">ON</span> highest_avg_grade.sno <span class="operator">=</span> student.sno;</span><br></pre></td></tr></table></figure><h2 id="30">30</h2><ul><li>[x] （30）找出比所在班级平均成绩高的学生信息。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> s.sno, s.sname, s.classno, sc.grade</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">WHERE</span> sc.grade <span class="operator">&gt;</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> <span class="built_in">AVG</span>(sc.grade)</span><br><span class="line">    <span class="keyword">FROM</span> student s2</span><br><span class="line">    <span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s2.sno <span class="operator">=</span> sc.sno</span><br><span class="line">    <span class="keyword">WHERE</span> s2.classno <span class="operator">=</span> s.classno</span><br><span class="line">    <span class="keyword">GROUP</span> <span class="keyword">BY</span> s2.classno</span><br><span class="line">);</span><br></pre></td></tr></table></figure><h1 id="数据操纵语言DML">数据操纵语言DML</h1><ul><li>[x] （1） 将选修徐永军老师所教课程的女同学的成绩提高5%</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> sc</span><br><span class="line"><span class="keyword">SET</span> grade <span class="operator">=</span> grade <span class="operator">*</span> <span class="number">1.05</span></span><br><span class="line"><span class="keyword">WHERE</span> cno <span class="keyword">IN</span> (<span class="keyword">SELECT</span> cno <span class="keyword">FROM</span> teaching <span class="keyword">WHERE</span> tno <span class="operator">=</span> <span class="string">&#x27;000007&#x27;</span>) <span class="keyword">AND</span> sno <span class="keyword">IN</span> (<span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> student <span class="keyword">WHERE</span> ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span>);</span><br></pre></td></tr></table></figure><p>（2） 在基本表Student中检索每一门课程成绩都大于等于80分的学生学号、姓名、性别，并把检索到的值送往另一个已存在的基本表STUD（S#，SNAME，SEX）。</p><ul><li>[x] （3） 在基本表sc中删除尚无成绩的选课记录。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> grade <span class="keyword">IS</span> <span class="keyword">NULL</span>;</span><br></pre></td></tr></table></figure><ul><li>[x] （4） 把王威同学的学习选课和成绩全部删除。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">DELETE</span> <span class="keyword">FROM</span> sc <span class="keyword">WHERE</span> sno <span class="operator">=</span> (<span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> student <span class="keyword">WHERE</span> sname <span class="operator">=</span> <span class="string">&#x27;王威&#x27;</span>);</span><br></pre></td></tr></table></figure><ul><li>[x] （5） 把选修数据结构课不及格的成绩全改为空值。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> sc</span><br><span class="line"><span class="keyword">SET</span> grade <span class="operator">=</span> <span class="keyword">NULL</span></span><br><span class="line"><span class="keyword">WHERE</span> cno <span class="operator">=</span> (<span class="keyword">SELECT</span> cno <span class="keyword">FROM</span> course <span class="keyword">WHERE</span> cname <span class="operator">=</span> <span class="string">&#x27;数据结构&#x27;</span>) <span class="keyword">AND</span> grade <span class="operator">&lt;</span> <span class="number">60</span>;</span><br></pre></td></tr></table></figure><ul><li>[x] （6） 把低于总平均成绩的女同学的成绩提高5%</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> TEMPORARY <span class="keyword">TABLE</span> temp_table <span class="keyword">AS</span></span><br><span class="line"><span class="keyword">SELECT</span> s.sno</span><br><span class="line"><span class="keyword">FROM</span> student s</span><br><span class="line"><span class="keyword">JOIN</span> sc <span class="keyword">ON</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line"><span class="keyword">WHERE</span> s.ssex <span class="operator">=</span> <span class="string">&#x27;女&#x27;</span> <span class="keyword">AND</span> sc.grade <span class="operator">&lt;</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> <span class="built_in">AVG</span>(grade)</span><br><span class="line">    <span class="keyword">FROM</span> sc</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">UPDATE</span> sc</span><br><span class="line"><span class="keyword">SET</span> grade <span class="operator">=</span> grade <span class="operator">*</span> <span class="number">1.05</span></span><br><span class="line"><span class="keyword">WHERE</span> sno <span class="keyword">IN</span> (</span><br><span class="line">    <span class="keyword">SELECT</span> sno <span class="keyword">FROM</span> temp_table</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="keyword">DROP</span> TEMPORARY <span class="keyword">TABLE</span> temp_table;</span><br><span class="line"></span><br><span class="line">MySQL不允许在<span class="keyword">UPDATE</span>语句的<span class="keyword">FROM</span>子句中直接引用目标表。我们需要使用一个临时表或者将子查询结果保存到一个变量中来解决这个问题。</span><br><span class="line"></span><br><span class="line">这段代码首先创建一个临时表，保存所有低于平均成绩的女同学的学号。然后，它更新sc表中的成绩，将所有在临时表中的学号对应的成绩提高<span class="number">5</span><span class="operator">%</span>。最后，它删除临时表。</span><br></pre></td></tr></table></figure><ul><li>[x] （7） 在基本表SC中修改800004课程的成绩，若成绩小于等于75分时提高5%，若成绩大于75分时提高4%（用两个UPDATE语句实现）。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> sc</span><br><span class="line"><span class="keyword">SET</span> grade <span class="operator">=</span> grade <span class="operator">*</span> <span class="number">1.05</span></span><br><span class="line"><span class="keyword">WHERE</span> cno <span class="operator">=</span> <span class="number">800004</span> <span class="keyword">AND</span> grade <span class="operator">&lt;=</span> <span class="number">75</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">UPDATE</span> sc</span><br><span class="line"><span class="keyword">SET</span> grade <span class="operator">=</span> grade <span class="operator">*</span> <span class="number">1.04</span></span><br><span class="line"><span class="keyword">WHERE</span> cno <span class="operator">=</span> <span class="number">800004</span> <span class="keyword">AND</span> grade <span class="operator">&gt;</span> <span class="number">75</span>;</span><br></pre></td></tr></table></figure><h1 id="存储过程">存储过程</h1><ul><li>[x] （1） 创建一个能向学生表student中插入一条记录的存储过程insert_student，该过程需要5个参数，分别用来传递学号、姓名、性别、出生日期、班级号。写出调用存储过程insert_student的SQL语句，向数据表student中插入一个新同学，并提供相应的实参值。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> insert_student(<span class="keyword">in</span> p_sno <span class="type">varchar</span>(<span class="number">20</span>), <span class="keyword">in</span> p_sname <span class="type">varchar</span>(<span class="number">20</span>), <span class="keyword">in</span> p_ssex <span class="type">varchar</span>(<span class="number">20</span>), <span class="keyword">in</span> p_sbirthday <span class="type">date</span>, <span class="keyword">in</span> p_classno <span class="type">varchar</span>(<span class="number">20</span>))</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">insert into</span> student(sno, sname, ssex, sbirthday, classno)</span><br><span class="line">    <span class="keyword">values</span> (p_sno, p_sname, p_ssex, p_sbirthday, p_classno);</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">call</span> insert_student(<span class="string">&#x27;20301104&#x27;</span>, <span class="string">&#x27;廖学武&#x27;</span>, <span class="string">&#x27;男&#x27;</span>, <span class="string">&#x27;2001-06-29&#x27;</span>, <span class="string">&#x27;Rj0801&#x27;</span>);</span><br></pre></td></tr></table></figure><ul><li>[x] （2） 创建一个向课程表course中插入一门新课程的存储过程insert_course，该存储过程需要三个参数，分别用来传递课程号、课程名、学分，但允许参数“学分”的默认值为4，即当调用存储过程insert_course时，未给第三个参数“学分”提供实参值时，存储过程将按默认值4进行运算。<br>调用存储过程insert_course，向课程表course中插入一门新课程。分两种情况（给出第三个参数和未给出第三个参数）写出相应的SQL命令，并比较结果。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> insert_course(<span class="keyword">in</span> p_cno <span class="type">varchar</span>(<span class="number">20</span>), <span class="keyword">in</span> p_cname <span class="type">varchar</span>(<span class="number">20</span>), <span class="keyword">in</span> p_ccredit <span class="type">smallint</span> <span class="keyword">default</span> <span class="number">4</span>)</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    if ccredit <span class="keyword">is</span> <span class="keyword">null</span> <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">set</span> p_ccredit <span class="operator">=</span> <span class="number">4</span>;</span><br><span class="line">    <span class="keyword">end</span> if;</span><br><span class="line">    <span class="keyword">insert into</span> course(cno, cname, ccredit) <span class="keyword">values</span>(p_cno, p_cname, p_ccredit);</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">call</span> insert_course(<span class="string">&#x27;CS101&#x27;</span>, <span class="string">&#x27;计算机科学&#x27;</span>, <span class="keyword">NULL</span>);</span><br><span class="line"><span class="keyword">call</span> insert_course(<span class="string">&#x27;CS102&#x27;</span>, <span class="string">&#x27;数据结构&#x27;</span>, <span class="number">3</span>);</span><br></pre></td></tr></table></figure><ul><li>[x] （3） 创建一个名称为query_student的存储过程，该存储过程的功能是从数据表student中根据学号查询某一同学的姓名、性别、出生日期、班级号。<br>调用存储过程query_student，查询学号为“08301050”的姓名、性别、出生日期、班级号，并写出完成此功能的SQL命令。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> query_student(<span class="keyword">in</span> p_sno <span class="type">varchar</span>(<span class="number">20</span>))</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">select</span> sname, ssex, sbirthday, classno <span class="keyword">from</span> student <span class="keyword">where</span> sno <span class="operator">=</span> p_sno;</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">call</span> query_student(<span class="string">&#x27;08300010&#x27;</span>);</span><br></pre></td></tr></table></figure><ul><li>[x] （4） 建立存储过程，输出平均成绩大于80分的学生的姓名、性别、年龄和平均成绩。调用该存储过程，并输出相应的结果。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> get_low_course()</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">select</span> student.sname <span class="keyword">as</span> <span class="string">&#x27;姓名&#x27;</span>, </span><br><span class="line">           student.ssex <span class="keyword">as</span> <span class="string">&#x27;性别&#x27;</span>, </span><br><span class="line">           <span class="keyword">year</span>(curdate()) <span class="operator">-</span> <span class="keyword">year</span>(student.sbirthday) <span class="keyword">as</span> <span class="string">&#x27;年龄&#x27;</span>, </span><br><span class="line">           <span class="built_in">avg</span>(sc.grade) <span class="keyword">as</span> <span class="string">&#x27;平均成绩&#x27;</span></span><br><span class="line">    <span class="keyword">from</span> student</span><br><span class="line">    <span class="keyword">join</span> sc <span class="keyword">on</span> student.sno <span class="operator">=</span> sc.sno</span><br><span class="line">    <span class="keyword">group</span> <span class="keyword">by</span> student.sno</span><br><span class="line">    <span class="keyword">having</span> <span class="built_in">avg</span>(sc.grade) <span class="operator">&lt;</span> <span class="number">80</span>;</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">call</span> get_high_achievers();</span><br></pre></td></tr></table></figure><ul><li>[x] （5） 写存储过程显示所有选择了与给定学生姓名选择的全部课程的学生的学号、姓名、选课数、平均成绩、总学分，调用该存储过程，并根据指定的学生姓名输出与其相应的结果。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> get_student_info(<span class="keyword">in</span> student_name <span class="type">varchar</span>(<span class="number">20</span>))</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">select</span> </span><br><span class="line">        s.sno <span class="keyword">as</span> <span class="string">&#x27;学号&#x27;</span>,</span><br><span class="line">        s.sname <span class="keyword">as</span> <span class="string">&#x27;姓名&#x27;</span>,</span><br><span class="line">        <span class="built_in">count</span>(sc.cno) <span class="keyword">as</span> <span class="string">&#x27;选课数&#x27;</span>,</span><br><span class="line">        <span class="built_in">avg</span>(sc.grade) <span class="keyword">as</span> <span class="string">&#x27;平均成绩&#x27;</span>,</span><br><span class="line">        <span class="built_in">sum</span>(c.ccredit) <span class="keyword">as</span> <span class="string">&#x27;总学分&#x27;</span></span><br><span class="line">    <span class="keyword">from</span> student s</span><br><span class="line">    <span class="keyword">join</span> sc <span class="keyword">on</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line">    <span class="keyword">join</span> course c <span class="keyword">on</span> sc.cno <span class="operator">=</span> c.cno</span><br><span class="line">    <span class="keyword">where</span> </span><br><span class="line">        s.sno <span class="keyword">in</span> (</span><br><span class="line">            <span class="keyword">select</span> sc.sno</span><br><span class="line">            <span class="keyword">from</span> student s</span><br><span class="line">            <span class="keyword">join</span> sc <span class="keyword">on</span> s.sno <span class="operator">=</span> sc.sno</span><br><span class="line">            <span class="keyword">where</span> s.sname <span class="operator">=</span> student_name</span><br><span class="line">        )</span><br><span class="line">    <span class="keyword">group</span> <span class="keyword">by</span> </span><br><span class="line">        s.sno;</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">call</span> get_student_info(<span class="string">&#x27;胡贤斌&#x27;</span>);</span><br></pre></td></tr></table></figure><ul><li>[x]（6） 写存储过程显示所有平均成绩小于给定班级号的平均成绩的学生的学号、</li></ul><p>名字、平均成绩</p><p>调用该存储过程，并根据指定的班级号输出与其相应的结果。</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> get_students_below_class_average(<span class="keyword">in</span> class_no <span class="type">varchar</span>(<span class="number">20</span>))</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="comment">-- 计算给定班级的平均成绩</span></span><br><span class="line">    <span class="keyword">declare</span> class_avg_grade <span class="type">decimal</span>(<span class="number">5</span>,<span class="number">2</span>);</span><br><span class="line">    <span class="keyword">select</span> <span class="built_in">avg</span>(sc.grade) <span class="keyword">into</span> class_avg_grade</span><br><span class="line">    <span class="keyword">from</span> student</span><br><span class="line">    <span class="keyword">join</span> sc <span class="keyword">on</span> student.sno <span class="operator">=</span> sc.sno</span><br><span class="line">    <span class="keyword">where</span> student.classno <span class="operator">=</span> class_no;</span><br><span class="line"></span><br><span class="line">    <span class="comment">-- 查询所有平均成绩小于给定班级平均成绩的学生</span></span><br><span class="line">    <span class="keyword">select</span> student.sno, student.sname, <span class="built_in">avg</span>(sc.grade) <span class="keyword">as</span> avg_grade</span><br><span class="line">    <span class="keyword">from</span> student</span><br><span class="line">    <span class="keyword">join</span> sc <span class="keyword">on</span> student.sno <span class="operator">=</span> sc.sno</span><br><span class="line">    <span class="keyword">group</span> <span class="keyword">by</span> student.sno, student.sname</span><br><span class="line">    <span class="keyword">having</span> avg_grade <span class="operator">&lt;</span> class_avg_grade;</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">call</span> get_students_below_class_average(<span class="string">&#x27;Rj0801&#x27;</span>);</span><br></pre></td></tr></table></figure><h1 id="触发器-1-5有问题">触发器 1/5有问题</h1><ul><li>[x] （1） 创建一个当向学生表student中插入一新同学时能自动列出全部同学信息的触发器display_trigger。执行存储过程insert_student，向学生表中插入一个新同学，看触发器display_trigger是否被触发。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> display_trigger</span><br><span class="line">after <span class="keyword">insert</span> <span class="keyword">on</span> student</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> student;</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br><span class="line"></span><br><span class="line"><span class="keyword">show</span> triggers; <span class="comment">-- 查看已创建的触发器</span></span><br></pre></td></tr></table></figure><ul><li>[x] （2） 创建一个触发器，当向学生表student中插入一新同学时能自动更新（增加1）class班级表中该生所在班级的总人数。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> update_student_count_add</span><br><span class="line">after <span class="keyword">insert</span> <span class="keyword">on</span> student</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">update</span> class <span class="keyword">set</span> studentnumber <span class="operator">=</span> studentnumber <span class="operator">+</span> <span class="number">1</span> <span class="keyword">where</span> classno <span class="operator">=</span> new.classno;</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br><span class="line"></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">trigger</span> if <span class="keyword">exists</span> update_student_count;    <span class="comment">-- 删除触发器</span></span><br></pre></td></tr></table></figure><ul><li>[x] （3） 创建一个触发器，当从学生表student中删除一个同学时能自动更新（减1）class班级表中该生所在班级的总人数。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> update_student_number_delete</span><br><span class="line">after <span class="keyword">delete</span> <span class="keyword">on</span> student</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">   <span class="keyword">update</span> class <span class="keyword">set</span> studentnumber <span class="operator">=</span> studentnumber <span class="operator">-</span> <span class="number">1</span> <span class="keyword">where</span> classno <span class="operator">=</span> old.classno;</span><br><span class="line"><span class="keyword">end</span> <span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><ul><li>[x] （4） 创建一个触发器，当将学生表student中某一个同学从一个班级改为另一个班级时，能自动更新class班级表中该生所在原来班级的总人数（减1）和新班级的总人数（增加1）。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> update_student_count</span><br><span class="line">after <span class="keyword">update</span> <span class="keyword">on</span> student</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    if old.classno <span class="operator">!=</span> new.classno <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">update</span> class <span class="keyword">set</span> studentnumber <span class="operator">=</span> studentnumber <span class="operator">-</span> <span class="number">1</span> <span class="keyword">where</span> classno <span class="operator">=</span> old.classno;</span><br><span class="line">        <span class="keyword">update</span> class <span class="keyword">set</span> studentnumber <span class="operator">=</span> studentnumber <span class="operator">+</span> <span class="number">1</span> <span class="keyword">where</span> classno <span class="operator">=</span> new.classno;</span><br><span class="line">    <span class="keyword">end</span> if;</span><br><span class="line"><span class="keyword">end</span>;<span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><ul><li>[x] （5） 建一个触发器，当往SC表中插入一个在STUDENT 表中不存在的学号SNO时，就往STUDENT表中插入该学号，其他属性全是NULL</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> insert_student</span><br><span class="line">after <span class="keyword">insert</span> <span class="keyword">on</span> sc</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    if <span class="keyword">not</span> <span class="keyword">exists</span> (<span class="keyword">select</span> <span class="number">1</span> <span class="keyword">from</span> student <span class="keyword">where</span> sno <span class="operator">=</span> new.sno) <span class="keyword">then</span></span><br><span class="line">        <span class="keyword">insert into</span> student (sno) <span class="keyword">values</span> (new.sno);</span><br><span class="line">    <span class="keyword">end</span> if;</span><br><span class="line"><span class="keyword">end</span>;<span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><ul><li>[x] （6） 写一个触发器阻止将学生成绩降低</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> prevent_grade before <span class="keyword">update</span> <span class="keyword">on</span> sc</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    if new.grade <span class="operator">&gt;</span> old.grade <span class="keyword">then</span></span><br><span class="line">        signal <span class="keyword">sqlstate</span> <span class="string">&#x27;45000&#x27;</span></span><br><span class="line">        <span class="keyword">set</span> message_text <span class="operator">=</span> <span class="string">&#x27;cannot asc student grade&#x27;</span>;</span><br><span class="line">    <span class="keyword">end</span> if;</span><br><span class="line"><span class="keyword">end</span>;</span><br><span class="line"><span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><ul><li>[x] （7） 在sc表上创建触发器，只要有人选修的课程超过3门，就中断操作并提示警告</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> check_course_limit</span><br><span class="line">before <span class="keyword">insert</span> <span class="keyword">on</span> sc</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">declare</span> course_count <span class="type">int</span>;</span><br><span class="line">    <span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">into</span> course_count <span class="keyword">from</span> sc <span class="keyword">where</span> sno <span class="operator">=</span> new.sno;</span><br><span class="line">    if course_count <span class="operator">&gt;=</span> <span class="number">3</span> <span class="keyword">then</span></span><br><span class="line">        signal <span class="keyword">sqlstate</span> <span class="string">&#x27;45000&#x27;</span> <span class="keyword">set</span> message_text <span class="operator">=</span> <span class="string">&#x27;一个学生不能选修超过3门课程&#x27;</span>;</span><br><span class="line">    <span class="keyword">end</span> if;</span><br><span class="line"><span class="keyword">end</span>;</span><br><span class="line"><span class="operator">/</span><span class="operator">/</span></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure><ul><li>[x] （8） 创建一个触发器，当往SC表插入选修的课程时自动将该课程的学分累加到STUDENT表的该生的总学分（TOTALCREDIT）中，当从SC表中退课时自动从STUDENT表的该生的总学分中减去该课程的学分。</li></ul><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">delimiter <span class="operator">/</span><span class="operator">/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 当插入新的选课记录时，增加学生的总学分</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> increase_totalcredit</span><br><span class="line">after <span class="keyword">insert</span> <span class="keyword">on</span> sc</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">update</span> student</span><br><span class="line">    <span class="keyword">set</span> totalcredit <span class="operator">=</span> totalcredit <span class="operator">+</span> (<span class="keyword">select</span> ccredit <span class="keyword">from</span> course <span class="keyword">where</span> cno <span class="operator">=</span> new.cno)</span><br><span class="line">    <span class="keyword">where</span> sno <span class="operator">=</span> new.sno;</span><br><span class="line"><span class="keyword">end</span>;</span><br><span class="line"><span class="operator">/</span><span class="operator">/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 当删除选课记录时，减少学生的总学分</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">trigger</span> decrease_totalcredit</span><br><span class="line">after <span class="keyword">delete</span> <span class="keyword">on</span> sc</span><br><span class="line"><span class="keyword">for</span> <span class="keyword">each</span> <span class="type">row</span></span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line">    <span class="keyword">update</span> student</span><br><span class="line">    <span class="keyword">set</span> totalcredit <span class="operator">=</span> totalcredit <span class="operator">-</span> (<span class="keyword">select</span> ccredit <span class="keyword">from</span> course <span class="keyword">where</span> cno <span class="operator">=</span> old.cno)</span><br><span class="line">    <span class="keyword">where</span> sno <span class="operator">=</span> old.sno;</span><br><span class="line"><span class="keyword">end</span>;</span><br><span class="line"><span class="operator">/</span><span class="operator">/</span></span><br><span class="line"></span><br><span class="line">delimiter ;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">SQL语句与基本语法</summary>
    
    
    
    <category term="学习" scheme="http://265832.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="SQL" scheme="http://265832.xyz/tags/SQL/"/>
    
  </entry>
  
  <entry>
    <title>Office新版安装与激活</title>
    <link href="http://265832.xyz/posts/db289af5.html"/>
    <id>http://265832.xyz/posts/db289af5.html</id>
    <published>2024-09-01T15:39:46.000Z</published>
    <updated>2024-09-01T16:24:32.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Office安装">Office安装</h1><!-- [Office Tool下载](https://otp.landian.vip/zh-cn/)![img](https://tuchuang.voooe.cn/images/2024/09/01/1.jpg)解压后右键管理员身份运行`Office Tool Plus.exe`![img](https://tuchuang.voooe.cn/images/2024/09/01/2.jpg)**打开后会自动更新，若是更新卡着不动关防火墙**![img](https://tuchuang.voooe.cn/images/2024/09/01/3.jpg)本机若是有Office需要先移除![img](https://tuchuang.voooe.cn/images/2024/09/01/4.jpg)添加产品，选择自己想要安装的版本及应用程序和语言![img](https://tuchuang.voooe.cn/images/2024/09/01/5.jpg)![img](https://tuchuang.voooe.cn/images/2024/09/01/6.jpg)![img](https://tuchuang.voooe.cn/images/2024/09/01/7.jpg)一键部署，等待部署完成，即安装完成Office![img](https://tuchuang.voooe.cn/images/2024/09/01/8.jpg)![img](https://tuchuang.voooe.cn/images/2024/09/01/9.png)![img](https://tuchuang.voooe.cn/images/2024/09/01/10.jpg)部署完成，打开Word显示未激活![img](https://tuchuang.voooe.cn/images/2024/09/01/11.jpg)# Office激活安装许可证，选择与前面安装版本对应的许可证安装![img](https://tuchuang.voooe.cn/images/2024/09/01/12.jpg)![img](https://tuchuang.voooe.cn/images/2024/09/01/13.png)设置KMS主机为`kms.loli.beer`![img](https://tuchuang.voooe.cn/images/2024/09/01/14..jpg)一键激活![img](https://tuchuang.voooe.cn/images/2024/09/01/15.jpg)激活完成![img](https://tuchuang.voooe.cn/images/2024/09/01/16.jpg)**若是安装许可证失败或者激活失败，可使用 [`power shell`](https://www.265832.xyz/posts/51605980.html) 激活** -->]]></content>
    
    
    <summary type="html">Office新版安装与激活</summary>
    
    
    
    <category term="vue" scheme="http://265832.xyz/categories/vue/"/>
    
    
    <category term="Office" scheme="http://265832.xyz/tags/Office/"/>
    
  </entry>
  
  <entry>
    <title>cpeditor</title>
    <link href="http://265832.xyz/posts/aa1df803.html"/>
    <id>http://265832.xyz/posts/aa1df803.html</id>
    <published>2024-08-19T11:20:42.000Z</published>
    <updated>2024-08-20T14:56:47.000Z</updated>
    
    <content type="html"><![CDATA[<p>Cpeditor</p><!-- ## Cpeditor 编辑器下载1、进[cpeditor编辑器官网](https://cpeditor.org/)![3A08B2E067B1736865E5890D2CDBFB51.png](https://tuchuang.voooe.cn/images/2024/08/20/3A08B2E067B1736865E5890D2CDBFB51.png)2、选择合适的版本下载，站长使用：**cpeditor-6.11.2-windows-x64-setup-with-gcc-13.2.0-LLVM-17.0.6.exe (224 MB)**![A169AC4093179D8232D71525A45BA580.png](https://tuchuang.voooe.cn/images/2024/08/20/A169AC4093179D8232D71525A45BA580.png)3、傻瓜式安装![6A5A6AB4144EDDC1FA60BA23C00C9FE6.png](https://tuchuang.voooe.cn/images/2024/08/20/6A5A6AB4144EDDC1FA60BA23C00C9FE6.png)![AA784F263B3BE5E151421473D15CE121.png](https://tuchuang.voooe.cn/images/2024/08/20/AA784F263B3BE5E151421473D15CE121.png)![4A82E97DF7C2774450E8963C8B0C6325.png](https://tuchuang.voooe.cn/images/2024/08/20/4A82E97DF7C2774450E8963C8B0C6325.png)![7E6A95E0D3C8D5CACFE6411A0BBD6437.png](https://tuchuang.voooe.cn/images/2024/08/20/7E6A95E0D3C8D5CACFE6411A0BBD6437.png)![44C5C5444FCC0652E94C581CD7D0C077.png](https://tuchuang.voooe.cn/images/2024/08/20/44C5C5444FCC0652E94C581CD7D0C077.png)![7A517DABEF138BD69D37B37980589268.png](https://tuchuang.voooe.cn/images/2024/08/20/7A517DABEF138BD69D37B37980589268.png)![0A1C16FFD7391738123951902E0DEC65.png](https://tuchuang.voooe.cn/images/2024/08/20/0A1C16FFD7391738123951902E0DEC65.png)![488A0AB17C565509B7E6174649BDCD22.png](https://tuchuang.voooe.cn/images/2024/08/20/488A0AB17C565509B7E6174649BDCD22.png)## 配置环境变量1、找到自己安装目录下(或者别处的 mingw64)的 bin 目录，站长的：**C:\Program Files (x86)\MySoftWare\CP-Editor\cpeditor\mingw64\bin**![6738B7AFA11617200AF49E8055767B70.png](https://tuchuang.voooe.cn/images/2024/08/20/6738B7AFA11617200AF49E8055767B70.png)2、在环境变量中添加，点开 PATH 环境变量，添加新的路径![811CA38FE0BF775FF833204FA81ACF20.png](https://tuchuang.voooe.cn/images/2024/08/20/811CA38FE0BF775FF833204FA81ACF20.png)![406F3C106C6449FE3CCC304342FDFFD8.png](https://tuchuang.voooe.cn/images/2024/08/20/406F3C106C6449FE3CCC304342FDFFD8.png)3、验证是否配置成功，在 cmd 中输入 g++ -v 查看 g++ 版本信息，站长用的gcc-11.2.0![075E4DB0D069DD1B639784151FC5BDCC.png](https://tuchuang.voooe.cn/images/2024/08/20/075E4DB0D069DD1B639784151FC5BDCC.png)## 配置个人化的 CP Editor1、点击选项中的设置按钮![5A46E171C7DD7B687092A69F604578E3.png](https://tuchuang.voooe.cn/images/2024/08/20/5A46E171C7DD7B687092A69F604578E3.png)2、编辑器外观的设置![D15B455378087063F7A5228283918229.png](https://tuchuang.voooe.cn/images/2024/08/20/D15B455378087063F7A5228283918229.png)![9B2AB28D8874750AEAE1E6675C1AE7D7.png](https://tuchuang.voooe.cn/images/2024/08/20/9B2AB28D8874750AEAE1E6675C1AE7D7.png)3、C++配置**c++ -Wall -std=c++14 -O2**：用于开启 c++14 和 O2 优化![00471A08B785873A6CDEFBCCD4AA1F28.png](https://tuchuang.voooe.cn/images/2024/08/20/00471A08B785873A6CDEFBCCD4AA1F28.png)模板位置![9D286981FBD4295924B1FBBA201C6387.png](https://tuchuang.voooe.cn/images/2024/08/20/9D286981FBD4295924B1FBBA201C6387.png)个性化快捷键![AB17D34B5BB829799D282D48EC4FA4CB.png](https://tuchuang.voooe.cn/images/2024/08/20/AB17D34B5BB829799D282D48EC4FA4CB.png)4、设置 C++ ServerC++ Server 会进行一定程度的代码提示和错误提示![07FD84ED50E90D9185D3778C0CED0807.png](https://tuchuang.voooe.cn/images/2024/08/20/07FD84ED50E90D9185D3778C0CED0807.png)## 配置完成![6B42F384D9CA048ACAE25D2E732230F1.png](https://tuchuang.voooe.cn/images/2024/08/20/6B42F384D9CA048ACAE25D2E732230F1.png) -->]]></content>
    
    
    <summary type="html">cpeditor安装与配置</summary>
    
    
    
    <category term="计算机软件安装" scheme="http://265832.xyz/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/"/>
    
    
    <category term="cpeditor" scheme="http://265832.xyz/tags/cpeditor/"/>
    
  </entry>
  
  <entry>
    <title>激活Office和Windows</title>
    <link href="http://265832.xyz/posts/51605980.html"/>
    <id>http://265832.xyz/posts/51605980.html</id>
    <published>2024-08-14T04:56:34.000Z</published>
    <updated>2024-08-15T05:59:30.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、免费激活Office办公软件">一、免费激活Office办公软件</h1><p>若系统没安装 Office 先去 <a href="https://gravesoft.dev/office_c2r_links#chinese-simplified-zh-cn">下载安装</a><br><img src="https://wp-oss.hcolor.pro/2024/08/20240818074112586.png" alt="img"><br>1.打开 powershell，先输入以下代码，然后选择是<br>irm <a href="https://massgrave.dev/get">https://massgrave.dev/get</a> | iex<br>irm <a href="https://get.activated.win">https://get.activated.win</a> | iex<br>2.根据以下选项解释选择’2’激活Office</p><p>————————————————————————————————————————————————————</p><p>Activation Methods：<br>[1] HWID         |  Windows            |  Permanent<br>[2] Ohook        |  Office             |  Permanent<br>[3] KMS38        |  Windows            |  Year 2038<br>[4] Online KMS   |  Windows / office   |   180 Days</p><p>————————————————————————————————————————————————————</p><p>[5] Activation Status<br>[6] Troubleshoot<br>[7] Extras<br>[8] Help<br>[0] Exit</p><p>————————————————————————————————————————————————————</p><p>Enter a menu option in the Keyboard [1, 2, 3, 4, 5, 6, 7, 8, 0]</p><p>解释：<br>————————————————————————————————————————————————————<br>HWID(数字许可证)方法永久激活Windows<br>Ohook永久激活 Office 的方法<br>KMS38方法激活Windows/Server至2038年<br>在线 KMS方法激活 Windows/Server/0ffice 180天(终身续订任务)<br>高级激活疑难解答<br>用于预激活的 $OEM$ 文件夹<br>更改 Windows 版本<br>检查 Windows/Office 激活状态<br>提供一体化和单独文件版本<br>完全开源且基于批处理脚本<br>更少的防病毒检测<br>————————————————————————————————————————————————————</p><p>3.在弹出的界面中选择‘1’</p><p>————————————————————————————————————————————————————<br>[1] Install Ohook Office Activation<br>[2] Uninstall Ohook<br>[3] Download office<br>[0] Go back<br>————————————————————————————————————————————————————<br>Enter a menu option in the Keyboard [1, 2, 3, 0]</p><p>4.后显示Office is permanently activated.成功永久激活 Office，选择任意键返回，后选择‘0’键退出</p><p>irm <a href="https://massgrave.dev/get">https://massgrave.dev/get</a> | iex slmgr /xpr</p><h1 id="二、免费永久激活-Windows">二、免费永久激活 Windows</h1><p>1.打开 powershell，先输入以下代码，然后选择是<br>irm <a href="https://massgrave.dev/get">https://massgrave.dev/get</a> | iex<br>2.根据以下选项解释选择‘1’激活 Windows</p><p>————————————————————————————————————————————————————</p><p>Activation Methods：<br>[1] HWID         |  Windows            |  Permanent<br>[2] Ohook        |  Office             |  Permanent<br>[3] KMS38        |  Windows            |  Year 2038<br>[4] Online KMS   |  Windows / office   |   180 Days</p><p>————————————————————————————————————————————————————</p><p>[5] Activation Status<br>[6] Troubleshoot<br>[7] Extras<br>[8] Help<br>[0] Exit</p><p>————————————————————————————————————————————————————</p><p>Enter a menu option in the Keyboard [1, 2, 3, 4, 5, 6, 7, 8, 0]</p><p>3.后显示 Windows 11 专业版 is permanently activated with a digital license.成功永久激活 Windows，选择任意键返回，后选择‘0’键退出</p><p>4.按 Win + R 键输入以下命令查看计算机激活状态<br>slmgr.vbs /xpr</p><h1 id="三、Windows-修改更新日期">三、Windows 修改更新日期</h1><p>1.按 Win + R 输入 regedit 打开注册表编辑器<br>2.输入<code>计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings</code>。<br>3.新建二进制值命名为 ‘FlightSettingsMaxPauseDays’<br>4.修改十进制的停止更新天数</p><h1 id="任务栏图标异常">任务栏图标异常</h1><p>解决办法：命令提示符结束浏览器进程，清除图标缓存【也可以制作批处理文件】（亲测有效）<br><code>win</code>+<code>r</code>-&gt;<code>cmd</code>-&gt;输入以下命令</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">taskkill <span class="regexp">/im explorer.exe /</span>f</span><br><span class="line">cd /d %userprofile%\appdata\local</span><br><span class="line">del iconcache.db /a</span><br><span class="line">start explorer.exe</span><br><span class="line"><span class="keyword">exit</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">激活Office和Windows</summary>
    
    
    
    <category term="计算机软件安装" scheme="http://265832.xyz/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/"/>
    
    
    <category term="Office" scheme="http://265832.xyz/tags/Office/"/>
    
  </entry>
  
  <entry>
    <title>Markdown语法</title>
    <link href="http://265832.xyz/posts/3c50d03d.html"/>
    <id>http://265832.xyz/posts/3c50d03d.html</id>
    <published>2024-07-09T14:34:27.000Z</published>
    <updated>2024-07-10T00:05:57.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="基础语法">基础语法</h1><h2 id="表格">表格</h2><p><strong>添加表格：</strong></p><p>要添加表，使用三个或多个连字符（<code>---</code>）创建每列的标题，并使用管道（<code>|</code>）分隔每列。可以选择在表的任一端添加管道。</p><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">|<span class="string"> Syntax      </span>|<span class="string"> Description </span>|</span><br><span class="line">|<span class="string"> --- --- --- </span>|<span class="string"> --- --- --- </span>|</span><br><span class="line">|<span class="string"> Header      </span>|<span class="string"> Title       </span>|</span><br><span class="line">|<span class="string"> Paragraph   </span>|<span class="string"> Text        </span>|</span><br></pre></td></tr></table></figure><p><strong>效果：</strong></p><table><thead><tr><th>Syntax</th><th>Description</th></tr></thead><tbody><tr><td>Header</td><td>Title</td></tr><tr><td>Paragraph</td><td>Text</td></tr></tbody></table><p><strong>对齐：</strong></p><p>可以通过在标题行中的连字符的左侧，右侧或两侧添加冒号（<code>:</code>），将列中的文本对齐到左侧，右侧或中心。</p><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">| <span class="title class_">Syntax</span>    | <span class="title class_">Description</span> |   <span class="title class_">Test</span> <span class="title class_">Text</span> |</span><br><span class="line">| <span class="symbol">:--------</span> | <span class="symbol">:---------</span>: | ----------: |</span><br><span class="line">| <span class="title class_">Header</span>    |    <span class="title class_">Title</span>    | <span class="title class_">Here</span><span class="string">&#x27;s this |</span></span><br><span class="line"><span class="string">| Paragraph |    Text     |    And more |</span></span><br></pre></td></tr></table></figure><p><strong>效果：</strong></p><table><thead><tr><th style="text-align:left">Syntax</th><th style="text-align:center">Description</th><th style="text-align:right">Test Text</th></tr></thead><tbody><tr><td style="text-align:left">Header</td><td style="text-align:center">Title</td><td style="text-align:right">Here’s this</td></tr><tr><td style="text-align:left">Paragraph</td><td style="text-align:center">Text</td><td style="text-align:right">And more</td></tr></tbody></table><p><strong>格式化表格中的文字：</strong></p><p>可以在表格中设置文本格式。例如，可以添加链接，代码（仅反引号（`）中的单词或短语，而不是代码块）和强调。<strong>注：不能添加标题，块引用，列表，水平规则，图像或HTML标签</strong>。</p><p><strong>在表中转义管道字符：</strong></p><p>可以使用表格的HTML字符代码（<code>&amp;#124;</code>）在表中显示竖线（<code>|</code>）字符。</p><h2 id="围栏代码块">围栏代码块</h2><p><strong>代码块：</strong></p><p>通过将行缩进四个空格或一个制表符来创建代码块，在代码块之前和之后的行上使用三个反引号(<code>```</code>）或三个波浪号（<code>~~~</code>）。</p><p>效果：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;firstName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;John&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;lastName&quot;</span><span class="punctuation">:</span> <span class="string">&quot;Smith&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;age&quot;</span><span class="punctuation">:</span> <span class="number">25</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="标题编号">标题编号</h2><p>Markdown:</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">### My Great Heading &#123;#custom-id&#125;</span></span><br></pre></td></tr></table></figure><p>HTML:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">h3</span> <span class="attr">id</span>=<span class="string">&quot;custom-id&quot;</span>&gt;</span>My Great Heading<span class="tag">&lt;/<span class="name">h3</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong>链接到标题ID (#headid)</strong></p><p>通过创建带有数字符号（<code>#</code>）和自定义标题ID的[标准链接]<code>(/basic-syntax/links.html)</code>，可以链接到文件中具有自定义<code>ID</code>的标题。</p><table><thead><tr><th>Markdown</th><th>HTML</th><th>效果</th></tr></thead><tbody><tr><td><code>[Heading IDs](#heading-ids)</code></td><td><code>&lt;a href=&quot;#heading-ids&quot;&gt;Heading IDs&lt;/a&gt;</code></td><td><a href="#heading-ids">Heading IDs</a></td></tr></tbody></table><h2 id="表格-2">表格</h2><p><strong>创建定义列表，在第一行上键入术语。在下一行，键入一个冒号，后跟一个空格和定义。</strong></p><p>Markdown</p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">First</span> <span class="title class_">Term</span></span><br><span class="line">: <span class="title class_">This</span> <span class="keyword">is</span> the definition of the first term.</span><br><span class="line"></span><br><span class="line"><span class="title class_">Second</span> <span class="title class_">Term</span></span><br><span class="line">: <span class="title class_">This</span> <span class="keyword">is</span> one definition of the second term.</span><br><span class="line">: <span class="title class_">This</span> <span class="keyword">is</span> another definition of the second term.</span><br></pre></td></tr></table></figure><p>HTML</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">dl</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">dt</span>&gt;</span>First Term<span class="tag">&lt;/<span class="name">dt</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">dd</span>&gt;</span>This is the definition of the first term.<span class="tag">&lt;/<span class="name">dd</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">dt</span>&gt;</span>Second Term<span class="tag">&lt;/<span class="name">dt</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">dd</span>&gt;</span>This is one definition of the second term. <span class="tag">&lt;/<span class="name">dd</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">dd</span>&gt;</span>This is another definition of the second term.<span class="tag">&lt;/<span class="name">dd</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">dl</span>&gt;</span></span><br></pre></td></tr></table></figure><p><strong>效果：</strong><br>First Term<br>: This is the definition of the first term.</p><p>Second Term<br>: This is one definition of the second term.<br>: This is another definition of the second term.</p><h2 id="删除线">删除线</h2><p>删除单词，在单词前后使用两个波浪号<code>~~</code>。</p><figure class="highlight haml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~~世界是平坦的。~~ 我们现在知道世界是圆的。</span><br></pre></td></tr></table></figure><p><strong>效果：</strong><br><s>世界是平坦的。</s> 我们现在知道世界是圆的。</p><h2 id="任务列表">任务列表</h2><p>任务列表可以创建带有复选框的项目列表。在支持任务列表的Markdown应用程序中，复选框将显示在内容旁边。要创建任务列表，在任务列表项之前添加破折号<code>-</code>和方括号<code>[ ]</code>，并在<code>[ ]</code>前面加上空格。要选择一个复选框，在方括号<code>[x]</code>之间添加 <code>x</code> 。</p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">- </span>[x] Write the press release</span><br><span class="line"><span class="bullet">- </span>[ ] Update the website</span><br><span class="line"><span class="bullet">- </span>[ ] Contact the media</span><br></pre></td></tr></table></figure><p><strong>效果：</strong></p><ul><li>[x] Write the press release</li><li>[ ] Update the website</li><li>[ ] Contact the media</li></ul><h1 id="公式符号">公式符号</h1><h2 id="上下标">上下标</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$a_i,a_{pre}$</td><td style="text-align:center">a_i,a_{pre}</td></tr><tr><td style="text-align:center">$a^i,a^{[n+m]}$</td><td style="text-align:center">a^i, a^{[n+m]}$\ $</td></tr></tbody></table><h2 id="括号">括号</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">(, )</td><td style="text-align:center">(, )</td></tr><tr><td style="text-align:center">[, ]</td><td style="text-align:center">[, ]</td></tr><tr><td style="text-align:center">⟨,⟩</td><td style="text-align:center">\lang, \rang 或 \langle, \rangle</td></tr><tr><td style="text-align:center">∣,∣</td><td style="text-align:center">\lvert, \rvert</td></tr><tr><td style="text-align:center">∥,∥</td><td style="text-align:center">\lVert, \rVert</td></tr><tr><td style="text-align:center">{,}</td><td style="text-align:center">\lbrace, \rbrace 或 \{,\} $\ $</td></tr></tbody></table><h2 id="增大括号：">增大括号：</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">(x)</td><td style="text-align:center">(x)</td></tr><tr><td style="text-align:center">$\big( x \big)$</td><td style="text-align:center">\big( x \big)</td></tr><tr><td style="text-align:center">$\Big( x \Big)$</td><td style="text-align:center">\Big( x \Big)</td></tr><tr><td style="text-align:center">$\bigg( x \bigg)$</td><td style="text-align:center">\bigg( x \bigg)</td></tr><tr><td style="text-align:center">$\Bigg(x\Bigg)$</td><td style="text-align:center">\Bigg( x \Bigg)</td></tr></tbody></table><h2 id="其他的大括号类似增大括号的方法">其他的大括号类似增大括号的方法</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$\Bigg(\bigg(\Big(\big((x)\big)\Big)\bigg)\Bigg)$</td><td style="text-align:center">\Bigg(\bigg(\Big(\big((x)\big)\Big)\bigg)\Bigg)</td></tr><tr><td style="text-align:center">$\Bigg[\bigg[\Big[\big[[x]\big]\Big]\bigg]\Bigg]$</td><td style="text-align:center">\Bigg[\bigg[\Big[\big[[x]\big]\Big]\bigg]\Bigg]</td></tr><tr><td style="text-align:center">$\Bigg \langle \bigg \langle \Big \langle\big\langle\langle x \rangle \big \rangle\Big\rangle\bigg\rangle\Bigg\rangle$</td><td style="text-align:center">\Bigg \langle \bigg \langle \Big \langle\big\langle\langle x \rangle \big \rangle\Big\rangle\bigg\rangle\Bigg\rangle</td></tr><tr><td style="text-align:center">$\Bigg\lvert\bigg\lvert\Big\lvert\big\lvert\lvert x \rvert\big\rvert\Big\rvert\bigg\rvert\Bigg\rvert$</td><td style="text-align:center">\Bigg\lvert\bigg\lvert\Big\lvert\big\lvert\lvert x \rvert\big\rvert\Big\rvert\bigg\rvert\Bigg\rvert</td></tr><tr><td style="text-align:center">$\Bigg\lVert\bigg\lVert\Big\lVert\big\lVert\lVert x \rVert\big\rVert\Big\rVert\bigg\rVert\Bigg\rVert$</td><td style="text-align:center">\Bigg\lVert\bigg\lVert\Big\lVert\big\lVert\lVert x \rVert\big\rVert\Big\rVert\bigg\rVert\Bigg\rVert</td></tr></tbody></table><h2 id="分数-开方-累加-累乘">分数/开方/累加/累乘</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$\frac{a}{b}$</td><td style="text-align:center">frac${a}{b}$</td></tr><tr><td style="text-align:center">$\sqrt{a + b}$</td><td style="text-align:center">sqrt${a + b}$</td></tr><tr><td style="text-align:center">$\sum_{i = 0}^{n}\frac{1}{i^2}$</td><td style="text-align:center">\sum_{i = 0}^{n}\frac{1}{i^2}</td></tr><tr><td style="text-align:center">$\prod_{i = 0}^{n}\frac{1}{x^2}$</td><td style="text-align:center">\prod_{i = 0}^{n}\frac{1}{x^2}</td></tr></tbody></table><h2 id="三角函数">三角函数</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$\sin$</td><td style="text-align:center">\sin</td></tr><tr><td style="text-align:center">$\cos$</td><td style="text-align:center">\cos</td></tr><tr><td style="text-align:center">$\tan$</td><td style="text-align:center">\tan</td></tr><tr><td style="text-align:center">$\cot$</td><td style="text-align:center">\cot</td></tr><tr><td style="text-align:center">$\sec$</td><td style="text-align:center">\sec</td></tr><tr><td style="text-align:center">$\csc$</td><td style="text-align:center">\csc</td></tr><tr><td style="text-align:center">$\bot$</td><td style="text-align:center">\bot</td></tr><tr><td style="text-align:center">$\angle$</td><td style="text-align:center">\angle</td></tr><tr><td style="text-align:center">$40^\circ$</td><td style="text-align:center">40^\circ</td></tr></tbody></table><h2 id="对数函数">对数函数</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$\ln{a + b}$</td><td style="text-align:center">\ln${a + b}$</td></tr><tr><td style="text-align:center">$\log_{a}^{b}$</td><td style="text-align:center">\log_{a}^${b}$</td></tr><tr><td style="text-align:center">$\lg{a + b}$</td><td style="text-align:center">\lg${a + b}$</td></tr></tbody></table><h2 id="二元运算符">二元运算符</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">$\pm$</td><td style="text-align:center">\pm</td><td style="text-align:center">正负号</td></tr><tr><td style="text-align:center">$\mp$</td><td style="text-align:center">\mp</td><td style="text-align:center">负正号</td></tr><tr><td style="text-align:center">$\times$</td><td style="text-align:center">\times</td><td style="text-align:center">乘号</td></tr><tr><td style="text-align:center">$\div$</td><td style="text-align:center">\div</td><td style="text-align:center">除号</td></tr><tr><td style="text-align:center">$\ast$</td><td style="text-align:center">\ast</td><td style="text-align:center">星号</td></tr><tr><td style="text-align:center">$\star$</td><td style="text-align:center">\star</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\mid$</td><td style="text-align:center">\mid</td><td style="text-align:center">竖线</td></tr><tr><td style="text-align:center">$\nmid$</td><td style="text-align:center">\nmid</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\circ$</td><td style="text-align:center">\circ</td><td style="text-align:center">圈</td></tr><tr><td style="text-align:center">$\bigcirc$</td><td style="text-align:center">\bigcirc</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\bullet$</td><td style="text-align:center">\bullet</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\cdot$</td><td style="text-align:center">\cdot</td><td style="text-align:center">点</td></tr><tr><td style="text-align:center">$\wr$</td><td style="text-align:center">\wr</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\diamond$</td><td style="text-align:center">\diamond</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\Diamond$</td><td style="text-align:center">\Diamond</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\triangle$</td><td style="text-align:center">\triangle</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\bigtriangleup$</td><td style="text-align:center">\bigtriangleup</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\bigtriangledown$</td><td style="text-align:center">\bigtriangledown</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\triangleleft$</td><td style="text-align:center">\triangleleft</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\triangleright$</td><td style="text-align:center">\triangleright</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\lhd$</td><td style="text-align:center">\lhd</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\rhd$</td><td style="text-align:center">\rhd</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\unlhd$</td><td style="text-align:center">\unlhd</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\unrhd$</td><td style="text-align:center">\unrhd</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\odot$</td><td style="text-align:center">\odot</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\bigodot$</td><td style="text-align:center">\bigodot</td><td style="text-align:center">点积</td></tr><tr><td style="text-align:center">$\oslash$</td><td style="text-align:center">\oslash</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\ominus$</td><td style="text-align:center">\ominus</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\otimes$</td><td style="text-align:center">\otimes</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\bigotimes$</td><td style="text-align:center">\bigotimes</td><td style="text-align:center">克罗内克积</td></tr><tr><td style="text-align:center">$\oplus$</td><td style="text-align:center">\oplus</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\bigoplus$</td><td style="text-align:center">\bigoplus</td><td style="text-align:center">异或</td></tr><tr><td style="text-align:center">$\dagger$</td><td style="text-align:center">\dagger</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\ddagger$</td><td style="text-align:center">\ddagger</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\amalg$</td><td style="text-align:center">\amalg</td><td style="text-align:center">…</td></tr></tbody></table><h2 id="关系符号">关系符号</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">$\leq$</td><td style="text-align:center">\leq</td><td style="text-align:center">小于等于</td></tr><tr><td style="text-align:center">$\geq$</td><td style="text-align:center">\leq</td><td style="text-align:center">大于等于</td></tr><tr><td style="text-align:center">$\equiv$</td><td style="text-align:center">\equiv</td><td style="text-align:center">全等于</td></tr><tr><td style="text-align:center">$\models$</td><td style="text-align:center">\models</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\prec$</td><td style="text-align:center">\prec</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\succ$</td><td style="text-align:center">\succ</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\sim$</td><td style="text-align:center">\sim</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\perp$</td><td style="text-align:center">\perp</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\preceq$</td><td style="text-align:center">\preceq</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\succeq$</td><td style="text-align:center">\succeq</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\simeq$</td><td style="text-align:center">\simeq</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\mid$</td><td style="text-align:center">\mid</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\ll$</td><td style="text-align:center">\ll</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\gg$</td><td style="text-align:center">\gg</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\asymp$</td><td style="text-align:center">\asymp</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\parallel$</td><td style="text-align:center">\parallel</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\approx$</td><td style="text-align:center">\approx</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\cong$</td><td style="text-align:center">\cong</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\neq$</td><td style="text-align:center">\neq</td><td style="text-align:center">不等于</td></tr><tr><td style="text-align:center">$\doteq$</td><td style="text-align:center">\doteq</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\propto$</td><td style="text-align:center">\propto</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\bowtie$</td><td style="text-align:center">\bowtie</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\Join$</td><td style="text-align:center">\Join</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\smile$</td><td style="text-align:center">\smile</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\frown$</td><td style="text-align:center">\frown</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\vdash$</td><td style="text-align:center">\vdash</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\dashv$</td><td style="text-align:center">\dashv</td><td style="text-align:center">…</td></tr></tbody></table><h2 id="极限-向量">极限/向量</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$\lim$</td><td style="text-align:center">\lim</td></tr><tr><td style="text-align:center">$\rightarrow$</td><td style="text-align:center">\rightarrow</td></tr><tr><td style="text-align:center">$\infty$</td><td style="text-align:center">\infty</td></tr><tr><td style="text-align:center">$\lim_{n\rightarrow+\infty}n$</td><td style="text-align:center">\lim_{n\rightarrow+\infty}n</td></tr><tr><td style="text-align:center">$\vec{a}$</td><td style="text-align:center">\vec{a}</td></tr></tbody></table><h2 id="箭头">箭头</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$\uparrow$</td><td style="text-align:center">\uparrow</td></tr><tr><td style="text-align:center">$\downarrow$</td><td style="text-align:center">\downarrow</td></tr><tr><td style="text-align:center">$\updownarrow$</td><td style="text-align:center">\updownarrow</td></tr><tr><td style="text-align:center">$\Uparrow$</td><td style="text-align:center">\Uparrow</td></tr><tr><td style="text-align:center">$\Downarrow$</td><td style="text-align:center">\Downarrow</td></tr><tr><td style="text-align:center">$\Updownarrow$</td><td style="text-align:center">\Updownarrow</td></tr><tr><td style="text-align:center">$\rightarrow$</td><td style="text-align:center">\rightarrow</td></tr><tr><td style="text-align:center">$\leftarrow$</td><td style="text-align:center">\leftarrow</td></tr><tr><td style="text-align:center">$\leftrightarrow$</td><td style="text-align:center">\leftrightarrow</td></tr><tr><td style="text-align:center">$\Rightarrow$</td><td style="text-align:center">\Rightarrow</td></tr><tr><td style="text-align:center">$\Leftarrow$</td><td style="text-align:center">\Leftarrow</td></tr><tr><td style="text-align:center">$\Leftrightarrow$</td><td style="text-align:center">\Leftrightarrow</td></tr><tr><td style="text-align:center">$\longrightarrow$</td><td style="text-align:center">\longrightarrow</td></tr><tr><td style="text-align:center">$\longleftarrow$</td><td style="text-align:center">\longleftarrow</td></tr><tr><td style="text-align:center">$\longleftrightarrow$</td><td style="text-align:center">\longleftrightarrow</td></tr><tr><td style="text-align:center">$\Longrightarrow$</td><td style="text-align:center">\Longrightarrow</td></tr><tr><td style="text-align:center">$\Longleftarrow$</td><td style="text-align:center">\Longleftarrow</td></tr><tr><td style="text-align:center">$\Longleftrightarrow$</td><td style="text-align:center">\Longleftrightarrow</td></tr><tr><td style="text-align:center">$\mapsto$</td><td style="text-align:center">\mapsto</td></tr><tr><td style="text-align:center">$\longmapsto$</td><td style="text-align:center">\longmapsto</td></tr><tr><td style="text-align:center">$\hookleftarrow$</td><td style="text-align:center">\hookleftarrow</td></tr><tr><td style="text-align:center">$\hookrightarrow$</td><td style="text-align:center">\hookrightarrow</td></tr><tr><td style="text-align:center">$\rightharpoonup$</td><td style="text-align:center">\rightharpoonup</td></tr><tr><td style="text-align:center">$\leftharpoondown$</td><td style="text-align:center">\leftharpoondown</td></tr><tr><td style="text-align:center">$\rightleftharpoons$</td><td style="text-align:center">\rightleftharpoons</td></tr><tr><td style="text-align:center">$\leftharpoonup$</td><td style="text-align:center">\leftharpoonup</td></tr><tr><td style="text-align:center">$\rightharpoondown$</td><td style="text-align:center">\rightharpoondown</td></tr><tr><td style="text-align:center">$\leadsto$</td><td style="text-align:center">\leadsto</td></tr><tr><td style="text-align:center">$\nearrow$</td><td style="text-align:center">\nearrow</td></tr><tr><td style="text-align:center">$\searrow$</td><td style="text-align:center">\searrow</td></tr><tr><td style="text-align:center">$\swarrow$</td><td style="text-align:center">\swarrow</td></tr><tr><td style="text-align:center">$\nwarrow$</td><td style="text-align:center">\nwarrow</td></tr></tbody></table><h2 id="集合">集合</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">$\emptyset$</td><td style="text-align:center">\emptyset</td><td style="text-align:center">空集</td></tr><tr><td style="text-align:center">$\in$</td><td style="text-align:center">\in</td><td style="text-align:center">属于</td></tr><tr><td style="text-align:center">$\ni$</td><td style="text-align:center">\ni</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\notin$</td><td style="text-align:center">\notin</td><td style="text-align:center">不属于</td></tr><tr><td style="text-align:center">$\subset$</td><td style="text-align:center">\subset</td><td style="text-align:center">子集</td></tr><tr><td style="text-align:center">$\supset$</td><td style="text-align:center">\supset</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\not\subset$</td><td style="text-align:center">\not\subset</td><td style="text-align:center">非子集</td></tr><tr><td style="text-align:center">$\subseteq$</td><td style="text-align:center">\subseteq</td><td style="text-align:center">真子集</td></tr><tr><td style="text-align:center">$\supseteq$</td><td style="text-align:center">\supseteq</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\cup$</td><td style="text-align:center">\cup</td><td style="text-align:center">并集</td></tr><tr><td style="text-align:center">$\bigcup$</td><td style="text-align:center">\bigcup</td><td style="text-align:center">并集</td></tr><tr><td style="text-align:center">$\cap$</td><td style="text-align:center">\cap</td><td style="text-align:center">交集</td></tr><tr><td style="text-align:center">$\bigcap$</td><td style="text-align:center">\bigcap</td><td style="text-align:center">交集</td></tr><tr><td style="text-align:center">$\uplus$</td><td style="text-align:center">\uplus</td><td style="text-align:center">多重集</td></tr><tr><td style="text-align:center">$\biguplus$</td><td style="text-align:center">\biguplus</td><td style="text-align:center">多重集</td></tr><tr><td style="text-align:center">$\sqsubset$</td><td style="text-align:center">\sqsubset</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\sqsupset$</td><td style="text-align:center">\sqsupset</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\sqcap$</td><td style="text-align:center">\sqcap</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\sqsubseteq$</td><td style="text-align:center">\sqsubseteq</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\sqsupseteq$</td><td style="text-align:center">\sqsupseteq</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\vee$</td><td style="text-align:center">\vee</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\wedge$</td><td style="text-align:center">\wedge</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\setminus$</td><td style="text-align:center">\setminus</td><td style="text-align:center">集合中的减法</td></tr></tbody></table><h2 id="微积分">微积分</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">$\prime$</td><td style="text-align:center">\prime</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\int$</td><td style="text-align:center">\int</td><td style="text-align:center">积分</td></tr><tr><td style="text-align:center">$\iint$</td><td style="text-align:center">\iint</td><td style="text-align:center">双重积分</td></tr><tr><td style="text-align:center">$\iiint$</td><td style="text-align:center">\iiint</td><td style="text-align:center">三重积分</td></tr><tr><td style="text-align:center">$\oint$</td><td style="text-align:center">\oint</td><td style="text-align:center">曲线积分</td></tr><tr><td style="text-align:center">$\nabla$</td><td style="text-align:center">\nabla</td><td style="text-align:center">梯度</td></tr><tr><td style="text-align:center">$\int_0^2 x^2 dx$</td><td style="text-align:center">\int_0^2 x^2 dx</td><td style="text-align:center">其他的积分符号类似</td></tr></tbody></table><h2 id="逻辑运算">逻辑运算</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">$\because$</td><td style="text-align:center">\because</td><td style="text-align:center">因为</td></tr><tr><td style="text-align:center">$\therefore$</td><td style="text-align:center">\therefore</td><td style="text-align:center">所以</td></tr><tr><td style="text-align:center">$\forall$</td><td style="text-align:center">\forall</td><td style="text-align:center">任意</td></tr><tr><td style="text-align:center">$\exists$</td><td style="text-align:center">\exists</td><td style="text-align:center">存在</td></tr><tr><td style="text-align:center">$\vee$</td><td style="text-align:center">\vee</td><td style="text-align:center">逻辑与</td></tr><tr><td style="text-align:center">$\wedge$</td><td style="text-align:center">\wedge</td><td style="text-align:center">逻辑或</td></tr><tr><td style="text-align:center">$\bigvee$</td><td style="text-align:center">\bigvee</td><td style="text-align:center">逻辑与</td></tr><tr><td style="text-align:center">$\bigwedge$</td><td style="text-align:center">\bigwedge</td><td style="text-align:center">逻辑或</td></tr></tbody></table><h2 id="上下标符号">上下标符号</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$\bar{a}$</td><td style="text-align:center">\bar${a}$</td></tr><tr><td style="text-align:center">$\acute\a$</td><td style="text-align:center">\acute</td></tr><tr><td style="text-align:center">$\breve{a}$</td><td style="text-align:center">\breve${a}$</td></tr><tr><td style="text-align:center">$\grave{a}$</td><td style="text-align:center">\grave${a}$</td></tr><tr><td style="text-align:center">$\dot{a}$</td><td style="text-align:center">\dot${a}$</td></tr><tr><td style="text-align:center">$\ddot{a}$</td><td style="text-align:center">\ddot${a}$</td></tr><tr><td style="text-align:center">$\hat{a}$</td><td style="text-align:center">\hat${a}$</td></tr><tr><td style="text-align:center">$\check{a}$</td><td style="text-align:center">\check${a}$</td></tr><tr><td style="text-align:center">$\breve{a}$</td><td style="text-align:center">\breve${a}$</td></tr><tr><td style="text-align:center">$\tilde{a}$</td><td style="text-align:center">\tilde${a}$</td></tr><tr><td style="text-align:center">$\vec{a}$</td><td style="text-align:center">\vec${a}$</td></tr><tr><td style="text-align:center">$\overline{a + b + c + d}$</td><td style="text-align:center">\overline${a + b + c + d}$</td></tr><tr><td style="text-align:center">$\underline{a + b + c + d}$</td><td style="text-align:center">\underline${a + b + c + d}$</td></tr><tr><td style="text-align:center">$\overbrace{a + b + c + d}$</td><td style="text-align:center">\overbrace${a + b + c + d}$</td></tr><tr><td style="text-align:center">$\underline{a + b + c + d}$</td><td style="text-align:center">\underline${a + b + c + d}$</td></tr><tr><td style="text-align:center">$\overbrace{a + \underbrace{b + c}_{1.0} + d}^{2.0}$</td><td style="text-align:center">\overbrace{a + \underbrace{b + c}_{1.0} + d}^${2.0}$</td></tr></tbody></table><h2 id="希腊字母">希腊字母</h2><table><thead><tr><th style="text-align:center">大写</th><th style="text-align:center">Markdown</th><th style="text-align:center">小写</th><th style="text-align:center">Markdown</th></tr></thead><tbody><tr><td style="text-align:center">$A$</td><td style="text-align:center">\Alpha</td><td style="text-align:center">$\alpha$</td><td style="text-align:center">\alpha</td></tr><tr><td style="text-align:center">$B$</td><td style="text-align:center"></td><td style="text-align:center">$\beta$</td><td style="text-align:center">\beta</td></tr><tr><td style="text-align:center">$\Gamma$</td><td style="text-align:center">\Gamma</td><td style="text-align:center">$\gamma$</td><td style="text-align:center">\gamma</td></tr><tr><td style="text-align:center">$\Delta$</td><td style="text-align:center">\Delta</td><td style="text-align:center">$\delta$</td><td style="text-align:center">\delta</td></tr><tr><td style="text-align:center">$E$</td><td style="text-align:center">\Epsilon</td><td style="text-align:center">$\epsilon$</td><td style="text-align:center">\epsilon</td></tr><tr><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">$\varepsilon$</td><td style="text-align:center">\varepsilon</td></tr><tr><td style="text-align:center">$Z$</td><td style="text-align:center">\Zeta</td><td style="text-align:center">$\zeta$</td><td style="text-align:center">\zeta</td></tr><tr><td style="text-align:center">$H$</td><td style="text-align:center">\Eta</td><td style="text-align:center">$\eta$</td><td style="text-align:center">\eta</td></tr><tr><td style="text-align:center">$\Theta$</td><td style="text-align:center">\Theta</td><td style="text-align:center">$\theta$</td><td style="text-align:center">\theta</td></tr><tr><td style="text-align:center">$I$</td><td style="text-align:center">\Iota</td><td style="text-align:center">$\iota$</td><td style="text-align:center">\iota</td></tr><tr><td style="text-align:center">$K$</td><td style="text-align:center">\Kappa</td><td style="text-align:center">$\kappa$</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\Lambda$</td><td style="text-align:center">\Lambda</td><td style="text-align:center">$\lambda$</td><td style="text-align:center">\lambda</td></tr><tr><td style="text-align:center">$M$</td><td style="text-align:center">\Mu</td><td style="text-align:center">$\mu$</td><td style="text-align:center">\mu</td></tr><tr><td style="text-align:center">$N$</td><td style="text-align:center">\Nu</td><td style="text-align:center">$\nu$</td><td style="text-align:center">\nu</td></tr><tr><td style="text-align:center">$\Xi$</td><td style="text-align:center">\Xi</td><td style="text-align:center">$\xi$</td><td style="text-align:center">\xi</td></tr><tr><td style="text-align:center">$O$</td><td style="text-align:center">\Omicron</td><td style="text-align:center">$\omicron$</td><td style="text-align:center">\omicron</td></tr><tr><td style="text-align:center">$\Pi$</td><td style="text-align:center">\Pi</td><td style="text-align:center">$\pi$</td><td style="text-align:center">\pi</td></tr><tr><td style="text-align:center">$R$</td><td style="text-align:center">\Rho</td><td style="text-align:center">$\rho$</td><td style="text-align:center">\rho</td></tr><tr><td style="text-align:center">$\Sigma$</td><td style="text-align:center">\Sigma</td><td style="text-align:center">$\sigma$</td><td style="text-align:center">\sigma</td></tr><tr><td style="text-align:center">$T$</td><td style="text-align:center">\Tau</td><td style="text-align:center">$\tau$</td><td style="text-align:center">\tau</td></tr><tr><td style="text-align:center">$\Upsilon$</td><td style="text-align:center">\Upsilon</td><td style="text-align:center">$\upsilon$</td><td style="text-align:center">\upsilon</td></tr><tr><td style="text-align:center">$\Phi$</td><td style="text-align:center">\Phi</td><td style="text-align:center">$\phi$</td><td style="text-align:center">\phi</td></tr><tr><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">$\varphi$</td><td style="text-align:center">\varphi</td></tr><tr><td style="text-align:center">$X</td><td style="text-align:center">\Chi</td><td style="text-align:center">$\chi$</td><td style="text-align:center">\chi</td></tr><tr><td style="text-align:center">$\Psi$</td><td style="text-align:center">\Psi</td><td style="text-align:center">$\psi$</td><td style="text-align:center">\psi</td></tr><tr><td style="text-align:center">$\Omega$</td><td style="text-align:center">\Omega</td><td style="text-align:center">$\omega$</td><td style="text-align:center">\omega</td></tr></tbody></table><h2 id="省略号">省略号</h2><table><thead><tr><th style="text-align:center">算式</th><th style="text-align:center">Markdown</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">$\dots$</td><td style="text-align:center">\dots</td><td style="text-align:center">一般用于有下标的序列</td></tr><tr><td style="text-align:center">$\ldots$</td><td style="text-align:center">\ldots</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">$\cdots$</td><td style="text-align:center">\cdots</td><td style="text-align:center">纵向位置比\dots稍高</td></tr><tr><td style="text-align:center">$\vdots$</td><td style="text-align:center">\vdots</td><td style="text-align:center">竖向</td></tr><tr><td style="text-align:center">$\ddots$</td><td style="text-align:center">\ddots</td><td style="text-align:center">…</td></tr></tbody></table><p><strong>例：</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$$ </span><br><span class="line">x<span class="emphasis">_1, x_</span>2, \dots, x<span class="emphasis">_n \quad \quad 1, 2, \cdots, n \quad \quad \vdots \quad\quad \ddots </span></span><br><span class="line"><span class="emphasis">$$</span></span><br></pre></td></tr></table></figure><p>$$<br>x_1, x_2, \dots, x_n \quad \quad 1, 2, \cdots, n \quad \quad \vdots \quad\quad \ddots<br>$$</p><h2 id="分支">分支</h2><p>$$<br>y=<br>\begin{cases}<br>-x,\quad x\leq 0\<br>x, \quad x&gt;0<br>\end{cases}<br>\tag{1}<br>$$</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$$</span><br><span class="line">y=</span><br><span class="line">\begin&#123;cases&#125;</span><br><span class="line">-x,\quad x\leq 0\\</span><br><span class="line">x, \quad x&gt;0</span><br><span class="line">\end&#123;cases&#125;</span><br><span class="line">\tag&#123;1&#125;</span><br><span class="line">$$</span><br></pre></td></tr></table></figure><p><strong>其他环境</strong></p><p>下面这些标签环境在很多markdown中不能解析</p><table><thead><tr><th style="text-align:center">环境名称</th><th style="text-align:center">描述</th></tr></thead><tbody><tr><td style="text-align:center">align</td><td style="text-align:center">最基本的对齐环境</td></tr><tr><td style="text-align:center">multline</td><td style="text-align:center">非对齐环境</td></tr><tr><td style="text-align:center">gather</td><td style="text-align:center">无对齐的连续方程</td></tr></tbody></table><h2 id="矩阵">矩阵</h2><p>不带括号：<br>$$<br>\begin{matrix}<br>1 &amp; 2 &amp; 3\<br>4 &amp; 5 &amp; 6 \<br>7 &amp; 8 &amp; 9<br>\end{matrix}<br>\tag{1}<br>$$</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$$</span><br><span class="line">\begin&#123;matrix&#125;</span><br><span class="line">1 &amp; 2 &amp; 3\\</span><br><span class="line">4 &amp; 5 &amp; 6 \\</span><br><span class="line">7 &amp; 8 &amp; 9</span><br><span class="line">\end&#123;matrix&#125;</span><br><span class="line">\tag&#123;1&#125;</span><br><span class="line">$$</span><br></pre></td></tr></table></figure><p>带括号</p><p>$$\left(<br>\begin{matrix}<br>1 &amp; 2 &amp; 3\<br>4 &amp; 5 &amp; 6 \<br>7 &amp; 8 &amp; 9<br>\end{matrix}<br>\right)<br>\tag{2}<br>$$</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$$\left(</span><br><span class="line">\begin&#123;matrix&#125;</span><br><span class="line">1 &amp; 2 &amp; 3\\</span><br><span class="line">4 &amp; 5 &amp; 6 \\</span><br><span class="line">7 &amp; 8 &amp; 9</span><br><span class="line">\end&#123;matrix&#125;</span><br><span class="line">\right)</span><br><span class="line">\tag&#123;2&#125;</span><br><span class="line">$$</span><br></pre></td></tr></table></figure><h2 id="中括号">中括号</h2><p>$$\left[<br>\begin{matrix}<br>1 &amp; 2 &amp; 3\<br>4 &amp; 5 &amp; 6 \<br>7 &amp; 8 &amp; 9<br>\end{matrix}<br>\right]<br>\tag{3}<br>$$</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$$\left[</span><br><span class="line">\begin&#123;matrix&#125;</span><br><span class="line">1 &amp; 2 &amp; 3\\</span><br><span class="line">4 &amp; 5 &amp; 6 \\</span><br><span class="line">7 &amp; 8 &amp; 9</span><br><span class="line">\end&#123;matrix&#125;</span><br><span class="line">\right]</span><br><span class="line">\tag&#123;3&#125;</span><br><span class="line">$$</span><br></pre></td></tr></table></figure><h2 id="大括号">大括号</h2><p>$$\left{<br>\begin{matrix}<br>1 &amp; 2 &amp; 3\<br>4 &amp; 5 &amp; 6 \<br>7 &amp; 8 &amp; 9<br>\end{matrix}<br>\right}<br>\tag{4}<br>$$</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$$\left\&#123;</span><br><span class="line">\begin&#123;matrix&#125;</span><br><span class="line">1 &amp; 2 &amp; 3\\</span><br><span class="line">4 &amp; 5 &amp; 6 \\</span><br><span class="line">7 &amp; 8 &amp; 9</span><br><span class="line">\end&#123;matrix&#125;</span><br><span class="line">\right\&#125;</span><br><span class="line">\tag&#123;4&#125;</span><br><span class="line">$$</span><br></pre></td></tr></table></figure><h2 id="带省略号">带省略号</h2><p>$$<br>\left[<br>\begin{matrix}<br>a &amp; b &amp; \cdots &amp; a\<br>b &amp; b &amp; \cdots &amp; b\<br>\vdots &amp; \vdots &amp; \ddots &amp; \vdots\<br>c &amp; c &amp; \cdots &amp; c<br>\end{matrix}<br>\right]<br>\tag{5}<br>$$</p><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$$</span><br><span class="line"><span class="string">\left[</span></span><br><span class="line"><span class="string">\begin&#123;matrix&#125;</span></span><br><span class="line">a &amp; b &amp; <span class="string">\cdots</span> &amp; a<span class="string">\\</span></span><br><span class="line">b &amp; b &amp; <span class="string">\cdots</span> &amp; b<span class="string">\\</span></span><br><span class="line"><span class="string">\vdots</span> &amp; <span class="string">\vdots</span> &amp; <span class="string">\ddots</span> &amp; <span class="string">\vdots\\</span></span><br><span class="line">c &amp; c &amp; <span class="string">\cdots</span> &amp; c</span><br><span class="line"><span class="string">\end&#123;matrix&#125;</span></span><br><span class="line"><span class="string">\right]</span></span><br><span class="line"><span class="string">\tag&#123;5&#125;</span></span><br><span class="line">$$</span><br></pre></td></tr></table></figure><h2 id="带横线-竖线分割的矩阵">带横线/竖线分割的矩阵</h2><p>$$<br>\left[<br>\begin{array}{c|cc}<br>1 &amp; 2 &amp; 3 \<br>4 &amp; 5 &amp; 6 \<br>7 &amp; 8 &amp; 9<br>\end{array}<br>\right]<br>\tag{6}<br>$$</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$$</span><br><span class="line">\left[</span><br><span class="line">\begin&#123;array&#125;&#123;c|cc&#125;</span><br><span class="line">1 &amp; 2 &amp; 3 \\</span><br><span class="line">4 &amp; 5 &amp; 6 \\</span><br><span class="line">7 &amp; 8 &amp; 9</span><br><span class="line">\end&#123;array&#125;</span><br><span class="line">\right]</span><br><span class="line">\tag&#123;6&#125;</span><br><span class="line">$$</span><br></pre></td></tr></table></figure><p>横线用 \hline 分割<br>$$<br>\left[<br>\begin{array}{ccc}<br>1 &amp; 2 &amp; 3 \ \hline<br>4 &amp; 5 &amp; 6 \<br>7 &amp; 8 &amp; 9<br>\end{array}<br>\right]<br>\tag{7}<br>$$</p><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$$</span><br><span class="line"><span class="string">\left[</span></span><br><span class="line">    <span class="string">\begin&#123;array&#125;&#123;ccc&#125;</span></span><br><span class="line">    <span class="number">1</span> &amp; <span class="number">2</span> &amp; <span class="number">3</span> <span class="string">\\</span> <span class="string">\hline</span></span><br><span class="line">    <span class="number">4</span> &amp; <span class="number">5</span> &amp; <span class="number">6</span> <span class="string">\\</span></span><br><span class="line">    <span class="number">7</span> &amp; <span class="number">8</span> &amp; <span class="number">9</span></span><br><span class="line">    <span class="string">\end&#123;array&#125;</span></span><br><span class="line"><span class="string">\right]</span></span><br><span class="line"><span class="string">\tag&#123;7&#125;</span></span><br><span class="line">$$</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">Markdown语法汇总</summary>
    
    
    
    <category term="vue" scheme="http://265832.xyz/categories/vue/"/>
    
    
    <category term="我的Markdown" scheme="http://265832.xyz/tags/%E6%88%91%E7%9A%84Markdown/"/>
    
  </entry>
  
  <entry>
    <title>数学建模</title>
    <link href="http://265832.xyz/posts/a66872a2.html"/>
    <id>http://265832.xyz/posts/a66872a2.html</id>
    <published>2024-07-08T12:48:58.000Z</published>
    <updated>2024-07-11T08:35:57.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="数学建模：应用定量的思维方式探讨自然现象、社会现象解决实际问题。">数学建模：应用定量的思维方式探讨自然现象、社会现象解决实际问题。</h1><p><strong>建模步骤</strong>:</p><ul><li>1.分析问题</li><li>2.模型假设</li><li>3.求解或解释模型</li><li>4.模型验证</li><li>5.实施模型</li><li>6.改进模型</li></ul><h1 id="一、成比例模型">一、成比例模型</h1><p>利用成比例思想建立成比例模型:</p><ul><li>(1)画出散点图</li><li>(2)确定他们是过原点的直线，计算出斜率</li></ul><p>当模型为非曲线时，可以将其化为直线:</p><ul><li>1.图象向下凸可以将横坐标的次方系数适量增大，反之，横坐标次方系数减小。（次方系数可出现分数）</li><li>2.当开头结尾都受限制时，可以考虑他的增长率</li></ul><h1 id="二、动力系统">二、动力系统</h1><h2 id="线性动力系统">线性动力系统:</h2><ul><li>1.令$a_{n+1}=r*a_n$，则它的解为$a_n=r^na_0$,其中$a_0$为给定初始值。</li><li>2.当 $a_0=a$时，如果对所有的n=1,2,3,…有$$a_n=a$$则将数α称为动力系统 $a_{n+1} =f(a_n)$的<strong>平衡点或不动点</strong>。即 $a_n=a$是该动力系统的常数解。</li><li>3.线性动力系统解的长期趋势:$$a_{n+1}=ra_n,n=0,1,···（r为常数）$$$$a_n=r^na_0,n=1,2,···$$</li></ul><table><thead><tr><th>r</th><th>趋势</th></tr></thead><tbody><tr><td>r=0</td><td>常数解以及在0处的平衡点</td></tr><tr><td>r=1</td><td>所有初值都是常数解</td></tr><tr><td>r&lt;0</td><td>震荡</td></tr><tr><td>$|r|$&lt;1</td><td>衰减到极限值为0</td></tr><tr><td>$|r|$&gt;1</td><td>无限增长</td></tr></tbody></table><h2 id="形如-a-n-1-ra-n-b-的动力系统">形如 $a_{n+1}=ra_n+b$ 的动力系统</h2><ul><li>$a_{n+1}=ra_n+b$,其平衡点是$a=\frac{b}{1-r},r\neq1$</li><li>当$r=1,b=0$时，每个初始值都是平衡点</li><li>当$r=1,b!=0$时，不存在平衡点。</li></ul><h2 id="形如-a-n-1-ra-n-b-r-neq1-的动力系统">形如 $a_{n+1}=ra_n+b,(r\neq1)$ 的动力系统</h2><ul><li>解为:$a_n=r^nc+\frac{b}{1-r}$,(c是依赖初始值的某一常数)</li><li>对于动力系统$a_{n+1}=ra_n+b,(b\neq0)$<table><thead><tr><th>r的值</th><th>长期趋势</th></tr></thead><tbody><tr><td>|r|&lt;1</td><td>稳定平衡点</td></tr><tr><td>|r|&gt;1</td><td>不稳定平衡点</td></tr><tr><td>r=1</td><td>没有平衡点</td></tr></tbody></table></li></ul><h1 id="三、建模过程">三、建模过程</h1><p>模型准备–&gt;模型假设–&gt;模型建立–&gt;模型求解–&gt;模型分析–&gt;模型检验–&gt;模型应用</p><h1 id="四、模型拟合准则">四、模型拟合准则:</h1><p><strong>按照一个或一些选出的模型类型对数据进行拟合。</strong></p><h2 id="切比雪夫准则">切比雪夫准则</h2><p><strong>切比雪夫准则对有大偏差的单个数据点赋以更大的权重，当极小化最大绝对偏差很重要时可以采用这一准则。</strong></p><ul><li>给定某一函数类型$y=f(x)$及m个数据点$(x_i,y_i),j=1,2,3,···,m$.该切比雪夫准则是在整个数据点集上使最大绝对值偏差:$min{\max_{1 \leq i \leq m}|y_i-f(x_i)|}$最小.</li></ul><h2 id="极小化绝对偏差之和">极小化绝对偏差之和</h2><ul><li>给定某一函数类型$y=f(x)$及m个数据点$(x_i,y_i),j=1,2,3,···,m$.确定函数类型$y=f(x)$的参数，使绝对值偏差之和:$min{\sum_{i=1}^{m}|y_i-f(x_i)|}$最小</li><li>极小化绝对偏差之和这个准则赋以每个数据点相同的权重，其稳健性较好，对异常值不太敏感,<strong>常用数值解法求出近似解。</strong>。</li></ul><h2 id="最小二成准则">最小二成准则</h2><ul><li>给定某一函数类型$y=f(x)$(参数待定)及m个数据点$(x_i,y_i),j=1,2,3,···,m$.该准则是确定函数类型$y=f(x)$的参数，使偏差平方和:$min{\sum_{i=1}^{m}({y_i-f(x_i)})^2}$最小</li><li>最小二乘准则对偏差较大的数据点赋以较大的权重对偏差较小的数据点赋以较小的权重，其稳健性较差对异常值敏感。<br>与前两个准则相比，最小二乘准则产生的优化问题易于解析求解。由于偏差平方和是一个连续函数，可对待定参数求偏导得到正规方程，通过正规方程来确定最优参数进而确定出所给函数类型中的最佳函数。</li></ul><h1 id="回归分析">回归分析</h1><h2 id="回归分析-2">回归分析</h2><h3 id="由来">由来</h3><p><strong>由来：英国著名统计学家高尔顿是最先应用统计方法研究两个变量之间关系问题的人。高尔顿研究发现父母身高与儿女身高之间有这么一种关系:父母高-&gt;儿女也高，父母矮-&gt;儿女也矮</strong></p><table><thead><tr><th style="text-align:center">父母平均身高</th><th style="text-align:center">儿女平均身高</th></tr></thead><tbody><tr><td style="text-align:center">高一个单位</td><td style="text-align:center">高半个单位</td></tr><tr><td style="text-align:center">矮一个单位</td><td style="text-align:center">矮半个单位</td></tr></tbody></table><p>逐步回归<br><strong>具有回归于人口总平均高的趋势</strong></p><p>用高尔顿的话说，儿女身高“回归”到中等身高。这就是回归一词的最初由来。把这种后代的身高向中间靠拢的趋势称为“<strong>回归现象</strong>”。<br>后来，人们把由一个变量的变化去推测另一个变量的方法称为为“<strong>回归方法</strong>”。</p><h3 id="为何使用回归分析">为何使用回归分析</h3><p>(1) 更好地了解:<br>对某一现象建模，以更好地了解该现象并有可能基于对该现象的了解来影响政策的制定以及决定采取何种相应措施。基本目标是测量一个或多个变量的变化对另一变量变化的影响程度。示例:了解某些特定濒危鸟类的主要栖息地特征(例如:降水、食物源、植被、、天敌)，以协助通过立法来保护该物种。<br>(2) 建模预测:<br>示例:如果已知人口增长情况和典型的天气状况，那么明年的用电量将会是多少?<br>(3) 探索检验假设:<br>还可以使用回归分析来深入探索某些假设情况。假设您正在对住宅区的犯罪活动进行建模，以更好地了解犯罪活动并希望实施可能阻止犯罪活动的策略。开始分析时，您很可能有很多问题或想要检验的假设情况。</p><h3 id="回归分析的作用主要有以下几点">回归分析的作用主要有以下几点</h3><ul><li>挑选与因变量相关的自变量;</li><li>描述因变量与自变量之间的关系强度;</li><li>生成模型，通过自变量来预测因变量:</li><li>根据模型，通过因变量，来控制自变量。</li></ul><p>是一种预测预报方法，提前知道未来的状态和发展趋势。<br>它研究的是因变量Y和自变量X之间的关系，是一种预测性的建模技术。</p><!-- ![img](https://tuchuang.voooe.cn/images/2024/07/16/808aa45672dfef6165819a53d7aa81a6.png) --><h3 id="线性回归">线性回归</h3><table><thead><tr><th style="text-align:center">线性</th><th style="text-align:center">非线性</th></tr></thead><tbody><tr><td style="text-align:center">一元线性回归</td><td style="text-align:center">一元非线性回归</td></tr><tr><td style="text-align:center">多元线性回归</td><td style="text-align:center">多元非线性回归</td></tr></tbody></table><h2 id="一元线性回归">一元线性回归</h2><p><strong>一元线性回归可用来分析自变量x取值与因变量y取值的内在联系，这里的自变量x是确定性的变量，因变量y是随机性的变量。</strong></p><h3 id="一元线性回归模型构建">一元线性回归模型构建</h3><p>一元线性回归的模型为: $y=a+bx+ε目ε\sim N(0，σ^2)$</p><ul><li>其中$a$表示截距，$b$表示直线的倾斜率;$a、b$称为回归系数，与自变量$x$无关。</li><li>$ε$ 是随机误差项，并总是假设$ε\sim N(0，σ^2)$。</li></ul><p>若对自变量x与因变量y分别进行n次独立观测，得到:</p><table><thead><tr><th style="text-align:center">1</th><th style="text-align:center">2</th><th style="text-align:center">3</th><th style="text-align:center">4</th><th style="text-align:center">5</th></tr></thead><tbody><tr><td style="text-align:center">$X$</td><td style="text-align:center">$x_1$</td><td style="text-align:center">$x_2$</td><td style="text-align:center">···</td><td style="text-align:center">$x_n$</td></tr><tr><td style="text-align:center">$Y$</td><td style="text-align:center">$y_1$</td><td style="text-align:center">$y_2$</td><td style="text-align:center">···</td><td style="text-align:center">$y_n$</td></tr></tbody></table><p>对于参数a,b用最小二乘法估计，即应选取估计值，6，使当$a=\hat{a},b=\hat{b}$ 时$\hat{y_i}$与估计值$\hat{y_i}=\hat{a}+\hat{b}x$, 误差平方和 $Q=\sum_{i=1}^n{ε_i}^2=\sum_{i=1}^n{(y_i-\hat{y_i})}^2$达到最小。</p><p>为此，我们令</p><ul><li>$\frac{\partial Q}{\partial a}=-2\sum_{i=1}^n{(y_i-a-bx_i)}^2=0$</li><li>$\frac{\partial Q}{\partial b}=-2\sum_{i=1}^nx_i{(y_i-a-bx_i)}^2=0$</li></ul><p>得</p><ul><li>$\hat{b}=\frac{\sum_{i=1}^n(x_i-\overline{x})(y_i-\overline{y})}{\sum_{i=1}^n{(x_i-\overline{x})}^2}$</li><li>$\hat{a}=\hat{y_i}-\hat{b}\overline{x}$</li></ul><p>$\hat{a},\hat{b}$为$a,b$的最小二乘估计，其中分别是$\overline{x},\overline{y}$分别是 x,y, 的样本均值。</p><h3 id="回归方程的检验">回归方程的检验</h3><p><strong>回归方程的假设检验</strong>：</p><ul><li>回归模型的假设检验</li><li>回归系数的假设检验</li></ul><h4 id="回归模型的假设检验">回归模型的假设检验</h4><p><strong>检验原因</strong>:因变量y与自变量x之间是否存在如模型所表示的关系是需要检验的。<br><strong>方法</strong>:F检验法</p><ul><li>模型的误差平方和为: $SSE=\sum_{i=1}^n{(y_i-\hat{y_i})}^2$</li><li>模型的回归平方和为: $SSR=\sum_{i=1}^n{(\hat{y_i}-\overline{y_i})}^2$</li><li>模型的总离差平方和为: $SST=\sum_{i=1}^n{(y_i-\overline{y_i})}^2$</li><li>可得: $SST=SSE+SSR$</li></ul><p>对于模型$y=a+b_ix_i+ε,i=1,2…,p.$<br>显然，模型成立的对立面是: y与x的线性关系不明显，即$b_i$很小，所以我们可以令原假设为$H_0:b_1=b_2=…=b_p=0$，如果原假设成立，则构造统计量<br>$$<br>F=\frac{MSR}{MSE}=\frac{SSR/P}{SSE/(n-p-1)}\sim F(p,n-p-1)<br>$$<br>p是自变量个数，$\hat{σ}^2=MSE=SSE/(n-p-1)$ 是 $σ^2$ 的无偏估计。</p><p>在显著性水平$\alpha$下，对于上$\alpha$分位数 $F_\alpha(p,n-p-1)$，若 $F&lt;F_\alpha(p,n-p-1)$，则接受$H_0$,否则拒绝$H_0$。<br><strong>注:这里接受H。只是说明了y与x的线性关系不明显，也可能是非线性关系，如平方关系</strong></p><p><strong>另一种方法</strong>:通过判定系数来衡量$y$与$x_1,x_2,…,x_n$,的相关程度。即(回归平方和在总平方和中的比值):<br>$$<br>R_2=\frac{SSR}{SST}<br>$$<br>其中,$R=\sqrt{R^2}$ 称为复相关系数，$R$ 越大(通常大于$0.8$或$0.9$)，$y$与$x_1,x_2,…,x_n$的相关关系越密切。</p><h4 id="回归系数的假设检验">回归系数的假设检验</h4><p><strong>检验原因</strong>: 当前面的回归模型检验通过，对自变量系数的检验，即考察每一个自变量对因变量的影响是否显著。<br><strong>方法</strong>: $t$ 检验法(做 $p+1$ 次检验)<br>$\quad$设随机变量$x_1,x_2,…,x_n$对应的系数为 $\hat{b_1},\hat{b_2},…,\hat{b_n}$，各个 $x_i$ 都服从正态分布, 所以 6也服从正态分布。($b_0=a$)<br>当 $H_0: b_i=0,i=0,1,2…p.$ 成立时，有$$<br>t_i=\frac{b_j/ \sqrt{c_{ii}}}{\sqrt{SSE/(n-p-1)}}\sim t<br>(n-p-1)$$<br>($c_{ii}$:是正规方程组的系数矩阵的逆矩阵中的元素)</p><p>在显著性水平$\alpha$下，若$t_i&lt;t_{\frac{\alpha}{2}}(n-m-1)$，则接受$H_0$, 否则拒绝$H_0$: 认为系数不为0.即通过检验。</p><h4 id="利用回归模型进行预测-点预测和区间预测">利用回归模型进行预测(点预测和区间预测)</h4><p>$eg$: 总体数量为 $n$，对总体的均值进行预测。<br>(1)当 $x=x_0$ 时，用方程立 $\hat{y_0}=a+bx_0$。预测 $y_0$ 的值，为点预测。($\hat{y_0}$)<br>(2)当 $x=x_0$,时，用区间去换测 $y$ 的取值范围，为区间预测。([$\hat{y_0}-\Delta{x},\hat{y_0}+\Delta{x}$])</p><h2 id="一元非线性回归">一元非线性回归</h2><h3 id="一元非线性回归介绍">一元非线性回归介绍</h3><p>$\quad$ 非线性回归是回归函数关于未知回归系数具有非线性结构的回归。简单理解就是非线性回归就是曲线回归。<br>$\quad$ 实际问题中，变量之间常常不是直线。这时，通常是选配一条比较接近的曲线，通过变量替换把非线性方程加以线性化，然后按照线性回归的方法进行拟合。(<strong>将非线性转化为线性</strong>)。<br>$\quad$ <strong>在做非线性回回归时，一般要先确定该非线性回归模型后再做非线性回归;<br>$\quad$ 解题思路是先将所给的数据点通过matlab绘图的方式画出来，再看看画出来的散点图比较符合哪个非线性回归模型就选择那个模型，最后再做非线性回归分析。</strong></p><p>转化为一元线性常用 <a href="https://blog.csdn.net/A15216110998/article/details/80479942">取对数再做回归</a></p><p><strong>如:我们可以通过对因变量或者自变量进行一定的变形，将问题转化为一元线<br>性回归分析。</strong></p><table><thead><tr><th style="text-align:center">曲线回归方程</th><th style="text-align:center">方法</th><th style="text-align:center">转换后的直线回归方程</th></tr></thead><tbody><tr><td style="text-align:center">$y=a+\frac{b}{x}$</td><td style="text-align:center">对自变量x取倒数</td><td style="text-align:center">$y=a+bx’$</td></tr><tr><td style="text-align:center">$y=ax^b$</td><td style="text-align:center">将方程两边取对数</td><td style="text-align:center">$lny=lna+blnx$</td></tr><tr><td style="text-align:center">$y=ae^{bx}$</td><td style="text-align:center">将方程两边取对数</td><td style="text-align:center">lny=lna+bx</td></tr></tbody></table><table><thead><tr><th style="text-align:center">曲线回归方程</th><th style="text-align:center">$y’$</th><th style="text-align:center">$x’$</th><th style="text-align:center">$a’$</th><th style="text-align:center">$b’$</th><th style="text-align:center">转换后的直线回归方程</th></tr></thead><tbody><tr><td style="text-align:center">$\hat{y}=ae^{bx}(a&gt;0)$</td><td style="text-align:center">$y’=lny$</td><td style="text-align:center"></td><td style="text-align:center">$a’=lna$</td><td style="text-align:center"></td><td style="text-align:center">$y’=a’+bx$</td></tr><tr><td style="text-align:center">$\hat{y}=ab^x(a&gt;0)$</td><td style="text-align:center">$y’=lny$</td><td style="text-align:center"></td><td style="text-align:center">$a’=lna$</td><td style="text-align:center">$b’=lnb$</td><td style="text-align:center">$y’=a’+b’x$</td></tr><tr><td style="text-align:center">$\hat{y}=a+blnx(x&gt;0)$</td><td style="text-align:center">$y’=lny$</td><td style="text-align:center">$x’=lnx$</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">$y’=a+bx’$</td></tr><tr><td style="text-align:center">$\hat{y}=ax^b(a&gt;0,x&gt;0)$</td><td style="text-align:center">$y’=lny$</td><td style="text-align:center">$x’=lnx$</td><td style="text-align:center">$a’=lna$</td><td style="text-align:center"></td><td style="text-align:center">$y’=a’+bx’$</td></tr><tr><td style="text-align:center">$\hat{y}=\frac{x}{a+bx}(x\neq-\frac{a}{b})$</td><td style="text-align:center">$y’=\frac{x}{y}$</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">$y’=a+bx$</td></tr><tr><td style="text-align:center">$\hat{y}=\frac{a+bx}{x}(x\neq0)$</td><td style="text-align:center">$y’=yx$</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">$y’=a+bx$</td></tr><tr><td style="text-align:center">$\hat{y}=\frac{1}{a+bx}(x\neq-\frac{a}{b})$</td><td style="text-align:center">$y’=\frac{1}{y}$</td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center"></td><td style="text-align:center">$y’=a+bx$</td></tr><tr><td style="text-align:center">$\hat{y}=\frac{k}{1+ae^{-bx}}(a&gt;0)$</td><td style="text-align:center">$y’=ln(\frac{k-y}{y})$</td><td style="text-align:center"></td><td style="text-align:center">$a’=lna$</td><td style="text-align:center"></td><td style="text-align:center">$y’=a’-bx$</td></tr></tbody></table><h3 id="步骤">步骤</h3><p>1.描散点图，确立回归方程的模型;<br>2.求方程中待定系数，建立回归方程：</p><ul><li>将非线性方程化为线性方程;</li><li>求待定系数，建立线性方程;</li><li>对线性方程作回归关系显著性检验；</li><li>将线性方程还原为非线性。</li></ul><h2 id="多元线性回归">多元线性回归</h2><h3 id="多元线性回归介绍">多元线性回归介绍</h3><p>$\quad$ 在回归分析中，如果有两个或两个以上的自变量，就称为<strong>多元回归</strong>。实际应用中，一种现象常常是与多个因素相联系的，由多个自变量的最优组合共同来预测或估计因变量，比只用一个自变量进行预测或估计更有效，更符合实际。总的来说，回归分析就是用来做预测的，多元回归要比一元回归更加高效实用。<br>$\quad$ <strong>多元回归分析</strong>是研究多个变量之间的关系的回归分析方法，是反映一种现象或事物的数量依多种现象或事物的数量的变动而相应地变动的规律，建立多个变量之间线性或非线性数学模型数量关系式的统计方法。</p><h3 id="多元线性回归模型">多元线性回归模型</h3><p>多元线性回归模型通常用来描述变量$y$和$x$之间的随机线性关系，即:</p><ul><li>$y=\beta_0+\beta_1x_1+…+\beta_mx_m+\varepsilon$</li><li>$ε$ 是随机误差项，并总是假设$ε\sim N(0，σ^2)$。</li></ul><p>式中: $\beta_0,\beta_1,…,\beta_m,σ2$ 都是与 $x_1,x_2,…,x_m$ 无关的未知参数，其中 $\beta_0,\beta_1,…,\beta_m$ 称为<strong>回归系数</strong>。</p><h2 id="多元非线性回归">多元非线性回归</h2><h3 id="多元非线性回归介绍">多元非线性回归介绍</h3><p>$\quad$ 建立多元非线性回归方程在科学研究中应用广泛，其重要方法是将<strong>非线性</strong>回归方程转化为<strong>线性</strong>回归方程。<br><strong>转化时应首先选择合适的非线性回归形式，并将其线性化，确定线性化回归方程的系数，最后确定非线性回归方程中的参数。</strong><br>$\quad$ 首先决定非线性模型的函数类型，对于其中可线性化问题则通过变量变换将其线性化，从而归结为前面的多元线性回归问题来解决。<br>$\quad$ 选择合适的曲线类型不是一件轻而易举的工作，首先对原始数据作图或则依靠专业知识和经验，来选择适当的函数进行拟合。<br>常用的曲线类型有幂函数，指数函数，抛物线函数，对数函数和S型函数</p><h3 id="回归分析中的：线性-非线性">回归分析中的：线性&amp;非线性</h3><p><strong>线性函数</strong> $\neq$ <strong>线性回归方程</strong></p><p>$Y_i=\beta_0+\beta_1x_{i1}+…+\beta_px_{ip}+\varepsilon_i$<br>$Y_i=\beta_1x_1+\beta_2x_i^2+\varepsilon_i$<br>$Y=\beta_0+e^\beta_1x_1+\varepsilon$</p><p><strong>方程一和方程二为线性回归，方程三为非线性回归。</strong><br>线性回归中<strong>线性</strong>的<strong>含义</strong>: 因变量$y$对于未知的回归系数($\beta_0,\beta_1,…,\beta_k$)是线性的。这就是问题中所说的<strong>参数线性</strong>。换句话说只要系数B是线性的就称为线性回归，方程一和方程二中的回归系数B都是线性的，而方程三中自变量X1的回归系数为非线性，因此，方程一和方程二为线性回归，方程三为非线。</p>]]></content>
    
    
    <summary type="html">备战数学建模</summary>
    
    
    
    <category term="学习" scheme="http://265832.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="数学建模" scheme="http://265832.xyz/tags/%E6%95%B0%E5%AD%A6%E5%BB%BA%E6%A8%A1/"/>
    
  </entry>
  
  <entry>
    <title>毛概学习笔记</title>
    <link href="http://265832.xyz/posts/bf6d62af.html"/>
    <id>http://265832.xyz/posts/bf6d62af.html</id>
    <published>2024-06-24T03:26:37.000Z</published>
    <updated>2024-06-24T11:03:55.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 密码不对, 请再试试!!" data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="7b15abbd7a7d227cf7cc59dd8ade2d1506d7af9d36661f753ebdef08109c092c">ec3a31742d91755fb33828633f5c235538eb663ec0e39f4ffb25d2dac398961ba7964c1ccaf69534daac5718932e7064b0cade94f0963f1a91e12ecf85da2c8ef7dbb8f88c215735d7bcd49a4ca0377f52d0ca0fd1a35b44bddaec0b20e82ef00ebd74c987f30d51df0ff7519842fd8f92a41bcfd9c9467d539faeb121687ddeb21c053b7886a5c36a06460b5f772f38e31febfe41f30da0702cc72ab3d5347359a00913e6e2b820aafe3ecf28ccee2713c4fae1996b1e9f40a05fb235c7731ee4ccd8974b08a3342a8aa55192c1ebf86591a9c806298468e3725efca2372408d0b2b8680fc509afd715f7937285a13babd5d9339e6c381c25107fb2c730c0f7b0973c83ad03057cc0e64429945d657180e3a98aac0671a0e976fd2104347c6c8d189f3e3eae66d3d0941e833fbaeb7a293d4847ecb6f18a3206d3245e80fce9c5920303d8c239c325d91690002ebf95f9224a25d02f684203e47616c5c509301a088b9a176ad7b75f76a5f45047745001e9595e3466872c06c7e636d52484951db37d63a4f7c797f30cd80e0b41f20e5192ba5d7c05cf1edc4e49d80344e34e10ae90c52bc85d5b952e20fddac5fad99f16c8d2ea3742b185b1848218decd6e6abea7b6514e4664093f390ac59a42e03b234baa1322e5d6ee3e77bd48bf61e3837284f40346e6515551d9e0c7f19ce5f391743a9b2193b5fe44a141de3a38b72109979e69a774160012b25daa4cd6081b7522f0c4798911fad87bfad83c87b5d69a8ca95fd419ffc0569e15b68a43fa571b45bc5787a71fbe0bfe8f656d44366ac24b5e79373a89c4ce260e34190b4d597c8faba0f18a2c6308506bd84bcfc5fb6b984fba62cae9629946259c89e0b10e4cade2b66b490784cb9747326004e6bd0859f3183dda96113d049c9c4d6c5d19690985f9abe594a4ed24f9f184e653caf86ea13f577597262a46a059a083da5f6969a2abd6353f927531cc24b3db180e8198a65446fe91f2eb0acdc54364ee418d77930ad40b605588b5b82a48f1c6c15a5a0124268946fa11f48f6be0ee40a927d253bea2f15cea693f79f0745cccf9f921f5ca69484d76da659310551f3476729449f1dd65bcc2ed6f9b3d082dac3e8c9df93ad0c7240f3116d014e11cbee0f1a190cee66af52d3da371a6532a33c23b0104c42f99729a7c355f385a233e47dcb65a0ebbd11bf6ae78fd52bea8f0294c71d10f614d655eae915612a206c014a6487d927f9933b38a17767bdccd98c766333a8b2369af3c8c0160c00994ed1d5c14c4ade0eb9c0c6d23b4f75dc91521336b760d7e257397478ffe6fa6ccd6346b18909eb135da61df331d8c865a641630f2668bff2ce0527d5012a8084ecdd998657d38ea3cfc473b6fe245f633e1c17600b501a8a362b216fe7df7efa9a9c3665181ce01aa0db49b76229335ad3f4499654d906d1c91eff2bbd3902acaba934ce711336dc744e3d87b13ed792ce11c458518947990a47f0543150ae2ffb3e1f0456a29cf52354cae04551e026a3885c7a8107d03e5d7df482feb976612c0c65e7417fbbd5ab9ce15c22f459a15cb9788941567b274a04eb1b754c0b19041ebaf3195e8fbee1a2e771941714f1a93ce3abc1b28b0bd72c8da0068a9d7ecf315a05a69aca4616514f6cdf144261a548933ac54e1a2de302a1740e205a343681e021564b519b4ac95c724e652f0bee736ec9f0803b7541b1cf21a9b17a1933f52fd53ce0ecbfda8045dbc9b77233579492dd419b34b7d82aaa48221a572bca4a6aae19732b402874eed10a4ca9318f773fc045546b673b9d66b22a926a6f9d6201e076edf5b093cfa7b999cf1d43755abff558f94cc404cb50fa80cfa6cb6fddb398723f5c3bf810638a724dfa91ec444867dc30a6f51cfa9fbe1029ff84ebe860af14b9015a458fe3963af0da1a0f5158d016e6a50622d6f00c0637001ea4a170944e07c74a89540a2ae706b4013f74cb69fdf861fc809dd2fb102cc08526face37aa28481989e0c963400d3541459a761c030a900c5b06af77d183994625ae0ae50224622a74f82bff06c2e620e7365b2fa63667ebce713f07cb0e5b65e1dc0081b8d22c6dd7e84e3a1c9c9bbe53deeb38c39d41e0a8c9e21de46401259b31411cc775aa62ededa0827328f16ab0eb92892033ef2e77de0747374ec8665b4b5751c4c9b95b3a585e52b381f70ca18cfe17c63682e569abf3fb4a4544c43089403222c5db43b118bf931d4fd16872a32cd277d62bdcaeeca609745489e6e0cae99c78825bcc43242f6e8a6ff58217d6e29454982cf818fbc796050841c9ca354311d067e10e915d1180f9e8b8e78dea29ecc972897e898f03d9f67a27a92d498962441b7081fc5463dfbb031fadace4c4c8570c411c0bbba583fa253a35b64e94e4c9598d7c85d28a2d02572319a0ba415d27aa9c3eff410509629ee728898bd79cfb847f59c82cc7fb0e0730baad4b90e85b067fa3d1c84b3b931f775f87c71ca9702ec819470dda9bc168d2a96352bd055c7262019d3dcb7300b77d69ecb81f8a2a9a728ba4743494e5dcfb7d40d373eb6ec96bd8d88179eb259312f5cbd7aa1cb9aa393c04425b41244a5b2ce0f4b7f185e90c2a3cfbbda0ab4a8834d920879cfa53595968168c6c42d3a99e7ce16f98da7da4f1ef48de05233251f64bfc5b4e88d3f8d98b97e4d26ba866630fce43dd7a750e7d965393bb591c18d909349f8c3ff8b0a9726596bf6733807a2488741c9aad51b6b61fa2e765595073bed6305fb31893c17b2dc91157f350768ffe9c0a13d0fd03b02e69b04ee021b4eab91017ec5343f7c49deda990bb3a9203504d4a55de4dbd5d869073b60c03817fba2a12fc4f7f1ae67b744d8580080c8ebad9f551cfb5f4fadb258b88d6abc98138fe80723fcce1418f58ef4767c7eb39e39efeb18e855444a286014fef2fd5787933e2924c521bb0648d6c95eb5eefa37980394ef5453ac6a9071a5e6ab7398cca4a6356beaae00a3a9a2313b78d0a785fcef56efb4fbb4c19b0f95d6c658717cfe8ee4d3aa7c87205f663e9a8dc7b001c6d00625aa18194ca28d70b8c30a93d43d606fcc2937373b9b05deb2b735406b7816585c5f9ad03f96f3ea75299522a06845266a3242c9684bc141ef40f0d114fd7e75b76779beaa0e09e184147ed6cbb6afebb306787cc8d5855e37c0d15ed9ed76dcd2e8e16f440aa6c0927aacf171f7d4d463f731d9dfbcb1ec71857290e5a68a2aa397a162e5b522d42f8b5c88d04a236a9db74fc083683142001d28a9a409c29dc39d425c54721f659aee5d5135a594db2d4f9258452529337b51441413cfb8133c9236083d8d93a3f606be147029b38989902bc369ad34163eca803ef4ea4c34917b6ca699e353059c4f01e09716e4093de19c5e718ccc8163600bba81cecabe15fd74aeb800f0ea0125b336c60d8ec2c5dfeefcf0f0b5fb4e5e25d1b6b8c620d32ec803b1583815f2b239adfd72bc38505fdf75819b73ecb6c6ef1416490b5d9524bd1c0b71515cf6808d7cc5b5da5aebee1a03c32c70870af70d769266bc9a9858fd188c1a4386e72540a988f6079ae8cad88259c0cb57943ea351e65e7201915e7ca028c1525c7f600d77c739e6bc38aaf7f5ecf1055cdaff7a1bb5ac4ecc2dcc39924ddeb6ca64ba441fc7e01e389d0c614c3a2120e3ce6ba7557998892d2b25f5598f50e58284ca2f8f58c0604d912342e602255921096c3cc5ac02736a68b67c2e7bf14b4fad29a511041d57f3e8467778384e5f3173805f0e95531b1797eaa8597206b98619d95e1292ced7b682c5cd9ea61ef4444f366d198d4deed10464f01063ee6abedc35becf13a484142e5d5fb745a622df8c3fd36ffc347f37da29871de1cacba3ca19a376afafad7cd5332299dec3ef011f1cca11ba5d0972fdc5f5d619095f20e8e8e2a0d0169489b5e7391f43b6b22a8b8666283a3c7bd08e77b6eac50404ea98b466de7bcf1e367931bef8c8af2ffb1ab0044b75f8f01034a1dcc1e95151e272a84cb0c9c0a59176bab511bdf0b6a373c5c19ebc1823e57654793ba8dae8d23d3f5e4483fdb24ef5aa052d0e0a9e076cdb1cbc6f3071f1d471c41e57d09cd2d8e1b5c41db0a55c659bfcb34f7a6411fc2ac1866459cc65f26ac2e52229a7e0ca8c26d2b0ce27dd8c8d7712fbd485c987c1250331c5787a77e5f65885b90bf0fbbd49e81183fa8d236f9f14123135ee5215401bd0503db212420f8a0c1ce202fd03f30c80860658dc98e55c9113a4f5f04edb452d3c3f570c9dcf040215c18d7942fcd9494a66ed5102231fc88677051ec84bd13de480142566b35171a2d892add023c99ab8d8b72eca0c3b782561d14e3577553807e44d33e4f6b569e3b8b4051e54570521cadc869f59c6f75640079135a15eb245ba072c208da8677fe8785f5889d6bbae72e7272370cc46a248985d0c5d2e8f4f0ade618933cacf3b61831d54e0314ba3675bbc915535156458d04fd25da66fe44743ded73f4045b2a7ddfba07ecd0dbb596e90be258b62bd83ba62820a47f8cc1f9a817a66eafa4b661d1816623887d95a8cf34d105b4315d664a6ee6237358746263f0e9a1f695bfd664e20a11d91c986faf3ba7f17791a45e461d8ba74cef206dfb555d741e61373fc45d45abeae35812cdff008be6852876b21052e35d2324c31910adbc18377f64ad7dd0530be59cf44b1fb79d8e0eefd690854dce82ba9dbb5b8b325112cdd8c912abe08a52d51a165e8b9f6d28081e88b8e69492de04019f368b0249c96e063626e4abd9f9e86c7f12c77f23ee193a9b4673b3790b23bbcdab6277d39b4a5de108173f0697f7f8416e40f5dc0d1e1e47d842a77e5c62577fab667f69f0da01d042b3fbfe0e4c8e37fd8d3740ec34e3907857004ccd3dc9af36ff76698fd2a8c921bf4c76147f2efe897a9ef54164b25a839e48b4fa03382eff4f254d34f9aac5f37cd98ceff9fe2b0e37b4d99ab4e46bca6bc569c7286d914eea08ec005e7c16532184f855c8745cff06c355e89f71169f65dd13d4306cef632ed501549fba30e0ffe6b3971631886fd4b770de1d50609ddb58fa99c6f535f68c0273c018b4045bd9650cd40c89778c8f362f23851feb702919191a9d36b02a147f86bcdf861c347b1760b9e72b6dd0bf6289a7fd3e1a91582d88142c4ec580a8ff23aee6d67e703c9d7a5b175d5189be0a6f4a6a019160c5aacf0c8d1bdcb22ebba2a3d0a909c1f8664519c81315c973c3fc883a4f9e9ec871db93102d73003da2651bc41b8b2288a308126ff19eff9e01f5342f4f99aec78729cdd99e8f16b4e6256d98c68fa149ead7df42ab39b25b1cd80c75e13a2fa8332d60f1f7af5ded375f8c9695303532544442b20abbc962e307889392b0953a53275b6e39110f22a8a4832feb63ded6b02a437d2a91e735df52c08246fcd4ed76ebcfaf0a763b2d3cf1ec3477ca4c5fc176e667e07a593b3cc32e4269a7d057e473f77464a56ea9e00f35463e7368832cdb1bbb8cc420baa98c620710ceb4ba43cfb48d8c5395d4b4f1517a8e1b416d1af67d76d0a2fa8c5311dc3642dcd7d7cf229bb05b09200263592e11aef93795b7fbe9c2e960229cacaa86465c0504b44302f40fcf6ff616a1a09ffda236b75469e249ca43bd8d281d3c4f71d719f5d556d71d59e75c812976c6bf1952cbc01849a191fcb0dbdf992c328ecfe76c843dadedbb8b533baed48ecb3e3646dde54799c7464004830cb59503d293b80bdbf3f44a2180bc42a245705bc0788301a1b946f140becdb2be64a450fd6f074016bb385972cdd7a20054ac6fdfbfad3aadfaac78b9e870c8d55f020b107984f4c2d58d47fc8b6bc28e5d60f3523805cf91061c1b04eb3f3ae6d13904db61969b5c790d2dd5669127e8ef5365449b7ffcc6cd3eb735561cc28a361e635a43ac21e99da7a1084dd3b0ae583e9c3d06d258f190d53f38bedb7208884f66393a0d03414841262c88ab67f6f7dc6718135c4c772d1d687442bda67e5ca18e48073f05ae28863bdb4813ee6285f969cde41696c3d8cf76e685491ca461a1f617318cce3dc9a7805e6c658ce48ff2789606046d555c6d0ee086e175f044188945c3b4ceeedb044eb8a03a436db3082ed2c84e450d5e003c7aa9411474f447404d818f24b10bb22cf51f5f40859e09c1f6eba8196c1a5307e0f38704b02f943cad5e70bdc5e5ca4531191fd39b62408ff63d312ef2049dec5067ccc985c612525a5face573d0eead7dd223bd6c1c4ba8370568b01f6b48c54d89cb672222b9a2af954cc2af592f799bd485730fbc46b9168c117dcea99ae46aaaf27c112945e4ab377b3121bc368bcf4c10a9dbd89d76aa41fea39d574f79f847841019306207720df5c1c9ee7e30b6b0686f8785a44b7f573cf6fcefd3b234367542e815750817b7b64a92ceca46aa24c6ff20b592cbe8f6562c6df9607fbbad5f97b18c5367a51d1ab3158d983dc750de9c5e298b1a89d78559fcf73bca2baf10408bb7b1973a01563c6dd5cacd664c672fc88125e9d70e09366e44510b229680eb3be8af96338ce87327bba509104437a499b75102d61ffd2dd2829647af510318aa40f337eafabc8694d4de43f9b5d60f43268042c0e6e5bc3feb4afbde0daff1bce26ca486ccc8f6fd69f6e134fcaa7366fe58abea78187efb8de410426c149ce5d2e98ec90616779f7336630bc6bcc720234adbe986f3e9e049553dc3fec6473467dec2054992763aafbdaecafcfd47575b47a38d877edff4b0d285ae5c200f5625318411e3b11b2834c3c08d60dfdacd562735b63c03a131e881b31c3891b59347b173bdd1106035afdbb8e3a9454f2fde18dde45aa719a9eda97bc6258bbd0df251680d5a39e134b94056d9d244ed81488b308d84462696f073c5b1155df5950512e5a49c9fe943656931d45dc8b3f0343bd5c044f9ad7051ac62792ffd4fd68f78e9e98858d41f0bab3c292a2f8267abdd243606453383dbe4dcaee65d5a3ba2e2c053ff7362df48cc5e09e0848eda4738641ae8bf29441907f739101add9101be7b06ad5e4e72fc01891be2bafa7bb0857e4fd2764bb02958182023ee01adcea59a00a1312800e427a7e559486a9ad695647a22dd442c3de21a0b3cd18b5dfee0c67397850953991f0286a77953f832171417c29eb8f75dc537781696b17894371b5e070f5a0021b3f3cec2af9ffa4952c2098d5eb560b0e68f41ed2a8fee60bf4534b03b3ec6cb4c7bf3cfb022a98768655c3d4c33e0156e2ac1f3c34b4d910362a7a6f558a45eacacd9b916e89904104f8e4556d8edc2115d54b801be1fb40bff9fe84a91b667d2408af5a816a030e2e0818a2867cfe5e438ce46e2738117d271a7f8800f32d6f974c786d97c5c9576075c8c3583a73c77a9811a83a1c026ea69ea030bb6c727c84441cd19822efd69a5725a8a75b5a4fc72b6d937250ee13ba3697ca3074fd45074fc104196db860242cbcae5a22f68aaa28dd4fc4345d5e8041468869bd3ad51b6d743e5120c1254dcb811bc168cb85535df5a3c8db5d3458aa6f28573d11cf00763690e7c89016f28bc27aebde2d9fe68641ff0503b6e2e2b32e6f9dd9da6b384f99b6a22087b296fe7b79a8be1eb122b5013702a8a7fd4a04bb352e01746f99d091bc37a8725887c708c2e4a3d16320b34fac027122c45dc1751cdc24fb647202b0d9b0326008cf69766053d98f5450493f65912e1fced11aa676d7d97f2cf9043a6b6556f40f0ea2b3392e4d35f978e43a6fd1170f11212fcd58242dd40a2c0d90196959c2c8573f3a4ee027c5019e400ab9376f3a49374d07af02468cf69c2fe12c34e830ee8316609b91e47ceb04724ae40696088d9fb4f2227dc869bef4be3c84fcdd5819781674ceb6fe7697fd86f0f77ba9f93d26105fb20ffe025e6e3bf7541b2079444b655dccec5c40ee8ca7e07dec1d1cb917accd564786d1df88ec62eb41252fc19c9316fed017fab3c367fed0e7cf73e1fcbf217676f4467f53c6d139b27f1c38e8853ac5ebd0841a3163c63df1ec239c3b656693fb7689c8f409b65ae587d682ffdd4d4bc5aaa645b815ff592c3739fb004e455e429935a4a74c69c0e4410a22a1a5aa0089f430e1bbdf3fc18ce85ae65b695caa5367568993a7b914413e4c4c353643c902a0fbe2d71feb72c10d21cf8c6a6cccb5263437cc3da5466c542f94314c9d1582500911be14478c31894de2087667fe7c3603ee27881b89063c0768982a7d4957497556a957961cc2f924efe186d98350ededd5a4c52be40f592d60aeb5298a950eefbabdab64945474e3af5448e4aa1a774211e38478d30a56e93dfd600e89dc32a88a685e8a7bd119780ba255c4f676549500480f60f05a583903d489a61ecc740848bcc33428178b101d8b3e1f6ca2d66c02641a8d51ea845434ce424849dea6dc7befb9bc8535615d09db43a7532602531a546ee088f548b55cadadee216621aaa3dc0f5ad5187e564862ca2e50a09e0b54919716112b08dbc593a86ffd538f2dbc18dcaf9a850340865a9623f9b53bd1b7e0be6bdf565f673bb1e5fa1b105c42a82a5bec4eae05a76d09cd834d23720e2cb5aab9b6d279b3ff06f928b6be9f63518872c3aedf4322335459cf29677a140ff890d394363fd4c904ef6b1aed01f51da5c128b9e65c96652f3d28d568396ac077c943c1d481110f6459ae0619fced947b59b92cec80e7f520391f3ad0f50c84a9024758879426df301bb93bf02ec67a16aff8c571320ae6e72aa1fad8703824bea04c64819f344a98d4e5156676ee8a99ac59167eec74c379bea16eebbcbc489b8dc9a0ea89d221d894d66a2a29a1fd39a07fa9d02ab6d746e62dde9954b6bca1447cc6f45ef453c23c302f5e8dde1dae5a57f8a6469d4b8775d2f941ea85624de5fb4f6cd44a4675935ebac2aafae0e33391dff66d79e24e71e3ae54849d13c6d54f970dc9f369162a70a083fbf6acaa4648fda72852b19fbed6219640688532abff72b6572e5090b38fec98d745761548bfb8be2825e3166808f3852f395274239666d940c86043f07c2997932e5438800d586501f73d176abf8afd6f3e4748c8a6df7d591616fd8f54035deb263853d51e892d25b44b808425c0e26d48cbd255cea151e5b7a1fcf4a660e3cb1c0bd147ffc57a4ab0102d626b0d322e6b97ee624d32c0048066c150d0da7f89e782970d0beac7bcfeea032e1131c3c103f1cda5c2fc3fbbdff1adcf96a92444e81bdeb7b3754f6930de22f7a7f3960aa6fb26d89e7aa59a7df989cb64782fedc42902fd0f49b4c9c78bc819de30f426f9a6fe96df3f92bf5d095aac8edcf08d9d372653738536b1f5e0d352eba096b0441288ed87ee53068918ced676dc17fa546959b81c2dd80d9e32dda8c0a58296904d03e8a16c692747efd432aafcc42e721fd9f046e815e029e1ee77861cb038914d90f97df6b0178d5f257bd37d3121e3e0e810e0f60f65799e61c278e78287a8fc51ec6f211560549e69c8dea3216e013416ca1f9fecaa768bd6e0d8423042967f18b5ebbbb7fcd28fbb1a6786860deec359cc902841bed3b6e273051fff06501aac2344a63a8b0af91b70095342764995fb7397d6ba92ef66f86ac0dabfc6007458a6f8cceb7edac0e00e0f44f082c9073fd210bf69423bbabb6df3f2ac64915181c7d38d42b103b8f0b31e1be3c7dad6aabde03435ddcac433d4228cc595afcb371190b28addbdadb25b22d8dc0b641bef5defdc59e0299b8283341b9e6a7cb51db4b7973efc7da29f4799cb1a9ac020b4b08ffa622d883b2904879cf3955be3b0c0f79fba79289fb296a257cf8cab7042ec0054488b0e1964ab24850431732cac91e7720e354061f46f646bc63a9ab3ae133690279498d556231ecca5d5aace835357f69ab7e45b74d791f6d6bc2bf458ca6cfdf6bddf1980fea9a7a80bbd57c3c9f9f6b218581faf3dc18da25b190022b9a23dc39af2cae272811cca0143dd220499ba17993b174323e5b8d442ff11bd3563ed5cfa3cad0438da527618509b1c95fd90663ad6bcf5132bcc85631037803630f21509bf5b863bc396dba035ede21688dde66dde53b9bba3d02392f3aa6091b9527332ede43f04fbad4558a814ca468a7330d241e51c074878df1d02cbfd788ac8230042ed856c7da5cb3cb5e534d18fb75aa5aca1c45cf668ecf3f3f5d93487a8aa259ceab96f13d8a1c813c6fca63c9c008e0e23833431f418d4f4eeb76e91c43d3acce59cebff6b6a565ed0a73f32ead137682def0c34f1da993e4c3a8eabd6bf351ebc355508e0f4e8fe7836b3cef2b01227f6c176a427196107bad67b6369f2958cda7aa4bf9d409c95d8120a3575bbc73615539a9a55af72252888c692f327b4e1361efd638f2df3cf667d548419bd8558c1f6878d61545b56abd20fafa119b56524e94527ae4ac4df1293ee6b55fd27888ed6e3b3866cba85c3c7214cb9cd1ab5661fa727a7e3c4ea9ef8641607a50ae40d400e145cad37a2eefcd55b4418e0e496a6d6ca9e5a9a21a61d3c02ff4809a44e25bbc5c0b39264254057429338496d8761b226feb90124fdead34e7b68b398cca554da1b2f074334c87aedbe0e0e6944c2bbda134ed57f906fde170363843bf1e890f532f5f409932550cae1c4aa3c48cb9385216ee25827e0d8360ce4db163eaf2fae952eb89dbb8b28a52a543fb645b82ed3a5fe96e55602ad0cfc4e7e8fe95594972e9476460e40adb844dae29a35d97f6031dba2440cc7aad1d10f0859fce4e2eda35ccd51cddeb8af000b575868bc7b9c18b2cacaaff7582e9ef199419c29b12398ad4ff16ed81ac163a8b16e85593c59e008f21a3ff4da85ac8549b853407d59a8a29822f3f84b7fd3abd44fdffdfb03c1e9320bad0f4e53f3a9dd39526e9793fcb16edf1b5818379f6729cd4221ab5d0304f449c612261a1e02e4b656a09a652e5063bc17a58fd23d0e7dab0943a6ddcbd6d066fd51fec34ef2446513710bcdb5666e22fcb895fc5f94b791d164381c58e30de1e937503e4308ffc70b6bbe516d90d5ada142f4d1343cf6e099c46aa5c080c6e136d16d9119734774ed62aafdbbfff63c5e14fad90d66135383c51779dc3de99f97a551bd52b1a2129dbfbb8fd792ddfe15bc393d4f97179c656164e6ef0aff8b7e43933e992ae40b423d693a4cac4bc2d311a03336ec737f642a37c20c2cba843b9c71e5f81a2e848750b8d94c812703a6239134899faeef9e6c5a1fcfdf7e919d9efbe6f2228fe67195be18c72348dfe3b28969b6a607d848071264178f56279ebff36d258f6ac1e9d6244ace17555ceac13076db13c9b0b272033a5cc0d0f3d345a1bd7e563af8598d5124f3483bb89689537375cb66506c351830cd1752ad6af0dc9266e519e1e9f8c6a810f94a8a3eede158f9f9dde61f3cd3e29a793d3b777239ee4eb6f197a3d26f8ac31b26a8beff9b165757c5e824df1337c1380d75b616c843b1fd3f839da08ca12b8462149891da9bd7c7d5c3403dd7b471c1090dbf0d87bdb3e9922009934def03a30ef772b20fc70f6fdcd95000e7a2ae5018cd5b7cae5e1d21804486e685fb71e5003e58c184f8c3f873b65423f253a15cd8b7a1a14d45987a42e52e2582036efe0d2da6f36d91757dd9816d3d4a73074373d58a19e7d29049d0f682acf1d0536bbc345c8a59f97c7c090c32566c2d3dfab69593c6455b3884355547e3d89a0b1f5ba245ced66752bc0a998f30b62a30ad872390511af8b0f38bd748a4d6a0a59e19b4af4b991ecd31ceb60794cb63a65ffd8494b071d08712c945ae364328ec2937e26ab3b4f324429d464eb4b14ede18ddf131d222b51b9fccd28ca7c4fabb3a0d8092e4768097fab3ea540d239850c5134c22d091e93cb654114b56ed8de031205cf082d87d40f0c856be0355d793fd2b13074aee4d9024e1de37820a9f4bf77bcdd5923f8c8ce31940180025c6eb1329ae742b7fd0659d331d5d031ee40f416953cc139452deba253640d7de09497cae85bb17749ff0db855ab004577d22f11110f7dc96e886fd1dfdd6239989ddd70ef2209dc6362b838dfc2a93b2578f8ffaf1d70ed59df3adbde63c1a6a5421c60f2fee3404dcf3e0f4133ffa2f83339dae2505d8a48cecc410923457862b8269b95066b214bdff0db0eb7ef00061d62f85d67c94b8f76fcda6f1405bc3bf0ba451bfd3584c2ecf787b9286812f700a89e46b021ff1bd52dbc1564251e791353a94415eef846d0d765c8b392057366e89375f2f90c4d101c174393005f9033d8fbfa31ed524ceeed45c2ad9430d505b81019a849807cffe63a4d753fae26b1b19771c71bc9b7c224704042ad0af084cdfb02e9b0f405031a7951365d0110bf3c6ee61668dc42cfca9ac5606f6d8ca9a542310af1c6f718c3f495db77b980aee0a19cbbf92b773c849e0b696f61bbf007bf131b3e48fc3af4f730bd9fe78fdb81f418487a81a71e8b3d3e2f03174e9fbb6b26266e1598b34bab4fbf9caefcb10509699664ab631aa92b5d0b926c80285dccee81775023ba9de1046fd8d548183796663949ecc59c513845bc35c370858db735977baeaa1d7ba5b160e895ea3350b43dd5b983f89f37197695a00a4fb3df565a354c3af44520492f95d8b6c6966ec20a0acab8667fe8aefbf9658749924c24cf7e86c22397dd5b6caa89657a672ecc2badc9d1abe7bd34d9e00f87fa643ab9644e762694f3e39948726ccfdf7d5dd337645715ea23b5b7942cecb747761cf55f65237e565f4354a4967c4efef7350dab798c863ff9112487222b8aca7c1381747a40a59f3dcd92393dad5546ddbfce50155d2add77dcc48444af542e0c9ab557d721d11e743eb0bd382222311e1f86b319b7369110af84beb336ff2931cb679f8c1a2925f65199a29d4c23d3122e231560dd4570c2d058a50f61470165fad718cabed200949a2f2d3cdb6bcdd252e55d947daac853c03206e63c1832d79812a02811563c68400928ec1c2b241c7abc010127558424ec0bdac675dcaceaa180c7e775c398a5b7884ded159ba9d873db6a7c24302d8c868f6a658a0f02bd94390f443da52da4fbfb42a0409ed4603b3177ea7ab688cfb1f2ec1cf0b7ad62cc810f8ad6e0a07c80d23eb62be0ec5d09ba541054c9bf0154be68faaa253a4976b281da323d54abf94a112b666b527a96cb637c63abcda2b5fde813f54d2dd8ba5cb8cdea84a9d312cdeae87a443f822641a2cb5ee4d2b369bd435a27d47cfa821ac5b6677fbc5ff007cf52c084140b3d8cdbca4cfd0d1c376ea0306c460bb59f6f7b0dc25f1fafc594f994ec765bd265e6464990505e6d00a7364fe5d96fe622469d2d3dc02e670c15e6b59c7c1ad10bb76a2ed6897d53e2572b53d8730e5183865bbb486a0257c5e36c4fa27d8af5eaefab891b7f780c2601e9f280012dc20688de6d2ecd0dd69c37af8562e9c91334df5ebd6f56c2e6887e86e97b19d5cd3479668b8dd1b11170417229be06d9da03bedbc6a85bb9e200cc1f30ed348c1dcc23a0ab6d00aa6b2d88acf889e04a940f8a6dfa8c7cebd14a8642c3334f8114d5675d745cb7a9c8bd53f3bf89ad77f7ca1229f942b334a3846f3048b874fad0920e8323d732412c2b743b90886a6760d6ec022ee67a50ccd0b7c85493472a97003b774324af2ff1c16a1a8233ec58ed06a9f519b00a432130f16eb7fa9411882cda98ab0ae1b893aa21e9b263b1a25b6461b4997c4219d2114f888af2a0f6faebeffc05e1ca5c40e3d5ae471660e043031a4e312a3fc751c83db26ef76c1d023c8890b6d2dc5f06e31a54a6f20046c930b311e444bf5fe55a743ca6ea1f14840d88e89488f163ebf77a48824303f6b55b416e54acffd7e7e467b5dd58afcb55a6915e6bfd624427e3292eadcce0a5d74d14bb8a83ef9e3f2241e2a82b162291c45814b383541188df6de15b0fb146a8e18d2cc1bdfa7e8738319e3e66ca072257d44b9bc80efa3abbf64ec683e736575dc3a627d99e8cf15b1ad9a8695698614acc07fed1d04d0058c423b44632c60f08b0d0c97c17797c5ad611aed08c72aded3601950b5b1d337a5b570bdf77d2b031261b967f3a76be4b0367353c943b487634dc4120b92edaf33b30d94d7d65da1d0b6cad1aa6de2a07bb6e22e4c57994b8ddbeb9a05eca647be3540dbc4b43bfcc6202df37c2023afff5889ec980507a0d6b8eec968ddbf58792ee141332b6c296698f22a6eb343f88a6d079f97785f0971d5d4fa9f4677d1a2ee0e5f55e7c9e2a4e8cdba7dc98e51191726ea812f5e35999f073b22b8e9ecfccb6b859e8302d0b3496eee4512da7b65ab329bdb08f4cbf11585394b89c40ee8ae70c5360b4ccf922d8f1df0f6e812f778f76d8ece9cdf4e7fde78f00d5ed92e933f488ad872ebfa495d36bc39463efdc8d82456452c291ed39cd76f33afdc1b575c0ce24ee3e21d976c1b3f20328657183d26e27ddac4afa8d7830c330a7ac5da81558cdbc6ab67b92cd16abd29854fc1aabe56fce9398984ad439af3af341f55ef3cd644063d12b837869aa928983df8ff00de4329eba8e42a77a33f3abbdc6d9b1a5611ffbd89629a7dd44f69e47e90c3b74fa14ad4fd26ecb44865d3c1f81603e68b23774a6f33b68b26a5adc63393ff33c67d362b8766f7df8bf6f5b2be7a23b6e64340053a0d16a9d33eddac821a47fdbe4ab879e84e2e12f36fd5bdca7042699c542c3184d3243a6fafd3848778e37e593fa9af3ff195f8bc02af69d2df02670b794eb28a1dc1c657353d07fbe54a721710878f6afbbe01a689647aa8ed22fec59ad9d22462163d4d42e8eefda181f1117981665a71e65ba27d77434a81b73309f9882280dbe5ffe3b97fc916bf888bef44ffa3e9bcbf7fcb6238da86a3d68a83e1939f1a4a0dcf7783d0c4678eee686aafead7b6e64320ca7ede9fe7bf94d4a596fccd89a80c0908681cba8fba4a3e5db40b86982302aa408176e118279293ca23b42c29c4d73211dfb034b586358e82d43716a5ec199dacc24eb2e8bb6419845263e1720a9ede2034efdbf93094b77d312cfcf715c10e6d6bfac3e658bd9872f00f709c3262ca86830a34ccd4777f5269ff0df6e50d1460a6e648e3c44d7c00c1d33ac025802bb90c609e27e2ee16ed6357d0c600b36c16e18e5f8e24cf387e3b3955bd3c0f92ae9148119279f209a1697f3fa09df42dff057033c49eaf365c490817229c2fb198d481f7064e6752e03b3dacf2885c9fefd7f65b5010bb4a30506050adcc107cda76e36743016f73b38135ebd190d29220090c9c203bd09d001929f6450a97c835fe1ce5fd29d9495b5d2187312eb17ad2d2262567c96d6d2751505b3891c94db484c83da489931c4791a7a9d5b2cff5e6eb51fd40fd2b8ba2071d97b3649435f48708d00ab1e8c5c9f7be09222d3b0e79cc2bcbc19cc4b86958b9adeb818c480718e2ae7a4b13230f9c03a90e2083c50362dabd9c0cfadb7a897f35d28b63218b92b041b77870d168598b8e44d582a5db032db15e60cefed675876ea26e8716206b1c68df559ca2b0b305c9034232d0c4373ee5b6ff0f8e199fea6d11aaf54a98cedf13f2ab25c0c445072d7001a3290616228dc6f96468a17c5bda3f648e463316da50d9685244d113ad568a114caf703ef34c5a264067a21e842ce34e7f9244a82df4f0cabd8823ed4884ca5684dba1c3abd568157de1c0be512ea99e4218c27678ae7b79af1e53496b4fcdde01f5cbfafb58367848fd0b4546d78c2417cf5169e24170aabc8e6be6c5cc12d397c9108829232eaada40771b641d747412a558c3153344cd11ccba2a18c5e9841c00a3188159aaab672aa0119f62ce8836fd80c87dbf46355c35e6173b0ca447bafeed6515366086f6ce8944197646996306fe5dd73fde324093b912ec3c51ce33c4a7b7541758fdf94eb837f02ac9400560708916ffc0318e733328e6d1675e1f19f9d673765108842ce4f4abdaa82d2492c489157d2cc88fc8bdc1d22c672b022884edd617d973fcbfb26c5e0a8fd2a59ccbd170b7fe9608d6787b77e02263a304db83fff3f9450e681eed364a0218f63eecc03a3f0de317ae9288a8ca46effbc123f926a7df22f5cb410e622ed832abd5a45b76dca56f0c21d862631b7938a9e0bc51c18e19cee3a2444b089f9cc1a00dc557267979dad3162980b460893a723103cf414215079bf58bd4552560a3746ee5107772770e9d285837c7185998738367263b351a2d040a1f9b176094426eea9daf8900d224e6d9c5dccaac52e8b23ccdc65858eeaa3328e4eae4f8d32ff8bc56a20e15dbd8d7887188dee5b3ee388fd1ddc25fb2520ec621ba7fab6edc6e24cbb6af22ad8da8d4bc7bf9d00e75ce311eb42b3f95e306329dcab94e75da04aff85d1ecc305569cea23a9446df69842b24f28948c42bc6b8acb7fa903f6e5cc7ec74f98c850f8479f898c1add49d5e81d558831d7f6bf391e5b58ad349149d873a78d9efe37f66168cc2e13f14f2c1a33542bfc0d44e13f88216edc8fe25801595fefea05bc34df9df02d2185b834578377921f073472c4044ad4922bfa0ad99c3af729e469074fd9124bb91547431724dbeeeda986da7aa46fab96c3b5c8545fbcabbc4b2b04acfadf2b552574284a927c3a0dd36f413826e6f0e6476527746a9b43825085e88972b526abea4252041be0446133dc22b7ed8fa6ce2a837ecf6264b3b1b9614b8556ae48bf5c5ed750588ea2680d1cd19290cc851f16619fd56c61e57f52ef4601747bcc6a9480bb46c80b8182073a548e7b82c03fbffe9484eeaa948392ec35d946560aac09df38382a7f68a667c9e2bda9c4bab897597f1001067dfab0cb9910860591c2b603807a3ee02efc9c0e104616a8cb47a559cc8e6474a61644c44f08100341cef813eb7e4a22d134df7971e0a01d01a82cff23c10d572ef8a315c0ce3aabf8f580be64459b6bcafd534220cccacd5ebe0ec96a4f5d3eb8e431f3ce670ded61c6592a767ff07573e1efff670b719b9c97ea0500455a41693cfd87d5d0762aae02a98537b8865c9adf58bd3108ec5fc01d1a3b212ee1234d0da9089a975497c5fbf14f71b99250f73d730535aea4356f7b4bea95d915ca002557cbb226da7a47a046e6d7586256e23d9298d64c14df908714794f886f853e0ade5ebf7ee33a68e83c86b51c8a3ba8b0b9415da632dc525b33e18e9a2283ca74e65995e9355027440ed8fd82bcb401f24bc36248e7a1ada27e1b0c23a7f9c5342778825c7b12eb77636c8f55c7acd438c3345eb4fc09fb579bf75338d7f7a9a99e0efbb4c2f97c03abe13fcbcb9da786d11916f12c37087add674858bf0c871fbc7908e26edcecf18f4c9cf92bcd5560eafe39b9fe7d0954bb65f7fcd740659a02d8c14e4aea02c328750b529c36acd67d89cdb3838587236bc8110ab2095aad1a38286b983c0edbbe32e8c88841a07a27226bd5c531aab76bbc6a4adc7b8ab92300f53f01c0b630179a49914cca3da8b6fff83300bb8d3b9e74c77862585ff65e884c0ca95a5d4f6dbbaddbe79300c2afe55ec2d95af55a9a67f99940f9926dd9ca63f9d175f1e662158cc6000729d3b93b1c7acc9ee49aa13844f7b8e94f2f60a4358c85825598250612eaf0951f4a3116a35864f80b6072b9eb39d7932b30e5d95520560116ebb195eda1e4168fffbaae84b91f0502633e40853f7c74a022b3f6516960c9ee9e27d5c7c746648ec8c10f381eb5cf1d1dc93132a9ec364b8dc4e75680ab31f6f8003116f8cb8d982d0d91ae6813a6f58785d2376d965aa02285dadbe8d809698249210c552be3c88438fd39372ac4d29eddabab08f6f8e56af42d7a1b30d72f8fa9cf34b689938a6dc01801ede5924cc7632edf6c72e55404297ee966f58b0a3f160e721c60d69beaf21bb6a9b4acb683914d7e9f39aefcaaf60b5fb1c53010bd1343288bc1ed6bd82edb0ce4e316e4c4c9fccc0817204e41cb787b36352fe96e9cf5b9d162cc5ec12711576c32fb3b895ae21d35885381340aa6d1595d4af47cf3df7d99269ad341b81357a1502a9d4232c74c58d7ca95122b6192c5aabd76844016f3dc97e73e0ae7fab6625a888803778f111595776b12d0bc338cce2ce41ee124b9df28c0484bef61ea4b6453039a3a54dccd03a917f9254d8353cebb77f4864a11f888849e6a613ffb0b320aff90debd6fc72ca2f3fd8d5d9313f932b85cce268f83e65a2c9865866e8dbc4320a3f3b9cd8ec6963f7ca557bc6209da409f2eb16b3408e1b44ace639d1de709fb369129faf7d00fb221038acf5b47681722582f17bec09f0d7ad0ade2ec49f57779db7b5da79570a48ebfedae5600af41e10782b0dfa5a9d32d068395daaa6160029339497bdcc6f375c1f40905c45cac7467a504fb2140d065cbb4139b2db7545f1607968739474267285b9061f8725f035b988e3dcf2e1244e7dd99830db8e50434919e5692d89e1ef8e2b68fd73159d7a3f372b32bb343cbed892be37b0572ab09e5567e15eac092cc8800a95d54af428e1ba85cdbd5e52f227730697d9d8d6cff739df71e99a111325f82111ce96fcaa292ba4ddb33b9323247a21a8531b61a9efd4b157d099d2effbe94bc02870b1a117ea3f382ea5592aeb173e02c64b8a67d05b90653703de5a4b7fe950bebb27825e187379435d6a09ef45ca4d588400e0d5f810adbde7fa2aca0a2a18595ae1129ea020a4ae1ca3aab61ef03610b76b69095b825cf201834989e9170fab0f8fa74ba5270ec1c3a9436150c1c8bb47086182a2c26257a5718b02f2e8e18876226718e8b8f5bc410c5bca3db3e46112f4d94270459898f4d369d03202b880f0c4b52e3f694f1c053d47b0fb351527cf6ba49b7292112e0211b0ea80296612c936c6c8d1cf595c4ad6f2ca9cfd293e7387f5d7388a776bf5769734aafd0e562d615f38eec51ece7a112cb6f1571210a1c1d23b64875e9dfad92ec2b2a6e75af58a0ce6ab8c971157c28274596f66c5b460cc1ce45e81c95b3dc8e0516dbb522d3fb760c34890a8e4ecd980b187f86d8a3eb243942bab6c1dc3ff04b8df2af9d2d1241fdd19b45118321d8fed90b26b6a5965f5353d46e4b7999a6e215130ff8fb8377020826667e334b6153cd911267f39d3636beb07ab5a3a11458bf63c2114fc31d180c7fe5560d076790a52055fea8d2721270d08ee9bcc7872e170ce6079d3e2896a4ed00ab87c4ac8f58587a5388016c1284705b9a1165e4102f9d66e6f7a70d710ed8a4cc6d859249139c0be9b3a8474262b70c3e7a6761cc1717eec1d19a8ceb0b07ef96ac6e4550be19c7a8b5d254a2556f90579e983314cd920f3be6ca52c47d3cf3b03006bf6b64bfe8f29cf047b83ccb39bbf1d7ac645eb7da0fd4cbf0bec1006594aa381797b1dd8eb17da7d6d7df1dab8d9acb66c0170f15832db7dbfb89ff28e02c195b21ed853608ca33a591653606b60e2096e160236b2557cd60ab7a9c04a1411c40775b30bc69aa56f054f4a6c2ecfc63224b787374aaf0e9213f372ea49cf9038da6a4c44cfe6aa38a7e68685ea989e045f0ffd5f66a7a1c36149f4fa2aec9f0237a5146df69a7d85ef912b9cfabb4a3bf9ae7c50682f9ed0e5ef40d94c2015a8bc956187682f68ead0c4b3c79292e8179ee9a80dbbd1ce5a4be54b293f88a079acbf926c4615c2aa8854a765d2009ffb471748666278bdd6950050733df452083a2b0b9be4ca6f3b7839f9994fbf2c10653bcb960d7bf321b04a4a07639f72d1fdab673ba76a6012cdb11477f77472d5ba913fe6b5f5d21f6ee53a99f6ff9ea913e953aa5a1a533aad77fb51c13f68b4846b4afec27a2ccc4eb9f424feab423c137d5af0ae4ea371f0b65409e05f41ced6ef5870584beea50f38789663e4f12a9894d44aeb7075894e32504c937daac978360bd6e6600f1e52c52f15f2d35d452e5bbaf49f396d3e294abddd1f31884aa177f1d242f9df107c1431d763a9320ff18c1a2d1fa6e94ded3f4e5dc62fddda46a4e699748b1b2c899c34177f81dff900333e3075bbebab30d17cdb7c52f6815816c18eb0ce0e2a51c6f309fa26a6c99f3bdf65d880d063e06c64942372a4c457098eaa70789a9d9dd87ebb836b174432814705490c0670ba0dea6e5937eecf7fd41f5219130a45aa17d8ca4328605384397ccc014a1e31e972170d97a2d0456bd7953a9f21035a3773703a1be857e50e354779765d33a0df62461591ba66a389e6a2058bbfc276b63b1c368434c2308c1e86709dd93ae2b84eed9d54dafd8f4d299c591009a484196cca50e31f25668fee3eac49be214afe10d6a0015c11177be8adc1f23df559aa65791affd8b009f094e30d10a6aa09740d824109439a483b709e43f949c45a4e9f9aa2778d0e391a0a7f545f3d95afe53efb82de48c4bf55d9c18240feac184364b615c63f99f74feafe3e39f048e48258e220874cfdbf7e318b781ed7d80ca74200343d07464bb1372c7aecc3fa1b57e9b86822506f7a7816fd3500508cae6d31d5dcd515efa9fa7840f091045d5c1fb2e13a8444c1f707a2b5a12a21435f70507eadecf4b9cd2764979e18bf39de2fb4c4e273ce50a3e2c1d6a3ab2583495dd0804e6a53ed559ea750a8a8f1d943b12225d8f673e57d9968ab0bd0a46379113ed7d98f744cebfb6f659a896fa43d77d705934649131497c7bfc9a4f2246cb51bb0f4caa894746dfc2cd0def6e8f8a1aedd18254c5b2a9033cdcc9269d25f79854e4450ca2eaf1877203e613411fbdd3d35a237c459a07fb8fc5a01c082cf026250ffd788f9d610eb5f240b8518edef71f2ce323443ce2515392717b66c772a7e0a443f0c59b1c6dae20db8b1e81c596e81ecbff9725c3e5c9761e12fb88a951700eebdbb67535ece05056b80dea0e5d9fdf889cfff4b8015664f4d8d5e02845aa0467cce8c275ea2ff6fc4f08ae7b3df8611fb65e30f32ad489e60322fd8bb02577d5be460b536f93a3f9ea22e3290cb2c9bbcbc94e497ba38db1772f310916131616128cdc29a05620f23c9752c789e4175f7b3f1ff4fe6335af3f61308e4ccf8d9c1e5a93e5dd75b6b47c1c5a7c2290d3edc58d5eab7c96a9d6465275e9f9493d9eefe1ea72e38792b5ca49c1478c82ff80f2aa98b74492ba232705d4a0cbe90a1c0809c35f32d00cdbba20d9cf834771d5f2b831ce6a9d84d6b225d11bf1aefe441dcc672f74dcddfa778085087be46cf57f5cd65a27c02c02f04088cae1c17ee01c3b8204643ba3aa1a36e401e6cd7250871c3c77bfd8149be2208d0e5e2e822eb5653ec4f6d0adcaf2ac256fc17dfb98d0ea8f5de452c988a20250526b37348a865a74b94558cd5396b96cf3ef086a0926c44bd7573a83d5fb6838df46066b8bcc46eae9b4a827eec6f1d6dc709287cb6dfca6555ba638763002747078b8c89eecef84793a107ccfb5fef7c68d0b5eee2911b8cd80437fed4ac12f45613b04ff78a1b718ce22c3315e855a528cbcd583f535d2ba1f5a95a824a3c9bcf08f75a1e50a3ca125e0f031c603fbc1a5f68a9c57fc629c6df6325cf834fde7b35d02688301e3a234c34b15b70c723d1717a751c5f2374f48cc54159e0b4527e38292bba6101d8578d3b183657234831bf0b4183b9c4dfb7c5f2988c0550e85ed9c709a70f1e81a45e5ab0ce992357fceeabc1bedcd7c9eb2468cdf00e2861efc9026b8ccf05f3b30e452221d8ece73167cb7a8f4b5442488eff0c56deb88ce4f10b0d08dd175d90cb4fd66ee4d28b8ee23b0452d1ed97dabada71e245e86e95ca86fc7992d574dfef2f1f5262e08c1d8540052ffe76e1af614d233ce95a29a562b386ad2342a3e629eb440f58d54a6111c4382f20061a27089fc86af5436467ced3cfcb452b8a7754d829121d7737ae19c0aabc8609350f3867bb3bb9406cd4cac25e80b127bffcbfd113eb7dc1839053e1008f28091de60414201df4cbe1e92bd73d488482d588cbf18db38819a18ce02ad13f340ab429684caa64f1e0b6c45b24e551fb395942c1f7e1119b8e0aa772fb11f81c9139c96c74dad7cd15619d99fa4b6fe067d5eb1be1fabcdb4ce976cc9ff969d62b16af54a3381f0ab9504ee9970b7ceb22a7378948398b517b209411586966b98fbcba2ed78bce8b15534cc166cfbe96c579bf5dc799bd1585e63ea14a4b7df61ab190605848e4f7ca96517221a7b6c8c54d4499efaec91a88a9c4f842e4044d5ac1f6a442926e2488f4461f4ec2253fa637f8566a9d23dfc85c46b014655df40fe0594db34e3e06884e463faea286445c30d22aa13dc24a48b98f166b7f522fe9d3ee700598e09e6f3b43b65e2b968e1538ae2034d19c62af2fb242b1367c858164aa373730cf07ab7d5b181bd6652f0c7b2423900a5d1aa62235e8653cf227da42efa70f7a7ec8b23d271a20feb00716a5eb57dabe17e348f817d99f6ba9dad25f992c47df90b34eb398a6247e8453c2a4ecb5d28845a92cabb83a6e4b777cd0c9cc985fa5f9df7cbe0a686511729404fd4da662837bc224651eb81d067609702b220773e4bbd8bdf466003f5b6a7c0c989540e2bed5db7f682289d5423948839b95801659da7da514493b95237d8e208a0b2714585dab29d9d8e10958f6cdef4d8ed0769a37ccda1399a261901881a4372f182d38f2e56b182d1111a3eb5e98aecee13c5a48f4237ac77e6f76b284f6ac351ddad97b67c405f35360a309cc8d4f3e5c9104e3337e35a0e8d4d61bf773d410576dd0387f21dbafdaab70210a010b252330587018a9b1411799cdba5c15e6d908592c65d50f1beedba46c70f53189ed455949d67e5ae33869edbb18ad5aad70b396df54954df77de405c8d8712704aad10617b8ed87a6555f8b8101348df39daed907748e3d59b08c57d6d53d06b2369f815ef1634289d83090572144f5267cd277cb34aebcb75168a9d09aaa232f1ca3c73b2f9205cb8b1ae8d84a925f857c56bae67cbfd8c063a42ff542eb30699eaeaa81dd86d3480b649ce53e99e123230b58955d3925b52378c5fca99002db088d8aac520982bb68fa26cf2a1c5068063abbd7fe1e14fb9b399a149bed5ab1726f14a681a83b06d8c366128dd6f790672f09125322fdf0be3218604737653b7eb515f89ed7453e23adef2edad00deb447bed90561cd9c07dfc519be482b77d0eebf926601fc4e36945bc35bc30ef5a25890759f346693979ecff7be3c9731cd927162b5f9c79f7791f2316f716fc7118dd59f1f0f64853f723878880bab10ac20442f23704b78c942b7d6c47bb444fd90f70eb22acc2e1f5c6f4ff11c8540f73ef1f85e3b982c928e044d7f0eea086b345be1034a5a1ccc6c5f5c05baf88c72a7e34533c5465348a14e75573aa7e816f49c764cef3d51433d04328373ae70bf9e8639afdb8ad0361f61f33d1662c918ed0647bc4e7954fed11d28d6156c615a07753d56d33a2ef599b126e7a4c3ac4bdcdad87eaf266537adcbfbb5ddd4d5567d04fe00b62b67729b85f7853aa002692f84552e223abb3f126c574b67887938d480e041816e71ca8548369c8ae938ac7d0656041a407c81dfe98909a0afe1dfc3c77231fa0586868212157e62408956a0da75d1b5e965ac6b7a4affec995d0a52bdafc92d4fc35b7db7912a0ba80ccb81e9347014bb0b3d7ac6b80566fc0933545ceefd9f2019919c3e035f5c87c3b3638ac2ee2e65a3d7e3dbf0ce8480d33a2261a2b5f9c3121eaeeaf0d48d7d0106a9f596932372617b35653ce3cbed16c50d507512f103e80d162f2e1fb9fd01c9cd3b5a3df7d9790f3b2471a8d53521fb2f542be7d07fbf5acbccad287eaae62b5423a597ebe250a1f8d6ad3f56e8a268a42fbf7d0f772488b33d0c8650e3a5e929b61ae0cdfb091ea067299069067783132cfae4d5334ce220eecb5eeea1dc96ec5395006b0bc7a7b6be83f3a2e23ef709672da91f012835a45a025cc3a940a724e42f89de46f5f831ad73ecca0e14e6631498421b6c64cb215036498bd5031047f9f95e68e64408a8edb10392a81b12b81bb3a9d8005dd1472763dfa0373d377b169f6e0d0762a46fa42c5857020f36f7759202a055c48ec527f8c65c2ade752880e02ddd44d1b491d0004fbcba9935050e4068b7a10f58e252e3c5d0e67cf19057fe0f62b7d0c9553738eb729c90ddcbbd3e7d7c2a35d22b2833d1563e6cf1821d3e298a6607a87a3b5d5d1cf24234696d486751bd09edb5216d0c243c8018620785bb9733aedd4825d3e2fe606ca40192f80de6e99ac7d6cdd8bfc69b6f859db9c6a6cc9d8984d834bbc2e38952e72dc5812a6a149b6c43878420fcf7da73a4eab76d1e4999c788414efd9b00fa04065f4570ceca0b1b8e5364df2f8af17f44ccccac641707dc81956255f8bfde636541627a1f6f486ecf73933dc95b4698c0ee8bc1e1d0a4c779aa7b36ef581ff050bc8a2caaa230d4ef8934b8e8783e23f5ff8ec72f975d75f3397b3a5e057cb22e1c4864a974111c6e7bdd57294f710a9a28f8a22dd5a56862006cd27e5c0834efc68d35a60d5c8d9ff4d5cc0d453c973fd2a062fcecaebf53b8ecb469edcc46a9f960f4be1027a287f534c2efebf0a69d3580152105a47d3fefbde6f1a3a55bb7ad2661ec5edc740984b40c189b7724bb50dfe2470bfe190c12cb9ecdd19bcb1676ae6afba76a2eb4d39b49633647b38e80b266a3860cdbbe3ecbea1615502a8c05a916c391f0b3449568e52579e828ee229d88ee7302ff41dddd4281ab7a47c1b7fc0f814b25d8c5a392c9adbaa78a3b328d8984fdc8e2e8d837e298d6c9fab12765bdf080856a8647dce10a66bcca6a09e688eb7f51413642020d91932552da657620e4dfd70e7a60dec47f17392f1a3b3fb6d34dbfa240e0144cbb620fd01feb0444a87977b1bdb55cadd1fbf2448a8b2a00190798265877003f85d25af0ced0d1ced6f462897d6f36bd59f84643971ecf14c8095fb5d7afe1af3c8376542ba1bff480e37c233a7ff11877b2b267b10ac48f8f2a5fc23a4c3e9269aab033ae0e57154abd21726e92ae88b00991deb901c26a788dd0b1a99aa6168b2228d79c380e1f3ce958e7d477b68a7af235c50058d51a1bea38defb10d917bfddeff9c956a7a9bb8a7666d97b5f1f1b7c01ce98851510681099719b4402b31eba29a711a924a0ce68736357a46e41a7c4f740b01a2ef1fe297f8cdd5e0e352f2809e0feeeb9eccc1b0840db8005d381456c52c7743e4b8547e73759ebec408313a45c603109f9e328df06fcf498a6dc343e0a75ddf35ff01065288e6c6d08672d74cf7cd71d2d00c1a23aed72f8d2ba1422ac76a329d63cb90e1aae09bdf069ca93f50ce664a08f601109d31e764fde3906090077c10556b5dd1fbb20be65b32f5c1ebbb75d623e4fff3a97d993c0f8b58ee4d3117e499a541412419498a4694e539642d3ab53a5564bacc7291412914d1b5364045bc92fd13df113450d5cb528db3abc769c797b0a5ff1f2bfbd933eac843e3c300d235a1ac0411ad3107790e198f76c288052d3ca92ab7bb76d541102754858721d4a3e358b917fc13ab8835a3c4ca71e19c7bf8d2bb836d618a9c7b60f3dda66b311d882cabd81723675a644bc9d9d4dc2f15decf1b0415f1957b709d4fbcabc98dff55c80cddd0d32367dcf39c2fb0ef03ae1b1057f2c1762b48b347605db934a539a302949ce59eb445ed9da6c909276db888a316d3ab11d91af8366cf3cb442c6735a03903c39c7e572c4ec6f6f30d67291742abf33af7c6f93033046c5191bb54fa3372bbcc8e1cf9f766c978960f2072f53f1e84ef56065a0ea993d90c6948f6aa3597a22c294ca2d918e64afe55442ecacac4b19f6f9de5a6df3a9e4a499656a8cff89d12903f632df697af8b5827f589a37cc356eb2cafea6e14384bcba8c8f4cd9b1e1ac7674c87bbb5098e2a5675663a6e9c0c093b64c74c873805414ca915db3d66d1d6c7a054b7aeebb4404bfec6ab613b35ae163a80ee2e328709dc752f82287a0135e32e9fe4c93b48fdd1b1f4f081735c7ad6c49e2d53f370dd86b88d4e67a997b33d2e5e0b2c9cf83d88f357ea60721da521ddc1189afd98ff38b9722bb6d9acee48e38cd08492ca7a135fa4643ef0f651628f72d53791659f8c03c29a91f3e6f0d387a738b981df22bd61fd7550ac1f89feebddaebd3fcc6e0366b45662bc754020643c5e8ace022e5bcc0c486a28eb2a5b5d86b59ccfd8352b1078fade81299a61146e8aa6c1cdc79bf1fcb68c04ff82b6ef100fbd037a1b75429698d7766e2cb0fc48f593ef534cec3c53764d21742e09075d82c10876fed773defb7332e64585ca0d9eb1f3cddf5869d07a891e69d3c0a990010c0e52a821c8e586b9e4321331e6ca97507a5bc625207b7f0d9d38491cf226a8f8785d3408a73a0db1999766188422e189b816223a37821dcee9a0ba696dfa59b7ad4296159b0cc3778b6cfd27573637a21d0c4b9d9f9dc77eebbbd0ee58b0af1221a282f1bd95e35efdd3be37bbbc954bb0e306583ca639165a4f79b14d1cc9e099f5b6464311a30fcc4b43803a0a7b7ae8c9b7e3dc163e04a972eb812f782a595fc8acf67e3d6b770b2469fdb5ef9f64ace3cb23e3c0a01cebcc4bd14a2b858cfa1e94b4b5028386bd8009077e09a9bc17b26311777539e79e67f01331ae59d57a6df6080ca1e83c26bb67df295a9f780ff5df8483e8c33597c4cfc8b6ec63ab77f8039925efa23106b03d8974c0ec3f092a81ab096b2770995313af01c5d6b614672413e1de1a53eccc7dff010cf32924844b21a7a265a3b1511c60da67b2bba7d1d699f02d2e341cdd6ffedc9a00ae3425b3c47974e30e5be1bf7de2d2e2882c4bdbf15333d4bf1f46e95183f6ac900fce7e87c202c57f7d30fdb0e485918c4f0d2d1558fa4bb638e43f898dc61abb8e56cbfbe36ec9df340bcbbdd6bbcecb110b21f5da9c4ac9cf9263dbd68e4ca0b3a2b64d99f30f977d430efc03b638e73acbf611c59530191749b719aba686f0298bbf8ea1ec39cfece5facd4a003e226d52d639e4f067559f68b14baa8f384c1a2188bd15b2698f2ba2deea380d93074bdd4f78e0ad719c88f32d760fba7d70d9eac4bb21c45912480cff867caad81067a1059aa596a4d31fee310ece308f204d79024e3a8d1045ffdc76c7b728bc03840f6a6cdc5dfebcdef8a0a5eac5c03527f309da169328b09d8748b3e171ad7d83e96fc4a64aee89e05de081bf1cbe4011e61ee9b1e2a4b77840e6c1aa74383c4cb503d841b4eb993ee3fdf22caba763e45f6e210542b52fdd5e9c7121f65078c7c34e1108061a5458554a4ed3860ebb07bb714a13b1cb7eab15fe895e7547c0982d50776c5686bfac692bf06ea2f36cc8e918c27e24961b8324e52948b6d9324a02261ef96eef77486e6c20b6418806edc6ed47914f736e9351262b5fcf37ebfa00ff401b03f2294ea2dee3f702d2a8eb099031e39a115942fa7f2d2a46e5bcd911e2557d19cd8615b15b218f229f5ca53f741ebf81034b22165b34712c2b9f305c80003108addbce5b0d6c82e24c1b6c06c731b0a82e61a6620863c2cb03da26dddb1d95d19a10e522daffccfef4fe54e1653a2e98eaed8b4117daf3e21163a1885d2817922aa92aae9fb64746ba7f37cb5c7d3b4e87f8b85b40f7a44c04c509424c3bf528339b4560c378b467b9f36b5c380db356f99f0276f1ca1ed885a6af26b8a1cd6f263a27fd5c1d9850b6e81897220001118527ef817bb81a92633cb50c9eac4fafc57279b5a3ffaad0110ed6ff1110b7004b6cad7a538c30da2fddd05fdb20da8950fddbd5a1a4fc1636df6c7b9d493615c543243d1fd6c353de4973331fe43a3fa691b54a6fcd9cdedbb8aa4c33d430556caf61de8c68e83480345d675f9242b32d0e162b9b421e9d8bcb5496e7faf58ef02526cd19717eac81ca6d0c0c7add8dd951fdc3e9a530d1417e8a335553154f0ccc4354dffbfdf65950a1a7dcb825565ff1781e55222c8d99d04d2b764840e370132656750b659afa136ce711b45e06c71e150ce5478867af183630f0c086b532c81372d1ebd3a6c43ce5f8249aa68b2a27ade9033bce95146a737c470cd5592e815285ce404de498bdbaa749f4278732ea216cc95a7562192af3f1adc551d7eb7ad9c61a654a2e5bf5e7dc0291ccd03c2d9cb75b84d1f7b64a55eb2340b3f51804839de290cfc983172fda1f5c72f5108c9862bd6ed493d535b53196cd72483328f66d9609a84c6f2ee09a2c0958015e051ced9a3536a7ac6bf72fb982a2dc3f85800a4e78b1c0f7abac0675a374947c97270bd32666b94a6c1012fde62bf65047be3c57dbf32f892b304d421641f68c3cd4ecc8b8c40b11d9ae9399639b01b17c35481fee3594dc1d7c5b7ca8c9223f6298aba1a1648738b54ff756e613c15b51d38b14c6f8060f5a215f35d5e36e7824304c7abc913486eb1248b04a601a5a05a3c25d636e01b2b55043de21537a3ec4b045896044aece455a2451e797ede1f8a24702f789faa8a798515a1f0f4bf3358deb5e1162472e7a2c99f41935adc24cbfb5d5b842d8be3118953b7f1f6ec8a9cc4225fa5e89a61085c757e1b890f64594d937315d0f0ec3f98e213fe4345d1372976e136f522caf8aa8c3dc10320a6acd38f728ac5435042e41e241c079c5d368ac9d7b46cfe4f10ef2aaacf075ef47c4309ee70ad1b2922622480fd78d288bc5fba5980c09f9d0a4e70c91980ce9d2cf7242ae02f25ef7987d5097c175bc6baf373b38c9fc3ef01325e72d3f0a7d08b7dee87368c13423c58a416f57e1c6e3618599538a6a9b616d580f2780b1186422b70a8760c81f69f10971daa6fb7f43d2a83516bcb290d771e7bee4ad500e7724c5bfb72c8adaed88096123757c20b62d35ea7a5fea737d0328cc0caa0152e93404be79802f8ac4f543e4becc1496104a5358627a0f4b42633c1534a98ba6f2ec0d663fdc0aa00f6799a6b9644443d24f3ad330c8b6e30dfd8372de862dd06c13560c072691ac94fb4e678dff48c2fc44088e7899360cb3c27e052408d26f56abfa7adcb15b400a08296f7460a784570aee0a6c8c3ef0df96db1b9969ac1dd9ee658dc734289e0f97dca00b9ad3f574fdd300ac84b9a55919f6e49c6e08afdf57b7078213c689ac37d558f13422a5068de41b004af418fde492e413dd66a322411df228bcd329683b4e766cfe25c0a67401a220f5f06082945ed0b1c6a82d28d781de7c8b515f3a249f2e304b4f620c9392929953722b35cbec551edbb4adc023a81819738921fa653785f41728a14eb1de4df66fe34f4c42cf09bfea1f8a901c3a9c903608e4a7452dc6abbf47bfc127066d9ec98d248fc4ad883dce66f513df3f013fac27b7d71d7e7a612ebd143f389ee13e7ac396f3dc8c81278dfc72859cd21240c8a23d4d4b36004fba03f1e0327be256d058b0b074905c9a49194ae73dc518396dcb27b72c0e0107a72ef8eafd625846640fa177391cde8327d3b6fcaa6611dd55ed5510fa22bc62393d9887d29312ddb69eb31f2436c187db3e2a79220eeb1dd335b940f8ed49fc7489a408fe39ddee626fa431be833726ffeedfe45d68e9bfbedf40a9578587c25e70107315d580e91926e66f85f788100515cd941ce09bc35ab0f3654fd5f64ade9a5a8e8bace0396553d53411f952d682c39a5b10aa6ba306a07dcd4318cae139d3ba3344e5b3181cc7d086ad37348b001feb21208691c35bf9b2cfe2062fd39e2e2acae772d03daf688500da2609f031afce76e5e4aaa9ac06a53d94ffbb33f673cd2b35754235a31717dddfce5c448913e26f810e224de645408162ac81b2ac7e1ba8a3beb5bcd455e2e5c89d0e9296ef197cf066d146a9d80b4c890151dbff1094b343b65111fc8e5d4305e3a18cae5ed428824d3c14b7bbdc0a7ef3ac0f6f531caa704d5cf6a80f5f571867611198b63d0da3c162406cf2e8c61c3794012437cde7975042f2b6c69e5ccf17d6e209065e10096cb54f22aa485da30f8149e70a1870d00548ced72b86d5996a764e460333b5e0a39d4943142c3809533e0da7eac4dfe9453cdab7415c24eea1b1addef624acdc32b863adcdfa2ff68967891adf1423064727800af714bd503937496c95a002c5b98b9d99a11e14b232feb9ac25a082818e0363d7fad731f4468183af687bd7b2af971290018faef37418e4c520a544a7fe3e284b44b1744a19ba72194883afacd1458056669fce61f27d9a68d71b6d57c5d8778de7ca1cba4487efc5eeb7cb4fdff58f31ca443cdc5179d8606c0e1e2c81118663225e732195f5c95f852bccef7b6858f499f8b56f21bf588e5757386840abf167a7c13b67dcd3b250fe99fb04fd6617e87c1ee1f72e73599bbf9de41603cb126e99d021c1dc66bad83dd46184ca97e331c5c63b36b9c17dbd328d05db6b3f59ac6c82c6239d8300552e4b3498335bfab0bd0fb24dee3d2f35d7ea51b447d29a35fcd604229ad4c60a20687318885e637549baa41393d709da4e3f8b4d1836ff57dd76fa7841d04634cc678cad2e5835ea93977af20ca1c64d9fa88c02a18192467c9c46331b2efb9a6adad6b5646fd5fe206649865b8d59a608ba0422047ed85bf0020cf39d4c67190d01ea5636f028f1382f7fff3989a29fe1a9497eb44c11afed9515731ee5e8b6ed57fd872f936166a3399480535e1b3cb22f99cbb917f00fd219c865cb48ea343c90ca7801e2d8d9313d16780f08f354291968412b60fbcde6017a7ad52de69fe1551e59dd967f63d3725746b575b9d188913b04136e36a55f9802ce7a76007aaa3cd47353d048568c11f4ccb9afbc30abfe5c65813a7eb3156c061ff1314064c97434eb8098fa0bed07df3c56cff52c2aba935d5a23fa882744c168c045579347fad7e3e6d9412fcede647b9824824c054f50366a6945fa381b8ab2f9be02dcfae5024cd922fec374166825df72f2b065d8f0ed6a1c29bf5796b3a1858c1e40adec735fa3334e624f64b891fcb61ae201593f17b53c22dd224778252b49600818e28185465e630973f844938810fdd410a2d390cd0a9107f7d8bebdcffc9aad1640531ab70a200fd0738dcc4f1fe57e8376bd1b5d893ac9141135e5fc698132aeae870cea693fd0242a80da52e82ae04bcc27156349495595822262e880e24b5a13c2cb351d7e64a70be972f4e4e4255d7b09ab82510d40a2f3c2bc9ff5b255e7d08b689ca971e11b35183a56131b63745c4edfe941fb352a8d1fd79e46f5c14d9afe681d6b33b8fb14a2602cc37477865153a5e25b956af3ce3d3b10e05b879f240f6f12e7d1092e9e478ba145220f199c67c0aaa8b8592661bbcd0f6fe5580909645d8db385decf7f3880ccc2ca50ff53e2df45c0655897450c953a146c28212df72ed3979b629b5735db21a38dea2bbab2b055696c7fc3d3b31d70f40a15ddb7abd7bde0b998898be353bf4dd5a843d68bc71df6db005c35941415735f2328f7cc2c2538aa19e8312f0677365f4fd9fdee8bfff6c3bc2f66f10a83bf978655dc4fb6b4f4d58ba44fe2e21e30e7e48436afcca821ec603f3ee4b8a7408c4df4b2851331969be23e13ae521b06313583fd999c90078b71e2ac45f6dee80d747d828d41b069f62c4e554978018c70e73ec3946b5c443a107102b256d742b2db076e14f606959898740906dc1a065d5c3fce8af2a8aabc3c185c49b1f9aa563ca1d992f3f1281c6d815b66d9cd29e6c78b4beaaf3ad7c2e2b8e31a5be3f87b901df23ec31e0418602c39110d8042a2dea7060cec852e9da93a43f461529a5ad4caa502bb307ea7b810f3a8691965b10da156d3587612ab9d7ac9e34ac27d40eb6fbbaa7483f4fa7678e0375a8c66b4f3b61b3b26c38a090027eea13f326d90f20aacac058f5f053a8b9f3166c41ea6dc5c6010a4bf0a6135261301837583569c5777fb86aa575e156ff345aa45cabea3cb4b7f195652d1f8088f2bd3791874b6762457c509f93f5e60ea849867ae32b333ebe3d7169af525ff78673e66fa29dff1ce6691a2977fb6df20182f601d6f949d09e5109693105df886dc6519674f1b8b98b10d4d4234b696284bf9ba9bf8c3612aa4b51edf762a2a761785451258dde9e2beda5eff32bc4b4dcd0d807f63c000dfdd28d7c5822c05cbf1cc3983e1713cd22b0c276f2cfdca87df764f92bfd129cb45fc2900b5e24eb5b60fc066a9eea5d40200af29ef958b525f6894db0c4d809ba2e3cefedd400c5c1732ba2dc9aea48a7841cb2ae3e1f81b83301eed914c08de0f6cbdfa6a79523cdf5b6b92667e1ed5397f3ab770f8c1b896cfd9588f502043d3c94a5eb56ba313add977263ff0c644a9fbfa085ce23c69a83c132bb108b7032639509e6e4e61b572eca8b710a2faa018118b4c1761568b622b5f51fe3e5e33ca5cccdeb1f1f2c43fa5ddd8faf6e698d7bc993546ff05bc824df594ad86422ff5e2a2f9cb650d26de8624bb1a04ca7ee02e3bb9cb5ba620b5ff80f1db785a1791f4b89dffc1a4ed0d65b43f3df0d617bf6d7e49d665ddec504089c5b4620a1a13c24b1d3b33b96fafb9771bf175062e6f73b640179770f9f6ad4a993c1898622ecc73bf7b6d65cc19aaa22ac0e9cb1a538a741b651516bfa0f987ed9a1aea64e1013ac1f0ff6c505d7461303a15b3089ab40dcd9b7650dec0308cd07df2f92007f5d5a2ac18f6c8007b349015f5c50cd5bdd2ea689c4f681b202e38dee9dfbf8d1f25fe70c4f880361eff98d4ba16a0504a4742d8f0a764859d55538408f4850d0bda1762e119cb7e54597b964f852e1e9faeac60939ede9bf266df5bd6d0293a635791db1771678e8e0560fc69e6c202b772eb743286991a9712a02b8e2b237a72db31d176bc31ef2ed650d7c6a0074badf9ac98722cfad63279e7394bff84e431dd6f4919cd8bef28a48188b1d7f8cde5f6ceed42d175e5091f5679443e77a788bdc58b6b4dfec046880de7bf8fe6437b36e4d1afcdfaec6ecc67152d3f455b665b140c259ef3307e1f56d1f1c6c3dcd0a3f4fbca933321e14ee84b6fda0b660f06b654e17bb7e721dbbf9ac2ae4a54a8a435d7baba132b97a0cdeba3ae622f10b21cc1c2c79777171878ed148d32cd8f293e3ca69d62c09a6e2630a9135d8f5976cc926dfcf18da9f7b8147c18b74b509f51a12727999c1e0ad58f9f7b11f89f2e1859f4450acd4870ac6d9e9aae8781c7b80787b0031ff432aadb930eac4a95d51d548c6fc6fe7c95bfff48c3a3901b72f7148c60dda96d7aba20e9c8a4ab2fd9b1bfe1c47adcdbaf5402ee652995e845e929267ad2df434ff7aa856c844daf57a8dc0ec5f8a0a209e473e202db72b21061bc15eadfb4d421ce64be02b08fa0bcd3323c0233a4a5147f2d64c516ac1ff5330185600b2be27e773a6d5a64f54119f6d107a5427e9b893ebea9d56c2fac22cf9131e6f658cc28465818d2469dae03e455ae38079c6e04c17bdeb53f864d8162cba6a7fc19d9d9a6924457b5f824a068d7d363468579bb5ed5e65a3c6a100ad04629e208ef81761a2977dbbaf5dfd0febde85499a87da57cc386a9161670c9bbf04f86087284e6f176acbbc6b9b4ca3ed37a2b64bc759fdd2129654b70c47b8da4c4ba74e02614b65189b163d03cf8b542a3835ad045bba7844e0410c4c56b2fe70507eb2631152676e02a44e3ca49b4129c69216f8c9c0d5bfb26d6b26ad19739d9e8e32552416c0e183e9c44f99616b24059eb05685539580e4b7075ea1ff8949cea32eed82381cc20ad3c6fcc60dd43482234e202cc52eea73f8f7de7daf37a42a8b63f9762e3d6fd1be138f9b3e2bbe4e14eb3f0811d15d046f64aba0583d09535f682e8dbc584b1ad785af5bc3ea9b6660a084ba54816a4496e1e97d725f4cd8c747f9737cee4f72b394326d3ff6bf628265891252ce5cc9df4c655415fb0b073447fb7f0b5a59c11c4a5db1a97917198233e915b2e3a582f57736d41f3dc0cf67502697d86bf9eb51d80c2afa39b6ac4e896d08491f07b08ccdaec75a428f2e35c6613b0d0acbda1b2d35aa7158eb579614929bf774a292a34f8d515084ddc78b172497aadf3b9cf3d413b9a3ad4012286b4d49d5f3f90cba9cf6d83507e3e7caf4d70c8ec61d3ed5ca6982e5fa92accf0f4e05e08564a2aecf62cb46099aaed8989bebf23aa35343d2906a505ae5032caed93f3bbba38a381ac7a2cfd4fca0e7b69a859e7f9b82173c0a9825acb6d998d0006702fb59a1a3840d136de6786968074f13338c03f80650d9da47bb68d62f4c60b79dc84c7ed2c3e5171e0139fc6b15f661dcfe32e83d637ea2af1eb64f5dfc39486897d62fb7137f8c5d2c6e28bc82ac4286173643f7b713e6cdae8643e9ba19e280c200e9091e778d4a927c126d35ec7bb51b0bb215d9205a185acda9619f5659b3157354f0107a2564d6448f078d0d3dedc6b13517d17fdb3dc165dda7a58f5b51912a6217025068e16c8b8452e61e2d1f275d510022140a174dfd06c3817bb2242eddaa30d2145a0c80dbe781e0af979b8acf5d194a587307f894b570a9ead732522598f2e6d529eabfd2936b9ee7483960b2f62d5a44b2c460e17a2f60ad1d11ce027b057802392b1b43f9793780fbd2a98e3d9043d1130a23a0ab075ed686ad69e235390b88d8ac6745ff1d2b2c91c6111f4f73f204c1dd0b4e8dbae693276d23accb5bb387b9e9cceacc4cb597889677a9a6ba52e69c99ad69681ad9bf6958451bc109dfad0bea01d91fc77753c694aff9f585739f9766926318d92285353917a6e7c4229a1a2c95e59e284556a05d3a6c6295a2693652cca038697f6868c4a0cd55c572e5495adad1e3267c3f0c4fdfaa214043838e05323267262a2b7b7578ed21393cce099b287c0f87f1078fd28b0f1e742e3929a2d2f87df5e91be615fcc142d1f17e546c4aab81552a3863c0a38a14ff650c11fb005893b007306f33ae096d53d10d951a9e530ece24542be00332795459dcf239ceeecdab67a585969350238c3ca193bf7828019badad1bc52b737865ee36895e2249696baa4edc22e406315b4bc16cbae11c5af3e2356783bdd2788638deeda182b00fec93f6492a06765551d6e82ec990be8d2ae572668cf36f1c0752ab7ca0ddcbb288874b62a0147d5bdad4ee0d870213c22f76025038df879c0c69c0e16b6619238fbd9fc30cf612535e1ef8e4935b531b3c28be4fb60cd0239a0617225e1085e755b28a1c5a7f3ac9493aa41e64d520cf54dfb136192d91b5101e6333eb840d627aa71b1041e955ebf42a364d20810beee4891b075d8eea5a2c3789f069fe30986a943848b0e4c2f01b6b253084a1a47e0f2f12e6000e28e0d7f69dc1b03388930592589e6e23db21a4b73867c292b4fc28cc95d6b1102698c31166c60d28dd60f95b9c5ccfbc19bee76ae0cd17e550871af3a57f8466b48ce32766781c5ae86e896de21dc5e241dd1c85df4dfc1333d903f2d7d80a2cd7186eeb450f5e6cdf96ec58fa87133ed3872da0954b939e1fecc5a8062df541120aec210fc82397c5f1a605a2c618de485697228627b859a104d1eceb6fd42e46789c54a7900d2e69775383ee66cd95e467264d548b96369f84477a9579e86b66dfbc57438b4debedabd9a5c05ed1f7142c89efb00728797035f03b3d92dde700191c55cc316f3ac77ba89356d42e81af51c4c2cb43f3139860a5548a41a01e55957ddf8d4b5639b7d6f5145f94e028da8149720f7fff35482d1a237e34410472f84420a6f289513474071a8ab799da52f61660b65b8c7746fcd1efc4e294a5e56b8b91b32dd53ecc07ece9c9ff79b349c7121f6e430f8e61e30207289bfa2ad44680da151da06e6f2e0fa8a0e61b8705e51f2c1d704d6e44e8350a03c9bd39a8d17c34497976dc9571ff5ac0487aecc31c755a1fce8817137ba785075bb651960c2009026b9c203c3cfe1bf7bba1975749ce09999ad5f23d73a55bed083554b19403f9813a7f163f93c785d5e00c9b47cc83aba09f8ea9b980cfea62d2a0f050cae2d02d2e6326e16730bb00ef8b69b2d10f23fe339c8c997e0b89256d14a158b6644b21f5a1c356ed41bdb5b78d43aadd992e82cd26a63a7693b95b16e8deb8095f58170b7fd5b318d1c006173ef723783331e9745f49a6228cedf123402038bdb4986b950666a31379be8b035f1fc74cc9fe3b091000f831ccd42cbfe198041fe116cae81ec6a39c324be72777d3c61c430a88371972615b789020ea8fff698f6630531afe7ca75f211c872ef93f9ddffb19e213abd04b9607f40a83b13b96f93ef8241ac8bb3832322a3cc16fb9823507110cb24b9dc2ab254f8d4e240d0ebf7ae25a34e63cc3c6eb91b672764111a592e8ae207b4f3219ea5ceb13a321bc0fc244065a45ee8aa0a2411474b8a783ed6d92196d6491c83e5baafa0b5c30adb50e5992b87035f32fce45e59e5d9d16b65e35857eb9a16945dcc61fb1e98ae334e1d3eccaaa4dac416df3d780c4b874aa0166b72daed945adcbff000794bc5b6f24035f10e3487490336ee68defdbf163531bfab5da8a8f6883ac08db8a10ce817a4ea59205d339e86fd2d964a31b0fd04d623e3748890616dc735cd7ab958fbbf6ebd516eefacb9fc5477280a41d9049559141f6187f2a7e9774f11414561eaa186b42aa9cc8e7395e40cb521f81651fe5a4c47b0b88ffbbf472426ee313603ac2214f07566ff3b18be4fc0f577d5b5ba6c0497974789d0d67e72e4a44157eb039ad4e3585ef43ae9629032ae2e76864d1df3125d831257a1505b8eddb246fff0f24c4020bb8c01b3d366abb84d92b5c52052f1ab507758ffa7a4cfd9c5fa4f228384bb56a91f5c44578d3276ca708d65543571ca321176dfec5c83be0b8458899a2d2d46849de4e8eacbf082b27519c0f4cd5d091b2045f3be56bb7762b8f1eb60844af901eea5f8a9656fa6b49e2046dd7cfc6dbd7d01bd399296fa8e03b9b7e80e6f5beabdef27d592de56570e64c961a2027e5ec83a17be988ee3beab25efe94e167a768e20d98083d54125d203c98b48163b8ac735b7afca8c243efa0feb747a4fab600715b1437387bd78fffdc1e63f93641cfceeccb47e883ba2134c48f2130d36c7e69e91bc1c8c0402127e9511cbb0014c7837f95b425473ce2c0bf9cd8f4cd06b48454301f04bdd9e4b6298616acbcf9184061d9ce7c22c0ad1ad50c6f12e00fd8ec03f5a4403ab2f1550a49529d8513d19b745e15ede87ee7cb1fe22355704e7f0dfcdb5cf4775c916e0a3d99c492d81b2ad8090ede88e1b3bc2e05c65630c11cc0e015be7078cb887e4bab2b7b57561319414b464deb8e1c441d4b929bf67246a3a75b0246683b2c0dffacbfa8b0f9585609542c34a6d8006592ee7ea43da22dd0c6b3aa70edea4545d00e3a7b7bc11d6f51dcd9b672d84f3f227f618baedf6195bbe3513665883d3e6d82013e2553af4a3d2300befa39b821119f9a6e44c5a15214eed7b97498b85d71106ea9cea1df38fbd54da79d9e4a65714bfd7369570fc834a77e6daec79e0accfd158ca43f12083b8c4f2a0c1624dd72da01bc6a67c9f654f49925df6d4070d88bb495e3b8bc926e3c83f4df718012cb699ffa703ca641aa6ab610d8bcdef238c95821880274b638252340ec086bd97684a185b1c3942605e914a5ebdec633a4f2a90c30e75abb84906fc466cd1bc85f16281a3b382fc8ab5d152852c380dba0332968476fe47d2741ed54d1e5e2ed001f65afbb43fbb00fff7500ef82be46534326abce886e9eb23ddb2e904a86248571ba6594129a726a1e82531466d9fd730556c2d0d66b70f9f23351ed979dcd46c15a9aac417b5d1fb46fd05a26e5ed8b49d9ecf8c9f7eca12a241c63e7d1ae440cf2b215074492939b6f36d1d381515ab8daaff0696024ac9e4d81d6f737ca9d9e7ae11b0f65dd494eaf670b66a480a626c2d306fc29bc8cb88e11df2e7898476152c1d6604d11383edb7c45b59de74f577fd2d55b78affef0606722943bb0421bd5d85810b747497022755e93d3194f2c1c4f3ea406451be3df4515e519c0abd8157c65dd9f7978bce0c9d2d889bb9c0f51353c28e811850e5c42881d7bcea86f43a978b56b4a7e4c0af7b91876ffa3b75d11cf270514aeaaf2dc61b1ff5263071deb3e1ad32568f8276bf51ab708a1d4b5bbbe1d3862ca2b9b28247ef11796e6a5f977f7e1ddc210ebde07476d6826c99f14ae73ac4c7154369e30eee8703dd2d116c7f3ee6823894366b0fcbb9951509907a2f234fb51dd270136138ba53612c54ce2c6e63543b5452e4baf30890017fae1a2a95cfd5729aaeaf8b6be995b69320d6f34cd230b933f80383678134bd7122f2a1fe2e6c6d5498f2e7a3ecc6729a29f643977464e99b620cb2d9c1c47c71f50d50f30c6b86227904baed5586cdc59c721a0ae0659f0a6450c9a8dd6a32d3b662c83ac241153782c5f822ffe5c084b9df70ae7e967dda0f9da53f425e91eeb480e00cfec86d4317e1bf6101d7c00919c33c01f82010faccceefed56a9755dfe72529ae5cb2dab0582fffcd45a2b7c966478ceec6aa662746393345a9708ad1b31aaeb85a030ab09b5f13d991a5ebaab87109cf5db382e2e0e2dc5785fb25a84376fd9b191ceb0717b3a07cf4a23babf238d53bb5e2fa41030e4707dfc971527c4b17f7a2e6c892dfc7d36ec48db9d8fae027c508885e8c53cb6a776078a6d2694896ae200c5f814717bccca690c5be7f5d1ad9f7eea9f3f8a3fffa8228d54bdcce813196f0f73de0d6db4fb1a2c60c67b65beb26ffb804266f07aafe379f59ceab4209cdc255ef3ec00027cef0e6b7154d24a3ea2f8596e31e999acd9834cd6850360e0895f2922b248a9ac29ff76c4a9076bf303c0e953f5023ff08fc9f33e99415798cfdc1b488f92876c0c6fecac975cdac76642f57d2c7b60e66c25d123ac6ccf9715ac3d73058007f9445cfbd62cd5db46a54ba3ab6b5e6a4ce795698ef05670df65b1b6bf88926577ea3900aa5bbe7c7c67e3022b8980f45830d92aa4fc8642cae079e6e49e98f913e434d4a326e6db352014c24c4820f0544fd7e80788772891f2d7fda7adbaa04f3bae6382551fb7151576ea5fc567405d289e6dc1bd4bdaf04132d8a28327a3d779b74d31fe0dc49cafffd8671f183933780863c7f92ec09ea69546c5d5cb58b548d8efae5de608a47ddb4a21f402c6a556b53ebf45cc7375eff64cb81e37286ec8bf3befa7c5e8ee02bcda2d91699bf57fd53cc6fc9fd727a6369a4c53fbbdff2869cb2cf363019727fed6994ec80a392a3c61a7afeb2cb5b990011f1f833d38236e87662fe582f67de9c67c8c68270caa41df0009340dec879d677fe671b788c03b2036bf9f894c3ba80ec3909f80d4999a64d2948b955569c6dce6d6c111d661f959f4d086e0186cd013671141a49d2766a60150c5618df92b9050ee8b1b3aaa3b84808f464533a87f9bc17b5a46ae16cbfafde770bb956bb7f13a7c4f73e19d9ebab168f39c7edce1afbd23c250ce51aa848fe7ba450372633187d2cf8dce3cc13e76793d9d2b6d45095b1eb94925927d2b7164fee1229bb56790d855e61e911d46fe5dc1767a859d2ed7704a97b56e0a73eb41e9dd3d4520258e373a164ae60134a4a3ddaf926af1e7180d1538e33695d6f06ae80ce798d00ef320ffbcf13cd4febba48ecc73d993ea16b575bf6040de1ec77a5bcdcfa1bcee0f7fd1428ac1f2650b4b6b58e4c4bf0486426d2ed06f7be1b62f8cea3052026ab013eb0e41541ed26c84de60834d6b1411776ef6d82707e34fca4ee2f6505504f4939d741e11697162a8556822c4233266c480bb4a10eb6ef9b7adb8800704f2411282bc9e45769617cbae3767aff4b07a6f57e5946ed239686c0bd2696e271499df3560916b73bb0438a411564dce5e95075883b11bc74dd9b89e9dc8da62ed44a77da79b1d904d9bd564c65130a203fbe804b36b3da8b698918e55c384e292d7f3511e9ad8b538699aaa4ed3f6cbfe6f821755e0a30d085d1b4eb2863e40288937a04f64e89c6f4fc007e60993efcda0f8d14eb5a21b5ecbcb4fda5a51de5186c309029afb16e069c6eb930d84340879ee87cd497690120da4ab1351cc0887a2d9d4bb7337d6f2e64771e5979fde0d3b8618e36904c8bea3cbf6aa3e69487301c1937ee809cf1cb5910868eab5458e0969c70ee34bc8754bcbf1982b2378afa8b17d9a907cc9d3962a9b77621a55b398a6c3ef663022728fd23bd06b68cda0ce48deb95f2d8fc0754ba06135013125bd4c52a079353c2b476f7551bbc116e917a3ee5c3f55fdbe12c46adf6b754056ab2a7ca315334556cdc606bf4a239305f56464be312dc5c9866e7fb01fe0b7984e8dbaf4c9a8514daf17f6ea4ec65b7bb8cf0fafd674ea315319c4aa5ac21eb6e499f7abb8cf609f4ff324fb3d00cd4b925a6b260a1a1377b85b6a5b2646b86ce31c6d301fa2ddd98903aa8dacc41c289e406fab2f2eb094a7eed3a5da4428f06b1a4086f5f638e3f30ff09d77f7b4e0ff1beb22da80cf257cf8d7c13f5010596fe664f7208b95a05c81f33ffa7fdbc9ac63fd22411efe90d3ba325ae743cca176ee52cb566034590f6e3878631b6deb24fbb88e47f25f8c0ff89a50f2fab478c019035ba20ac45ded70fa800a7ec6af288e3b0493a578a11029eb4d12a4574b507551d44136d330f73f51fa4c3d96d116710a4b720e6a1e9338d3324c73de940ac32a69984edb942f7f4e9687e95d2e8c7ccc5ed6b8c53846d4c06f358dad27d22aa8247fd6efe675557164f32bb86c2efcd202e40429e174e7ada9574730fa4880c9d3ceb91fe4f6c6e52ab544029c5c09ac0df6130b5c447021df7bc68b29b70b6a8be3114e0d1c779452558a5bf2870cbf7166734349e0cb50dd2a53990ef92f6ab7ddb4a5db041c118eda63c48fb9606d8e716ea90e590138c74cb0bbe033748ee32f3c863a4f6faa9484b2a622fe21fa7d704e81c4208255eceb87285487e054770436d88baf94aded673dc00b154e4c8e1abd37002103b31683432c033f7fc60ef825d5ea6667e1643cde34a17023cfedfacc09ac752ded7e14e8e37474c78c8fa1fedc9ef6b88bd5f5892a0a745c87137370af6633585e34367259e068b618fd8be714a54b0db3ce81cfe8c4f5ece4dbc81e8c896f32914c4e71961fff149941e6e5ea31b3e6c651640076a5c4d40973aaadc403b9fbee04faa75855a995e8a00553f6a4cc02b4c95e8b80848b04ccd7252df8524b567fccda7f5c10a2f4d433918f88a68d6a5aab8d1f4442074b0d09224accc3d4e239ba18cd6ee1da5d2eab4845fcdf2ede60baac54c68fcedc71f4f7c4851f94a67c1f313ad1c2ca28aa9d75b100f5bfac2c247ed3da65b9344e8301f28f2ba1c1868fb3d250fdde25cfd7a4c620740b465b6ceff029d8adb5dceddc340d1af10bf6aaf26da3d684b3115f7236114c4a83d6f9ba362b67e7828989a23a25195f975eb8cbabdbcc2954585597453198572863df59288c5409e5ee83077a2605ad788256e7d4e93d0ade4165d11ab9619be64b4c07641f2dd447a73acdcd56a758b5094406700c043edb1976f1175b2719bb20f1ef2dec4fc5b9151ff5f4fecc6ffbab440ff205133e5d067b865e04d89f68378d41c427ebb79b00a8fe83bbad1894615147c3da4cfc91bcc5e90c9093315bac84762aba406b34b48474a83234d2740bf5c8c1b42d98408dd0425b5ab6b734b5f03cdaae4ef3d3f3dc4dfd7305c3f404cc3f67bbe2c751be800f05f14dde2479902f764113619250a4dc8398c578832a3ff8cb355645ab71929bc594242ea6e9aa49af1db47e1c14c2600191f9255cb6e0bda0ba16e2cc636084fc27d589a3ceb670ae9024c7ec307561adb9e3505d69a01c9175d6d934fbb9de86e1e86d2d24ae151b4ff325477d8101fb35d2e46f40ffef182c3a1c0945d8273cf342a7e9cbe083c986459f8bdf88072506f13dcf6167aabc00bc0522d17ec5a09e3030180bf4f25c5c9a9eb77a6e2721df7121ea507ef46950162e50ba73248c66a59c97a5b7ecac30919b42f6e2e27a7314025b1ff00c0909e3bea6fc872e196564a6aa64254067c3a973a99f101531a7e832a3a4c30cb415fb0bfd8a8d0259d53ab8e5d5df71c01662b63aa2ceb127144c00c2204ee40525e515ed3871ae70cfd482d59b9bb4b40e33e8a51d8ea8f5e564c860a516d880ac407d434c26a3477ba0392213305b5b2f504930c10b98ed70eb9889b4fa79290b04b4cf91db1d5cdc439fa693b30f45799e813b32ea054cf85ff974f23aaf9a4507194e81f0ef934728bf05ef96d7890fd111fb726acfa1bd604eb402d526f13318bb96d83425d3ac469814228af0bb2413cb5cd7233f3d04a4aa7df4960423421124acb0f311e78187246fa1af3c0a3cccbaa09c7ace85026e1d1f756103ed0f003ad211ab66ac756a478d7f699d52ebcf3f1bf228bfcd3944283f4d344db9656978227eb7aa6ed773136cf8f92c22da6afc45c9a66ec48bd94d6bc800249528654d8f3137b2870826ee3dc4498d54c95c5ad6b3ee70016401c5a6e092a0167962582f21842c56533d59309449d9e52557009e5e2d1a1f0e5aacf35ee0137c2b67ad60ed1e0f1d24676ae4ec42132f7427e9cd2da7f45864f52a16d576e29db006209a12bfa5ceb38747aa33d410205088c454208b5cc14a05f5a841d9ca0796b9a50fbe6a61af43817f9016ba8f47f723b2a7b17c7eb54c7c15dd59d4d5a944e2c0b35a363c996453abd874bf41bee26cfb10e448e8f8098ebe4b03f2aa5500b27293774737154a610fbb34400dacedfc09838f76ccc7b8ed86176a068da888f0536afc3e3b69c25db92b7fce4d40964161bbe11dcfd689abe0f44e2f62b43e38451f8e5dd6a647df35af82b5efb2c1d5f05edbf88a8b096e3f8ade0d0cc367caddfae9d3bece83b7b9da0b92bd5e29a261fe5233e5577b71c17220c27fd92a09a768a895b62f310da8cbadb1c45180b26f24fa6e68bd59b5baef97d926632884725b23a8d03f25372c40551058410877b1d0c2911c815ec49133ac7c44c9ea6751d84102f02a195c3ed527efc01599a3a4275be494626deca948ff1a934503691c4358a144410d3504db8f66d076d8b3f722d224e178586109f76b8dfa12e1b37f1478e430ce973ede49607bacf38366b5a20f6a2281f48bc58490f3eeea3e4d24e9af687bb0a95576c0d4c5e424df424efb130edd225abdb55792f9a311c166120aa2b9314896ac41d8a68e570a340f05f771f7586160e9454388910d34320f6118ccaf11774176599d91ee8abd6db832721838f7f199cbd75320dc7753dab7f13558858353781537db3a161f938b89f7724313663a3364892053bff5711fd5deb8fcbadb5acbed09fe05170037082f4826567aa873232e4e0890e0813e7d86baf78d112479892d83a7d666adc8ae92a81bcb9db6000c2bfce0ceffe1decf4a79cb1e758c8b8ec11781d9eec73a8b2c30e3756cffcedb2f56a5b541bcd58d8ecbe551c0ee2d545974c0ecd2bae1b3cf5695e1276fc4bddfa803e222b01be88f55d2290a5ba4a60874f53ff8b423b78942bb4fc31cf8c97bfa9ab4294cdb6ae953c45a3958d2fd1e23a0ffb0231bbfc1738f266d6aea8868e8bb9af86008a2e5f6b880a66f211e7ed9d00570b9675ab16a195208527707f49341ad362a066cfc01e25c164de1fda7ab215543bc0dab25d9b323dadc7a723bddbd0228001b62ae6fcd52eaec90bb56fce8e60351c59b5e9ede2be24c522d2e829f7fc0b04a7cde69f7ec75ebfdf6128279dd9dc92a0d80b9e11a8b7576cfde3a88fc186a8e6b144251ef118d4fa8007e9132d79a7f808f1d9294e5a760fcee595fc7e4414c4253c34653f5ec704c511d0491eeb7568d1f40b6afc8241f01d7e71261fa4b68400744cac420f4ad6a025819919d0a75503698d805a698c7db3fcfc2fe25c7b88765858cdebc6fd684cf1bc64fddd3c2c5068639bb637acdf4c1774c2a8ae4e1bf336ba79446b07edfaab50cbe12361a5c9b3ff2200ce1d2801db4af6a2762583c9e049cf75c283e674f723fbd884fa396bcaf8132e875ba20a3b349df5d0bdb1a76ff1dae2360bd8098d71252064e58aaa84ac9692a5b00948b54055e784ac5a8f033840c272f993be02a90a7515ee4d00b421e18daa619646a724c9c9f24c26efbf1bf267f6f7c5f72510ab3dd6bfc5ecd275154fa7376817322c0e1382ec39fd502a7600fd6540c0287c19e9a7a7cb8b0ab77faa2847d6ac4d55d242d735d60d86868dcbcbc1315881a897a4ea1d4ca577778fcfa8b468530a726213ce3d060f920196327570c102bd269b9487d3ed7852c2fb663f42e7ca45ab83da41b931a0c2d0b7a81c9b6975428d5343d393d72f5e06f666344b98f5d9775e3a94c0e5d522477ea8ddc18fc3638d7964e3db53d126e4c0ad29f10740bc65e65f4f67c400e2c0b2b0032f094f683d8c7fa0f9f788ced82f82e0d61fa9eab0c18a1ab5efc4c33fb89e4db1e9a0a82454326e4a432f26041c2524e4481021e479220abd68531325cd8c652bcafb3cab34c974cedb50042b89c629de912588077601bf68948a507b2fc263ec8cd9e16a95897d79ba04bf6f1e3a5ac34839abc21a5fd0eb0aecbbef4563e52d956354c11c8cec2d894dda5fa82795a2ac2e3a910fb363ab4485f601ff157272667e1ff2b0c896e472849e1fac476b62e2161e426e8411e88269b4c09987b46d27e1074ead97cc8e22544095f5e1dd546fb953e6bf2547048c9c035a82cd70a25e649a3f1e1f9bafc42e3947659bb89df72a657446bdb8c04695f044f0f92aa1293f71c2414d18f944da237af7c6f6fcf8d9ac671e8ea0df4ec6d6233a05e95ccbd7bce1ecece7f3995c995bbe56f6012ba7725e4ce3f8250c75a9aeb98629a156c716c75a82fa45bae1dcfbaae262fe7dacf32758442a5d1486f5c52a22d8b95f533678719fd7d858ba26a3636b4777ee1e45cee6145960104f154b574c5fa41312a275e6e1891e1789d839004128087e5274f19d1c8529945386a740b5e044f56aaf04f74063cd3dd5217619f38476d4300d4860b95fd57bdff50176362af692f78401e3755402b1af3b79d609bc21609d1a5120adfcd7c488a02d2838ab9b8481a3d793e0479fbe3082a4571a222be878a6e638886c1465304d95087acfef5bc5ac0b5ea50a183622c09fdc9b965dabb38e71176478671735e0b24bdb1a6b54d05fe1fd9ce4b1a1c1c5f07c33ef972b743090ae1f724f56e45dc9ed695432fd20453f604599bb0bc76e9254c5359e94e6bf6b77b92d030e673e8436522936c50954b5210ca9a6c99c1b2fa34fb97197d7cb355d02f112517903374a7aab6d656d84bf14e8b0c388b46a96a9d6388c5ac21b513949b58e2d3b7b3c88ff4c4a4d11c335311461f0a909779c77bab10757b7968a7e3c30d87b658ffb9bacaa8761faea72b0f6ee4afe9ce0cfa22912892f9564aa5e7a1fbc930d7a3131d72f341e206f6984668d207211a1ce7e9cb88d3afa4378c1aec7c7731ca97178d26c6f66a594f20cd08a974a99b72508b5042c77779364c0eacbdc3cf43953166c284d70b8f142513fa04c59ba2a0656d3c1cb68bcf9defb3eee8d21de867d1ddcdc24f871fc90906ccbf6d054e3d31bbae4d77d8f73b07488079bda9e10c9715d43df5e210a8452efbd9ab0765366820f1c3d777687f9b8e0cc2c43620dbca5ee0844b25da757f5d041e605a987d1cf19c9b4387d406f1d3e8c330b204229df4b1dca68836a4eaf3d3aa4ade00ce3577576f22e8387ba13274ef106692c68aa26f6f43041f1e05a00154b866e426718e21eaf3cbe9a142866c2859b160cb94b04f29ccb80cbc5cfab8191dc9c1685577b0cafa3f5c1a35bdea1f60be82acdbc6f3b3421ca21d90874585f71d6dccf1076c7a5850585c97306d79ac885ae8eabb37c854567069665d3b7572f1b80c0aefaffd59097d769618b32bb7010fa8b1146e212b19298eefbb60139b6ed241e631eb799e12a9b06c1e327f2c42706028677e2748f418eb90d64d60d0ea3b9f3db852aa529dfc9abfc893b33f0f168d0fb26015298ec0e381b33f8d3352770ab968b65bca0898ddd1d9ff56e25882ce9d06014c0912b557deab5c6ec48e2eba142c989bef04a82b88df8f6929af682321a520ec6bb5d6690e0f6f0f96c65eeaf4085ee52d695064bd03c60dd6cf844e76f67d16c649c9a07f849a382ec29728cb0b8ef25ed940918f7d2b9f150adc1db887103bf291bd55da723d14ad0d72b8c07ae37380a9f57a7eeb8674079785615942b8e5a0f05da5f23f197541e629d26693f60ddc1c9fe774cb9ea14a2203b3625acd125ed626147f2bfef55b80abcae896ef3f07a1811472169cbfcf43b7d3faabc3fef67e83b782ecc674824d0d0bf54c1fd306b9bb95110a062f01f53f3ef146b1669600fe74bec4f890496fcb8fad305daa8c7bc60acaf33f8a1d555ddeedd16b76dba25da6c00172f75d9d8eb3bb71c859e8019b0c00c84e8268a26ae54d0296f8a8d397e5a4a5bcd6f9074613363edea96826fba062b75549086ad018b3e504eb2c95c9033b5b9d27f5d8aa2690d4f59a7e8649dfb33fc06712010d827f3381ba3fe1f442fc772fc535b4e4ca61b3a49a6e1ff18976086b48a8cebeecd1779500a39ba11d3d2afb9a8914b397cf6fadb37d91530f3ca99e4028ca3615bb7e1f58dd4c2fb983d0a8a171a91277b395eb3693d51e9e8a40e4040a6060071e982bd4d86ad9cce332f672266fccde40a7e2f0cd2ae7eb04e4b1d564a9ee47a09d6cbb8c610c80a4ccf309b01c5fc4e50ead5820de0b647e0931ea124fb623dbef1d8a47c01737bb1385c2af2284a02f6d29a29e0df3368ab247456ed9541500a86ee85276353b4e9e7e64d919f20ff8ef5fda0b389391040b9c9815916b5d76d0e6bcb7d4b3bef3fef3c0daccd299f1e023be3141d98aff81865e0f9bfdf419865799a2f201c0ab72bdc8c598c2814e7fd8a8751126e129148fd0fa1794ebe3d988b434b87788702974cc4fc3789d63527fcb2242fb979faf4d8559e4f834f2a750e799eadcdd9b137e086e4c4eebf93b5bf314a1503bdc35eae6b8c85d8d39100d466c77bd4555dcbd778489b21bfa0222da4b4d57c7abf41fa069ff0c757469671a22b9a2d8c6623258721f333de9af584f0632403112ff76d51deb2dbda1af60f45f9aabe673082a0a3daa78655d67eefc5bd59d303b49e111cf7f9ddfcef0c3538c7c94990b69068e9e6a3b8f9a3f4e58f87fb6a5380263aa6ff96f6390122cd042bd0c37beede5f46e20d78c9f28a17e1a06bea73e174e64ef10cf0c6ced966b72debd92396fce63262cc5034e2b458f8a05c8cb0004e0fd64e7f05174695a09b9b2a50c8df7f641fde78541091b49d53346bfcc3828ea3143cc9e9d8844c0fccf0f7e3549580a79cfc7a9ba9e98ffbe9af5881daf84f99ca27155bc78667c4a979b746d93551b9025dbf6935d0f30e7583ff4f39303a590ffc53971483991cd31c9846d6b60aa2d766d1d60caa40b3022c3b7fd107c35457e3357e90f4acb8ef797aa5c4363d7c113d53c2c2850924c4924b9c2d470dd93839412c9743b43614240e5a91c6a2cd12adb67c951d96d0cfe8a728f2b87cb2739a1a2d877f85557cc1cd1e5138e4230e6b8128c9c318d5d82ab4880ff2861d8260d9d3ce55c87bec06c971df201a0a14414cb67057eb5982197e2267646ce97885eb35e60de4a00b54141cc7f6d26ac7cf678e5c210d2b645a8f8a1a6050033545795b176712bff838beae9e1ce16779435cdf6051cc1f7e7d677d68dfb0ad519f2418d35a9cf3965ce6096cc7aa69777454d63df59452853aa4dae1074ddef8602d4606c570e83ab2347aa9ab550d7c01f0e799a68886975eae3984310f8d19c351699575a2efa889aa98a333f0abda7de188e8d7eec43c85c6b672ac7dfdfa27979b12754a206e57bf99f14ed2ee21c617a6501b4deadf6bd3a45175cccfe22e2837f5c740ee3b7ab65d7c673cc949b03a03c610fdc338a97cca61a9b8ff29b4713af9ac2655c487dae352a2d1584643cc14a09095e4ea3c1b3a29c6783d0660c3813537fdd872894214ad852a23c12236dd5887f35235bdfdde0333eed9fc549b407cf798e51a30a7b244c25a62615aa233242eb28b9a9b9d07150856cd783e49e64ab60341c8b95d24ec2cbfe233f466009e2c8b14bd505bef674f4d7c5bbccb9c60bdef85f3da4f0d626ed813524e85ad76fe16352b0d337e7664b4b749e56dc6e3cdec45618b0ae024b85257f69bdd7157f4783ba3522a03f072cc070709752085d14757e7d88fb84413673993b584a35dfe6d0d82495836f2c77460bc4c264599d83d3d535ef4a6fcb3bc96e30695076531e10a5a85588d73e42bbf27eeb9eb419b1234241667bd839baae49d5a31eb011485cf3d7dea9588fd44179f4eac6586d9384a77059b04002ca03378069c7961775d3849bdb9f40b7d44ec7b018adadd529391b35a9012f24e615f4b81204facbdc162eeab29acb6a3c2d3ec9854457e37186490d0dcb0dd440a620e9f532502898db49c47558fad8ea7ce475d95c3696822f94d76f5a70a1d2e7d00b15e0155a7c4e9a43f135a73a097cf0538ef5ac670b1fb59cfdaf3361b831644a81088525761cd22f4803a7dc7123ba12b6ae27e704c1559f805c9bbdfc6525b803cd973188894ca4d38404bab59f8ccdb911267e33555a9e26433a1cc5b7de85f5a550da379dd216298f036a0a33ec14a3c222e88956eaf0afdb39a96157b957ddc4ebdae44036c77336e369897482351ac13566378e336ecba6151faf869c617b4acce54d81032b58748206ac4fc9e4f2608560d052117617a3b6ea332d8e1f181fd38a49ba3a2b0cc1d0d19712b4a8ccc73db50ff8e0282c4252acbe415ce18ab866ca664512866616b3c559bcb4e5dd619669a64376b2064ff03ac752940788ac3d85fe061324c7dcd9f7b90c174acbc2c3fa0f9ed13658584843363905f9a1b3b32e12fe6e850b03f9200a038ff17fb47ca91013720a7dccd0245f80b11a4c0e441050f91ef5bc5df402d08fa4573a079be69fdc5fe40de1fa3b5d5dcc01e83f0600f44789445c62d07bd85672b3daf232e7c6e3547121f7d4b010975c960475a13bd13569687c68aa08f5aff9a5956d0a2ca9e83ad45ccc0a37e55079db0f0063ff39189b61621c8ef0fb6eb897a8c6bf9a0cce8c0de56621cc43e96ca75968deceb0cc9c77d1bbf4c9098fd9a38da1f07838c60bfe62c002e135827c8219ea000d6d5a95776c915341407d48811f9c6521017b6fc36160b657829f4d134d784aebec81a2fe3b140303c8a771f57696392c706804f6ee41149abd6dae3c15c076f9d249acbf81864627bc70c668a2405bc71a53597d9e2f50f74e09af1783e6ac184b729e83680cd16254aaa087583fed5ea077d463b5c9b2099a21af7bbf95e89ac7d4bbb2069f65fc1ee0f57e85671b8c0a57dc204823b3ecb5de5a4cd55b21f8809acd9791dd8a3985531a40738efcccf2073a14dcf498bca2a8b61a072b485acb12f702eda6204691ef5d8a1a24e04e986b65087592632badefaf3d17db8970c15746f5fd94d3d04fa4c2a26288d66a304e9602faa71f80276ccb0e2db8aaa88f266c5203896ae0bcb44e60c8cd3251819048839f7deba17f70ab12688add3782e122c44161aad47dd4855110720c50a81611b037eb459b26f0f89d4c6d0fee7cf7d6350de29fc5e0e4419cce03c8c6d40304811caa97a33f415a9c600065ae5d5d58cae188b7211f8176419175660afae4cec6ed33925b73ab4cfed1b6c70c9144c51cc9e32e05d9b1f09cacd8865cc06b6f1d93b46e244a09e4ccbe9b4805eaaf06a756c0069eaa1542e6f3ff5081743c77c324504590ecb9f08e1a4aa13ac7b940b2066739ed4a76960900114f9212d2e0d7528e27300af6ca925a27acf564d3b0a41a514ae9df8ac091cca4b69dbf165c27cd2bbcf2c12641aa385620b0164ddca07b0514b0e583c31ba3899e35e1aba7e3a905b92a8464962150f150a937675e1d36374039c61946fcf6ba3a871c42fb48804390989c2f06db310d51f34537331fa5bd245e41192c4863c011c5b56dc427534a98919f763049c6007ce74eab86de33c156822c162cfe7e05d1aeea1bbf2661c3ff34df91e092b036373ad491dc90d21377dc8da83d69994277f407eb15cceb21c72e6cdb6d8f14c0fbd8338ee0e091afdc34c826172b94b7143161b446b377a6fe80293bae545589abc80ae942b7147aa63fb348fdb25e25c61b1b7c96d828126430df2937e0b216493b1e7d28f94ae6a244feca17d42630764d1c231e1696b0b0bef0baaab7c1ab9473cdba1ebdd1002a3a316c5485d6d43adb75a0b888f7bca9a0c052dffa011bf9428dde1c5cfc8160f16b59d4b6c5e68eb44bfc43cdb2d3c11b73ec632c200801e581a184dc006d5570a08f06694e8c46846d3f769bcfdf56cefc4219e7edc8c2e70d253fc21ebbb8075a3addd91153062aded1154248fc6857a318a2e0804129d02155ff42f894f059dfcccfd3b09d3201c1973386cad2ecbfaebaf7b4f278876b7c4f86f8e70fa71d2f72f59d815142fbc9eae5f62084dd38ef43130f65261fc017bd76f7f78c8e478ce27beb7a2e0657db362b202dd50a21d96d0522eeb4c1366e945017165acbc8afd7016cc2cff39163e0d0a2c0486542e5cb297309eae082e98f68d3b8223479a3e5b7de07c83d9bc0e04be76851a6c84bfd483695a9042bdb7aab4997809cc5f0d9a594d0a7ea230e8f44a786a9324fbc5722bb9a543d4ac5686ca28a1748fbd52f77f814025b7c66e673166ab0db1564cef4ee0b4010ec373a22c2ef61268c696abd84571e48861621d5fbaf45d930c1600dc83bb8f12f131a0bc05bede3a0706396683510f7e9447cd2c30b827984968a67a26c69858e8aa56e75e16f17ce9352cd4a22de4b79476c56aff4051c9fe37e08d49858dc6a7361f2cb29b271caa9a53279996c65f9343ac2aaa78dd80865aedf8e3186621586a96b209a607a71bd96a2736afdb0f8d9758442965582ef757a7840b0cdbd9fd4645a2bded516f0ba64c5b1c93372c939f4340176e7f87310d72d5d6551b5e85b7b6764891e2dba12acccb0596336e20a7b6a558f98ad1a621830d061bddde89fd4793b75987ddf6a30c72fd397c130c45b2b0b275c4e77887cde71b37e3c4e9febfa2ba1f1c3979802ac477528665a3307e85f47877f33af045c8f769bc7e20eabd7caf9febb73cfa43d26683ab9c3fc1fd19a00fb79038b1ce700918a9bcaa7455abec92d3f7141f1003a8975636ec610d3acab68d9f3011474a2707fa6909c3f0c8ac916b74a2719c0ce5e2cd946002975f6c1122d60592b24fb7a9924e188f8b7b48599708564978a4c38306ecd2d329381d65463b5b77523f0c8c05fbb216e52cb53ace57b2a3ead1ba4fccc43a7c31b80f3a6cac5c36224ac60527907d1f785819d2126891aac882623a252ace8d68338c2e856bd6f812639ba137a3e41a5bbf720c050c67e9a3237b3c15d7172067fd6536fbc07682e75c070fefd5a8df2d5e235c777642d2d4c37560a0c1f43c991aa43a7b457e28bd201d034d8a8a05d3365d8095fd075a8c9242d203734b4b3f602e3c8db9e8f0bf827438610143a39050c79502a244fe8ac50b63a775d9ef05580fa16ca0c92e9b620a3147210abd7cd81d980c3d6781cc284e1aa2dc70590cd8f19436148037addea9611ed0f24788fa87387577f629702ae520079215436dc862f980869fefc1ade338f2bd62c014985a43c3be17d2c4355eca92d12bb541eafa9828ff0c3a09450cd963ae2a4c899745888fb597d5e5bf1cc48ac34dea89339ae18f481b59a6ba78118e077954c4fc981db9a993138bcdfbb70ea825d54aca83827b36db493019c91a6ae8d626ff2d19ce24018633907e4e4dabc3c25b9a94601e07c578c8f47ccd28cfd5f3b6b59bad9ccda6563ac07a58e5b3006a8808c69088320da702c7e605d6c2acf55b9a25ef359678fe247bf080965da7163356c7af87536a3757f3aaf2670e94a06953813a94afd88f498b538b181af87c820f3e9e5d08165a1a8813f8c4de4800d981a47e00554860ce5a7c1fb333fb02199389aa45d2639b71ad81eea2f1ca456467b964d69df5c9cb9e49d5f6b5124084449989c8b396df77569f2461c26ab711be14a6b6ee837db76bc99170bc8b629f23fdacb2be0cac9754fe933a5f4d0da8b6809fe7f177b045530e75110511e03ca97ef944458f19147a885a60cf2d13dfc37d15d8f43f0e77be858bb0b16fdd0429a2c4dd0681ec44292bc5a46a674eccf83de61cea0ed34bdd17b29858d4665f14b1d50854ac4d8b1406365b374f2a884624f7ac6e60d85da7d48599aca925ac0510077e5ba84f2e1e721b1010c001c0a5fd2656c6c3be982963ce9db1eff8b842059f503c28a6d51ede6319d8171ca4add13f6e755473e5df78901cc876841dcac9aafd77792f9cd67db4dad94a1a2bafe79036c26c984d9ab05238f8c301ba88c4479bf31ad17ba993ce69916c29898e61d67e9d732037b4677b064253bb3e643dc24743b1d69858275b2c6a3afbdcb9f91cd3a174368acdb0bafe3ff848e4ed91a194e168b3c10a0aeafbbb5d80e0efe811aeda747ad9dfca0d9c54adf8c3a0899c6441fc688bda13ced3836a86a0c624db9563c6d744c5da953ddc015326b1fdf605dd704fd19e51e9e66ed85d41f10e495bd492cb981b8c7830a7ba595c955fe16278f4c66da1fa7ab418004e7a9df519139a4be01e1a4ccb12cdc33b4aeca6c29bd34be1013dd562f41578d4d94e44dd48ef3975dc3b42110e1b54c69f16fbee8e0513ee2ed5b279bf4c06c7adcf0876c8d4dedb37e9bf041297defbb02f44b403d637637911cfc289c53806911939ebd3c731578f4130a9a170a71c4051f33544c1c87f293f33d330a9e73d76d47b2309deb537055689bebe251e0a22afdbde331be865760768e38e3c44acb7a5dfe0cf55b9f5cfdb9bebb84417dbfedfe1dc594e247f5dd266525b1c0fa987bd04c40c2e9c51b9a844509d34b7343ff894722fac21d5f4ba4f0927eebfd63c3e9e7c8a370bef2e518682d6357aeb344316dd59f3828c8b93b36515f6e714b401e65fa24b5ad78a0194117fe6bcbfa0f04da6ae67df7896fae491f16b145f12b5226602c317ad8f4d9c8fda89b7a6f4469215d403aa54a45fe6832fe16294f6052f08c63322253886d6bac83ccc8275d218ddd3319b04fe44af2113cafe335dcc6cae6d29ce46d9ee1dbe35cacacba19d9f27ac45798aeda2667c7da21ee09e2b6a5a3d0036fd8e8cc3376f678a51dc2460e2ca973af4660c56b613a12a925f5065be91da2c509f32f4862f4017b7e181b95b9ce44ecf80b234d0ef23ffdb032f49b405e4d8409edd1a26da153d4236cb6dac370406b57c735a3ff8fed8f06b94ed4e7dbc156f6a8ae58b1f9b40dca80b68993174915821626aa90cc669cdec0db0c46e178549316f6253c2bf5516fa92170f9354818b9099d00227fd5cbf0f29fa221f10907b4b2f973beff9cbc2930fc899479f09bb54b4e12ac11e3f15ca5a103e385c42ce5259f28b94b45fff17f8d7f5bb5ebd1ae4bd0d2657d33912c29994b1b01ada737b8a9e79ec0e29f368a226257a60db8b536ed9ef21a78e17b1edf7ecc6aa3eafcf90fc04dab682320552ba61fea3d4e77e0a9827356f97902105b866f76905018f0403ea610ec113626a851198298f8e0c0f21df11c21c002e6314a79a2ffe96c25e6aec7ced20644b44106edb761e95fc96c855eabe06c110153a765dfc9c377314735bfbc79b99fc82c60cf9e2181c5bd70c289bf8f9602371fe929c78590883848f014b82f7c0086e3cf8155e395d56046b7cba18b625f4dbf81b749cca496e813d0609239645e08ef5540240c5f576ccca8d2be37f115622df37d1f446cd089d991f1e90257b4edfc5230e0cfba246374a4dc8b479e00e633fbd6791255fa38f924b5c4784dd8466b0b69734a623e13a354131d65ff7e6b48e4bed7a4ef899e318bc7c6ad163c331deee476ad508afa1484a21af8741e1d024de9454b1cbb95ce9dbc120bafd652957fbaa1bcda8554c7e53eef1d86c417ec6e8815733ac18584848152a562f805c765911be62af2872ee36017e1ca1e6f0702aea150e93ede3a2d7bb544aca86b44a20fe31f301046a4c109ba8e116663691fc7d043b988669bd28e8fcad3712a694c0f4d82572418d6744d73552e06eb485e70e011e155e6cce0f3f6785f98d264c149ed1abf5a86e3828663709f6477d470577c63d8d2735b5184ab7631f81f31772c0abd2a03359fd9d49fc48bcc17ec93029614ca1ec30d32c2b1c7b1e0c33f5c57703a1d23136d93e69b9915973e6b62cc947bf630f946f8e5b0df707e88ab073ddc0f7d52d6d87ab06336e8f44d089e531d49be2e018318e704c7aa923c606d2bec8658229390193dee7fe3ad042a81628920e72b652ac1a4d5c371ff12dd5ff7735eee219580d5f570f98b9c73063699e67e3ef83f4e1522d0601e2a6cabc73f2b0553de2f11a09f9d5682db5540eccb4ffd62784bd9d30734f9c0a4f489fa483f2bef13a447528d0805b7414a12a52a01b606b7755f8e49cb05f48da56173e435a12fac3afae16bc1f8fa3271f80d928877c9fe098f7de0aaaa742bdebc03d13c1a72f678e2380e6800282b713a82926bfb0c9d024d56e937897e5234523e2ff672dab6dc45fc5df78e99f05a927bb3d96814f520d2901d089dbb48bd0a5d84a1d9783b16130d1f3fa821f7d7212e8b37b21e99d4f91f9dc17483393f1178351bf40e6c013a1efcbf12b41f8b99335114a3c995750f4c659bf994ac2fcc28be7990b8bce2c6f7eead9ed43b701e8cee284a0112f076a082ae5bd1383a8dab7e80480410f66414da39ff127894b02b91bed655e01925f7699dd65861b1dcf9c50d9ff895e4ce02a4fe5b9c302d25772efd528080af94f64a707862b8c2aceb98012137f0405056b1df37c13c65d468c075d897ec667be860f9ba50bb48bca6228c9e41313982c344f3aa7e25c6d247cd0cf9a3dfd5ba6624f956f7e727438336734918b1cbf877341a597733b1722493365d359c151ea926bc51bb875c356f8f70e861e4c2246bb00562a5c83ed063ffeb6338917b814065f68b8196407f77c244ca61177dd04d66de99a9f27d946c66ac7415190ace2032d30f90d29c3c0bc9bfef13c479b69a65ab531cc26e4e4f392c9b4e1f4c7527ea55801f831f5d6065875516575af295415fc2124669d12dc4a0d505df6666322ee1f068208b4145a5897bc04131242ab22ec44c1af643f646d3a7a03a352b388f506f8c664bca5f9391e5d9faa92da6cd51b3acfa8e7c8ae0003994f5e4b7ae698bb17ab1f24b815448d4ebac4a5abb41cb0d5c0f50f59118a6c4adbad7bc68d808bc9b77998f74752b89ae34a5e9657a007de7e69d1f1541ed790ba1aba620a04e50fe9a56b98da161dc9d4b9dd528da4ba9942dcc330c9c0e1d989369af53a5bc8a6f553a6a19a62ffebb0e6b40550eb69a33714f87166d71ab50d5e0d7aa7f6e18d7fe244cf518f5ea66a657333406165889b5eb210a3d19767d793bdce2b38582f0879ff49de025d59f9b539370580a00df641e963b9b590d7fcb5d31377f8be77b834b0d527e164b15fd9d08a9e9d94cebfdcf1d7dbf331d209e72921d02ebdd8a7834cf7a6f401cc06d84feeecf246a768c32797943edd0873e0f9f88c5664b77e2e121cb77ca84d3d0cc6c4287bbffd5cb9e01362006650a15fd9a70112b1815d74b9a423fc64a1584a5d951a944641701f8efb95459006f5517f1103188898e6d82636b6e93762c1b1049c7d72e77c08f97c714233ff35218954ae8921c8a17aeb3ce5d62535cb01131a4ebffcff5b24c3a329ee499eb65a4da21692c39aa94edabdeb18b359126485a270c18b7178a824330338d39ffb5174b63ccc8600ecea92d8dd38da44e8e606cbdcfa7cda13c13d50d4815c98f712c8ef2b29dd3c9b43a4dc3fda7dc9ffa025b9174c5f1c3c28a7c4714d3b4c3de4f98fca8e970b0313b40895f3c5a42d09bd064dac2e779b99039b4e161803fb13c932e3abb26f82fc5a3f5d4eda426193aed323572af6ca7531c09b7bcbc566c55ddce82059b3271fab7497da1cc921af59850737ecdfc5152100ce89de55a0f9e8aee8069ff076ac4a61cdddcdb4479a90e4bdf15b3cdd71b9166016c7e74acb43d451954faadce5bf1469b886118cf93df00958f1208dc5e5f255c82da220720960e81980d8ffb181427f4db206c428807aa18e4d45a0e0288c48f9c2f6befce2216147ecce82a035ed90b2f0e4998e60d6af6e635894ad97854fcf843af4b622df732b58f861c04bae4fa630eb549febbaebf804a091165cd8b16920958692939f6785546e8bc20c3ca8cb4a117da173f1da11388df6ab9dd6b82588166374ca2b1f8b1763bac15fcf93def6405526e31457b4eef39824c2d72f7d3d4ea141446c9d0e371567e378ae4ea52934343eb33dcae2743dbc3cc139bcf85ddbcc7f3d5067c753a69331f2cde12e641347d97065fbfca02ab1c44e403e52932c1270eb481e9303c46e9bbc96d0e07c63b2b8392bf98293312e619366c07f9eec6dede10414f51e6ac430e8ad2f560fac10d2e7184f5a124bcff92e2d8ce568e62b83604bea97ad870174b7a9386e939da8ccddc79c7fa1e420e6a860b2dfa892ba4e62f9eeb9a511e872262200c295009f679326dfac552449ddd96d95e2d97c825f9c46044c52c09046b99c8d4617b3dc05fc303dae8ea86faa66f3621b686e8f7ed8d028a8a0913d94f712ad17de63be7222d3a668bfa13c1d91d60fb28c216b0e91028591ec8c3834f3bfb808c4f142c9e1938d376542e6a98eac631118468919a83638c82cd0d5ec94e4d986e81a31fe19d66522ab48da18b0f048b199cd630d205335c5617f5ac7986f4fad09e04ec65b136b84b99b4d862f90b4979af9c0c32ae6a95e6cfc6a9130ad0d170eca6881a096f4288aed8ff90c155c69543a9a57e44b0327d3f233c39ca6206e5d108fa5c71ec3090f82de441d0f055f8c5b45ba9f22518273ea8cf93c9d00935ac9fd9cb9a062a12106539a248b6e2dbe1749926bb11d7537b00b653c535de19856c76fb707ad6e133885357714b2cb467eedd45cef186d6519ee4ac7215d21320dd14de19249d6e277dfccdd9c5cbcc635963528b4261caf05065d0410d352a8088666c91394fd1b32185c5902d6d1d4fb4e6ab94051ccc72b2f3371d8c23462bae11dc089fa51dac66946fa607808262529944f4cb6037d4b0b5c161bd047614448f8524296eefaaf1397324faaa86c1a5801acf46d642d82f0acf44b57607895fd49835f38afe27e0a7ce3de1e7a8b85b4e7e394967a3fa62a84e86dee85a102e1bd545c69175d37f37ed8de0d8f206e42de43c69ce81e97d14052c1a5dcc10e00a437b2505b1a1c108d040ee6f5ab0005d46a58b0eb921c9ba656c71463488a324ce65b57df9d9fcae0aec5652e185a92991448dc417ebe1fd8267758953fc445b4e79a09da3f68bdc62c293f7a9df5969e4547056a046612ef673494c7b6cb1f81f3924b77ad482c482d6be3744e2de77357c0e2646a26d83ebd03f054214be654623ac4fd3ae20ae11760a7ed21fd9c565058f424b7dd6edb22da8660043d8f26285710060eeb1f83c9c53a46fdede8b06f60ca8ced3fc7a928ee89a41a3b1b5db90541a5f04c5e8dea750bc7fea07307906ffa94a245ed2af21ef5a2f1d458f73f74c05bfef57f786a03ae4d1842c3d9df746e93387317a3b2ac73dd9c4e251863ad79aa0d2e8443e1085b454bad6a7320129ee67740c6395719b52f5a6de9052b8e49fa7b9e0c968fc3bf734a9bc6368fbb3ebe0c65dc366b9d5e45a50233bc2a69d9c6750074ef3de56e3cbe234b248b6cf925ecce4f468df6e6516afcc0dba3b91234712c8eaf7a3e5ef111ceca350e8ab75c4bc5debc2c35c457319fe03948e8fe58b7cb6845a326f4e93e7191b92d164bbc524b0e96a29157d47bfd4a0406d50d0185bbcd1037949963fae33dee759e8971fd03aa23bcdf2c7b21cb9881ae523f80046566ebbcb968481c5ec022733a9900546bd115b1fa16624a8f240a14d59268de92141273a6cb99997b3165b5ee03dccd55fe9f13e7fc689390e34261f11806b48cfac0fefde9545807b894a8c9b6b8c38cfdf21a6c71744429d62b62c7ec56be0e89469fc4ee55e45e0342105670ec310e169e2d182bc3ad1bfcb99cecf069cdb7a9bc5430d5112bee4962cde3ae7cd793279dd5bc14db0344c3262e1bf7e427725af7bc3918bf579e7c823bbfd7b57464c4128e8050662c5c1bb9b11e89f9fd3859a90d0e12172ef8567e91e8b7b6eb1dc808aa0ffd7bbbe9fcdc792faef74d280900142f21b79c65de247861ad48daa947c526f25718169f9e9729c2869b77c7153617b87843f104b552c00ef61bbdbe6c50cc1aa406e61a78a3751faca2c9c8fb55023b62594c32ceebb29428b02150a50db9ee307d678cd9d5e91c26525386f7e5867fcd2039574f2949003ee294f521fabc30ab055203b87beef948e751d2d4b0ca16ee4d9cb34b00356816068c105763f0269574e64c646543770392e03f420473b76e90ab367674bb1b4c679df14af6b032bcf8d48302d4b1c9e89e2198c8a29d0733dd53d5440f492d321703f85f09f529ea93377b71d798533580554f2ed45be4aa012d0025da764c38dfdc2f961af7133d545a08b6343e1456cf8d3e38c50665fec9f8be12f044f6c61825d59400416e030ab8312923f991b5239d4abe980b111874520bd257e8bf99a2c4acaf3876dd0e5d458e09d5977d54a347cd713b03733d8f89a6262dbe760518421309b2c9081fe04b5c9422a0f85f228610b880ad92f2b49466b674d772467536dcdc245474161448cb8cd7495306e04d78adf8d6a2e37e710bd5490c02339ad35025b4ecd6ac952a3ea7dd61ee0e3c10966864702fde7eb5c736dfe9cecd1da36fad01d239bafeb09906a0b0844bf94c20c89ab75952e21991ffbbd1e62e325700b3a87d0bc8d95e54fc6fc9c5103729ba5b1889d320255423f9b1e79262161109b83e8683ef96afe8a125979bdd868c0819b3c14df2ce0183f536adc60dd8183877abfe3cf7dbf34446550577a5fe029af31e7bfe96cc0dc10892a29dbdda140b9fa869ef1d02353ae0279c7f4a90f71384ab0810c5d7a85dfcc2d01302ccebf0330f363d05f01ba119f5ee182a7a902d1899df3c9b5fd1cfbc96c9a6ac20478bcfe9df3c2c02783af520a77f22aa4ee09de5247899bf32b5628ac2927ea5621d4ba093e7921b2e089389a5772aa24a4abc4593bb773ea339d650ea85d551bff58db7264672b7589c58880107782f41198de04bdf27866e1e5dbc36ffc4471fecffb0de8c0f348168193aa5e7c4d38625e39ae78c2a20741bc0be1f9a38e635501c871d9986640a0b93559fe4b0e10174143f7015c25c9af8bdb8d94884882a7ee49dc1840d2aecd910ace23f3c32bf6c197773ae2ae416dfe60bce19040a96099b902976a1d3380b35de6f678974b6f707fe61f17e5895b82272858f2274e119acf42f033d4fb8607df7749647ef618b78816ee64bc392f08ab20f0029a698e3f128cd79180d4210d34e89775e62682f0078a8491ead7a7bac7326bdf7d114e352f6d26952977e61088c2d97fdc84bf0240b55472e260266984c940e395120086bd19e6c8e16a16166f6a97965f57868da539164b4ac61282b71999c0a38517e409d970f0044bf902984b13824307263f10d9408dc409cb196de3336c853f266edf7faaaa2d6ece61c621d87a827156aa1c4159ff09202778d4910f20a58d303d3e5e5cb1b13fdda3ed547e1c4d68fbb32e0e58a2a4420b4e4c46d54437a9312bd38c724fa8d571181e9ca94367e62086bf83f7ba71a9bb4fb9aa3410017ac63d97aec6fa0d41fc9d57bc79f9802d443f1532839f7f721ab41efd59a357a8091f3540d5ab4d18b237c6c12d223729d249457a23cce720ab4b3791d49c48fc2573eed724918ef541209b57262e6247fd07f3e369cffbb50e3564fb80f9139dd057e2e5c03ac268b9e934a02ceabc5d725bf14c082c9b5504544dba1680d9aa93ed5f5a9f6222d4d03dcf7225deca2111fdb7fca40107530194eb3192826c23fae27f407292e858e078de14c4c1da9ed80b528d280d3d5d68ee9b9977670bfc68a28a2e585cdf8aad91622679838853df5ce9484a6f38b53330534d5274e2541e9ef0283ba1d41cc25b305b6221ab201239608535fad96c36b357e2dc540c1c5e75bc069a0d9d108c9996b2d6c87a8db4a29418dc287803ee25f508f41665c3fedaa5dda94281c9632d982af1c045cd907235c20763b20ff5c8e16cc294b7c411214530327448eded6298ce6ea72edde2595e78e1cd3949f5f48ae93212073852e51c35107ca4a9932c0ce30df2778e6332e8d0ccb6290767d5496a9c7d39a8f65426b9a67388bda43cf213c19619869d28e6214f7881d7e7fcf64ab01a3a702eb7273b374c02a72edac89656e7d0ebd2d83854a66dff74c3867a2a29cbc9a185b821480a9a73f946eebfaf79126185eaf63b49415c8ca12ef77a66883916abdf73afe18fcfeaee46e1386583f39b9838906143caf539175880add14063530bd3c760fd19e0c5bbaedbc14581ff0eae804318af4e6de34dffa02a9e010f84c0b3fd45819132e565044bf7c5c1332083a21099bb7fbde88a00744a9537d4089bdd1c41c35cb78bd0b638e71d0c80ee795429c8180ede9f8241d478ee28c73a5ced6bab5d40ab7f22f5c9224268cc14dd19e40ba3c5d537fed232eeaafbbd57dcec2ff9fec81bdca82a538a83feb423a1fb1bd5d77a6d9face56c4003fb81f0039d7814c779770b2cd6c5262e3ca7d8307b458f857406478101c597a1a17129e7e93877951a707ecdb8234828bd0d52317a73b1390e6f1b6ec026d2c106ed430928836f64deeadaf7b6c48b5ff589ffd3ce9f41412b7f82fd1a1058138ce609a7bee5ee2fac538b7a94a638de51d8849f54a778d5b3e8edd7a14c94fcde983d9af7ec33b5de9f496d9300bc646779965574997953f51c18c3ca6c28a0b8f2d0cada54441388b6b0ea177a5eb3b178ed6d16d870ce16c34d539e4ea9377a2e70df576ae1852ab9fe26e7cfd857ffe9fc97d4d52e43b6aaf5f6586dbcea94813e727970ad66ddcf7b3e5a286db8d60d366fd6024ef2b9e592d9963f8f5dc80f4c7d717ed4f883cae6ce8d72affd0b05508035d6f0b9fc3b6e14c552ea6b7b9056aebdee8700ddaddaeb7105aab735b59b7e2e41c4e2d4cc47e38ee50fb3627bc5f80c65dc796ca8444e8a9a78851e35a57f8eec217f5afbd4643804f7c1165c778837592126aad60dd9826f653499b06800819ca4ebe4a537b387cf19f7ffb6d90f542b6bf56d31df14fe9acfc26ec5d463fbeb7de2714b84516a8e881c33113a349fefa37be266d467efcef6ee2c75901bad483f213dcc68797616f1f25b4153337193b496f96d190da753c135242c220be3457ddf9482b0fc5521660bd1d3ba2d3e3df56745e370e2feb335cd269185d1c92b4b13cdc34310a125562c6e7da3b1e8558cd6ef15d63d7b3945e4dae54c0b9486d13a9ee4e1f7f9761899864812c7ce469af151b4caed64672cd2685f139886550b9e2b711a0fafe7840945cf21a584e6baaaf0e08ff2181b66ca2b30c7059055b3ce38137e81ea50602d685f284cf30277a875aafb8addfd62011491df0c1b6de6180a5bbb9f778c83c151a8f7814ef9c138ff87827312bf0f43d34becae96bda74235b8343bd2f0417b2bfb317ab48fda2535eb959d0da0cc842638feca73e5592466352e64b3a425905138214d8e6390279bc7e2a107430f746a9bc2f19e6fb7bc9a79e167ed8ebfcdcadcde4e16de9e44300b914662e2241d4d76c2fd8b6b4dbc7e28880ba969a9adf1bfd840052c6a6f6bedf172b6931e6a8309f147dcf41e9a4275294753a1ebc79187e58c202086c4e3ba26112c87792fc5f6a7fd95d0aa7b1ec274602c721fcce747ec9ff61edd39b9980c2e99e3d946bbe614cb8875d5106cbac560e2f70e933dd7ea3bf791dbacfe2919874211092629d81456753c837135975286dc72cb4c515586535e39a64db4bc7f91157ae284ff3163ce7bd1beca2e497cdb4c10ba16f879542db095ee894e84a9e1f4ec737c3583c8a3fef3d0f7ad28dc0f4be79ffd22c454ba737e51626cbb6591455f76fd2c97fe2b84d18b97231f5d9c29cd95e0e265171271c001d765b7a2c8660bc6134134e52f99757f64ae32fb4de5ff3d89227ae94c377fbf1e15663cef32b72c0b6769fb490f7f55787964439ea18f276e017b0ba4f8be6d7db509a046617eb704b4e9b0ad8b5b1c001dec9a3986b800b24805ea47fd41119bf9bf819bfd04c710ddc40de8d2f0c605fad03fd06af9edb247b5bd38e740ea50e45766f3b08ada2d9ad57d1597c448acfb5f4c29e2ea7d0c72dde085defce218c891a648ddefcef8eeeabf2e993d53ff8aa697c86f03a2b90eeb5118e80566d686d880ec1d7bb32365479f36e8b75f1e5ca6d7a0c8392e63b81a70d6f8a61bf7f02985322d4e53ff8f062a5237b80f88259d451f6a429b803a021ae6424b4b1ae9e21af50ccbdef45f45b0f876f9dd8025f6ce4b7fd23114c0b790185aeaf3bcae69a39a50eab567e894a47145fc3180c7ba48ef1f1c39b30228f1e7efe014b06829938d88490736afd8ec33dc0a4d869f017394dcb9b52040d06a15a51d148c8bbcd904246a3323d27dea9cebad12ad0ec1526a38f5e32d720e8f5244a054cada7ec05715d568314dba80f2341a7f3971c9c6c2c337c1705f30a8e390f0f5caf27405ccb6bbfc447e74351cb039509258cdba04f3e3f629541c5fd86d09bcced8fd2c3abd85e794541e5304432830e01f6e5159938f576740cd97527ac33ef56bf0ea81c5d6be650a3990bf9f5d0d1f71e6607cdc8b28d07b40d3c1208092bc65325c2e820a5e463517fecfc8082620070b5162202042f040e675bbd9bad66e1df2fa547b49cb61fa667dde899f2043ceb624d89f89ec0c446714d7046a05411c0395c324d5d918d95210220b4aac39391ea4ab72d370d1ec43edd24f152fef4e9ef27a0b28b0879984b6fc861e855e90288f90afc4a986ec5f97df5c1866b73e0c7d70ea4a71179615a8a17e50a23605622eec598e65ad0107873fec18d97b55945b389148b7ef34a83dfaf05692eb132eda74ad90e2c805555c254c4d845f7cacf2340f8cf94f90dd77a559268d67d9f8e59d636386068727becd1e1f9057052b9e3de75c84a6e32e361bd835581c29b77c9ee6a6e31de4f4a9e45b15cb390e20068c0a7df77a6bdbf39735d736a7bbf11a0019700d29c08bce8a864e7159396101cecdfed43db0b7afdb5fe4801470009ef4b04b416ec7f3e57709ca2912f1ba97e334030a693043d9183ad946dd5476cf8327ef75a250da798466baa702f87748440da9c0e0960085dcd3ed4f7f8da91af3f856ced2b18015681570e680d680e5e07a9fba81aaf6c405ff597ed38a4731109c95fab5162f370d5a013861a7a1865517772701a9e0023341f7a6ecfa9c860bf783fa923a52819a6a4afae1511d3517aaf8bf05581051060c361bedc760cab8438aad371f577de470ace106c459ed979b0710475414c646b41742929f730abb2a51b14015fbb1b3a787fabc802c293b34f25fa3fa34fd6015d6bfec55fc6f479f7046fc4efb0646fafdd0fd505456dcd6bda68d5cbea0b18dd09d649c18414b24383c9888e598020723b08a65de072068d28b20f26d41e723c0e87f4c2d6850a517eb1ff32d5779cb73c547feb3de2eb3f7ed9da0a1435c6113b61d832ad1e22a080fe05bae1a8bdfee200248fcd062679310989c5c5e0311c4b51727a6180cb265c3ad094c5cfb8e9f28c29f6c6d05553c322088ff4c6e5f11959c58ab8c5ea2e510799f25172b34e3503345151c39d1dbe7ad6895550db44b66fdf9dcdda84c1bf1fd9bd932d69cf3804e6ebde8ee165ade5b0228b13129786a73b2613b7de71800cc967541bf0fe27358986f439628950f246a51a15ba60eb37a7326960a1a8fc58ef580d08a7dea6263cf60a9f490289abe318ec1d3c4a540d8d974d101e31bae5091d4e47acead756cb05192eec337ae5f40a5c8c7ef2dcbf7792333da43ff0d6f022e33498f1ec43cffe69730db29fe199ac9ad9b39d3732c0aa6e5f66ff3181b85656b5f992596176d9a865f7a062db7fd6a3c6f923c9264fd3d3cefcf6df719be594878b35185d15e57f341f195d790c3f2634adde9fefe2022aa964fb7dfb592e2baed7058e41020b5efd55b1a7e3f2ce7b753b5483b5a7bb45124f602223b207dae92a819affbe6efbb88a5c8eb88b7a380087ad6b5e5dddc3d30c41c1d3965a61c2a17e25420dd33d2f2f46ec319d8cf2e78f32e0836ee8064e37c28ddf61f52c8155fe39d71dbab0ac3b145c22e641a88131f5b11233d3c3f4afdac4e28510fe6abd5f947b377e9a34a5656c02c3c5cdbec7ced77036cd7c95dee9ab329b5ce81880d4f8562a161a0b376cd6248c8a94480b11ad6f81a125f29e35d129effe1e9f8aa46e43d3d44c1008e173e2a967280bd825edd6f74b85a713ed773b62ef6d87351085e9497f2e02c9f3026182ee28e6ac162232aa13485e444fedc48ed4bf9877e1dd2b58703a2feecfa8c29dcf807c42034caa8128d629323fd11930e4ba8693b0a45492807ed6d6ce09413e43b138441e02d9bfff99986d5f6b8f6aabfaeb0b6148102bff297a00d2781de7a24a981239139a7b5f3f6e1cd7f11d60d2ef1a379423f178642fd61305dd2bc6c67b553b0f7aa4b9959530cf46ac7f557896e65aefd13c26e0a3bdf8b0bea4d06a1ba7885870d89f2ca63ed6d6f44e6d0bf3082a028e680b00c31c12e523bedfc41a27480c027bfe185bf7ffcb064d62b741903526a0d592cc4fe654cf202fdb9434facbbcef89327864ae6e732304492c9e346f5d5616491a5a69304641b978def19debaaa4024c3a50be0fae1d3b485184b5bd5b0913a848348bf2b4eeb6e7af7c2ecddbe1e0e4e478b707d609246d513bc3f92aa78da65a8e740fc94e09231133b2dbca41816a73ee416ebf30ea8bedc305c4c8c6865b714688ffe4a3cd14b372ca4d2d62cc93d4fd05b78055b0be54bac837b876b79daa28f8534140fa3803c18e47875a2e387e438d3c7e0dbf324f687509606eaa76b2adc2cc0c82039023e9b4e589b718693866a15515862e4bb0df805f6f9cd6295be0bac8d373adc669ffa8df528d778f0a36770b5e7761f7b33956d8a9f969c4333690133b37729c5399f0010178d67b2553a23583b76e61efb30f27aa708d607679996f9c5af2db382ed62bd72abcd0f8dda413a42e637e35b452a683d852bf707629cf3b787fb212a247de50425c5a9d9cf7b3d8a2df58b1fae5b4693aa186bdc26fba33aa67ec08dd9cce3ade613294561007186bed25d1c207c0d7ab9928248463ccf1d8985c73fefefe0ecec28cdf416939458d30badd37e02462c04ac5a0917cc47ce9f041c4e698b1782b36e1d4cb8a79664dac078b569b03981ebe356619e068b94e67c031431d19e58d941376114d1a6d02478f04df2515544e651a557c46890db07dc459ef9f3cc82b615990d043a542e61f1d54dd7fbc93ce8fd79aca64f2eb231832c8689b146d805fa9963e2dd1a2e4a2947a3344de64a3ca5b0906ab1001da1a3a57f6492a8bd8224089ca475bceb602c9725f6bc93a36ca615f073e2570e2443da3c869b499a9606281b8f3a63ade3dcf3e33810efb32057d6e6130cb3cf3f3b1a9e8fc8846a7e266ced5461035d10846a1312693741f73d8ea4ae1a7e87588b6f24f79ab87e463c1b482c98d38d63ee271d2989b6804a6674c8de3926aa9c84d5a51e04dcba0b8317d9ee0e4397542d915d6433a33dc17310c33261a4af10503eb5256e0398da6f7df5bc222bd0095db2bab2e3d89bc085a3a8e587c41362e9307f517f4ac9f893f08202cd213f4fa3bf92c4a904d8b24f8586aacb36c355f2c07b6900837893010ca7a62abbf4777fc372b1556077b5eef3fd2dc53cd05b04b1c245191aca0ec01ac33c4e7b8203e2a880bec81580b9d75f254d559ee38a8dff1cd54c6aaedd4e59a91a31dc391589d83ea1c0b1682441be2a0cfe5851ef2ecd56e91a724bc41af5dc94950fbd212f8b3d3ce829817f4abc51fd669c57cf02512652b9df39e80e06784fa6cc5c4b80e36cdb57f110cab4036c7f538776741915f8d3d6504acb4b3267b71ef1cf13cb3a0c9fb72ebd5c46f2c02e8cd4fcd0437567d16979385138eb4a36d627cc8599910e9dba2c0f225ba7fe73d01c57a59816aa1174a06ea8bd476ae6de48f26d6abacac544b6aa39bc6b964d997bac0bad1d326b23584dda591991afd0f703925ab259380db633aa07b1969e774fe04732d3d3f160676bfcbdf3bf167a5ec613c258c853cba58466fefefd65eddb563d867f8e8f0fa998632c3cad2853439056fe7c0525670be9f82bc37c14e18a7bbb0f65b8c0219cdc36c8e550076ee391e42d1c93ec77a63a2982ece5d3cbd28d733b22b3dd75cc08d98bdf14362ee82991d414fe75d67110f558d92f828724e89f8b6959f808745abd01daa702d2a2381a869dd35e5ee9824623976f6e98bf9d4afe51b17d5e406574d4dcbeb7e7deed13edfb53650c8bd94fc81305597d2852b03d161262c0c29199fcbeb8ee745712fca9d9da046aa2b4457cb741da61b1166a2d347d27709f776c96dff46216477eef9cb643298eac504ea29c9575cb11d9e7cdea017e0820d27438a2197eb9c9c8f0ef58d327c12cd9fb83b90c991c452c1ba2e794b8f7a3d2c6cce45a6b9af19bc30b645ea3fc6f152052be2d092fd4c1c1a55e9b5441093386867762fae3dd145e6b338611046d74931acf4ad1514b75c317369f384dc6fd4d63a6f371101bbc1db6f3c6c8ade220acb559d904fd727e3e67b108219aa8db0d50926e157a705fedf6b915190e39651205b0af1f728aec79d8f207ed8981895d23186bf8a68a9e19e30f42d65bdcbf56aeb8710a9e39aaee5e7ba1839a9d9019ca5f60ad0945cea1164989f7da0374aa535f870e41d4ea85dcda31d21f7fb4e815e6718e94ed53787ec06e58c3bdfde1bc47f376ef44e2ba36d7fa02345a3fe2cab06a2752bf4944c06c15ae1c3d5f6a497e06a73bfcd94dab724536d2ddb424fccd9f30f3f68d2e165c684292e0c347c4e8599f6ddf3666f0fa130adb509dbc7cf55ec2a5902e473a05e69fa5a3c17084563c09e3bf4498e9744a210e27a95d4dd50f131125f6d1ad8e8d3add7ac359ee8ae5de27d3f71fecad3522ceb73a7fa0d994bd10ffe050a26bbc84bdae0294acabb4127320fbd04123ae6010eb46736ca998f8e4862d6b69c7a8eb0c403c1f3e9caa35499c3f4275bebbdbd275a185123cdda3c1e0ca0ec8a412c53a48822c79fde0fff30dbe2fc6284a2e2ec9caa7ab819b25987f23d3a060c0bd192bb826edd03f98bd32ccc9a2bdd4751d116fd034188753575d83b1708dd486f84e60569510920e4b41a52ae7dfdd45d8b93e27f5e99f6a85421b2bf39469415caafec592dbb5b07e6f951c8363562357aa88e06733a6a06360d3c14b92af9f968c21c339b0a0708df5387d1f0843197ca2e928d3cfcd2cd9193cd3f2d0fea3b0d5a60605c2d0dfe06973b42de99e784817de1b51a1487b7976d3774aababdb06a6c7e861d9c4e0fe232cd85910a30da2e06a267f81621ad101e3ce66b31e39b32057369d203cd17513bb9cbdfd437d0db8ce5676d15e09a19da038f087bac35deead08ec22487fb4947ea3ad7c15c9ec1545689447db10f6958fee1fac7e75279dd1bff45220509d694736269f82c63969e303863e6e25ae335bd99651c195ae64cacfb59f0556a1a420a9fd7105829de1f6aa74b19f20391585f63d9ad96e6cffc1b83f95ec71eb01db6ba8e0f32a9fc9e0bd130bf40e033b5b98cf98b9d1ac8cbcd3937ca45b1362023fb9b16990ae66b7fe83bc1b8f0c5b58e06e21e41e0928eeeae745b36ddff2117a380db6d09f8f28c86a6a1c644523466258f131f40eb92a70cede10772edb46197186ad7d76620b1a03c48322fcab3e960a76641ffe42f6b8c7f930ec10b995fe5331f382f5608246c73db0f4e2f9835a3ef83c10e28df2dfac2b75b3c830074395f9e7c1f65bb434c1ccdd9f93d303aac15c1151215b532232bc9242305a1b95e519200e34e7f646712d143be0fea155a020579f3da8ad02e0bb02c309a2d02180928f57b38b5c0003a2227305b0a14f63d6959f9c98aa256bdd6f185d3f81705125629f2222fce34aa4250efffbe58f72062f11958d1fe088c74ab6d3d82912c27b40758801b4caf8e014c7c2db69d57a0300940d3323489a940013cda23d4bd8ecbf832157d34a3e5031bda6bf7c84629ded6f1b78a23d211de380707cb7e4950199b2dbef357522fd7e2635fe0775851534fd1f48db009d0f90eb30f256fb819199edb00a6c8177419eebb9552523514d2778e305cf8f5bbf3c11a6bd71609444d43a4c1a698c8f9b8b466e906e4400257ed515d2aff15d065fc81458e4e71225553fef73c82a00d1b0e2540073289711a52562fd1cb6e7a504d41675d6ad112db76fdf7aa70d123598862275e432b39642800175bebbfe5ab9431470ccd583d2df457514e19b5365625d410066687b1b52916a2f57e0e893bc4ee3c17244bf716cfb9dc5e24704433ae547caa0f66040c99546104bfd77b4f8208add7da230eabaa83f24cc1f21dd1194e2c9f3c6373fe2d1e4b87ea8bb09ac5fea54ae6dd39953d3a8a75870e005d8e5483e316fee72056d25afec7d02e9dcdfbb50032745a226dc84bd5ad3e1eb703ebc3bb615c2dbce17ddb2b6ba44e726cf4b30c1ef8f81f89b83ae3196cc6ff12288957164735e54f7f905e41090bdf73fca20683d36b9bbf69b6b36463c0c31db15b3b0d822de4b73d7017215aea8aa0ad921d6cee3dcd5fc7b58a101f0e7233a52650b1da77a6413fbd300465187184e02518bce977b29a18412b568e3a02938e8c213f9b04d3bc491cd397bbf7c9fd96b78731f9cfafc6d74e5d52902a05f5fb5eed3969c380cb055ec2fdf6c74e56e0360444968fc4ae2fa818025bf4c6f27092f879a70d8d4687804c1a47fa101edf1b08621fbd597ded585d7e1889c6a38ecd781e55d26534831b74c887fe8db8d66af05e192fd18f2eaab19554058fecbdbec5d6369201d4198be0ae968954c26a0fce8ca47be9042b6e8ae63eb5f1875e1554b2fd6a0a191b507a7adfc02acdcea384ff268a756ba73c71ebac8f7d48e5d2c33210587a9bab471a9f7108c17d900977bf7aa531e9afc1cfbd99bbcc76e9fd2885ad7f38511e37133bbb28b1253e69b57f3f40f7f96cb71fecb8dda2754bda46d3428e13266f30188a6da3d1ef15012bc32277e81e49846746f72229a3e7a7a07fcfd6a4068025aa87abc60be36ebee87026dd714794b9c791560429ef01797aa2be865495148357e5a32c8fe7a1391067e2caa76156a4b5e6c112c8bb373c362b24818ae01c53a8e4a034bfb0e1759c29fd44f53c757ee9271dd608a0879f8c75dfe2e8f5d8655b0020126520979b416ba3792bf179fa91349884ba7272a4d9654a3048fbb197d91ace144300f806c140d75a6f5679ee85c0139ce65e841c18dbef32f2b9837729c0a9ff415d9bdd3d3852cbaa22271f292013caae39c7b0cb7c3bbd316dd34eb9e40db4fe36c399a613c6d24eff0076105e1a981f820096e1552dfec36d66a7a35604d554f1e845d9ed46201d3650c78fd1c06f63f7232a60a265b84bab24b9579e54e69ca590fd9747fc518d34f5e1e6de01eeabdad4d20fa027744747e2235154f819b36950a207c9b4e3bdff77cb64dd5470d59eb193fb6379130279cc96ee959212a7afd9119bdddd6aefbaa3d239650172508d0c81014a8f8ba87e8077734a4ec5bd1de680e6453cf8fc6dea1411f42883fdfd81170fa61a67dcc7dd2a47878f80d517c62431e23c4d14f789fb44fa7e9ac027d756ae07f025e91fecbbf86277ab75dda978a1792a4db412c0ff8fbbdb7d26ec27936c6a89f9afd23b435224d0b3094f82525a614fde6647020ef2d6b6f2c5ae6a7af6c27f57fc05272c74368b0388461ff65e2bbd8b3e118408e23fafceae3c78c0eca1f6ca4f97db9903ad659ff8e63d19df44c2fb42a040e0480c38ed18007397a455e1d5115af5684475aa1f75442ae1c1e4b2167629f41e006fc598cb9cbe5b5e231c825cd89a99d8bd367c01ae902c6bc30729f8e4d995e33fc9a1eaf7eb87c81203dd25d16e86a132b04c370a07d9baa50e14680c2ce5140af4f6a5f7dc90bc09e1926580135027bc4bd56cfbc29a280a28a73cdfd4da84a1feddfd7b4d60f0f296620f2b92beeab720bfc227f3260a2429da8bf64abca72369ef1a826e0041200f0b6f7c9084b0b95cc64b987db6e21539189d8288bb13e2359bc69c14419254d1d0c2804a73725ecf5f08f4c3aa1598bffa0f3dc1580b8bb60b1033c85f5346cd81b278b2ed94c0420f4dd7c151fbc35a07770c7e1c5342b74a88d28d334f60e714e8c5bdff9fdfd68e3c6473bf094b75f9317710446ff15bd302074b976840d03722d86167949ee204575e272c3a0502da127ae6c3f2951be9ca35d6546316cfee7895472c0777eca234cb8fc83eb8160830b17e253425bbe92640bfe3575480196403f9dee79e3fb84eaf57194730164ef68a53ef5e757dae58903e7abe63bc5907f5ec6f9dda8a2b78fa557b09c5afcf01194e7394016b9d2eae3750d4370ceaf3b7a772dcfc87a052ed3f9c9b6ddf2d76a26dd4bf6e4d412f6cd62fc8911358b027f1eb8a4cc648f17714d8d4369843168351c22cb4fbf03b32162ad6270cd6208778e3247a85f89ed12894a83c0e28cd149e2da2ae572286bde54787b9ca1b23c6872457683637b5439ba0f0ec62c4c97b53ce71d184344b05b1ee8e0ec5ceae9da23f7c9e9f73b6459aac1d76bd009871f42041ff15cca2a68ff21cf3ae7e8e63dbd80205b353bfb28d36a7b9dca47f7d4744cc983dee4d3639653c4cf75e0ae43e25b4431c08c766afa41e3bc4592d3dac4a2ee63c030e4e97be4693beb74694784e0da4e93570b01a41b83c5a87efbfd046227fad6e42e05a3e10e63d875fcddd3c1635c1014f1766a137e5d55fcae0ce8f60dba52e1eb0e9f96994bf803520c8d2133b8d8034f3a3ca51d9daa06f761a315fc8d67a5452602b72813605061975006330682d1a0fb6a3b8cc17dc74228fdeaaa2c6e776862316baadafaacfe628717b86179eb38308d1d02109dddf38745218d6eb5e9bdfc71817ba5fe6afeb032966d4389fe102a199153cb655a8cfa29569ed0252274b11d8ba0e503624e0ca175182dbf2eb49a31d6e6cfdc6a922577998125299dc4aae8a0b19f2ffed84d885ed8baff97627656c2c12a1dde6a5239050b557807033637562990d56a29e86d786c43ddd98cf83c279c985559e391950290a14b848031b03b4286820881bb55fdf944adaf48d57f2d6e5a8dfc297c5c95a6129dd1185b5f090919c036c54d3ab073efd156d9e6c4ebe50dfafbee95ccede56bff8449c2c9b0cdaba666436f89d9cac89fb87f4d9d6bd9d6d4f7a94d166df11e2ef30e13bcfdffbb966ac10704b2a45d77d9106416a3e3122c0f6494d31370fbc9bc71931bd294278ed409acfa18c94dacdf40e8524305a9f85a03f5763b99ccbdaec6aa0ffb378a87ad90aacfb36150d9a3ff6af0e93491cbf2ff4855431991de7e39dbda9e74573acd4f0c07a4fe799df98cbb097973f8e20dd10e3337f039915dcdb9efbfdb001e94fb9ee7461bc2a18ab924ddddbc5466708d395399c2af3fa28a64f9318696619887275bf322e152bfe8014db3cebcccedc7b6f031bd8a4485cb2b7343dcc1bdca939e2bbf1d99aa383e0a2f28fc00542bb01fc377252dd83185b4ac2479c0810145087e29bbaafd50ea73c7a5e5c943aebe19786a4a829e5d11402fafb3a97c83dd499a602ef14e1a93b2b191bf02a11d9db511e6a525bf167d1004b0ee7aa154d728f8667295bdb109be8f03e4330c513c33a6822552ff09c5e4700c287bd2ef1e65679e4081cc45fd9f0a6b5cde5b079b160c0bf6203a59b1be9e5a2b51f007eec1e2ff586ea733f101698c9c7b10f4f7e5b011ce3e4c3a7e785ac7b821f15cb71ac853d7baa70e65a0952a37eec9d3f108c50aea887fc0bc9441b1a69b9f6abeb23e9c2bcb8101b5908cb90fb7d672e501f94dfef53d9ef89eda1e98b7fdaf0149f111addedbc4c4c3f2b825e4e96cc72031f6d2b34d730a052a4a1473bd649f5dfd83cd3a94d915e4738d1a27a2b53b471751e3a12d79cabd60cccb7b107dbc764be3d512916babb02afbc3c9c662d2095dff1825444aa760f1a42c220a724a7020e7f7210a4db6fb6a7b4b01b882267d0df4af9eb852f4fbbb4edb8fa641be3dfff6e7eb736f072921c31e76bdbdf062fe7a83295d4807ad1776de621387154062913e8eadf5c17707a446062ad16ffd9f1d46bc51d64fd3fb2a5469a9f06a6e125732805186256e12dde7af04a2d99ce47e32d1b07416d28a443ecc7bbb3ef2cc8bfa271791dd618a08d4f758db77d9132d01db8cfef08e5089deb0af085a70120e28ffdb29e42b75986d21df08f054688c48f8126ec14a744d8abc5910418602b3b89ecb89c0582ecf8979666c20d7eade8679820be4adaf344b8dc34d16a91ed8066bf3137c023d102c291aad0c9fef556e6f9ea28491922f361dfcb17ad390a6fd7a928d61c2544858fe01784d6df3b73950e1674eace26c798dc872a7f72e55dae2553ac29c13ae9e692d0542020a9b5b1ec315b4aded2ed6914676cb01fd9f410382ea80902b910088f914a62c7bb9b4f975514f5996d8d008622f599ba265c1bdfd33fb9b24fbdf03c7892ad550d690c4549d8c503a251d0c3fc89fad721fd7df5664e25c8cd0eca1a4c5a45e259b573e7a97a0413f4682ee5e33643828ed4e22fc3aa64cf836a701626eeab78a2f88168d817ac825c799fb2b750c1b3050071263705ec05cc5fa79a67269a14f9a9f0f1f7037786fff8a56790c77001fc151cac1567d7bbed5b44ea839c30199fee9347f7e78c62e8705afd8d19b0742742216e1810badffb658c53a9355a7c1e99f3c08ac6cde982bbd642993f443150d654f72fb9febb7e3af1775556ca9008cd5162e2f0f0e62c1873a7ca32e8219ae4e7eb8abaa36482a48ebad863c4ce261bd699c66075b8709693bfcb99347a5771be1bb6de1377309d194dff789d89268c8af71a3dca43c26a01197e29e6d1bb61cdab00180e41ee259751497a598925645fc89d8f0bbab7912c966aee4bd929751530022fc36f9063d4d65a53d886264009a54bf6961c01aa2ce9ac3e2c74c17d9c3056eff4db90319fe96961b575656e9257257523f98d2cf00c0d61227caa6849300cab331f0d2753991283990587a93d2c1eb3423d5dabaa481e7b8021e7b6d54e12d38d62fd08e5b37b8358cbe9c5fd108d990d5ba3a75ec6fdb13715d9abd7920cb8459b3757e1fd2996f17d01faeffbe708e9931104fe446c9252f8c1105b19902a387d869501765574b85423480ecc6a8e874fa883c08431cddb05983e63cba4e9153ec23ee9b257f25a83d30d49e911d607d883b855d2ff485de9ef72dd1f42b217e9290ab36df7a1771c0fede7f519c43607cd8b4b82e2f88dc901284e37a047e51abecd232c2bd8931ec6dbe637ca9fe77eed44b112e36f59e09367459d2ded141c64869205f8514410e185e396283c9d00af4061b5fcfdfc80dda5627516a1ab2903930c6114f911da09c9ca8b56a037288f400c25a00f76d9a7488f79e9a0e6e8170c133fcf7572e67b24ddf32139e24b036ef44ea438875a3e31fb5a3b3be0408da1b7c9f8d7bcc889d9538b1f3da4d4cae95a582a964ae39a05788a9d25d28dcef9d945bc3a3d80462ac5f7fbea701d51c26cd3c265580fb465dcbc159fd9e8fa88365672e23e31697b2e3b973d5e873123831d75ce00a8fdd410db00d460646e76a08cd3bcd5d5140971974a6e2dd08876474c994e831ebc330e1e1560b9b6e188ecf1309efb23b24378d1b025a7217fce1af4140fda2ba0b9f029c99929e7e068fd96058805e0aa1cd3069f5a8e7f6eb9f914534fc11a3ec67ad5469dcd1d7eaed5a3955606046333dbb89bf9536d56c1ae48c14cea3ab0e8b534a60feb76706b260ad0cf82cc419dd708a41f7acf2a67e0278417517c7cd9d7c445e32d523cfbf0fe9ef842c432260ebadd3de2e462baa173c832fb84359c3e97747a72ad9ecd9baaefaf97ba2d0c5cfef05c7421ed60ff78dd3ebe5a4ca614dc6882984534f80103ade95f40387f1cf064499aaebcfbf6e6c73a32f0ce315d5d54830af5b8e8538ce3625eecad807cfa05add6fe975259f1bc9681d3446d0b2485750c0120bc9d665da02d7c3406da964afb12cec1074c5f4c55302cbe02542cda7d3b72a5c91c1b5e8c5fefd9abbee1853a96438d0e0ffd8d5b1d112ce6bc3d2a33ddcf43033e2c2cf273838d309d5932c9a5634b8de6f55d0184cf2b9cd7e05346e9bef4cf2c034f1bc86679c31ffa16b5709241ec1550f981387be616f92cf6e224a0ced7eb553fce73fdbfb8476012c5a3c854f76dc94eb110355c2535bfd9a80b0710451e9127b1b6f5aaa42ad0287c113354981844c89f41956ca55164efa5ff6af451024c9a089a98bb0068181bf1f1d727e36234ef2c26693eb1f49813b0c033533c845948474d9f3a9da413eb3e7ef1f4ab3f423ddeaddf8733fbb46db27ec619a72490f3aba598c1aea9d1767d29b6394bb09d5abdceb5d431cc15df67bc545b095a71cbafccf41455d80c7cb38e740d30de584be82e3a73077fa0563aa35f28475dbc3190b632c152668a437e595feccd5d62acfb871faff7656c9ff9ff556b8a023f0891c24911b1c24cdc4c41653d1086aa61ab6065555a2bd04ccc73b169705cdb296af80becd780cb7c85b21c7c65177eea95e448ef5389ed2837716a799e878ef6f0d7c5ae1a3f3c096180fab3cf3482d9e572921f4320b821f0ea54a662d5ceed51a53ace2d99d00fb7d475dda6a560fe46cca89f0cb397493fcc6243e43492ed0ca0aa9fb94b107079480841aa7964dada70ba5440829f1b4091eded92c40416c2806aa1f8b78e08e02aead80d33874fc935c07092ad5189baa3e6dc6c4bb4cbff65b3f8c1510d5e04ea98e22c5b650d9305d1a53b956d31b439973e9e044473e31c712430f4cb4dabfe7d965ae0c07f67e17282d6f69ade4c2ca6a232af23023fa3e87b811b4a77d50853e2846e97a61e7b33fa611986db7dd546e0e98d4da0dc4658719e0384ed4e3361cf805bbec3f913f88f39fb1237f740011e26b7416ce8aa4330efcf04decb40c04c9653ee9a088a5014fe31c4c10590e9f94ff0b3a6cb30fe8729fb3dffe2f994f58eee6910f80253b1d755c6541f4ead74d29083af49c9168666346577d0108641b1e867a127cb4d67f4931385225da0dbd3dc8253cfdef421995951402b24382e09950ce8aa2d2363d1fe6e6cab6934cb31237621fcb51c383e9d278df26f7a7386a89ddb11784b65f3bf5d3e657d491b3173d140bc2b2b3303a29fef1c1a1fe336232c97bfc404c42f61b4f62300a2712c7ede2e7b1aa14ee8d25cfc6a87ac41f7cdde8eff1a6fbbd4e206eac37cd7df9d5647c495e3535599ea9e18800c5bddc025b9d74cdc10cf747d008920f9737c1e66a6297ee632d0fbd6c00ac6e17fe1c52a00ed4b206615ba0c2dd5fa4efddfc6487c596b3eeb23ef61a00d734e65cf747e6097e0e71e9f928b8beba56c53b56a328fe90217e80ce5728e79394daef4de496697a330972a6f3e7f21cc30e843dafb3f88b361227921481060da182dd4737924331b8b4ee3ee4f870410d8f828384b929b317682067ae536bc82e05b2c1c6204058bbe80fd789caaad45ca0c547e8d2c426ad3f21e07ce4bb129d9b27ff59f8a8b0504d4b2ad4538643288e91c2449496ecbd6452908e1252d3c85dda6cb7ddba07e8a01457ac5cfca631d419735ab53ea18ac82c8a4ffd8ef52bf1b8a6de08ce73bdc606f6f58e7e16d3ff4326d23a359864da70880076517e75cad3a658d4fdd07e2d13cb4f4b27346fcc18fac8c609930ebcef9a24c268e19a0dad0274eb2fff86f6ec92f188b77e1ed0b84c1e9e92f2ac648b96ac4022dade4ac649a33a784c5248b25374b7dc8706c2c4f1c5c18a8494db35ef705a6c1e29c81b9ad58badc09ca631cb440a7990f02ff1559aa425d8fb8206ea33bfab9bce1434af96dfec06e0e7e0e1c572e3b3e18fd58f2b27bd785bd3d7853b200b8caca3edf7abcb95f8ad4759844de90ccfdefce0f4dcf635785c01ec6e65ff3028b5b4ebd3ab4073fbdb6526d61f5b31de3613bf65505ea536d38f4f1ce063cefb0d51f8c0f7eff6821d479568fc49dbcd49793ebb294fb8d788291ee479459540c4e0a52498ea4d40763e6058720879e23b1d4c53f31902564db5bfe933e41e9e5f110d088afa8b8d11a1e122b5e1b290c5295cc90b3781138eb811e37790ef8acfff4157de73548193eda1c4680082e19ce5a9c4700ae16304f7660cb3a56c345a9375243f4af288e47650d7db5745980132e0d57ed2ac7458e7d33d074eeb55cbae323322da61096ec024342bc597f64d91f902b3fea72519444265978d40aa5f078127a143591e2af58edc6d70d2b24f4add2207c007a8d49c0bdfbaeafcb7bdadb1c1bf71af44b3fec855b4be23f4255551eac9d87898137a833df83b0e7929d55aac65ddf147c6aafb8966eb92b6ee3ea029d8000964e5865b6d053586031cc3a4b0a12568324c44463d486a7c71a81bc4d2d8847fb59a0e41432fb4fcbb751c7249fb89204f4352358c03b3ff2ed4d1387f3168e6b9c94fcdc098177285dea2daf50e7b5517d470947f2a2135c4e98e6e7f353795796f6a7ab1059d4f8cb172c4236a4afe19bb38586c865478fec06cd42e5627ca36276556f188977f63ea15aac6559e9a72d25c07f49645eca7f8f1c9b27e77a7c3bb6fbc9ba4fcdbee396028f87e99d435ee32b57bcf1e0c79e3e8b99ac90393584dc49ead85e5f4501414a3194963921487d608182a6befb1351a77335ddc0e59cff854dcceca0f534711bfe739212235ee4a80ac9076ea8f055ef937186ecc5b67faca751c79e841f40118b281ee9bd8112aaf7f7f263d817f92e90aed68323247957e1c9b604a2e48fe96b38a4e020f5c2d97a501183c166acd816deac9357f7254d0a9fbf71328fee9d0c60d1b159d9e8b9f3a80b1a2a4be9e6aef8fb47827c301e44fe2f40ec7c235b9ba24d6d71e2790586756a4593819523468bbd55cf56918bd322fa2dd9d12022187c4b9bc5c9c8ceb30b472a05e88e56ea825b235b1b6e403726873a346cec4b8798289cd4d426e66f8e5b307fc82017f91aff5e96846306f2d4cabcb05de51db0774a224e1d8b2025c41d073ba6d7ba558f7521a5b5472d12c38615e0a2808e4866334179de73fb120486019ed87468f9e4c78e1d9f5f83fab23ff5cb81b0309cc1e7aa34212c60e67677ed87440b6e889e61f9398737d9254354a4fa3b07e725be0980f2a4d6c04ac7b7ed5b19a2f40cd57fd65a6d887954f503cfbd12ee30ee17a5a2eadd2a97455b8b5b92936aa67797b853668efd26f3bd0e6469c369774b76614b78d9ce5d96d07a7196d849a1f91f752cbc1667cd9527f3107fe5213bd57b4198cc58d6ef6a7a922329a5e7c04afdfe6d9ccc97da4f3c369b7a611386c8fad3a75bfb77c6638b6cc30803c3816cae9b487563d623352b194a0307cc5cf8fdd227b762a6f2c2ef769f0e58d3cdf4432fc2c1f9175334c2696f15ce38904a1352ecf99d15631166731ffd2173a4e5b874843fed9cd8bdeeafacde566b3159d568982a2bf4176fb1d712169d36baa01f12097450af05df555c7e999152962de2a67780141ba1f21491a5f169d475a04e8083788164b80094b52edc6c72cb140cafddf519de86ae87e5dc2cedbb25661e38816376c8a83d63f3911a11c4b57a869448dd414bbc2ec8248e2b97469a5fdc23043ae8f617c234320c298e3407e69666a6536697426e994bc07b41b959d28bdb17a258012b7b5feb953e4d8e948ddec91f3c68fbc1013a2c666aac795b7ee417e34136b4601099a5b006b91515119e8d6849ed2c5b7e48a0cd05b1fce93f0ab157970b0dec0cdd29b83de91e1c15fcace105415a087bce24689a9a20e6a98cdf39bf92de10742645447a9f9efbe6b7da34a563df87b0c2e289c264df0d669a121898f3c51833a2166ea8ae456e255d619260bb4f747fe75ee9706c14c28f697672b9f9eab388cad08564f3da5a4c55746fea9c680bf50deffcfea98b4d829d9941dad8f4da56174c71c5a307735a685f5a32277020aaf3c0e6a8cf26c78f52beb722d31c8cde2ac1b7bbfd3e63b54a9722f590d22c88d6308c7344f6e2c7e133af880d02b9b6fa04d833ae5a5188338fc69b5045abcec0a36563ee704f6e8acaf325e9dcda41a0a2ea61a9cac00a2b27af4658cecbd3a55f5a921e72f9b93779e87388c60af04e583329bb9916a56179a883f89f8683fa41687f07d94bebb54a32f6602deb43f08130860387a8b0f9336b048288be2183663927652a4768d34b71e887a99ed02e6194d99f2701bf49b886b8e492c52c9dfb7b97a4c58ffe7ecc621751937d905036d00df2a0b752da8755b47e8cd0d7f4b2b2c599bd381aed15c01f7deb51ceb4a7e9c9b33dcc9607bafa3da58093d8887d88be62291e1047877e129fb06bb4cb0551fe72e1760667cb78f91991fe1e9c987bd69325062b40df456416b47be5e2df6dd0373d3656cbe2ac17e021d152dc740a7ac592f25e3a983e84ed6454d1201fe63d830ac9a618e2f43df464f931258f4f618fa5b39276f89b1db97981d0542ae5a23cade5a3425797fbc85d558460602681539e20a9a2799870635850d9907773e41c84c2cea86841b80f53686ef4add346e12f3f9f8f09513ae4ff039d6fadecb85685fff946321d13dd36b397ea8b1d36671be54aedabb38ae15f2fa3a9dc9149cd67d670b6ce2e15d05f8367b7211a76bbb2df62840b739dd541704410a51b828ed739a6d0ce3b631d21b61b62ff3ffa516c8a25d9a06133e2716a7c2484ad441267f434c5c778634f9a2bdaba929b3ef564cc31d721eb158b8d525d2930ab1fc9686028d76302eed8d067de737f334ffd882baba6ea7f4cd8aea5b99c3de0b0b9164ec775622b165b0cdd576f11b872481400370269a74b47a0cb287089c36daca69c0fb26bf49f758ec75928ebcc4ca4a3d02a8afb097c0b5542887f260017497af201a8aa00f33d4ba2763b3119050b5f0c70bc8bc960b8aad641ecb4f7fc3d34177b0d609dc5e8a7ef9967683d561111181aaf7ba9e2d9c3ed21abfc98e352f8fa7fe922911e95cd3f382691f25e8a1da778e37ef4731040d9d9c030a450bad72b737e50f541c96b4483e81f75c2742705358ceb5bed92c57d3ebad0ad06392c07d9cc8bf379eb12e890fd7e686789a9fbfafe5f0699c695749f493b2fb54b9b7383229a644f3834dcc8583364798e9f818d85b01c9821d7a2fbd24ceccef675d5ed1ce8ecc600d8a645c76f36faf6772b751ce8b32849276f27c05d70529f68da544965ac9078ef38ac015947a8d4f99918c33715e00956d631374d7c7d4fc1d16ece511b36668a298807f513952deac0922f5f3af274ce9f5744479f09087c68dc28e46342201337bdac6c18eb79df6b7df0368145a479e8ff8854031709e690cdbdd630d9e0998d3c2a9ba41a7a2f655cabfa5d5ddcc88c9d4af9f3dee0d40da12804221dcaf9273847b92797f652d230a8773c4249bca9d23e13791235f50166e9f121c03a3117eb5ef793750e5b8b481d3e36cc72d4ece5565fb7a629a983af489634291210a7f92390e36751c761bfd5938c459a1ffe46de00bcb52014f44bef17ebcfe148c58a83684f3d04bb9a0084e78056e615e5a62c7f762e5edd4be5857bd34ebe3f007c7961c439ade68738e8c96a859d5a54aa33842dedb3bc5e9ec496a27853bbb32d4058058a4655f4de1ff81584df9030246ce5dfd02e39f1a86a20de3924af6c64d0d1143f989afaa27e6e708ce92df2caba438d1624f4d9be6b987b7fdb83a6d51c2f48507830524589e2abb3c91af2833c8574d8f4f592d97a8487d496c0e63e0f2510931ae90ca120144d631faa8fc0824112ddfab24212b9b837bb4dbf089f2d9e8fa68676d63b859b4f31c92b9819a9012fc8830bc5f1b7fe535c0f4c61278bb353b6604ac296a2e8799decf078597785ece838711de280e591bceda8ce1ed6eda27c2ab608b102a5e5e41b3317f52d58190539eeedfa51cb8b1b9265bd5b2469fe8e37d833dacf167ea4948b7ee719f630e6f42f9e766276f491a73309b2030a393299f0feee6d979dcc02ef436c8714e6b6b6745ff03cd32166e969508c0330ec69303e6c09be6d3b372b2a3f563746107d0f7934eee8fe3a7b5441287b53c12453fbe66b615f43941218dd5aa881ba787c86f91d13659dabf8afde9f715be48b85eaa9238099acd13817f9935f30d42a36e220b2bc38419160938930d28d8105bc0de49ce04f8293bcf4de5377a3b30407290be933170dd0a42bea90da2599e8dd14841074684aa0062d81a00025a420cd5d325f7fcf866890abe3ea57255f33ccbdc040eb05f438bb4e454750750f3a6f8fc1e1603c1866725b4c449347d02a5b0579b3bb707a5fa5e04a5113843153fcc9d8bb0770db88057a025d4d554a8c7a30be3c55017c78096da4f4dc419188f8ce5082f97c8efa9a0368fd1aa30b1bf09427252f6348c83d614c8895a7ac27f90ccb3ae3abdec71087d5a69fab71bdd7e9cfafba87fc2c2cedc3054a7336fec07ad4be220ab5703d469f0db1d64d10d16e35bab95509ca88a8d31b5722d9365913fb6db7dda9eb9d63e5a976726dfdb9917b4cdcddddd1649dbb59428ac14843de7a50b61843346601629f0617c12bf239fcd5a89fd561b525cfe0f8998e2f52787c451fd833ca25da718eecbd8d589c0285eb89b877b54fc7ea51c1555b25f285b1303ec9ce50fffa39d1847e37586e5639f3fefd8a2a739d25d4a52dec94e8ffe8bb71c6ca931c8d6945a6d832fa6fb95a37af604cdb021d73c6174b873f62b25a0b508302eaa3167313550f32095c94f0fad52234148db394fbd1f1b4da7d285ef186b0546cdab17c9affdc5b4d743b7142cf2199cb17ed664bd8f0bd3a1079b08b1d74936c73509a01d8340d953739747ae8ecc38e74b09ffaac2ac3c591038dbe1b0140804dabd5aecd70a5ba65d6c99f2051480a2080b1f75ed5aef6f543776f784a2b5cc1104740c6a80b35f905f1af501f3a7a78bb79b98611ee1755b3a26bcdaf72f2cd25f40240308095f5272208109c6dd82dc82e820fc07bc1565dd44384629be535b592df3526808e04ed3fc74360ab426752bea4f2daacea27762423ed13dfe8edbcdcc067e86ee48f2ce310fcfc5b3bede5b7fd638989a0d40d2a470d335f862e75ec09c3cf9ff3232b8fc3c6ac293bcb9bff45f3539522b1d4546babaa7d5a205bd1bcbf0c134bccb1d7781a7fea1702503be63672de87716fb3b3ad6bb69c08ba15760c48752a8a58af8659488852d3112993b3fcd16333e45c023ab5f029b742ea7355b5c8faa69e68237ebd0a3fd6dc1b83e3b3a210e0c69eb3863a3e04f845ae3980981e847d984cec04d6480da21eab71c83bc0abcc8f8fb81e7dc8c4b3e6526ca7d0c03decb478a3daf293231ff6ec81dd4fc7f8fa613a2d80e2ab086a16899f01f944ea406bf8c2d9330c55f55ac3635e85f128954644a17874e3a2c12aef2f813f11c579d62f759ab59f543c5aa93c59d5f0f4b7ccb1f4d4dbc63637f608d0f50cc437dd6755ed26d633863fdba2a8f54491328e6dd93a8252e42043f6a7aaf0ef21db173f6ccf45aadbb838c2215df01755b5b1d459b0272e050a7d4b91d3a60f161223ddb6202335300c76336d20502ed51229ba262f0c6da9018117b2d9687e220700040461d8cc62e0e5116c0dfe1f283eebef9cc4f6e61210aef5d0a8644a2aa640dd0c951bc408ed1f7a29858d256aec3d5a33b1b48e595ad3a109a87515f4182dc39ad10439a12a451677e1bb2a7f53a105cb9428310e54da48176e8d79d535b70e91dd71a43fffb5e3c891359deecaabab4040bee150812af1ff6afd9af0d205a150028757dd35edd828c32c8e8fc62fd859ad3ab6c96d60e2badd6ca439d6c388cf2596f390ec2f05e44758e55c2688984be3a90c00968b140936cc4eb2652d29bcbb28021c2263b1eb9be017d2228edd82bfdaf33bb023c450dc4c9bf322c7b952a5b302cab96b59c714f5033f20e2558b49f8347ef2d2c2424caa75a524c7c9da15dd9aa381b337462011cb15a4ad606207194d06e4678e7029230add7e06bb6abe59f95652183a9cddd9a2d66244a3ac2c263b4a4095b5c3c8d337692cd12616ca4333d6910d15dcae69ea13c3ddd4aa86a8022275a533cee8a3ca3ec261c93183dbccbdfedf0677cc1fc7c0bda68492ea2067530c29660db1f3ea4f44191e3f8ff79d49d3150b58d340adf7d09c4a11ec8d602e0fa2940add2d2e407b8a189e912f3e689ff759c45f430d296a25ccb0b791a86b6bb03f1e473abd27716779805aa8905c9d30f47ddc92d5faddc2c376e6976e33184eddf468723f40e64c8d5318e7d7538e63b90c38adfd50c07dc4775fe8b052f1843c3fb81b29e6ef719fc1b5a7347a3e68b12473c029003452676952ac17aa732e5bcb311ba52af56e5290d09661801c1d8d3176d38571f784629ec336fa0d8a45f07a3855355ae27e18049c9af3e9e9158ea68df0e87b9b6993649b5f3700a73f2397e1c5cc9a28aad2e3c496948bd0e6e0b6ae420799bf7af1e98f2793ab67bce7103e3d361e6b45341fef5178431d23a4185c1d0e3a76d2153db3c30e0d521842f5829a1b046ff99b0121b6badcc0264dfd82c85151615399ced138f6ef8d780abf83188a8d45e919250e0a2f73e9296328b6422d01e55aa53ddc76a97f95eb24b6e70101558decdccc6ebfb8f25d8e2ddfc26ad78241b5aa1961e077ad99df89418817b1e654d51d247cbc59e7d837d6a7e01f6c6407ff911f5cc9f4cbdd589b2dc6181199681dc8ee6d85a2bbda474637d7b15af905bf0e07565c0372a4eb1b2c54389d147d8afe63de24d43969e013b3afe0b6374df7754bfcfff6a9373b29e61b737057e8379f3b522cf507f426750d3f8e452c244de1601d318240dacc083ecde31783f2c8d735facbdb38bb2091cc0415c989444a328d6288e2241b37b68dfc6ccd532e5f4a58bc17d954e1f6bd27cf24cbfa7f74b71d82e6a9ff9b28c97ebbf2eaf2955146e95445cb8f4ef38e336a7ad5829a614f713cf4df28b476803818012b3efebcad6e4a07d22e2db0102cbcf21dd98a0053c1906a7dcb8d1499acc62f2b4cd5a194bc179fedca50ea6bdb4d0d587b15577271b73404b44557cffc7b0807fa475690862018fd1ac98c3c253d60807164cf1b0adfe65cd523e926f42a6e5b43000a7e2d154a2f829ff199fd7da1f59b2d3f3445e077888c1500ef9840d91f3ff505f8c049a8d649c9ddaf2bc09b134381c921a4faf3307ffcb87e6de80ab66c62b3583e3e9ebd2c9fc5849bd346a57db7c60d6edf33fb55e32258db690043536f1a0d5f8cf858d0727495767f2c2973f502ff4ac49efc9d577aabbee9b5e996c11b025a0c7f078725f6f5c236a536c2d2f2710ae42b82d919e743be944a39579b4293c04e2d68390540ee0ee4ae6019adb9f5ef6ebee54e28862d1c9481f5e0762d28acdf6c2b6b6d1ca01810ab20a85d352e3b41edd94b7644cc74ec052ef299c1f3fad2df1f23eef27a79d07f4e7421839f97e9da9e6f3071235a90b3c3fdb87315c8c8c40a42f5d1c6482845450092be79f3418b8a3586cfeb9bffeb4f825ce8eaf017d24e4c374cf2d5187dd00449fb78be31e38191e220a6a9ef07ef227900d56ce06ea0fa34fa0fc8bc860de6233b681e9819e109d9c8866dcbe07c018b8db4a70c55542670baa3de9e0a540aba0aa1673dfac30ee203f866a89dbc71435b03b85e851504f3046a6924201d02a3c9626bd7e4947040e8c0e8c924c13b75a9c3a85ccbafe5c756653e20379b4049b4218f6e810461edc37022abe603c0f9377f2f7e12436eaed543ad37d64a8d30547be7398fa7377eb17b520cdcc4485455156d7e7c646e5db3d1c96ae2aeffb78bcc7c3950f238831124b180baa9c53b0eef19210e44856e315d7b15d49da05ff866bdaba03cd1d5f92fcbfb2956e25ea3bca11444ffb50993fe796346729bd8792b5103352d32c94a267e26373fa61a6b267b4289ae0ba6089d348b0b2f55512b80eab2cb86f643550dd9f9126087838441e8132d0809e7252774c927ac43c0bc4eb3b8a9687e4b43bd71b36acce61ef91c9b64c8d3b14af7c2430e6e05a5f85f0eaec5a3761caa79587e34d9f2b49d2b5bc65c020387dc35580cffb10b2850cad134a8d9c0ff0cb6c6de8a91ebe00ae4f2656791f9f304986b48357326ce82309c1c7fcc6125603e95c02b18c0358e4087185a7aca5236edae2ec01a0e8801fb14bf567578759c8ff303ac411c14bcabb79a3c9a786ea55f45e62ba443af91cb481fef40f49dc2ca82e9e20ccc08efa3c5a96e9acf41f33dfa84851e4043ec725b62cac7ce95e78374e9e9c8d4d0856036078daed1183ddf1dce9e96d4024356d28c94467913a14d7ae885c53ddc3d343c2b30691dfdabefc96c0d139f22364f042cc82d43b667ac9cb3c7748c9a20c93ced0457e83f27394771944e31312e80423e57012dce0832e6da90bf426130b3336a7e35b27735bf2e42f3e2b05caa45f3ce79826f75aa45bf959449404d1b20d0889ee2a996ddd939c57245eb370fa776614eda9e22e4eac9b152576b5ecc9e75c24a06967b159194d7b8678135019a3cff0b1517acda2a5cf0094544eb3ef1c21789cbb26e898a278dbccd86b1a88a2f2c40626b1dcc08dead91e68e737e3409b9f4d2e52174dbf143014b5bc8625af8f6292c859213d245b48a2a182e8504c5a5c834f9c267d3165791b07635ad77072eedcaeeaafefd256268794cfe0eac55e8a567e8cd149b90777733311e876007b6f05196f4ea1fe44bf28e169bb77b1dc1c70049f1202727466aea9f8fe6182c7913b2837e3298cc84156185fed45bac9cd38da95132604ab8b432b999b09c026402dc5f8649cc59a00bb17021a4530e26c18652f5aa1f0b62fe8145637f8edbe18669b7d8ec64969c2c29010d8b06eee7b748eb3bbd65d8347731815595d7cea9e79d2335f721811d1c5f29bb82284536d60c19bccdbba9700458364938f0c02bb6fb1d4e7ece11c9ba9d54f34750f3b813b85372403a581625fb8490e7916c2ecbd956805b7bec91c3c18415723b1a7efe33e3ea791ecf524a1bd63028e8fb53004b5df9aed3a61f09e031412207862d16555bafa6920b35364726e06d92f30344b028c280125a9f1e8dc58b8f4f3b4bee93b0f9d8d7628510837d48dcb1eceeed800998b44abcd851f093a08f3d7a80e135d4ffd0bdeda44546601ff2fd03d11543c98478af288c651fa4b8844727007c73c9bf842a4da6e47cbffe3a0498fd9d8df903bc6c9a7d25bcadf06adfb2d9065f17c332299ea1a57cdcbe21e90908d786cd85112e3661e45cf9b06a2dc3efce9564e15b96bf154bb43f6379c1b59e9b9155cab0bb41b14c145b24db62efd7d23c4bb643a64cdb5d679fa0d492c7c263265d1fa866e85c4e8713921460852844f0a4252419a80e3c17f031e86c993c945c6b844fcc959120148cf334b6d563fe8fc33c0dcc9f6cfc5db49944725b2c49c1caa155f0ad5296f2c3c8e7adb03d6f18f4ad705ed580a1c77427b23651e7357fabac34ac1bd3cbd2574db937d018728632da8a18044a20153c89adb6224935f213b996dc3915c5f466645d5386ec61921e3ad803dcee82b55d56d5741fbbcc51f892cc349bc0e5cee51a02b89afaa979963922ba156f6ec46731d5087e56c56524208dd835a5d26649bbac28503f5c9d2089335bcbd51382ed6c759879b9dd58c5971117cf2f13fa7a4a84546cf4e7e6e79d09ca588d18f9333144ecac8e987d0f429286664a2088328126c89ef710a868f149f653fe3e281d08a4b843ca0c008abe1090d3a8fa3dab85010ef4856f9fbc96daa882024f508ce7af746c68919c70bd6206f36541acd7411bf4b596aba4f4f09f12061ebd8dea08f690077b8b61c1238ff6083c2cac23bccb3310d96029b4c3f62063c53eaa7cc187818199341d0b78589ecc470ef3eeba7a8c4c961583414a36333b2dda47e041bd12cac0c0d3a143008299d6ae5df70828fcbc70ba6350cd491d72a6da4eb5e8984826284bbfa30dbe44e6f08275363a5fb6fb8f3b9e081e1ed2a7afead21f20f4b7e73600a8aaf15799f898cfb197cc50422a8a595fe710408e39e53aa63b4c4708661f46dbcef8b30cb6906797f98a4460e7a939a0bd283a4a078aadeb0fb9db462b63679e7708c5703442e5d2d8b16297757c46e6570e8b091d26671bb596e0299cefbce705939bda36e9fdf2d4b7f60b0f6ef3a85ef4b82b5494852b7e2ac027a38b73d6dd7ebb2f8d63bb1943af11d066a7ea522316ab445a0753962aeade626c5da5543b9df6e4a78c42a8fa0b29dac1463f672833af725aa11508f916597115d91f58025d83e77c88a0ac259cf68d2def5b78728f0feeadcf879e8e3b5e08becc109c3541d811dd913f2afcf97790a64a9f4dd08ef0eb62619faaea5c8c9218f136faa1787322163b277e1aa17ef36b188457ec0849c87f7463c23789902f04632d86bfb0ebef0dc1e1f4e34dcf28a0c44072ae9a39d3aee9cef229f1f31fb59f7c5e1c871b074358e3b022dee85b8e5d8f158ed3e0b959a651e959ae2f831590273b885e24d4385db9c450f8ffc6447afad463c3998ea90a9b8dae66d83b9c4fbf35f862ffa7c2054de10f34732f5393bc16ead09a82b154fed2b2a98454980e53d3f39bc8cb89f2dc325c46cc0246cfab3b83056cda499d997702e1ae2067f95af3de6aa55e789b6dc4038952bea909b4a44e9781f2e6d5152b2f4b044ee0e467bd2db313e62759f1f8b2e4675edeebe0f17316ce07dc50a1e8e394a596745f73463ef52d6ddca0ee335a760474a7c13d112b5ccbde206f4cfebf394368208e4528a0767376213b7111d6c499c50bccbffe5b91ec1e58ff30c75d127c0f341aa1426592819fc06855be80b3a58618acf9a841e44063dc9729d36c28638a0128558c2c58abb40cb93506c2824bc5d599006acec1785a6f8e333435ddb61df6b6b16f01b2179a155dc7225076caba9aec24000df5622b7b3d816f5503c4525eab14ffa1258d1440770cdb3a19c61b37670926fc72528b67c308aa3bd8876aead4fc321ee7853c5205ff47e360a0fec5afa5ea34cf66625170bdbc1bcf0963ad9f601d4fcba6cc7251bc132b5dc43bafe25f78ed2507ee2cf1da75eb6cb5c80ef0c187255a0a285a1f0667218e2e79e1a95c7e97d860a090998a192a3b4a2745ed6fe582ab9a22fc0573d41c45b6ab34605fc8a0a9d45c5a01315a9575a6f14e0a5a6baa0178ef4f27e1a36d1581900a1e32ad04fab2f2742e58cb6fe18df2541f7b7c72577c055f7846c68c64028eca954fe4a11a285a21a5ebb491cfa648a776fce5272ed2b88b1ff3b822304f9b04214bcb25715594023be0df7363361c917374b55d8c421a32a1d09b17335f7383ebcf0e7dcff74d103d9581b70962ce1239077e68308f237d47ac8dc36636d9d608bc27a8732e2c62953e27b99c4f58bd4ccd4046b90cc602ce512e2042857c073c24bc28b28b8bde91f8e6a7e6add61aac0c21d411156f545bc6ca41c209c35a3141d7201bf07f7fa550dea235f9167a88505222c4f9550795b8731d69daee9cac514046c871608ba386662dcc46496368943ec39bd777da8c86ffc788b3f9308ec52dbc1849bf680c889e85c70dd25c5789c6ebe7bada595295fb374354afcc31757e566f584ebafd69509813fdc5138ca77b3ac0b02ae7533a1fb3ba2b37fc355f4af52acf3b0fc93355e61452f2a4880bf5eef99f459ad28aa276bc11109b694eb6e77e424d5b1d12cbb8e4f29b637128828899171ddcda519d2ceabf3a17a52fc85a1bb3733082febb2e6e184fb5ed41e6f2da30133bac1597402ff69af4bf82705a4d33054f02e6dfd078d0ca2cd9c3f8750718d83a639cf2b9f58927eff1337f15af083471ee4aa5c16b93a7d02b8d61e0013009febd900757fe944fdc1121bb7a78247aa8c86c27c3e22669990b4c6412240b2909c10def6df027bec593b797a0e14e756b1cc474b502a1deb18ec5a0d9f966280a10635292dbbd18145a212789c1c9a424fbef0c358fb9c92229a57692cd2a46a8c760c799aeb53fb314cac7cc6be5f2be289286285c1fcb517b353bfa14e9db466e62cc876f29ca406d7239c0693932d4924e69b8cd9a14af54dfbc6ccdc3a3d0cf570d58773dd354672c9c72ff2c4105521b1822583a6abcd7cd4857dbef11b4777a209c47910b9d47c8c158e23bf8da67af07072f3d02c04c4122587e237b4a926a121843b51e099dff9b315f4239efc01110f3129cca9e8ec74b93c16db25cdc440c044c426dc78cb3e6b107873571b291df30888e7d79d412fc3678a335be520e40477766194fe0207d87c05dad266fae94d6a32f96b4f098ce1c4b0091ab535d78f7e73cf542c10a2355b74095c311270744661514165fea427b3588f8e540f5b524991db4f126028e0704e7198bf8a295ab93d1bbfe5d93d1fc50b56c0d7a6b555e5c185555e1c31d221c5d73ce45b7ffe0ad5ac0b76eae46f441d1e929102dfa2f3bd4e91f035693dd6075da2b699b15b1f7f40c2ade3a33566f32118927246a4a4ef7f9105835c478e457a8cfc847ebc3c4db9a61b7d4514ed886ad8832f0f9a42a950a52298ade7555355459cb7ec427dd55ccd19a48acc0128740c7cbeeb528bdaac708981e52fd2c62f0e3493589dbdb7db8d1ec75f7976a6559b6cd00f50c1dccd5003f1ce4eec0efa45f79b3af6f1df0422cad748e6076531cc803c431fb5cee731b5aef2e9eecdf99ab2893297d865d7fcbf1ba2afb269c2bdcdbd7196eb717c04cc4a7333c1db961c95d1ab4b4b110068fae59fbbcaf8826ae41e13a7235a339ee58b1fdb7538a93b6731c823bf7c36a03f774d0877b94eb8d84c1d4caa55964cc7f14e6f6e620de941f097bf7a84293962390c1bab3abec77758a8674e9ad0f4b672dd1848fd067efda6d93e53ac40f61a0d6f8f15f8982a26c60c9059f07c7e37fc7e7b62dd0e1a9d1c27df32449bd26f26bc47615e3506e546ba9947fdcf15058b937c5868b487a84273c904d857ff25380306590347272d994fb1d68e8340166c93537b1ab54a05330c7c383a47fed02e360f7e70379546fcda4d5ddd97e5402c1cd905bc62541481a759d688d0f3cf6fb640a41ac63de0b4bf14688c1c8bc99519b7f7f2567cc96e4c2073d95617c8eed2ea4d6f22eddc979dd3ced751ed761c28ab3ae620288fddd8b2762caef7d54ee1c053c83b463a319cbff8a87e4889d7523b52dcfdd008cf1072a17408d26740a8af016a25b80e06d229df2b79f6d03b6f0b1fd230e9b6598f64d2d8c3e96cbf7469ab728b7e3b0ccb557a46c1b5ca5bd4ca2d9407962869c29013092d5ede3de5e5449bc3c091f46f600fe49d0d16348552b33e72e3e4e9bc32654e1ba350e845fc52dd52603c53eb845ff8f1f9b32ae2359f0268fa7eb7bd1101e3f474589120cb6a2ef6b874f29da22721629c697db46947ccb25909ae4f31d5e7490c06a25f61cad95ff0e1a80e091d3a60ffe5811a379f9d4349e6502adedcdeb168a700148692b02a9a5e5e801a7a9a5f84e45ab216c68243bd88ca2f999bdf455475a4dc14a0fdd66d4b2f0be04c35bec2b37d2323fe7d13f7e30747bed31ddcb6c19264c940a191f74198906430e7ca8c90e66f9a2583e136614a0f0c21a056be8fdf76edb298d951643bfade5557d9b6b9261ee2c3ee74f66fbe7f00f20eee16d0bf81462416e20fe524a8ff81ab4107545ea81b113da4d528878028a2614a987be33554fe48af48fdfd9435b2fc1bcc63d1119a830672de31bb08f58bdd3ec93774b8eb46819f141b386c786667aeb6856a51ea9443f038ab76882d00dd06fca086722c245052b06363221e6c5ff96318e9fe7d39c5db7d03e8bd265ef74d328575c5f50f88f6d48f0ed63b2530740c8f4dc8e5f394ad33f8a72c91b4aa64359bbbc61fe4dad49b46363e5af9b28b5e17ac1a67e32d251cec11ef73f6b47b6dbf7f925fc87d182ea6084a4e02e58cc4c287b7bd81246a61c87dddfd3ef1c59b2881e389fde66f73f6f0ef5e1ee635dc672afbee996f5fd66f5e4e94028902136a8ba693b8b72cafac60917fb3a9e4aa5fd95c52c9557c783a1c84824e7a9bb7fbe2364134014f46a7aa604a021e09cb244dbff3f38c6ecc8f198d207356ce31d6f80a3118351713ea15f950530bf7896d3762da51356720722849a735f6bd23ca89f6916060e34037b44ee46368ac8a0ef93a99ca8003578d985103e86979dfdfd1ddcdb96df9a8e981637344915040f2c5c55f6f7933db3012f36be112d16925c3e3ffe9900e2525bf4a8dfcdc9ff2ecae59d15056434722bcf555187d17cd6e064186abd98d411495cc8ab2fbb25b7fc04b779d7e1e3d4d38857910fd25171fc8676cb674f3ea4413f5c2e88332673cafec3b73a8972a48e7f67834b43080072a4b35d40e4565eb25681a8fb043f11fcda525ee3e16f89fb11a275a2b6b3c1e1c47b9c7599dce8e33eaf437c9d9f5e2db93d4e4b5e4366052ff3fb0296deddce776677467c36a0d95bd3ec44172b011cfa37bda731f5b9583168a5de7998e3e9ba90d5a737c8b47bc2d0323dcb04752435521158148c716dc217b26464ec653c2ca3cb2e78b37acf832b4713b6704ef87afc83b64a0a9cdb0705feaa72b09491961408f20afdc8a1176ce5459e834ce5a9f93f0626540671b16be25025caa7b6411ce876504f538cbbb9cbf83f244406592ab1bff3868dc97793baf83110eaaf31820cd84237c1f23a1d9ee80fa3d92f513b3abc600891982f49b87e8ebcb514dc1012d9ed97c4d5aaaa4cb3e0c8fe5937d94fca930f2410752af994748bd2691b43878aae8e47f28ce4b20efdc44e33b0078706fe7e03c6cf99b540bd501690c232a52c2213d02f27600201602d040d5f51a4d8547d62667610a692b16163043a31b2636a34284c5d4c4129207cc69864c63c51909ba30ca1f3cb375464e68d1d6983b3bedd7426c8087348a7f6e9dae7aa19b11da0cb71a6a6c6446af5b654eff7b5962723f9435eec897b28d941462fea89fcc12d3c0933217bb67fb87e2a1475f3ace08091ace9ce8d7ed91efb37310ef8d39b2b8f20d5fb38bc3892df31814e75bdca4139b9253a79a285d8e02a8ebf994a807c89fc64ed52f31d68523abf176eccd706fa9ee97a99791bce0613f0ea86ba3befa3a3217ae2c828da8b03f16a30218a260b78f4602bb2abeddba4759d9bf38c4eb31a1fc8c31cc91d8e355205fee3d1bb01d77676b5f517da877aa1c42b5122546cbe4c3c320cc3963ce995abf23ba251573e74832a921c6ce55a2c507da49782bd191d79bd03210024e4d320a378e187c1de6ebc43da83c97db8ca8f4303ab038386621956e5a0c35967733637ed22ec228cb3115a60ac547f1951199788280d3bfa2fb0dda50828853d768e77114bc63e0da86fe010ab58ee41f58acd2f0d037697316dc15b06d820873643437b427ea81df775494226deddd18aa2bf3a30d55f8f4f22e835ef24aa07efd58af27039c306c9d3fa849d3dcbf8c363e73988a02d2bf22134d5ac5346f54065521924a9939f3ba585bd8ed75ff863cc24d7eea9bb699b8db3c58aba14ac8b1bb0b998f67dbdcf1707475e3af89b5e2f9dac1150075701ca1be9df5c5be3f92f1bd0fd46a851af1f337c51ad7d75c12535f4250b929957fa855b54764692284c828a1b434123ce2c6f9ed35da61d0096cf1e9815168d99434831b23765e524273dfc6f30b921e1ce5679aef2bb05543ae746c6183b460a01fa071d321e92d7b47034b3ee40d817ea53497c22952a98eaa019cd81bd92475eaa1d17ba4856770da67f025f912b4f958a780babbfeb532a0e818efae83e45c7804dd880b2d656e8ad04d413782623a6c48c014eca6186c3a3db24ad47f5d1c045f1005d401c1716681f7b7fe2c4fbed8499b17edfdcf8aa52fab81ca57e9d6ad1f4b2065163d262dca06388c52ff5d946544b30ed9a6f67086a333221bbc613f9fbbb06b9e1dd8ff045ab0542b8b5683fea07a8c5796aee7474b74686dd3a7035358246ae979cb5a2dd261cbdad452162d20ec9f2d3fb7ab4576c2f02a77c46bccbf65ac4bed95ba35f1278e21e403468d4ac0c8ea38a4a585152be787d00cbd474adea28a92b3abd11519ee026729825f2ad4ccd204686075492a44b0e6ee534cf53659eb94e5361404c0e978d29d53373f9069ad169168c0e613542a789e6713a8a098d775f45774501354c718cec3b87ea5dd5943d5b74a0b67669a0681714d25064a144b791bf5c9cac0edfe10f3d1164ae9089915e4521ab9cd3e1d4ce8fa13c077e63cff3153f0ffee07cd11625e4ea3308ce9ff483cf3d8f07f8ec8754d7d3e9c40e33df5d788e2cbbaaaff353ad2bc2fd54ff18ed2966826cdf0160d160e916634a81a87e31c1eddf3abb734e92486e234ed015fb6a1314b48bc1e84cc88bb4650d31b40a899c830ba186c5f058bb8fbb3eb7b4c8b63bbaa330a43379abb38d947356887bf0e11e01dd8234a0c6b02ff3b027739286c576f376ea5bca9b16164914e715d8820b4bb222e8020b1b59a56f8b998cf25df47d70171aa14bc93fbde57ae3566bf8047369dd2b67773f492368999d7129813b413a3e35c1f1d0335d2bb3523ce520d4f00ae69fa7786ccd1a19258a85afdc35aeb6eb444328fdc348cfe5cd1080c04ac4bfa1065b6b038ac5e3d0d70317054ca14d8c9749140606cbc7cf2ab13585eecbef2f3a60bec4c297fb5e7e5d7cd975342eef4dcf23c9b1de9b411fa65ea66c5df3905d2d846b195a7a2eeb192e2b06b46abd77b57a2959a0c7b3dc3cf18b45a3d4104c0dc05241325083640be003e8ebdf56eda370eaf8c69be2076840ec284ac6904b7f9f9e0e57da0a2eba4eb16f50fb8ee4582610909163a39ddfe071d71c5cad6196aed7fdfdd6101ac8dc72772b906f0737dbfed3a91635f84e99ab2268bb1702cdd5ef5537ac68b43e5e66b4c7ede03cb3a55032945c5fc3e662acff926092a9a405b0fef606718f32fe9c02d3456ea8f45e0d681b7fe9b039a944ea4e6bd0f99c7d6b50eda682f0061c8000f8ff7a39c598e9e189a85e51192e7e507ed0b6db3a33601555bee3ff17cae4167a9c30058e6e581a44397c26c5cfff867e7616d7931a1cbae433ea59f08a9fe1428931268700ec65b8b01c6fa5dd4820b9a3c156c8c85d8e5c5e3869da02858071a35c3f2c5b9eb8506a27c976b8642df781089a30b9f1e4fcf2113b87b1b19c91f13918371d22b63bd1b14abed3592f203efdef728f7e9143b19311c04fec5512ab1a6a6f5e55d66805a351ed3275ff1ca48407e6ff67ebd63132036eafa64ed58c0bcd7613aff309213698ff3e30c054e37a7875ccbefa1229b7cdfab5973a3da3d8b28091f5a68baa354ae88670ac3b82d3d3e4fe71a48923b51f0868a1d0f1b0a599f43af709a9bef0aae0a0901747ce009152a2494d38ad614df2388c146557b025f877fd196150765b36a7a2350729defd1813e21b90ec5634a000be66d74a333b3d3095e8d7663f935b202d7ba5f643ad2f588f115e9b19d46a8eeb1e993b54fa4fc235c18b5fb9323922d07b2aecfc428c4e555edb81d5acefda7e5e43d47e80c69bbaf519c6d667a5f7277ed546b4f1ebff85a4fc2402f35de3415d3cc369bb7108b11cb3b494eebab8fe8fcb4fdb99ac12d58ebad107d885fa1142a3b0255f89f304f8b661480c3dd60fc3996f217e253c80cbb735ec7a3a2f3fbc0e3f56ebf32880e083223d08cc9090fe358ea097ae99403a22dfe900715b44fe9c88159a16bbc3da31a406c27190657efb17f28930e20b874941e163ffd805fb0badeda3b3aefa94a35a2dc324e361cd204680902daf4dd34f8e3b08bf39324259ab23ea72d442722392826776e0cb723fb8374210ed14e62e07501d3d9ceeeec89001fd3a37ebd953f013aabddf4f9816c2b1aaad5371943a0b39742e538de7ce494be5c3f7d24528e59ee06925a23a83db0645203c4952982caa58ec793d4ad2ea66151be3f4e9c927e183d3b2854de6ecd1ef1a8ee1150aa2105fd909189f6debc1ac6c1933200e571c198628fa81c8d41883abe147b9d47b29bd534e5682e7e0876f98023340ef4506a3f0d8145fbe1e888135e56030eb8a0552197f35b4637aad729019d727367d089dc6429e155fd6e29df80418ffea986d77e84ce73b283d8d9cb164f28f009a8f5bc48308e65a9d81990a0b6a26b337178e1cd3ef51d8b052a42fc4bba7856031a040853ce3092fae1cd143f4ca973e98c108f13b74ef2c5f2b878642034932219eb33725ff4b0912bcee2d8f599bc3a06e636907a94a2c464a97a54a6816fea21f01f826d6988512e9cdd13e809f460a764ab2ed49c64bcad6800f150667038ebed2d2f201b90e8f2b7e3542fb85810f2fdd7afc4ee942fff23bcc865a65715bf01721dc24852dd504a92d9dbf948351c8cdcbae1ebaaf73101a321a65da755815fcb8501eda85a89315d711e466f32ae8a4d207e1a8b7dd098431c73905736423b0bfb134140b96aea5b40e3103266db7059e02cec35fe9dccc5806e4ab6a5b494810535ea1a56d3f880682e7929d7791d08c051f96d91cd89c04197fb7769c1b1e5292030b43cc6d1699aaa3b037196c27f1264e4dc98f247e666014a0598c257541d8ae3cdae8eecaafb8b4743688b8f06c09184e568e1c43a30521abfeb0818ec0fb126e3222824f4ba6ff33fbca1fd79b313e0e38c1383948bdaefc36ec2ea4b5087542bc1956f130ebb604647fa0e4aa1edea0da83791f678438d7a1d4867bca6f9c0e0a379dbb836d89b4a1c3f06e6b93ffde7c60e911301cf8f9fa4879daeb7213b72d111c3925c90bb22314d6b0ce549e660b7f119bd3a2d34c42ab3e438e2c933a7402c6c3899180bb532ed1e42db5fc60055d355cb24b01c9d2b3a23556bac6f378a639ab713161ab9dd8f659725f153c1068eefd16b8ec32c7f23e6ccd6045f822b2a6d6a9babe7135e04d475e62650f0b79db3604f00bd68eb374ca89468d1e180ba6d51bf279a50ac34a5bbe1f185313a6abaefa44274c3bc7154344e686c3837faad3a27dca4ee2e803187754ca4431cb61d591cbd4d12ff6fba329e7780709413df97fd7e8b91343d8379b2e26de69e4d8e37062fb3fe1fff3ec0cb729ba8958ca5ed5e64672bddd6892d1626b14e1fba2c98aed866c6c4eec42bf1bdfdb87bd505c8e5538357984d684ee1680b014574fbf917a1bab4b824328b4682d5b512f94df667403da84def98d3ebda577b898c3bf9a2037a39554e44b736bd69f9799a7cae6c06029f47855c4b3463e6ccfe785c73c124a265e60d969decd696897e1bdab75e1053621470d7855afd69b5b039ea39ffaffac01cf642eb8b513036e1f21efd17a51ade4af3b19a52e3c9088c58bec0bb61c66e122f6031383e739780181fc700d2ff4a03e58af4206dab7e851bfc3e8211f3c2bacf2cf6cda4c50bb85df835accec6456ef3ea5d54065a90b0dcde7eedc781cf24e1aacbbd67bb5ec02b5db04ef02ddd3513480e7c4dc196fafdfed7bae3f08fe1af9cdae2f456970b269a94ae41abe868a7442c6b8f87985bc8bb244bed5c88186b526297405c21109e81c063e69487711dd7a217f7fe53c310f2b912a64c833e5bf980e0cb2b30e014656196e666af79d62a62fcfad392034f5aac3474cb63d96e40f85a72a2695566f1473ef6ba8b7a70d72c651817eeeff51695edfffa9d1cd4e49955dddaba2175c3e15d81095634323716efafe4800e3f4f316cfcf7584c05a3b1d6248d31509fb70c8aa864af7cc64721d96903f1eb32329093a28760259e4d5bc4161faf8a1103d0d0eb3ad9c2480ec91b1c3cd0f6ff8a04ef6f47fa277e3792fefb2034ce392703fe6dd5623c8aa8c534bc8c4fbaa378abdbfd868f84c5a6897963eb46e78c6b8baafaf6f8117b73f64c48ce85b2d24292e39242c1fe83ce80ba935b0155afa613e0a4e33a5a2a4d348a6d5d141a2354c248988b051295d7e3450c8ab643e0e422be778d2164c51c59129a6db4078f5840582f1b82e9ded0beaa0488cae9c6b5baf7d95f11a99fec932357c6ea7f783bcc7e9e60b55832b6fc18abfde2282df7a242691172d33d0e2b43b38b0502bff0345b0d9943d38fb66b2a2d265647bdcbdcf0ea5e981f714184894c3f68027a67cf64ddb1aa91182c537f54c5aa9111c0b3e4a82ea6a80d9fe9d4613b856279c3dc7829fe72851444a195dc3643528590b85cff432f459d772fd95f3bad95980572c54f76c96f2e5f673f8196a1c0d0e9663631ffd4ced1194fc3f59aa957774d73fbc0de82bba7edbd9c01f18e57826ad3262b3a5d3bc5022bfc63927b4e4495989ad69a22ef6ff97b33462f6bee4ffd309a0ffeebd605745ad246b30613c14d8e542826297f103f2103281c3e127ffee47c3394c1e06b21c77a233d2a9fd8deea275a68c95bd391e9f8b372c7758d756c294acaf3118bb5d97b4b563243edc641e72aee138ccfb41f704c81882baab9bb4aad24eaad4f6be08be0ea17df316e9c540f3542f45697496d30e86d01031dbd50213b02b4ebf467d730640ddbb166b96309f1cea8a16e56746cea07a3ec862b544f0f0cc2db09e3cde90863b8e4009d5ff10548934e6341f41fe09d636334a065631c4a6da4e4e6a1a1cebae759a9ab13616944afb7777c54e43530dcf8981349028ff834201f74e019af10110c8ea95a48d77df607b667b91421a15fb3b96b26c7d7baade3314aa28fc3442b16d4459793245338305955dbe9ba01cc21631c0f4ece1eb15e02231be31825c9e5a1c993ae56b5eacfa598090df8edf24af766088bc3c9752acd397e87c8f2a22ad6de422892c3ecf9a2164a23d2570164aae3e9c2f3b4d23086013e34eca6781874c11b6ea6c3f1233203666e4e2651d2bf4a1c26fa28b921afecc0ef5d78a0c2acb1272a7ac1887cb4ba0bd98c0161c83679af95d5b1a07c3198c7a0c947f75d38a72c04b6c1136a772daef00a40d8d9f5ba05d114754f461ebf1544521ddabdc7a9165b0047a05a5bc2078ecea21d36f586c24c7ee42c7803581437e72c59dedc13c32415c0923003029f861f9ecebf5b467b5efc7d221ed04f7a09031d13a3b4baf03866831664da2550fe5725d3cc1e9631c6d3ca663581f2039eccdd0945577957f5bfee3a46ee2c982bb5c6519df71afe8949febb035bc7e0e7c508cd933db8973f61374ec5023d1d45f54fee75eead1104f1d9706807d77582be3201e91f3d999220f18309654dc5a430e033a2aeaedb2b04413b00fdbd6df913c78a8ce324d4756a0822ac0fcaa9b5ab3ceef796416ca6cb7fd75b4d2e28da035a28fb312366471a6e556677c90c39980798b0e0b3660e56f54d615c3f37442f7ba094d7d2df2a8855982ff628234cc13aa7bdec2225fea436310cca22bf03935da01e8df673f27bf037171476db91f05bb239e15539ac4ae181aeb149decc54d107f1e5384248c4dbbe4a10967150046d6c4520370e801f4c51ee6bf0c67b8f5085eff5b9f9409f1056f84ccd727c244e01617c0702b7886f49f2a551c01bf0c7c3e697071ef0a5ba5ff98fab4cf17d7951d247cc2f3eb00984baf419f839f967ff42b1779023962f155be95adedac18f4b59dc1f40eb45d553d5074180cba54cbe3efa106a1528800a1a1ea106f59158c5a211a83ea60be64b5b0461d349f3efd3d52a2a6e972185086ebaf82583c26949c3e0f67f79b4d7c4ec55aadd2355a3f40f40681114d716bfbbc223eb3ade59e15cd205cba29b3efc7e358d68aef8dae1a2d83ba68b15b4c1888588dc3b9625453a090be218bdf22b03fd91146dedd714fa2834396d4af1d43b074ebdc90e3c8aab8bc497a543446db0d4d93524d7bd933e29d4f752997eceeee202737b35d5bd17e90aae566f329a7e691ad0d38fec05d8554a9370e04600b7f1949abc3e171fe83477f8d4a82c889d8509ec9b647aa05ccf4675190f0a1e710f918c8d5f5602818c1f939bdd9747df0781590d815ef8851de82ee6d6baf593036e83c522a2cf3b218c6d1267871282ec6624d27417c85f4d444b6a5eea931733159c4652d6c498eee540c00405184ecfcfd24ae76dbfb69e66fba77a031acbd322e575302a0df08e3c4bb1fafadd61d2bca3ab62abe212a2a9835b90ace153f04e57ddf9e1891bf4a3abb68e55dd8a185145473819905b437206d282a0ef816a17b0b41f0594f355117aaffa349df8ed1fdcd4f16f1b5e399acf37e5a1e8785f53de95a7cbfeef2c69eb48bb0e97065d042de258868fa3f212e79e946e56107f1296b90f7e200897b0a8a064bbf77c4c92bc50995c8d5e6ce383c2362cf2566fd96403ea48519a5b1b9c0291fb89e10643db94c42e12d985ab09ece08630ba51d31985c2d20c4f4a12df7dd0ea497ebeac6cfb690539498bcc72fb338158899286fbca291e88e56cf1c70a5f17ba7055662e94c93856a6e147141484b2e22ee81c352443424ff4ae7cc66b460a228345fa2c93289a91614704253b1c962f3f4365f987fabe6738a70164a500e0adf41b8443a6dae1463882d0e348c7b0a7326bb89860499bbb788a7503ae75e0ffc1dc593585e4ad1aa5d6bb0d991015e995ef7dc9bf20adaac106fcd56ea436b2e3c7293c694aed719d05030744f6b6c3d965221b3a9c6f03ea642f6344ffb244ea205438faf0afc4f65ef679227d3ebb23c01eab7c12a6028949d09a1de0bd644ebfa0c6d6dbf11a3d86ef67135303dfb44ede042f1997f117db7ce4e5527d87e7481bb2064690a479e9a6751669599ece772e31bdfb2760f74293cb9c317aba148c3bd0d7635cf5b54e704f3df3edd5425c3929a36b4999caeb5a44f0c23519d496cb11251582811e8f753f37ffe80e256f353626f19264f662abed88087886c19d51a53bca74c9308a8f489307ffcb3de00c75802976699314cdd4d670a23db7f4d0c8028379df065f9c5ef1d4049da210a4e4a826507a16fc4e41c6d1fbbeb02ac9c8ac2cdced2001f8aa01ad983ca6a87d7cd24653d4b5309697e805211f662ca92f4ce2a3fd4912b5856366ed1d79c67eaee308a60b20b7e1589aca2c7c11e262edcda3f34d1794180c17b11572e1d801bafa67785d3fe103e49a6428f9cfd868f7f32ee764fc69e0a849305b41efe0e9e91815fe5b7a584732169157019a569a28d87914487d57bd20254e64baf0e1bf5c11bfff00375ea8e9bd0405ed7247a4054ad5dacae1b9141a5b653debd3b6e1f1fbf9dde115c5040b9d4b9d653f533cb64dfd38d1b0c61813014707a8bf07abea6a9c1cdc387082fa7c2df68a93f5ad46b57fe30512ed407611c30523d1775ddf8a7e545316a6e8f0a266d4454501bee7daceb1d99da858468de8d1e4fa63c7593d10c8510596dca8bbf6cf15c72c5886cce4c81287664f3eaf0d34508c118ee4a1ff82c0021e28488582e235bf5bfa83a531619c42e540e7e5a3cd2845a6fee114c0756255f9798abf607d93aa56e8794f05f5717efc9a9aae1ac030dec5d78074735e526a4906a88e74f36d30fbd69eb4056b222334f114c9765f8774109b53cb6cfa609f38f462ad9a66bff43f466d90847f6cdd1903ac709df20498a0ae7d8dc25c86041ea2126a31cb2b8739a9420c673672356c8cfe6074dbe5eee8355f47bb4317ad65a53ed58e8531bd1af0136ee231c69a357329833858493ee5780c060fffe1f5e6376a0643621269b7bc5eca4811b7784ea77caefde88dcaf877bae31348ea9f0a67db6b661bf3e974979b2407fcf29203df643f87c7c8c8619beb4db03eece69c9e1ac192941e6778fd0359c9c09c93c38b880c0f7bb10f253ddc8da2511a9d9860749ec090e66c1adeb2aab44d0b429370fc96c2377aa96fb3aebb85b42d88bd4b5870ad35c25f04258fa1fcb053e4611dc83ea9f8e036b01d86b91ee141dfd686fbad6edc8a236095b68c88e31e681930d8dcf7bc692b04ef0466276772e040f22cf722e418586502060d0444065197ad94af8bee0ac8f5c55b9a4f33d388702ced2a0f33704f5267159525b12c8d1e90c9290fa1e18a62530508f9c8f3ceff6bc02751f4cbbbba826a810a2fb09f39bf169608698ee994ee53f8b9d9e2e01ec60bd87e0764500f84ba9d400341afcd7c4022c56c25f80bc07eaebb454ffd97174f75e6f7841b4f12e597e84eb2abb3e9362779f8081ed8ab97fef880ef0fec74f124ab5ef2081e1148405c00acbed638cf9f6e937f17e28508fa0d9c39e5fd1e83454ec43f51c298c84d9acf1d908c3bdebcf20bb6392d8d5068a60f378b863add52191d7857b4d0c1f22d4f875a6745d913ec6e37bfca19ed8546ed0e127de7999aa079bb34b46ec6b60b8818900b83a470bcb47e57a746a43a1a8be7d9b342bcc3280c55519d236c24a566a607f020b498141044821932faa42fc9e27311e5670b7acad6dc75e6612988b78fe4562d9a08c49184e4926955743d188da4dfaaaca1b614f821c20e4c2774528781160782d6b8bbbae78895995b4241809688d7476113e116e7eeed221b51df2ca5e5629dcd7c6de561bfa367f6990c954c0ba7bd0e7df2d5b67bda7fa10892870370266941c00d1b41d96eeb5f237fa86a55f1b8519304a51264e1c1846ed723182035fed63c137877ea0fe9f6dadafe3c04b36a6c3842408762328e8565df1af2fa3e1d26fcd943aa5523eb6b5f6ace52811eb436b748e9ac99e7e98d1c2c60695b27bd85bdc44ce482e59018b5d70527e27a6166bca5b80b5150e126b1ea5933d0882938c94256dbd5b63e8190956426645789fb0192171329715328a721f7e690ac16e246498508c043f3fc9632dc833be644d31225d28fab9816630811d648dcedbb23041bf5bbb0546c805b4dda1f7362a0f00eb6b9c3d5bdd927b076fd587cf47adb40e1494cba5fde2259fa4b28c1fb3a6030839ffc3ecc5bd67db52ae6d4049645a96056225db430d8cfc737642907e17b9af2a7c7b662c882bb95403ade8f413c9e4fd3a79ac65ed337d6ea995d716dc7a5253fa2550dbc3e397171f7a0db3d87c98f69275628e458268658d7aaa73e9040d26e7ac70097dc1d01a0c49b0aef580cb013bf6ce45a1b93499639ce16e7e524fe22a55589c6c1998fe7f17ce01c0d0fc7146b73e11aa3d1ea4c9549c7e31d2b10da7f8df49d0d2b825dc16cfb7af2ee1cd180c79b2f520fe78255ce56c38c23012a12b5dcaa06ce51965a83606d772b4b599f000ed5f84e5e57fe1b7b833909391be9b7effa53dc42c83dbf32f9a5809f27b1ef3a1a3284fd7c86e3788da0b9548137d7201a34f1b3143b781c42a415714e8774ee89fc6e5708a60ce9546f364fff0ad18365fce9d86f5ae1b00bb0aa11defbd00e84b8b78c5b211a150b90c85b4af04ead10f5dc09b4dbcb7d3e2ef8a3a5afeffb91416d97362d71b6247a49585f1dfb3426594ac90595dd87284c0f9213de9003f848361cbb2562c97ae52da95ef4cdfbad8ca312a6e6f196d87015001352c9f79ffd94ab3e9f153ca70318e2659a5475f7ea2a712ec632b9cbac4cfbdc5b814e3789cec8ad54bb90d506c50adc8345e8f80d39b7e5e861226dedd63ecebdfe1db92a5054f120e1548e906f894c443d6d4209098a61802b3fa64903f4b2b35f2bbb81bb91bc16843f179d343a491dd607e6a83214d2225ca11c91eda4f9d7efb9955ea3594368c9ecf01cc03538c0110fc076e27ac6d77197301c2aaabece420b24e090a61bc381c3386b16da697432d556363bb88997007a75a200c352ab843db043cc28da2cc5c742adf3fda4a213d80fb90ef43525b3fcd4bea0d00995bf2fe07321547ec22cad64e7aad7eb2c77009e0543ad82a8125ceae076216fe09512c4d2f97e9efbaddb5a09ddb7a0d5561ff92a78b0eb5e80723e689dfffcd73723518fb70fa8785a7ab7eff2c3147b6a97b5d9ecad99bc92ef8ca01cc13525a5608db58244b709e7f763f821262c2326d496706b784ef5e1f695cf27162a2406237edd778da057c6aa7dcef2bf0ac204ca03384c667142ac15922c9695bac17f92d99257b1299d4d03dcd1005aa7df4de27f927888bbdac4960d4ec43f4341b7bf978bb7a4f034c9d36e2f94ba52286e4cb34577d83e1e8957006416731916d9b7ce2335c87f12396d60dd1bb49f69939cb178a102ca3281fda7b2f40933b95686f5ddb221ec975a2032e2761c4747e0190ff69b4737801337c5e02f7c65ae37c0079ce4b642de5178de06f3be5a6e570f9b19abb05d5668f88412cf1682c804505af05e4db8a83d9ecab3ffb8de95c08d25e0f791c692465c0feb2bcb34b753a69b8af0a850d03c048090e32ecdee023f1184612b8b14f6e5a395b85b27b75895664aaa15e41ad0f632388cc3e8d96214b7120d02498dc8fe9395438f26f54ab8ca4daa1c87c53fd5488a0a3a6ca3afc7087cae6a0028a43851ecd85986c87a37ee48ead471d1750123af1f7f10b3d1dbf402c4e78d0ea84cc5ee13dc85d133802060e844c011c951ffaa6af0678e2173d79d9f4854ef82b6e5f82c94ecd4d1fd8f57689a04f4246f06d0d93b989a01914e5a8820bbccc51f9269173008a9408f1849100eaa6995dc6d57551761d711e005120a4372ce85a22f767ebe39bed0a7e02bbe4fb1d602d5427134331490ca3b41ae92a7d66a74ebab940d11a394026a840703fc52934c83b201cf7b8fb01dbb4f6980c765ba6a06082877cfc9b7200e2f326c1a57fd10648a5de551ffe872ee1399a51e8d93d254d752da6d16986a2c03ca5785e2c649d3e7b2dcdb412904b8604de1883c5bfa4027c7c564125cd1242d49050a728ef461055ab63a272b995a4664a36c4594ad5b592f08858abcb15455a7b1ca22f34eb446a744afacc6c47513e0eadfb63df3742e8cd4c7fd75324c35f1eeb46a8a7f809ebe754961ad63b44e6ac6b586b74271085fba87d7c88dd2a64bae7bb9471fa80f87909c984aeeaa74c5dd2388ec25db2dcebb12404bca3651cf1b4ea3b9a8bfbbacb018a16307eaa12f31e79b9058432cc8fae964956e4491aae04f60a17009e379fbf7e565c8c42cdbf5c4776f2460f8053e5fd2dea09b0055f72260779764a50c127c92c887e5cc083138b5bfccd8f42f686f04d784e34b3cc1fc3d4c882371505f85e55285b19d8dd9bbcd2d52faa1292b08126550540b07305be7420160a0f53ecbdd43b06f05b2fa9a949ce634765296c95ba1902bf53bc298e87d26ad9f37feea595f0a9214d3131e67fd12ffd4f880696a0bf71dbb2d54737393cfa677c251f5a12009834e961b44cb13555db1f354d8d8cc3977362748b8271f5f42693c74c0143d532459720f09a62769250988be45ec05029f74794880970fdda7f373be325b1d744b63c6a6ec4a0fc0c6f5be64aad06246760fd97289c695437a5cdb7f67ddf04dc5a2863179cc2bf3f976bc12c4760ff83f0730f1d9b0edd13be3c96b029b3758f0687cea2dd7a44e50b8591b5400af2854ac684f1f036e591b800fb9de42342d66af6b7260834ef0dd3d3312fea79c5bf603055fc8f02a450206b5ba19531057e11a0b11b4d5283b0608d02d91e583dad7fcbd61112fb4bcc2d4d450fa5892a19483a2b680e3cc6dac80f4fb507c7b94239c29bbe4b065931702354059d102f9751b9ffb465e441ab5f2393473a950ec19188e41df07a87865f1021e2e15afb70d32b5ef1afd718a63b6561384d1d762678aac1d840d844f001b0956f9281a5ea39a682188c4a3466a5cab00a458cfcf73100be56dff32442be1a7e162d2990f98a12a23b4de1355d8bfa543d3a1c19605bbace5260dbf4b32fd00964ddeee809d2f911bbca40df1bf78e58cb9b32da0c29240422cb1f40f2bd2f35e3979066c8b6cbd47f55b452670345bd4c85b1fa48e0682bcd1423f335de2b07473b091d28570a55094fc820295a8eef04c534f771f6ec40f9c3e2278fa1949f7691cba21bd84fa040e5417d80639aceecb09b93e3a72576f434398ef4bbd147ce3598e2552fc19299f212d7975c7b7bacf0b9bc52ae40631bd4a9fe038e5c5852867f7f5a4a596b6f03abbee4cb649fa5a9cf27b770fbf1e1c641065653e391105769e5552346032bd7be21363af2a50f19f5dd8af7a6a44846cf20191d049959e8cd8f874e567e82b0f9cc20a26ee9209394e40697999774dca7bc5ed3cdbe0c426ffcf803910539855b8f3ef261e32b5c7beffc14d3899c7ae3f45aa69b37a3d81d12506ecf9d20de236063f5ff8f1de57507bca217b2ace827b8a523ac1b5012dcb6c7cd2cbb7b4476d91654ca35a9aeb210d41ee7735c5f04f561959da904b692a4b1b854546f79902c95390b2743caca5c621368360d5ffef905bd1c89aaba11006c02157c294236755e2ede1185cc43e0b87f52959af36479062de29ecdf1011423214c8d945ad07d690d0ace9ca7c709ccf4fc4cb587fe63693e8905193fe909200ec1ee2bf3e44b31c3f8a5d6eae6bc7132e30bf2663044894766cad902a169357532c65f760fa0484ecdb91ae781bb8d5a1ac39d8e27f5aba80c3823b521b129951d5845525b3b074fa11e33aaff19d00e247f8f2e789fba58b917146b130223a04908f901a9107f16220dccefc7d254c3f27e9165eba85bf55529d938247349eab140af787b2b07b8400751a9ff16e5656d1ca5d0a91daf4f6850689cc533ee3ff0ac54c62e1c60610c8d5044c222188eff60f4121461462e785ac3c9592cc1046662a8ed1d66b6af8209a7d24fa06744289575532b3b96231cef45e5afd6e0328cdcddfe7bfd68656194beb4bfa06ad7c9b4bf440989616c74d242a428dd13142691e308cedea10190f3d05708cd3a79cab22e2a7bf907d411862e782cc63d3d93f18feecdbd55202b1e5c706429be4e4fadebc9688244b4070708701bd743ae1c59b55c3cc8b708f987593468f5460bb415793a355fec2686ccb548f4f1ebfeab9797631c1bb276e26471a0587e81055cb2a0464738732c4c017bffbc41502b59dd76aa444e621d77d396b129e289ec6478847454f0b516488eaf516d9f302322c9dd452683357b3db0453c647fc49ab81a1c041a0e1457405d7a4cdd600075aa6a2ed074ebd78748cff75b245eadf1461d0c5a099b08985e3edeca675e47815f342aed4a14f90f51e4009f80fbf44ff4d47ce2b4196f4a7fc47153749214eed441447e9e2988d42635198f7ddd8d1b2bc990191fdee388fe80941c1d44262cfac8177f6635fa97c336cd3268a5da8aacafc6d6971e540df3c2bb6ce588203474060836c0c4ba3a0c946b37fb024201be479748b6645f2b9f92ae2145ca48909c35e0f279702729cd063381ab40bd4e1efe0423356b83545d5f72e46424626cf3391ed0f107f53b5829c581d37e0aeb2e23dff4b5c53715eae30e82e1e833e0ae8045ec6cae9bf78c03e3e8b35a462c673363d0b0348b249993e1a4fb5f390d351f1c2bc7313c1d7f32f561e26ad57f879db1ccf992f9fc9ad73de95605bc72514f79d1a61d76fc042d09c1328eeedc96443346da43110c015cdb1fabd0f8ec5315fe0d53d49e7a06af1f7e280c4f1b5c5d644b0f60da4101afc5912b5a57196d5a6b2d77405811bdb370281ded7c7451962a9a5ac76892679f3a52f10cfe576ecbec0b7948813835bdc6fa4f9d39c4b33108291a7ed169b410df162862010b8e4b814975876b0c0313ff8b5badc1703f9c7b2040342a4fdc1293af0040325c93c7a63a22df212c4aa9ee92641fe1ddcdf2ca6ef1810b49ddb39317072380b62cf7b78b5b226c48b3e84d0a6442a88f36e366f54c7929c24ab158903f88a32a14809c3f9d04eb374172e5954e200666799a2275560fc79c397f1c7fb1829dd2727399618c5eb3b4ec5e1889d1592038a7604f6b22605caa8e0f612cc236e53850643156a218360ca11e06cf061e06ab32975105bc1c18fc8283356fb7565efb80aeb05b659a88317cf623c46f733eeff9d12c64c37c7e994fd3c5ae11d865086b80628d34a2f7099c35277c09055bac9392345062a22eb80d0b2cb13584027cf06ce754777263f60948505bb6d21cdeaee9f7111ae5a1211a3d2a7c7a57473c4dd133de14758ab04cb84e27f44f2bcadeed09e3e7fbc9732460ef19d52286f8194e33cbedb9969a47ad532bf652e804792604fa46127c72711a10b67df73a8ee13b7fbb7ea03969f65a2d75435367a2413d8b98100e37ffc46173c30f2025e9b033cbeb9f003b7de436860beb0a2bbe0d5ea11e9d931b457b8903cd3d4d8f6d636253bac2a050657b7450f1153e342a23ed7845c9f419c161096543d24ac9257505d52c2532c6abf451845dd76560017869e75b08e99356607a1e54069471a966ffb9005bec5a4e77355ab300b4ce3e64451e9165949bdd0755a714064d68eaa0456c1f183a1326ab8fb68c121a1cd94d53f1d71263bcea849d1e7ed3c1c0b18f12128b57c80ff332352ac0211c90808036e4878e005a4eca84553339a806271295135b0509f142143b62c6b1ad70c15477e0eddf502f035facb2848c6bf28f4ef4a741c0fed55eed7d9c0d1d4ac567d4a3366202bd61ad9ccaf0ad60c89812f5a4a82b3542961633af3164cf7f1bd0e69435f6acdf9ff9064f29640a66621003f67a1d5af58db148299d21960ee9ad3f05f834b057833561bf6a570d917c50f761ff4384afe3717aa68b98687961173f13be15620c6f388992609509a23f47fa09ee8b47a36e73e77a2a1c80112bf9435f4599f8ce4e812314351e007748ff9a7fa68ecd1f4a2eeeb857c540817f2928a1cd1e15c074e32c65e8351312a82deba9cbbf36102e454a81c9ec1f0c66e5b0d3bbb21c9a17b024d753db995a57030b464687c9d697413d51c36fe28d31c7209271f7be4bb8c8349a78df15127a4b160f3d49cd454494196180263727771721c79ae68f445c3ca21cbc2479067a8107f95defd25f4ac3704c23b6e5f64f4a08dac88819d9d2ad4484afabfeefb1a6197d66f4767a7aa108b35e05ebb3e792b8786426be05f00086b0863063ae1c7d1d805b6c003b4b10f30cf4099ab4f0dfc908ad2e3cdf13b66195275e238f5c8ed6a3301d4d7ca5fe8569657691a739e9ee6933ad89b4be62db8b67238b4b2243125eedf66a2b2ac0d36d7d46393bd3a3dd10ae167da5c891bb8f4e0a4165eb721df49e7be22d0fffcba47d89e679a511e94a8b7c2b670c7186f7ee0a899310a1a682accc6915a993327e6941751fc949e57773505a5168d5d63c37d0ef1c6c2dc74c60e7dcfb6f075c9cb0e10c2636a66c7ad940eb4c5aa6d639a0fb61cc8b0280d439c089c73144c7f087e7a064bb0b3eef32358be543554daeb34b4af8db3996844c984c3cbde9aba77496697c4458a5c291f698469c6f9b00d479c0d349bda1d8842e85d0ff041121813044b3067b3133bba4dac895ef81f8703af06bf64346076d024a7bc54f128e274745cdb15369d777fbeed908886d4486a89a7c4c0ff1ff8622b60df634af15bcebc86b78266a7ee2d31258b9fc011da45c31a56fb8455cb50e1983ee49686a4e54faeae9edca60b3f7c05b21da5d6ffd6adf706d17523c9a869a6db6a86052b82b63bbdc27fa7936774ecdc3af06f63b305031df24779c593fd3e2f07a6f6918f2a61536c8abd6c49a207692f71ecbb496ed82adf980675ffa1faa1e0e4d0140a0af17c39c0fd12da22e144116e7d361237165e466d82b1196a7c8a1f8f05ed1dc3c1aa58fc481f3785c23e0d4c084c510da99a20ce59d466312bf321d9f8cb0119107de622bc9e24b7d7e12dae7cb22844783f90af23622f34235a48ef86c942e5e5f6cf6ee44f1421a03a9d96746842e09b6f693244c18342b8d85b73d49206f3c876114ec0ad442ba923a7430ddde019a9f87c5c5fe386bba15473e904e9dc26ab336180fd945de767e36f622e2ca9d6d190434e2d68b8f82b2e3dd02174f0055f2121991913480ec149ba42d3338fc99cb23cd5db03fb355f314c26cbf75c41bd23fd6c91107c26a677d4ca1c309933c6cb0ac0ca6b9e4cc21d40847c395162cdd65c25ef22a37b51fbf159822f47febad712ec4967257eee3ce89525bf519d2c32476676821be304c9f742a147221aefc386adf6ec33fdf2871f46082d35007f1fe55f330a549211e83114aa07d0d5e8710a424d6c338402527a6bfaa2342330db5e7d81642d1968f682ac82b3534fa6f937d1cdec3fb76dad935ca907c423151ca3c76e9304f01a7996d8b6f00ca6ab030c7b9d6bed083b9beeaff1adde82d2f64369a2a22ba8890ad36cebb17b5033423161ec35d703664c056796ea88840a1f51b9d75ba466f9358f797f2496036c0c69fb6ca22d17566c2806dc70f7abe50d88e746d586cb08c47eec6d684fa6c8522b1cc3f3d10aaea3894fec45ba696fe8eb63bcaa01720d9d84bc6f23ab59d4f659ae263e4a2c030b6cadb3f1f45439b01971498f356a676b4718524e2ae8a4f190763594d35b0743a43ecea3aac24dbb077dd2e9e793563e657cedfe0e8bbd801981ce865e600c14897453f4605ddc5d61d8a71ad8d6929636beedcb95ea315e9dbe9e549a7ee3ae82c2971842ac6985382bdbdf00c62c0c8133cd2b8610c26bdef7741d8b54084654c1d017f49960d20a8af38bf8198bc54bfa3f782c55cb1fcd8a8b208649973eeef03c0030b9792aa3153e9d8a44066ab0edc0e10922648a7df11b436ce4bf86db5c159278043c9153582679247aed6b400994e2a3656ef03d7062253a12f729cf062dc7000f6aa5e1ae9abe267c43fc4d6dae13679419fecba7dd7e4e39c0c3874585b52e6f656277dc3b3e4bd9d73814912e001fe8c627ac8d2e25ffb53e50f3d9344995c9e0dad9b34fddeccff0eac02594ebface26addc2911ec3c464efc2fed0a1ac0346756e4514cea46e4e970e3c5c2381b7a0841bca1343074cf058f6b235786314fa55c87ebefcfd6e50c7f88124be39066adc8179ea6027e195a98477834d27f201a1ab672b0cbd36fb8d1bbb786149c4e52951328f0f73bb3215653a505e3b6fd8e0b489ff3cf2ad91570d9273d2c9baa5105dca6efb512f277bb3f57831759d4e0469c80bc45a09ca20c35ad03fecb91758a5778e8ea2341a05b9658061ced67ce305bea4df25f82ec59893111ef983155c107bbf3c642a23096c95f037ae0318e44ca9d478a9801d1b33d7c8ee01b90ad57eb12841841a07c25de193cdca4f9e452bcaff1a26873d82171c04d3a938932d9c1253d0919982673f6348aa9ab67798ff6856e2c199b0cadd16cfffa21e65ba18ae7cbdaceb1b4788806aaf5d03b1f88d2091226625757bc7277e49b099f57bb11928a8260c24398e08f9b6a6fb8bc5c475fc29da1d021a77a5e4c3bd165d9e3e58cd42443245f8602b19fc6d0896120935693a8e9cf499eafdb8c33b2095e195ea048852aaf9fd46bc21cd2448f6a38577f235dc834f0d92f54d944c51cfa65151698a2ba3d2045f4d15d27c6f43802ee34ac56eb9c31a133494e2768fe321ac9e3ab00417c39e3a884e15a3e848ac342ad9f5d1b8d62f027d26b26ec303cca573f587a6ad72e42519a0fb8e62110b5417f4de59da28d7c0b810708b3662542c6fb8bf2edd6c1e59bc69af6dc97a3dec555ec8935d97c9703864d6bb48f300fa6999d65f62bdf1ce5bb603b9658026239faebebc0acbad9400e819e661d77055645095d71a89b0e4cab5ac152ed36594a02610322e8e39aefd531edf3389910c63bc2088b69c1f1818a5bd52129d7ac713414b756973cedd206988142eb8bda9d510b87c40bc4b919cb3eb44fe533af5bebdcf6ebeaecf6e24d3cde4b79dfb279fd7243079ec17702795a0a654274bfb17ff8256db7031b112e172694711936e039967b1234b67513758d5374d99fe63c72657ed6d41eb2e5089ad8c07db32170894f62963144dc8118f72c4fd7fe28430b4fa22c392cb04a83860dd8c694b204920312f1ba7bc744e8f97c5ced84d976f7d744839f8e4c14677f40cd218b9035ec2750186002c71e080027235d560225eb5058b4619db1d2cbccfbf40a36a96aa019f983dd209fcdb140bee19fcc35885b57bc37cd4d9cdb28fa78e77b7f9296c1c5d02eb9dfb794087d476f2b1be29982c7f1ff5d547f73bb0452ddae974e4a35bd30a3faa96a84db029de42ef8cda77831a0c64d8bfe5a85d31ef6ebaae208d7f84548dfdf42aa102974a3cccab55efe7d4868c1205bd2b28c7cb363f8f1aefaaee4c04d17a3b971620963094e970893ea6df2fb4a514cce7f1ffa6588b280a99c8b356838582a514ee298b323607264e10f18fe003b9fcc385fbdd24106bad25a3f5d4a794733e5bcb2c2b647cb387847aaa544b0a46c75e7322455775155e9b60be417f7c085971d6bed03d64d75cbebd30ee8e90b7bafd44e7f97ce42dd977b690266d42d52fb74f128c6d1ec66f53eb35b4b262c3e56473712b5c59ac065525f3de122c3a2804458b5e5e8080590249f37748ad8eb74f773f2242a7865f40aa413fbce59da71e12f5d46339a44d599c6a96276d827a581d92cdcb9e9323989b7c97e6591ff625d5070f69143e5cda5b9222e91b98026be2c494dbf3c46a4e591580694cce135ab464873044bb8878494fe3f7d8a3ae3596f7efb02deb194196aa9e0ac8fa58468a8b8118c1a874255462c62a0485ffdc1d1be65bc31e256c75440e9ece41ee21407b88f7a8be0e98466fa46de743236a0a1281b0da4fd51b2abd53280a72a2b51a29e4ee106996856982b192f6d2762df5bb0e0fb492179807f5fe990fe1b4bf181c306ac2ca7cf08a3483eae3067ca5520715c699236d5eb7ad1eb7b408e13639bf46f7f49f21ac045038068967035d0bf59f13af47b09c01e36d5b136c64e392deb10820f1b8ae36918c3893ee6c38f5ba0dd9714f13c01d21674ebe51696ff14aa4f258c8f6e6304e5e6d7c2c1d28771c3cbecb26ec5037af11e772d42278a5a3971c92946fb6f47f95a59f5fa6639ab86f20c27f6dd5c8ef1c9f08deb3bba3a35f9a48922e5e711c7c9991a02f989a6c6b4d3fc586d8d6c85003219ea466ba4a16ebd73e627ebddfb18403bed5ba82e5003331d1d37250ceda14f71ee705c166e2338c00bb9907708866a72653919bfe2e07a4a1af8afdeb73538ff04c899687bce93e7157b78d49c8ca0e03f3299a27a48401e363983b06fa27ee2745aac7125cbc332b18a3afcf3739694e2057c27cdc33f6d2386cf69d3d69f938d6944bd5243fbc19175d395fd63a9848332fc267385a56c0e5303eb45e6470535fff46ad86392605d73ab2231f3b8e73dcdeded0ab8a1fb6ac19a1432c299126675f7e7657c25857ced0e99449db446ff2dae530f79f309f1b2b1684254da5203340bf65e0e1e333565cd12c18471eef5259e1e7022642e55c835e601c514f4b819772a6c9dd4c5ed8c3b86d603f5bd8a7627d963f094e93556e3085203d6a39ee98a0491e7a362718df362e0d39799044403522102665a42b7d497e1135eeb91f5a7f8e1111637242e33a1cdf19909d0401ac136f6ca266c2391d5eefd515461a7a018ba7ff0bc673c5e8c9564a8fda502eebd736ad7079e9eb022d5dc6e1545a90061b7da1975f6ff51c0afde11d710fe00acf1fcc9da353d1db37099c2c44aedeef9d336c9edc1ad999c7cecfb4313154fc09a567a02e4d4944cbd1b6a9a68457f3c3de558b351168865174a835f0b3c1e6e60c87158ff6e73abae441eaf8ba522b2edbf524ae0c1de4962184a6fda33b0247efe704aa6ccc15ce33734392415446e3ef388d8b2babb25841bc940799c05466d5ace89ae46e83a03da3974d768840a14803c519c44e0e2cbbdc8dc122e054389675e67c67691b0c2df382b269bb71fd64d84d853aa8b7d8753304b9bd0834a99c60bafd1a6a0ceea409c9aed76ea162f8dbfec0acc895d02b1f6fd1a8c02c2761dd085696dddbe71faf9dafef4b6d0bb4806397ed7839f656bd4412b3df6f21438015c98c110b9e153e69fead76bc1af1135b4933e9512bbcdd27714e5a6b52347ce9d9a99e974aa1456d0a3085358dde32877533e3e9f315b6940498e3ded17d2cfbbedfce43caca05d1d3a879e1431e61078a717834c0672928320b1dce8c6502c733df44d54df6096ada8583030e120650098906b4e0b79d21d4c6960be2fbdc46b8bad6586ec844f6cda0af8e27072f7327782d122fd81e14d06a976ce4d15e57af7f7f518208fca80deae48586f4e4968027538e6f4210d3d215424a1f8a004b6bf9d86af20c623c79a32326e6e32026264595eda4de8cdcce209998f05be9dbec9e0896821ff19ebbb989eb794225d872f9e07e0184b508f9743c96a3cd5469322030f24c702fff55a0adc01a18dd4c0748cf0bae75876bf3b7335820eca11da221918fcee8087cd4d0e674259c08b29278629b13540b06de36876b3db0c1b79f2c2ef16a51d97eb4fff153eae71edda3487b808a5502d71a56c70bc798cff59dec3acd785ad4cbf159b4f934bb7760061160051e3d6daa89b7c874ff224aed2c09554b3d265316d3915a49b9c56663b85d144a8c75fbe94be911f85ee0776e4d54f1878a096b6563ac80fcbf00ff4fae9bf3b5f695fd25987b11ecc66b18bf01f40bd01919b02da54069a32a151b184ff2667a24a7690af93e171394be812c8a55395d866b6497c085fab0838686ef085c63b6ba9dfa25fd25298fd113645ad35bcee263cc0e3975ab52f8a56355a54b6f5b1dd9cb3a7302b957a80d6077fe732e97257d63077e712c537f68e3d7336c75a58e5113659b2c94a7915fca89b1aeb28154de7e679f37525b483573524ef47788d94cc236e5f951c503c767eb226101fd1e7f0508625fa8457d83b22fed08b5aa6d540c8099ed6ff1c602282a4ac158919124b12fb0e4637e81875677c6f66069d13cb621725b953f9c63d9e0d079cbc265df08bec186cddccf6dce02954d58f46584848ab6daa7aaab9d5919cac2ce4fde153ad3e509e113a0791bcf79d093625d35e60beb3f539e25b0cc493637d78048a806a324b7f3d13ac61958feafecae1b9368a7169f19bcbb97ae375d3652b4306772fa1d2711d87c4aeabd8307e5b87e9c616909cd2728057c849bce341f96b0195e6a439cc8e0847c9b4dadbff1869efc93613c18b27d17fe28c9f0d7dcf05fcd4cc54b774a2210837a210654f056620fd7cf04117b62e65e25836bd7a10665f71222c2f5345689113f4798e0c520712915c76fb9cccf9dafa98d4e843bfc7750486f627d3927e5892c9c359d25a49e268ff53ef8c025a79f933d692f0c318c49300e0c8dcf1555a361958d271c005d07cd09c333ce8d327b35464dc851a79c0c8677d20791436ec7dda81979b651358140fb0559349ee547aefaf33d7232edd9bf2be090ed8b57136f87a4906ea0aedb1ce61464891a05038c41e1e7b8d6d914ba1f7024e930829cefcc44d5d5c5981ec839257bdad40952b858665a07ce7f7fb379e772e2d45f9df044f19565082651c85e5b24d32b9797902e7d3b57558f455188ed69521e6fbf6cea671684bc233a4c1966c3037d0428cdce1db5126850627309db0608b59ca63b1245543eb6d6e3d1d2b3980228cf4cceee3a7f1f75a0ee6d1a166e0eb948d20fad28c29af6e2139cb76f5d419570ae498aa65043142b0d740a9fa7e4e4c3854290a8bb1606a15e58f3b2c00bfe07931b29a692e3ecd5c4cdd104e51f54904721314a1ecd108c6c9ca6902d551eeed40702afb8ad14b9d382213c1b1c7ce54c4fa1f4e7feb8e5a5d64df4ed2bc5edb8a8d19152c43ec0c733dbd774e52e2d4bb1a307d71375b375448298bb72acfd9d1b9ce2c306ddd81f3f63cff89e68a2d064472fc138bc6ad35739117f0128d7ef7c1fa139f48b808c7c5ba1c94ee66636248dff8e62782cc8b48e6225922a64d68f13aaaab1de6c16a583c958364843b0d5bfe73a0843c9ff8de7c38bb78015f3f099f2e6a40e59e03a0d25cb7e61072652e60920c8553652563591fb8366ebad31430adad25a4a104f3f5daa6cd2da2dbbe79bbbc1362d5b16dfd5d7d7349c0572dcb6adadbd3da8c1d724502be7f8852cebfd39a0cb863c41549ca03a8b5b586317ae5d5ad2d537adfc61d5df8672dac0537486c093e5abd8fe31395b5d9f62af5b9019fce9f6c418ca1ba1ec77f8780cb2a4141b2ad48812eb684ab4147773f748267ca953d71c9b20b50875f33bbc770b1f82eb5bd25de9d39722a5d28989cb7b8d10250df31ded19ff634fd95f1473d916b20c89d956399876e57e8fa8c362dcb4a9eee97aefba0382174b76611e20264b43ee7d98ade7934b68526b6a5dc4ea9a5da149524c52488bd2b4029f378a4b5448a6a1fa1afbe9487126490bfb074dbe70edf591e518df8f8926c9d50339e28ed4cb5f9492f6d837035ccf82e62ccac2a6c9bea2a05522fe7944345e80f5a527ea72e4f46a72ff40830114376c39ea969d1fa78bbe138fa8ac920661039249ce607ddd59a1edc969fde9d9e592a63c5ebff3689a0036c40b19f585f1d3a207b2ce2d050b0b86764208e904abafa4205b409201afcb879deb36e732b2cb3758183a19c531b2ea8d2179b0902b06555a064a888275b67a3fc0b7eeac2131ea07cc7016f1307bdaca3926dd9e6569c5fe539a8d6b0d0f1ac65f790923c96766ff31f287db81e763cf2137c614e6c933ff7ef8082ca0c296156cdf9bd9322f9aa2373fbbf9f026787deb86ebfddc0de82a9cae2e5aff85898249aa55dd99e4e97c7e5e7c25be9a973eafde00ae5c5ff36ee64a307a176b920a9c5a778f6d8c969d9354243e2a22f0c6acd11d7c26b6af489c68a7347480d5c9509f3a0c3280d5d15a08f6323dd478115de815deae67c1402a6e6bc7407521f66a98fafb3603f7cc98b29922d2ffa00f5ee28fb6060050323390dc5e2b3718c2cd49053264957ce0ba473d171268c56a5acad123b7ed19e3525758e4eef84268bd638a438184d661085baa7a8da6c55de8ab6f6525090ffba22a36ff647232e7dc68caaf37779a03608a93d0d26952829b6bc421fd1b1513cb4a79ab11262e98b5ebc806130c24a6a5260769ecc8bad2305d5ea8d9e813587183b2e31d9e9a2b13bd4aabfe5a33b2e88a8e6f86fccf8648f564d7d638d4cac4c97573b4d1f703f5d1ef08dc40c30a3ca2fc48373173c292f49bb1d8aec04e8f0b9f11941d7e47f569094d7e787d18585bde9cf8989199ab2cff51f299a1ba1af99e2d360f12a5ecf491d37bf63b92801c54e344a4e63a2b94446ad73231b9f1cba5f5e425d988967b7bab09693cd65ddc4c92b5ae775144ad2996bcdd10c38baad1ab98187127981f23fa00d0e92b079b0ae4deffcf5d23540ed0441779a6ce27432b02ac51b98aba02c5945f76779e0615c96b733a01c98818bec898cce9cbbdbf908e126531365fbd451ebb2b2fbcccbfbdf5c46e34cb89b446edda96d1268f7c79a6b377160f59d99ee6bd2573f85733ebd4615887abaa5ee130dde98697ff566dd5e41367ce4100d201b393d82f887359cd42e55d40caf890d556b4828183af98a349d24d0dae4f6a457f14cf84656daca7e0ef1319ff32a0320e1b1485bb9a30e1b29422fcfe9bad18990edda268bddf523c2b30cce43b4f4f7d3ae488c20f97b3c5909b626cadf62ecdd7d24f50e6f9dccdcd9857877e86a41cbf0433d64420d8a7d91dd83a92d8838d49241a4a789ec597ce5b4a05164d2c1a8bf00cf0049af6aec64f9f4a8a6a9f1a63f1fcc77b55b8a76433bd6b3cb59e6dd8dd3d42361731d5acd4cc62cf2b90641787e606cde9a49c2edefb04a87e47ee4e3277eda7e28a0a44bd3cc7a31fc6b8d2344ddaa91ae12d0fe9ea5ff0e82cc48396f369d9aae4da551b2299e89da4a6319aca0814f9454d9e19b697f503e3c3cdf2f21171bede9f73292df0c0d339b0f5ea89e4eba64442b72d94fb0a0b96091663c06880c38c1bd3b7edd40c92d79785520d878985ea0052148a39124b751d5b560d3d5ed45094eff80e6578405c450faef46f933f4c7ac166ef359c513a4e6787ba5b55e2e746a5e0ced9b91e28a6a3cca95a0f96d2b6ff41424a02529c67b3f393f6af6919f84d2c92f54171d12ed039df340b445c1b205e881de2933592ac1f9c433c50a749b903b5c290eba3376d71330a417dc7c0c78611fad920b0079159a64bc39f71ae5802719808837dd2a3603795fccd94f64928953a82af4d2e9522919d047dcf5c7a075d43319cd43107dd85340b797b57646d35c372b7f19907739c66a30001ca872d31b31f1c35c247877866da007959f714973fd5f72b5121be0ef62a4e1ebc6561396ea6ec3faca2a39eba1f0257602fc4fde36106d893eec6f9d25684b1242fdf08a1462299c8f935d487610e71d697a58b031197c612cd9ae8a0f108ed86f664ef7c10516c699a82342496c22c371fe2702dd6dbc5c6d33e39bcaab22acd19ffb623c44e7ae5f14232fe36635e04d4233dd56609387794e7bef7036894d312b78f25b5931e517103c0407cbb016e2fa865b8629f951c54f7051d6dd9f0bc63bce16b439f97843ce76a502a1db35f5e1272370226a229448f12810bfcd98b0dd8581ce75dbf1279a2c8e713246881df1707f3ef90a826204a9dd2bfe080756018b6afb5af7d26ec799abd97c9ae75fa1d823b0217b6d700bba6c33ee5ee90dc3943421dd69689a535b66ae988a2627db3844147db5422a6466d750452742cfd7e37f587c24b6914a8e757cdea1f93ad6e76e92e0c2dffc4a024c321b86d4dbc817b2fd4fc555cae9a580a7570c5dcc6e975ec0428593217abbf20a607049cbdb592847b845534f29067cc9573ae34357a121dceae41af1502ed963deaf346eff1b3542a6aa5f057d61113f6d93983172b4b331f710b7648aad453ec8d031cbc80d44812bcd5c408dfb161256cbfa6a46a16937dbffcefd282eaa22c8cb03f09e3af7f3c198e1f9b57e3de55b47208fd12974c6e53ace476377c3f165846dd15d7ee8318f4366f2d0c7ffb5016570a5c5f73ce16c5762353e05bb774c1ac296f83d03a34ed83fbd6f30e6d0ecb9b1f64e4aca4eafbf9a8b9233e24bf5b66425a24ce05c2c9731da1bf6b7bedd5b92c3727c0f6a2b642d8c962ffbcc69af54b34fbd0e288b60afebd96fd6449b5b70f66fdb21ea074b3f05ee22fd2d3e2598d56eddf300493718cc80faa99fcb2793e3b41e06f390bf2ead95abe26ee2cf6c86e794f92fae123a04b8f6e931f204581261fd0a37706b243391289a0b6decac2cc0a5847963fc57611b06b267e4eb7584efcaf5220d06d6825c9c6a3b43c471751f00ab1a5748bd2d50dc8b869552ed389c7a7f62d9cd5304fd105c02cf305bd094297853ac387bcb98fa184efca31e69ccb73688a60e45534cec9ed09b050417496a5365d5cbbd9aaed7bf30891b2029c3114db50517eb84a97f7722801e1854a1e10f3ddd4dda842a485139a621487682131db8db9df498bfc2bd4103fba50c754dfabb4d7a8e7a25a090d00664cd9246cf3701d3b05a766b8c6cabd89928479be5bb126ca39327465db5b9ca8e999d4736661a518dc65dcc52152d47fa7a33950098454bd9f52bf12efe585a244da00c8e3aa02181ab2a894f9120c3dfb721b8d3db68c924f4ca668f21a1aaec43a6a8a2963096f13388778481b7a3d77c5f532d66e6165a05353c4aa0510ac9013675240a3b415090b57cb2b91edd10018433559e0b05a548e7f221768d8a95342b2540d91e09772b3fe1aa5ab2390537ac5956f2040eb71b31f22963dac09ba8170a05cb14e8c0247707279817a377c8033e2af51dc99cbb58f78ffc4a914af3ce4add43815e40d22561fcc43765703d299891b39fd9fa34570c473352f9e8745dc24e0affb553d5e64ffbdaa49db8ad2bb4a1669cf07b6ddab56ba544de26ae81bdffad45e0f12fd8c138e94692d8cb4af58ce6c191ad956df3c8bb817c19d8a0d82f63037e96d5ada3bef6700582bde6393f0f215c6924b422ea90669cbfa6af5de7c4b13c38be78684ecb56e437c21efaa34132266e14e2c4f486f4da6ec2a9303e6e5caae1b6be1336c2ad80419b02cd12d4638bb257bb7978fca3feb693f2c0294fdb9cf05f4e8ad7688ecc4502c6c26b2a73678fa0aaafe3473ffea5819e75bec238d53496dc70c205c2ba8cfb1958fd2f0ea4d7551b258cab6edf13cfe70d3e2a3fdce2be9e3a2ce79058bca534f91088012442493cc0ec653eceeb35f018da6ac7c02d0a6258a75bba7fff7d05bd695493ee2570d5e11761da2d05f8c42c5d0d1bc989b05487f2b9a876cf6ead5a3b057d29d3ce9223e2e34af49800759d8c50c9c67dee4764a68fc1e1cec1e30ff4917011ffd84a31ddaae78c03c5703d8da08838958338a5e77f4de3a0d1cf02b4500110bb95a1b6e239067aae62a9d9961d0973fa33601f587d31df9320aace28c8476ee0d71a5f3ca832d0b1116cd7eb57c3dc83a262507ca1e0298d7c92e89a0292c9682e99f4dc0df1cd47b663c02ef0b0915390308ac07cee0688d0217c4f341fd2f11abf9347c8aaa09f321f81f5403c207602b316b48aa58dd8d562b6b58686c8050ad2503ccfebe67b888d8b730bb0e8afe1e27bf434096b7174b9e04a2232c29a87cff6f7b055a5b7ad3f2049c9d8b7b70d218edf4c61a44c67fa0694f8f543237c1e8694a97b8af3e48b79a3b1a4fbbf99007775963797db468432fac59fd15672eb701ba7acc1573429db31a8cfe4eb1c3a34bcaa2c68be2e554e88efe3e3b0e863183bae80cf57cccac0ab480631748fd90f75521999f62a16976716af99fe30b3e2f8ccd37dbb7645c44833756c1948d915bfde4836d0133a7f9f787f5a7e23ef1b91c1b5aa3dc140cb2655ccf59b7d47cec0ae0bb5574fbc4cd9e6005b1df9d76a51853a518eadf3e5f7b41e5f8a26baf7a77bcb89720d7cdaa73523cd3e389da3566c34024d5fc18f1de72eb5f457e1c3296018ff4bba3ae87782570effcf33f5a6dfceb61fdd3f7a12287a063fd1525ddb5845cbc24df0df79ee587fb3817b724d190f4f2035c943bbc43eff82f618274553c30d8d29e6921ba72616f1f37f62a651fe39ab42b5afab3009aab2b73e6f4414f41b835fbc41d4f89dd177249899b5ddb4d21705a0e3339497f280df409dbf6556ad15c8f5a858e5cfb3886f18dd688d645aad9a910f8d7c4092ff2ca00a0c79f629cbcddd7256d32b7202ee566e1d5aad710530422f3309c8da97f53d4ba2ec3d7a74e75f023d4682e3d2d3b2ce02dbe134560092e94cda5f953d875a86f94e3183e5799985baeb736b75248dd94e9c41f92bad3bb3836d88ce114bac50b7cfc08f6b0cd3f19e71959fdcfa40776b29dfd9abc59125940599645252af2f5c3ebcf1dad11551360b830b0b61a71cc689af5250daa06df230b6c7cc745a3a0e88f7fbe029819d1269ea61e1783e5deea7d0773318222045939aca679473da56a45f26201476d22a51232190eddbb28b0beb250776b75fea20b5ef4fc6fd9e362127a90e86f1541cb2b2123e5a2fcd9959301294f33ccd69e2e5eda703615c5b5f883ce54b0dd3637cfd8e2284758bb9ccbd7173fd7a2c637bc91e59f051e94c77ce1bb7d1eb42db9facf6d72dff85abd938ddd4ac6433b5de8a70ee0fd97a2554826ee7b985a821e9cb8a586d5d2ffbc5a45fb5143e7cdca738abc574b1b12f99c3b10aea6070a424d9ea5bea30c1b023e9ea3f62f8ebacb33c3bc7b620c50eb792aad201e0bf9c28f3d5bdc899202d72e55ef839b0843c98abcb2489513bb358b814505462443c36bbd557a9497291ddf61e947976e690abeaf22a4e69242cfe31e8fbbec085e84cf791a99ab016953fa73cfe3a6876c2757411ff150a044f13fcb62955cf2d58c73a292063d396e2dcf6d692a3a0b5bf36cc85ce8e824efc525c21078f0ca663130439e62e25c22c024368755c57dcb09c7b816c890db09ddd004766302babf5987ebe0aaa98a24bef93418c322a66cbaa51c7a0e8a1dabb4aad4f629043797abfccdc810818b0149a617810b713b7fbf91979f2334cd781a712ad586934d6e6cfb450e3ee1015a50fac78ed7153a4458457bf068d2113f4338f40185943e3e6b01a6e56817aa63839b70518d59eec07fe2c64e871ef632b9679d03d1bfc1b55e6e463a2219f350b14f6ca6968dd9f1e95388f9221c27f8a8ba5abfe9ee3ef0dbbea4cad100b0c07bf8c41a4d6641cc5c09eac4bb2c969d6711038170edaa6d31c8ba58b7047f7aaa81da95ffd43954693e7d1cde9bde05a05c59e3ed3a07e417b24edf98a2a28ee4463205872b84f10258eedb172c69e47ac9fc3a38ca0fce8d30100e71e77c889274979ca48ac87484e921eb20653b22e19532518a0bebd993ccd73b458483160067d29f7aaf05192b58b333aadc7d698a70b8a86d04d72dfdb99c5b15736f439a80c7bc946142a4fe3414671885f62b19a1feff61207bae43f73c2fc9aa70f692b4be8c98e76bcd463665fb7cde175f7967204d4159d45e2d6b39004584319bf267b9dd56e49eb49b818c19d3f7407de8376cc574f783c809cf2501c465a71905245e128a6b1d10553a3aa0d6e7d2550b667f61ab362abfc2f1182efac81d5b62c6d168b7df49d2c6676ff23ba1dcae2af2d2d9d2caad4bf591e93517a35b83cc59542b5e1d80b81c24b84dcd36e219354d6b1ce2799db9ca725359b225f949775539cb6ffa6033c909a5ae72d0beafe53c75cd7a61d3ab49085a53400b731add01c738f6f6f026fff23b9a52bbf5587fc884c3f517f07a724d831c1aadcf1f98c9a8552db5125fee06506f39f67bd0bd91f7e088a215ba5f420b689f4047e2b073d69d9739acdb8edb0ad250da29f18e2f1ffd2fa0554f7ac0c4599b0d8eb1faf3b15c31cd80aa59782f80eb3d586173c5314df6dc670e8b2b57910ed9ef5d13c7b7e1e58dc99165051c65493ac5be683641a395ca69f514a68091873f0b6f4b3627d860eef5b2b3ec56628d7db8bf88a24fb16d3c3df32e03346a96abdb415d8d33cd7c1b2208b25fb839ed54f80f9f90f66eb5000353d62df8495dccbda1ab43718028bcd59cc2104b700eb65c63372468e5c0d69d72cee2abae431afc4a6e745b1c3504d6e30c7c50bcd9df8791b5a0f78ecdcd5a91196f959d1d9d33e7aafb139413bd48bceccd9864c7d6379f39789f213ea3b60dada4d7dacbaa57fbaf9c2c975667488b2d482abf4d7f6ed74e78e096e303a0a50b548d1dc1d559f3392d859a49eef84203a5e2c780b75170ca97bb6eb7ba5a78ab40b87a488e0c01d6e9280fa32189747320ad2a330d35466f0dfebf04ca4c8ba830999637f1d0059dcd4c70eabcbcfd160b7580890f9f1263824384ecc3ddafbb2517a0fd5a5de463840b27ed0b2309ffb944931be2f9cf0b165383d5fda97557343916d326cef8a7e92264d12602ad1979c09d17712a04b9246d5b45c04460314013d79176860753ff2ae72cfdcf0a3e043af0251abd78c4e3a449d4366d961afe251a46a7d77654d51155323e555c0513169f89af7777aa4fb60761f95faacda0e36d310e6bcef10a6a5d40fb0f875c8f826ee4249935b54c46197ac2471f58614a85876bedfb13721ae60905a317ee36adcdda0d5001538faa33e0c99d3e36763c00c7cb66c1a4bd1403a44a55e98b4c18bd870f0746b848d852831399559d5e363259fd8bab7a486c229354c58d690ae4470221c59a3d773b11819fc6de2bb8f218084aa552f1ce8e1df1ad2e1c1e32d7c6c2e535fd8e30b75e500ff018d83e55f85fa1284fc5fae655aa8e31f819e8419cc02345d3fb83aa6099ad8668ffe70d08b08da7c8553bd7b49969cbfbb0a010c63d526ee30d28a98c711d57b7c50111cb17f379f49a92f9de96bdd648b990c3acdddfcfa41df249b18d7f05331c33d38fddf26d1e6a2aae5b4fb36e426d8bb7ff5d115f5e96b2d72059a97df875e24d92a55c594372213cae9b406696d84f157ce3e38d82b9e114cd9aa3477156ba3d45290636810bc90656f6474c97878c636e16f4866f35938ae14163125d3b5fb0a0fa05408da567d53ef29add4e9e4174e11fcf6fdad58bf9666252697c06c4a3d6dfd97bf4eb01b7fc531d64658c1a75a9328a3b647795ac88678c4df753b7535df6a51ed13a34a8c6582bfb2eb9228f75734c8ef40a5092c6d47c80fdc082b3952450385a1ccea4ac44f6de96ad95129d748b1c9fe40f9785606d6ba44aa2ef813c9e27357e9347f5bf18c499cc9dfb0adce4cc0d57770a65cfe2756d10ca183533202aa48230efa047f0e18e539e947e589d16c0bcc6baebc3dea7d75e800a407b6ccd1798bd53a9ac30e6aa94598f2034d18816cb1969daadcbc56ce461ff14e273699416c64b6949414c7f57cf24aba12769af9ab0ca5ec5ed98e6e180d90c221653656f3d3166e88e0415e229dbac4af0a2ff6705420e4a909cfa73fe176ed3af6e0ade77b046de5fd721e185dc47aeb51023a9298f0a7e2658a676451fc6c0e62837926df19cbb05363ac515ef4943c0c9dd2c4bc96f4a7969e76a5455089527a24633146cc8de590517253da3e3e51a9a855ef25adf441aafd91062082cb6f56c6299528f6a238735e9ef096007b86ad9541723a242a9dcedd51677309be88ad0f10524c0622267a34aff2a1dae0a8f98b04131d0a5c5ef4fd105192d4b2093f0dd95bb3ba2fce86836086ce7ea80d8d6778a40267623158f675f414e8a95e91f96eab4bff5d9359ccaa4544cb91d14ee6325eb2e3784dba2d433eb92cc13d7af36a0ec6ead6b2e439d6eac647d01d3aa76733cefc55735090b582f5a2caae8f5efc26259aedee0a7b16874c844b10c69d090609204d7b733670eaa08a4932eae5d38fc0e413ee71ebf428f5700ecaedd555b9454e29e5337fcb4ecbe52ae6de1b5005ca3021087c93f29d50d97ee65a097cc01beb730d73aba03743a9fdac304a1438c43b9780396ef599bcea73894500c852b84518a0904d382fc299b0db586cfc0f00192d47d074bcf840903989c75f405b8b0f2bedaa598ce657c583db435b4f6da18e4d41fc8226c13b26be50e50c524d0b7674f9b17e77f955aebd4f495de6437a6a3199ae839424eaeb5323676671ae28e6d417277965ab159868d1c946074063512cad8cfb75a674c1012ae444071951053e495d4d2bd940a26f11f47b9b95e60150d878768f08cebd95cb95218023b01613711459a4776d468be83e7a8b77336d40802901f8c87298a6025cfadc4418bf42290bbea43fce0db5ae4c3b99d67a186ae489a9015b2a0cdae15eec59d817e50fa6612f26a51d06e0f176edd49a7102a7c878cea5b1d513baa6cc603f5f1bf58ae93b6a499da2db4db6c9419befb61120eac2de4a27be543d89efd5137c00f0caba9c3d74a9bda260c93550626de048fd173c0c387702a35f5fa7ad690166da840bf48d47b52acfb5e9eebf3619298429edf9c176b21ca04a8c62937c2fdbccd9cb652b7a7acfe91bbe549e41ab97c267bf64ff270067ef53bb657ab8c66b2e9f91c871f6547a56994dd1962d185ae82c735bd5023b646e2cb07fd54f676742468b0bf8d9abc49a0edb54aa0056b587673eba9302be882468049bf7d501f6ef34cd8ec8d96745e8a6d7756891f3b9c14f1434172b3264a1a3dc3f3d3676bad991a92b466c2a68635b6534572391c8fa4151b41aa036db52a159ad2bc3acba2e0c6f506fde51a2616b8efc1017441fb140a877879cd4b3d460de341a64873b4d6cce7f56a76ec0ffeec30d6c7ee09f9267f48fde90a0e6c7683bee6bcb4b942ccd5c4176071f94738cd1d9865378262100acfe9bc5fbd5a5129aa190578660faa45de2f3b5174d60018becc309b0ce49e0eba0e4a2b2dc28a6077c06a6fcaed03a62538c86d8080c8d8cfe6f0f57f87842dfcd96e97e9a58d949212836c52c3c96d21f414acd14aff5c378f4f752f8589caea14fdd61b7b8b22ec58f408c5aa8513316c174d6a0e372184432c83807b170577dab7027c2aceb0286bfe34162981d1bfdb27c658d8dc4a201d4a4a483ba969476459f686bfb6b9adb7008e94b597c847394f3c67a8a4129dbb63ae3ff168df6de4b0bc6ed4e119fb2861269097ec6d9ef0bacf47ba0d9b7badfcf93208b4abe2781ee70cdc4a36a3aee9038bc1ae0b97e1f040725ca36792625106376afb852ca3c5f5b2975b353fb3c6b07d261e0c103aca4d72d20ffd3c172dee18aa8462a4acec79916272f9fede584dfadc7e7fbe546b5de815015e0c3cbb8d4ca86d6896485a0a975f1062515d995ee9b8a13401ddfb444e95509b436e3b6e7a7d9978eb9758c4155df1139934e1c4a3d856cb7aa8d822b2af011e11b53793a23793ec2ad5aac8d069347e59fb5a59d1dcf7ee92341d5ec077dc0920b2ea0aad7b8c6f4acbc02e4149507f778990f817566671c904805b6b28fe60c1eaa08e575b7badb56a0212ab0949a58ad0475fede8c74d832af938515d1e7c00149fcce96d97d449c17ba0dc3393af8d2d45085aeeae2db6efda81472493eaf2dde1f3c55f5550d6f2015c8384f675156717b1d0acff3833a6c932b773b2d4970d17749d0ea00910a69181d60b89e66bffe5ca6e37f70dad7fef189f6486aad19905c9f2dbe9ef517d423975506b42bc82609e329200e1124d495c78a18dc0661c57a57b71ed56d37e80a07ee03d95b58f0fc82fcac91dbafd305fd8ca5a2f4a2284e83d92b46ce4d35c3c01efaf6f24c5bbd7c91dd9ca0a5cf0b3810caf729ae8a27cd9c82a89feccb07f12e3869b6197fa4318aeb823254f186dee8eaafb5f68afcb60cbd333433967e362c52608839152ad2b96648d9fcfbf7bb706c0e61442aba5a618e0a705b0c544ff298c1f03e51c360bf10ed9893c65431223098784b6f3e677d43a6a10188ff17dcb50af923e01a01d10800b3b4e79ec48106f3609fec3babe13b379cecd9520f2e7d643d97ba234a5b758bd75d3b994a4c530d934d1e2bb9e941b90dd6aa0a1bba1da2ef87d58a5db29f6deec4038e562e54376c9d204682cfe95a33162dd2a1211fec8f271fb0d9f4adc02e5cc3d5fa5fb326a200be4c7ab4f725496c8ee4df04ab8e5e1b3c223c025b59944645eee102568ec9ed6a8ddef0eb94522969844be2814f4c72c5d26e23a07192555fc3f98b445e2f3fc9268af711450ded616e129cccaa6c49ec060015a1d0bbb39f077469c460e020512269a904e3cdaeed348b52dd5ac7aeb197ef90b04c010c14b6924d109ee968cfd5a3a183e8463694e8ef3ce4f059987ccf7cc73212eb8962cdbf86925ce6c3dd52c4803fb0dad1a0a44178ab1296b1bc767dcaf763c983fe1e70c735f068d834d04383c1b2151aee4d1516612f1caecf965f7be133c897125a06bcc5ad1a02b10d15d3625323ff5dbcea309599909dd8f07bcb7c96f856058062f10958bcc3130d8cd6c5f2cd206069841ef76fb13fc2832d3ace84fb0d30e259ce2418fa24f1592d907346ca6708ef3c69b7dc47de404e13cd1943833ee320e18c819bcfaacdbd1306cb566a0c63e6dbbc795b66b6621cd1e6bafefbb74bb595d07340026ef9a4b90ca6efe6b494ac96b525dc07c0e5d24addd166fd82e7b75b04d44ab3688e2dbe7479dee0cac48133e8d6b51ca29f496fd19735fb47f3a0152f90856db362af14660215f55cc1268c3354dbf32d165f49d30a445c005227244365b032f06c1de2f03a2bba552f385e045163f0ca6d562925f2b034f242f82833a5c8b833a7f944bb6c16d9cdf7870f8c624ebf3b8eeb34f4a4f761e80d1284ab863a2111306c5de1454b9c9b74c245deb146ad33acb8bf0ad89b5c52a04e4907163a8ff9a13febdeec4a41a24e5f1820357ca1b02083df6aa91356b892557c8482bbfbdc0419138a960871ed9b47588fa14a993137e99668dc3df15f2d7548ae987f59056eed0a39e8c4604e7c196fc95691ea8348ac7b039eb8d7c8773c80ef6f55f9c53fb4c568b8b850d560df7d2bcf662f2e4d5000cb67fbeeed7be687eb59bc1742f82e3aaf900fb0ccecac753d6cb8f5c021c0225dc896faf7bee7814575102b448cbfab5d5fdbdf2bbfb2c1de0fcea5bfbce1c696a9695b4e493bed2d683ce399221d527f1ac05d1eddb550ef7aa11583dfc6d76f4a98bd154bce65195c605d552a8eca21da873e6f10b5eb3c16a07ffc813738970bf9f2573a9f90440f115adc960ae5c24e55650efeba61309e98090f37767c45341cdab807769eba64ba5c35e3ad3dc8a76fe6ea757ffe6e58f81145641f78b25be5246bc5e71c41ffee0f1d8d27a522977c5e2993f06749bede01d4a5391f4568a6ac558856ede4023536389fcbef0b1d9449ddd94cdb9705ce8ebaade6367821b9e3f5f2044741d06cb83c8c1561f1472cb1a5364d6e075c6b6eeac6ba9b9d33f710ff6218819c10b5c5685420f69b9cfb57876b7121c11cd0c2f33778d8d18d7d8070a1589deb3d66ee539e110a7e54386c0341c73318c2b239e75cf8ad7ffd7b614a6f45e881f38105b929234cfc528c3ae07707ae4a8051ccf9195c9d3e267ccb655de9d77fde54d1509f36268793e8b5262e066327dea4595ec27f80777d37bd1810ba82314d3d331463884c68ee2a2487f549f3ccb32ae6bb25614fcac1e70fc5b5e168c35fde1cdfc3c9fe519e7eacb365c54f23967ea260f88ccfc93563c7e2d45602c21c09f6fc9dfe022174089d639e1f1d45a3310fdcabf2d93617a79dcc53c6236ca7c52bb484c03a8ece62dd76d854e74809a6beeafd1cbb2f5820e702fe07ffbbc145ad07e7c00bd9c7d89c0317eff8f4ca7d03187c5de3b4f2494204d08718b5f1a4b92460751a2de02b99ab60e74f2ec36f29b825f783c24fa04102bfc24414f5c7863a0d57949163ad5b4a0c49c5a9244f089ea151cc02ac30df8b762222ec515201de3f514eeb119c270d9806d7db5d6ef73fd837931680af6a732ad0c4b73d04b5f2db6f947189d20891bd4bf7ee108f71917a55e9560c0d3555a3ea7dcfbf6b4abde7357496228ca153a7915882743cbd8ff8828a977417acc06e51e9a797a84d69b2b6d332594bc6966b92a598af31682af79fd0cd95524e3d6229c2e53bb7311cb1335e29801da74b2972d3556df9b73e31b0513573c721993dec50b0e1a98c824695dbd3fb88700f530d7dba1b995668ca34fb1fe53e787e0b2f7a4c4bb637704c4b2086b8db4f77d0d3e10d21d32499d8e01db2d602b38ae280054ed4d19a427947bc520d76c24132c99512faec577cd238e6d258de550882f9cf8bef83f1d24e62fcd07eafeacb5d4524353d4844cbcfc749d1f2aa5c81bb71cf1f55c58d52edbebfd5fbfae3cfa19d9e2dc7d3196e7f3ba2814509f119b7ff318dc1ad41773656b6789c8f1c8697bf6ade40e9ddc812d364d8d53be03159fc11f02338a2f7d0f860ae68daacf8b85d7af55ed0857beddd9291678c55adce83a709bf080dd7c457a35b03df13cc26dc63d3bb5e61678bfe6fb545288efe2ab9b2fe42b0c1ef95aeaa236201caa76f5c695be4755ef6143b7ff0e25a8241001b90b1b223ef002c97292db67a10878c5151730158d7641468dc9bd89bb07298dffc18ce64538b425c4a989b52795a90d58ddae46e4f5a8b0c3aceb8ef8f56a10710399b6b82c058cfb621856d3bd7e9cd2b66a109ffd4328715fb46adc7185f98feb6cda82cc24afcaaf2549835441c10a02ba0cdb15e28f48abec9e5274356461b402d680502809eaf5d78728c971553459ec9521bf29a8d414bd3015874a54d0da222eaed474c9966635bc5b8ce7f524d79fac086e794b4d5ae276ffd1f98d94a3d8da62af4ef68e077ebe2176145e52f7dfbd49fa71f285df7363620607dff554995f47e2ebf0cee4621881a8ebfa8af14b570cdb0ef5aeda6b36f9c4ab2e5a1158ff719dfd948684c87e72ef8b58f248c9aeb814b27ce865691e7c0d86d2770924df66f60e4b5458a42587ad0dc39f739c9f81610accda4165ea24e8b6dbfc073f70dd968974c8fdd6fb0d94e85b1c785770286d276300a8c3499e2fb74ccb34425a135bbed95d0ea9b70c1a155eeadb7aa42d6cc427c72a616bd8c2a93983420a0f69304ee43cb251524d7377e584c6318dc7a7dd2d33bfa5638f2fde9f2b79d6dd5a56a1b1557aaf71d57b3806d6967cc2cda2aac4cfab73df4e95e7a78c5b0921b47bf817a182883fe49dd0395d196ffd73273f6f7e9f241fad6e7df977821cba105e088ffa2af453ba3cf9ce82b14c1370f7bce05250a7a41a69f20ffed1771a16e32c5ac6a34b8cbf52255f7cf767850c4cf151c2122ae5407d70d851714adf42d6356bf3d8ea056c159aef37b57aeff863c26f66e79aad4e4d8ff1e88769628c98b1b002782a08b8b7361c5b282e9cdcee60ede8da4ea609f0754cbf148ccf9400adb7999e96cd6fe4af10eb19647786360ad548e61b2f7cec75ec97acef5b6df97a4286c69a2c88eca07868a4370780976d9f24f190546ca52260f19b6390770cc63929fbbf2f3e9f6939c4f4cc20d9bf8522dcc147ae76e58762c145e6597bb8116aa92415c150aa2642dfb8712183de4c4f7ce1cb75c316b0da34a968630e8a0919bb4cbd5330567b64405f1bbbc65700c18c3868514b74ac6f2d2e6642f47ecf75feaa828200ab4a4afde3503a8792edf3a426f8b6ebf8d8ff938f0455b005dcafbc01dd52d3526410840892c4f1b40b77f29a63d75f5dad47a3524dea15065668f6132d39e12da4e2d89b6cc81a065306eb6848b602cc5a8e48732d84304f1379047c639b54233dc9155a5c6a08cbc6b49660ffc05e21d0a6d609ec43867cb804b31a0d3fa0cebfe1aa125c92f2e249a9f6f91a5192c6cd18695e34b3d61b28b187912bd589c1a862767d881be3b2a060786691a1275e4a8f17bf1023759dd6782b59a7be904acfeefc46e5c46d17639ef4642798d9ed529918eb5390832c76a76202a82ce1721344f8e24638caef30e1113dd972a9db038008b853cf272a17773f6d99c135092c61dfe97f7769bc59a0040373369243673f0fb9f61bc35f9fd0f3aefbb93aade4faa341ac243f5799c3fe66e4f28957b7ef2ba2e707d3a65dfec010dd0399c09a3ff5459f7ea1ac0f66bdf4696369c4253117b0bc4f223228a89526275595349c2b352dea621d5f31786febb5304341667de42737d8bde9ab57e9d826ad06d555c9dec94ea316d735f44ae917e7300de6503e1db702ab05c6aaf954d04dae7bd5c8ac2adc659b9ec9f4b2015295780dcebd9eb0c6baa786246f1798bc4fb4cd74143773d5676d0fc4f99ba7e208a3388294dcf917477898ab6ade9b5fbdb7c895a0dc89befa6d7a52921f4d2e3630fcc5c3f1a7fce230bf57212cbb078ce2f476f10c780876a239ff8261bac45b20699b3c81cfb7b167b3e95dc9581a8707a2883df6504d1effa863d300d2e1e83f5f2ef471d9e72ba44e78f935ee28fd0171e343b3e91d06253ae18c910e29e2a1073afd5c38cac6b27ac5856275859550c15b3dc5253f75d6c746dd64577d301defe1ae2c5853f631460aeeed5f650deb087539bc9efbf9b0be6661e0f4965c2188a927c7e5be2a6a2a3b9271102e9610c8bb61871e4fd5f8967a677ce2bdd340be53da85259c6a116415a41ec3cbead9f5566077fb1195ea48b107498a48fb460c4e48f416bcc7ac15e184a625431fa938b334d5c34829d48b4fc17438ed86015ba83880b68ed80403b95873df601b62e1d0b435b1840e2ffce7716ffcf2351de12d772f6f441addde74c64428c5916408ac1a82c19ccd394792dd784b265018d74b7671c0c9730464bedfb93d99e4118a369edbf9507e4257b90424f26524f938443f8927b27cd28699d5fac0ae2f9586f3d3ae686d06cbbdcae35cb50fc5263a8f6bb2083eef3fa6f62c64015a633c792113fe8fcc46e2ff645afd8c7948ea823cfccd6c016f9a20b4bf0d29c9b1f6349be029196d12a946926b5a6f8e9a99e10bed12554943364f45b993d173673f7c88040d1648c1321189f1edf5f05ff424f1a835167ff7e5602e777c0bd5734a58c19c310bb0117b86142cf2ca7e71cfb5e4f63496470cde4a68be573954c1c19ac6741d58e3d7fd364fa5d51981aaa200881c913a5202b2bb9d2d8ea0b55c0c291a655d76c0bdb23870afe45f24b42ccdd4f1c2f1cfd928015f4eff3ddfcb2276b598d5712939637eedbebe7133e8efe3d4da40bfc7b334df04a0b6f423469635b1cb8eee9f7d57c0e4c7caf68fca40e1267b8ed86070855055d2bad441238de3e0b51a0ec4b31857e62e2d78a5eff85943a39b7c0cbffba05cc0fc80aaf03aad102b0d94384385d1be6630424e92e85f48d14366160eb8e0827f3fc36b52b27f96f4104c1a17ebd7f73c14758c3cf8453309bdf01fefc398518d15230430ba59a9385437ad0b0e59b781ddeb2f9d1f730fb702abf2844c34132aec9844f359288327a0ce9de9330a23f021afc3ed0beea32d57610049e858106ca296721889c393e8906cab61dc8fac6410e7640bc6e4e43dbd212e40fc28d8adfb18edcef569c4467c7c1e15bdd1d6350f4cd987465bd6c0a06f5cb2c80c40db942cd7e4fbc9c6ef5fe36f854768e175c903094e267727227c27f669a94c71549b5706017900cea5eccbac622305c37265191fe19de1955e679ee86b7abfdf80a619c24f0f7b02040c7745729f6dd66848538b9ae22a60e95482f7aad6f82ef21fcd2ad9caa3d9f239a9a263e6357521509581680c8b084ec87eb90daac3173e7481a22c7a4a7f86b165baaa2937e93aa4217937f01f0992600da21f169ace08b701f7fee55ab7817da29aacb1e1d4e31ae2a1e831ca8c4d3f9b9529bbd08c0bdb72aba44d2f937fe65fb0eac6d51c573faeb652fe36e508ae6ed2a5c9a4e468e553a30fb4d0522d13a2261830983aff44a8e07d373214d5dd57789ef7490e5b8eb6ff9f83bd79c7e3a212f4edeb1efe0dfa4f1c887e657bfbc861157ad0fcc0b9805d009c23df1d6620dc72970a49a5893e640081eafda32dc2c2f45fd48d0b1fab8680b71e6b44d93a97f380a18ec934f9debde46522f40d44029ea9777301e204cd0bb57613b2b782381bf2fbd4f7ee1c2f4acac49da2224dea3c5640519efde0bd0d92dd47e939851aeac63b218c873259508be15b9c165658d27036dd59c1b56827826f02e6030061f9004e6d277bdecddefe48a7174f0fb08652676497a347d9ef254a879da1d92577cea37142b7c0fcdf10db0ec8a3c6f5f7562c2d3027ff6e504d7fb895d19a00549323e0f6c1a844eec5ac5ffda5e99ef2890706e60454b327c5b311cebdcc304838d81dc4e3a538eb1d8becf0bad6e002554aa910ee0359281440f87770c4015fc8f18aeac41e863c7b52faa6396237cb2cf89c9930c8c045e0b78aa3a9c232dd32a905ae5b1b279a7836946c0253ba3f6a8a9c92cb7e968600a5017414f6a050b14a2fa717066ad356d13f9e05381d80a424c7e7959f928afabf00b0daa6c5bb036baa200a6af4673f615fdbd4ddf534cc16e40bad5c4152fe5d2029675a8db4b3dc861708e496fbbef2a639a2b57384a57cdc3c07564474689180c24c38f64ce34a4f659edffff1900888bb4b9d9b57557f9701fb569b76f2edb256b3e6fc939cfb85d9b3be89e0880825763398f6534ffba6633537a8f6d373d0090c21ef43ce47bba546b63499c9d08cc39953e7b69dc65dcc55f10c7f1b8386c158f2abed69163213bb5799c745b596c6c83ee8a1b04d48626c72e3d1f2bd5948d00cb8fff235117ccef3d6c0a6d556f472ca12f78ca1618ae78ef061b336357da5b744c5d057c25880f30246a244bdbf677fd4a05ed69062d819ef432c5d1efb2f52b35eb4d0e28d9d497a865fa53641ea7787134e9c447a5639eeb321cc704248dcbb5e82015dc7ba9f75b50f798403f988eb3b74bc77787616cfb143e5f06338d5e94a826d44c0f27993204312dae364024c24dc673a492b1ae1e0356a9f921a0ec42139d6b82eda14a03af5b5c8588f9c7a693153e46c8980495083e4fd5cacb100ee80fb4209d3c6029318caf3759f0c6d0de0508f5e08960594014a81493bd4172373435c4d9d736679f0d385469551c2b58960f35f90fa343da70070718b31f4763caf1a37b219ff4a76b6b5e45745fb3afa67e5c0c443011ff588799949b22d422cf4427aed191e49f8a4453f2a7895e3b17fe973a12fa0c9f5ee4fce6d96477f10bba94ad419e65f7703dceebeb4a6ed8c1307e293c9c8f86f8a2a22770f81843b2644cd3a4a0698bca0d31c90a19e3b31ec6c7695e7fc40a6c7346b123d9c02e9ae6452c1089e6af542bc66d1bc2021ffc56afd9ddffd10112f10453357ddf2681dac4c4962a258577f2b190ac8c81f2899fe570f67c58fee18848bd7bc761291007ed446f3b302b60be77743d62885afd93e0593b01ca1872979bb941a2eccf350dfc7c826c468b2dae8db5951ed9538bf3d32694e67973215abfd0af7bc6fc4454919cfc230347a688494acba54343182356ec849dac0b05f82901fabdb513ed7816d27097e6f0490d01ce2a4f417b986495198a79528433c63cc34dd64876f32769e2889857c628b9ad850e92ce0583b1c2fd2212a0700dea556904acd0338cab1308d15c7d8319f07e0c353f833296bd2e7bf3c928cfdd1f8351f921077249c89da81f2b805a4f456bcc7475bff1ad9ba367292fd2d60d2a4dc2a3d2409e12adbf6c3a98172754186001783fe9e1177df2db8d0db4bde27c09a359ef5095892868e58d47bacc1b30938226fbdbc0fb721de4be38b0c2a7e2b340ed54e7170cbd4f3954915a84ddae52375a075a5dc5193bff2b10ec9af8e79dd0f967499a4178b9be13dbcf27c0d6c39a5c692bdb2c2501bbf2b3b0b80a2bf9bee2d7be903765abcca7c4008c29fac328ba86886c8afe89033518cf1686c03825f90fb558f9771f5012769e7daa9b313a430af0885803b5d755eec97187e7da6eba04a0926909ac77cffa8861abddce6174ef8e3755255bdb09246a86f20514fcf0d4e1ff7c677cffa91c01c57ff62146d37431aa8f08a47834a29f251d0c6b1483e49618c4ea7fcbfc2da2714ced9680b3bffa4fa21bdeaa8e3d615592afe8f2cae26b2c12b10281e1bc5dd2eec651c5cde8ba2a26ed36a6950bdd3f655f13073ea0a7d0bd93cbe27c163897ff5cdae499f34703512187b10efbeb3bb0a1619db8effa1ef6520901beb6fbf3b0b20bc5fecc5a2780adb6603b24a90ab080515a8b3af44653e251295febd2385c345983347858524c0fe9a012a3554b127f6472f60519f4fac6efaaa07395a172c4e6947acb67f247c34d15ae6bd37165c32903b11e45da16e490338c998119b00299eacfd4ee3935c43ae65b0b9cab8dadf32a3bf09ab25c7651e40da6bfabfbbdcebac164031b9bc0ed8f62afbfda8eb8a13bd18e5c0921c86797a02b3d7fe68c82f2f627b7fcfbcc96131b53141fae940d914f63999994537140a5df80bdf410939b6e1a07dd903663a4f46c522ce6713a4c5855d53831ac1dbead03b66b9ea251fed459405ba126771369a7339d223fa29a8c6a17c5346935935d15cd582ec11c41b67115cbac2a401d992e6f42c631c4c0acee24232240dcad943f620eace971add374f4dd91056c019c045850408ed0b87754c071e6bd70b7525e42343a886870bb58b262459e1e2507541e29bc397e4c1ef2034f5964444ccee9cf1fd1b6988818deddaacea94e746735e5c8517f61a95a2e7fcc6eb8afba4ddf0cf6f62e00b9e755c09b813ab40f0e97840f0b14c0b3c12529a1e7d306e617de711af2901fbf49f990166e19f1289b44de421e2e6537eec73aa99308cda35cc819c7b7147ca7b1db410b2ef2f7e787e913c0947f4e4ddeaa56626398073ab7c5aeb4da7c6278c864716a05bdbaee508be960f594928060da2a21287c4270b4c84fd6b128e21a99231b4a2d756abf6ec60e50fd74ea2e1f8a1e42b3aa950e3843ff0d0124938a08a19d3a9d52cfd5ff89f652158588f8d3387353a5f7e161dd585797fbe763d2fe4edf10850eff57bda4a0cebdb7d117bf0da41af03b0a204369cf1a02998cc8245138bedaaa7d61565767d76f4749b346096a3183fbc9e1a0e186853896527c8a6193cd5f651dcf306fa46f450d5a056d1d8bb121fdc06b57a1621f2b1e78c96b275d6af1b21372f3ab93e86514b1a4260d8dc58109fc1b4f2428cb30d2754d513ab17693df0cc69f9dbf1b6b5504ffd0340ab9e3e2e08edee206420ef70e8134f0d527f34db44c610f64f4338c8875c64512670ee0cb9f77ffe742c37cf46b0bb8aef0ac3f30e6d9319e20c7389289f01d68b58c11122c708aeef53d3dc8dde27030aec4ad2b612009787a679e6225db10c696a39dd23e75478bf5dfd18921ae94d08a3862414f6b3672751aff64ae67a90326fce406615b8d9d9400189a2f6dea5c89ad87391d6113b1ae26bf48307fa792d52434126398fdef4bfc10d0dc2ac5b125b669d98757fae6d8ea4fe7981bfa76dc729e11d0a0014f6b71964cb1b79b5566a35149564f70ff44d5ab4530499c00f1cf78e158dea32323e744fa6a0396a01724c7baa86babb7d2b866b64c3ea2d4517855446efca2c0570a871f386e38a68c82ecc4f774cfdd032b388ef3fdc505ff2270a7a8fbbffc29ea5f2e3b1db9b714b2443506d83c7002b91bb850aa25ef98c72bcf13197b1f1fb433488ca32367d8f08a93c26c99abebb660abebf0276f3808d8a583907a99fe1ce3a52fe5c242db26eeaf2752dec36437bd489d8141bf60f39ed6ed03db906f456a778e9df0dad7d6ffd790af9f198ea6225feb24c97ca7ca5a02f0ac0276b18de7f5f8c7b3179ecd4d8c62fe6e9100cf70b8b9e10d7ed06c0cb258c944ce1874e2138a125c762f8c6333866ccea789449e49f50d0caf1e5417d4d6c4608506a0de2facd3444059b04b3749e7c0778bb327e30857104782c35bf17cf795bc42925e657a8e5cf4ea04433da45fee0c3651704a7b48a47137a77b63ea9dc6f581e70dd595543b65e9b477bf088aad0b76ee95ddae7440ac13062bd8b372e61ba8fce893aa4f091715b253df2b5f6f3d4902da54f51ba2eb396af8c17429b74c37afa8bd151d96f39e04e064acfb78cfa2d335a4b3be25076069f97e88000d88c252a51f2760995080a3e4818f91e29ec8c41961b8303a</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-xray">      <input class="hbe hbe-input-field hbe-input-field-xray" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-xray" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-xray">您好, 这里需要密码.</span>      </label>      <svg class="hbe hbe-graphic hbe-graphic-xray" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">        <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>        <path d="M0,2.5c0,0,298.666,0,399.333,0C448.336,2.5,513.994,13,597,13c77.327,0,135-10.5,200.999-10.5c95.996,0,402.001,0,402.001,0"></path>      </svg>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">毛泽东思想和中国特色社会主义理论体系概论期末复习（2023版）</summary>
    
    
    
    <category term="学习" scheme="http://265832.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="毛概" scheme="http://265832.xyz/tags/%E6%AF%9B%E6%A6%82/"/>
    
  </entry>
  
  <entry>
    <title>STM32答辩</title>
    <link href="http://265832.xyz/posts/e22e37c2.html"/>
    <id>http://265832.xyz/posts/e22e37c2.html</id>
    <published>2024-06-16T11:42:08.000Z</published>
    <updated>2024-06-17T01:38:57.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="简介">简介</h2><p>STM32：系统内核小、专用性强、系统精简<br>Stm32 三种开发方式：寄存器模式、标准库模式、HAL库模式（全称是Hardware Abstraction Layer）</p><h2 id="GPIO">GPIO</h2><!-- GPIO的全称是General-Purpose Input /Output，中文意思是通用IO端口。![B08C4D251F5874F0AF73421C80CC09A0.png](https://tuchuang.voooe.cn/images/2024/06/17/B08C4D251F5874F0AF73421C80CC09A0.png)开漏输出和推挽输出的区别：主要是开漏输出只可以输出低电平，高电平得靠外部电阻拉高。输出端相当于三极管的集电极，适合于做电流型的驱动，其吸收电流的能力相对强(一般20ma以内)；推挽输出可以输出高、低电平，连接数字器件。## USARTUSART的全称是Universal Synchronous/Asynchronous Receiver/Transmitter，中文名叫做通用同步异步收发器。这是一种全双工的异步通信，发送端称为TXD(Transmit Data)，接收端称为RXD（Receive Data）。串口的设置是设置起始位、数据位、校验位、停止位和波特率，通信的双方要设置相同的参数，并且硬件硬件交叉连接。USART主要特征1.全双工异步通信。2.单线半双工通信。3.单独的发送器和接收器使能位。4.可配置使用DMA的多缓冲器通信。5.多个带标志的中断源。6.可编程数据字长度（8位或9位） 。7.可配置的停止位（支持1或2个停止位）。![1678E7A91DE1E3E81C4D1244450B9784.png](https://tuchuang.voooe.cn/images/2024/06/17/1678E7A91DE1E3E81C4D1244450B9784.png)## ADC**ADC** 的全称是“Analog-to-Digital Converter”，中文是“模拟/数字转换器”，将连续变化的模拟信号转换为离散的数字信号。![28AD6228738EDCD6D1459AA4F7C4DE63.png](https://tuchuang.voooe.cn/images/2024/06/17/28AD6228738EDCD6D1459AA4F7C4DE63.png)### ADC的性能指标- 量程：能测量的电压范围。- 分辨率：ADC能辨别的最小模拟量，通常以输出二进制数的位数表示，比如:8、10、12、16位等。位数越多，分辨率越高，一般来说分辨率越高，转化时间越长。- 转化时间：从转换开始到获得稳定的数字量输出所需要的时间称为转换时间。### ADC的特性1.12位精度下转换速度可高达1MHZ，即1微秒。2.供电电压：VSSA：0V；VDDA：24V~3.6V。3.ADC输入范围：VREF- ≤ VIN ≤ VREF+（一般VREF和VSSA接在一起，即0V；VREF+和VDDA接在一起，即3.3V，所以一般ADC输入范围为0V~3.3V）。4.采样时间可配置，采样时间越长，转换结果相对越准确，但是转换速度就越慢。5.ADC的数据结果是12位，可以左对齐或右对齐方式存储在16位数据寄存器中。![DE3C360E1F33DEE6CCFF268A78E8F122.png](https://tuchuang.voooe.cn/images/2024/06/17/DE3C360E1F33DEE6CCFF268A78E8F122.png)## DMADMA的全称是“Direct Memory Access”，中文名称“直接存储器访问”，提供在外设与内存、存储器和存储器、外设与外设之间的高速数据传输使用。它允许不同速度的硬件装置来沟通，而不需要依赖于CPU，因此CPU可以在此期间执行其他任务。DMA搬运的地点- 存储器-->存储器（例如:复制某特别大的数据buf）<ul><li>存储–&gt;外设（例:将某数据buf写入串口TDR寄存器）</li><li>外设–&gt;存储器（例如:将串口RDR寄存器写入某数据buf）<br><img src="https://tuchuang.voooe.cn/images/2024/06/17/25A3AC7B7267753B450847A07C9FA174.png" alt="25A3AC7B7267753B450847A07C9FA174.png"></li></ul><h2 id="IIC">IIC</h2><p>IIC全称是Inter-Integrated Circuit (集成电路总线)，用于连接微控制器及其外围设备。IIC属于半双工同步通信方式。<br>IIC串行总线有两根信号线，一根是双向的数据线SDA，另一根是时钟线SCL。两条线都接上拉电阻，以确保总线空闲时刻为高电平，其中时钟信号是由主控器件产生。</p><ul><li>起始信号<br>当时钟线（SCL）为高平时，数据线（SDA）从高电平跳变到低电平。</li><li>起始信号<br>当时钟线（SCL）为高平时，数据线（SDA）从高电平跳变到低电平。</li><li>应答信号<br>主机每发送一个字节（8个bit），就在第9个时钟脉冲期间释放数据线（SDA），由从机反馈一个应答信号。<br>应答信号（SDA）为低电平时，规定为有效应答位（ACK，简称应答位），表示从机成功地接收了该字节。<br>应答信号（SDA）为高电平时，规定为非应答位（NACK），一般表示从机接收该字节没有成功。</li></ul><h2 id="PWM">PWM</h2><p>PWM全称是Pulse Width Modulation（脉冲宽度调制），它是通过对一系列脉冲的宽度进行调制，等效出所需要的波形（包含形状以及幅值），对模拟信号电平进行数字编码，也就是说通过调节占空比的变化来调节信号、能量等的变化，占空比就是指在一个周期内，信号处于有效电平的时间占据整个信号周期的百分比。</p><ul><li>PWM模式1<br>在向上计数时，一旦CNT&lt;CCRx 时输出为有效电平，否则为无效电平。<br>在向下计数时，一旦CNT&gt;CCRx 时输出为无效电平，否则为有效电平。</li><li>PWM模式2<br>在向上计数时，一旦CNT&lt;CCRx 时输出为无效电平，否则为有效电平。<br>在向下计数时，一旦CNT&gt;CCRx 时输出为有效电平，否则为无效电平。<br><img src="https://tuchuang.voooe.cn/images/2024/06/17/16F22C096F8570792E7467C8D94F516D.png" alt="16F22C096F8570792E7467C8D94F516D.png"><br><img src="https://tuchuang.voooe.cn/images/2024/06/17/DF802ECC05D4F8502679EA4FAA6D1C52.png" alt="DF802ECC05D4F8502679EA4FAA6D1C52.png"></li></ul><h2 id="TIM">TIM</h2><ul><li>时钟产生器<br>STM32通用定时器有四种时钟源：<br>内部时钟（CK_INT）<br>外部时钟模式1：外部触发输入（TIMx_ETR）<br>内部触发输入（ITRx）：使用一个定时器作为另一个定时器的预分频器<br>外部时钟模式2：外部输入引脚</li></ul><p>高级定时器（TIM1、TIM8）、基本定时器（TIM6、TIM7）、通用定时器（TIM2~TIM5）<br><img src="https://tuchuang.voooe.cn/images/2024/06/17/247B25D6084DFDEE33672156715F67C8.png" alt="247B25D6084DFDEE33672156715F67C8.png"></p><ul><li>向上计数：<br>计数器从0开始计数（递增），计数到自动加载值（TIMx_ARR）后产生一个计数器溢出事件并重新从0开始计数。</li><li>向下计数：<br>计数器从自动加载值（TIMx_ARR）开始计数（递减），计数到0后产生一个计数器溢出事件并重新从自动加载值（TIMx_ARR）开始计数。</li><li>中心对齐计数：<br>计数器从0开始计数（递增），计数到自动加载值（TIMx_ARR）- 1后产生一个计数器溢出事件并从自动加载值（TIMx_ARR）开始计数（递减），计数到1后产生一个计数器溢出事件并重新从0开始计数。<br><img src="https://tuchuang.voooe.cn/images/2024/06/17/11416BE9E27DA7521661C27E02E55A93.png" alt="11416BE9E27DA7521661C27E02E55A93.png"><br><img src="https://tuchuang.voooe.cn/images/2024/06/17/D7548BCE7BCFD388F49C7E5FCC44C580.png" alt="D7548BCE7BCFD388F49C7E5FCC44C580.png"><br><img src="https://tuchuang.voooe.cn/images/2024/06/17/A9A2811A44F64A543871C719CFAF8B96.png" alt="A9A2811A44F64A543871C719CFAF8B96.png"></li></ul><h2 id="DHT11温湿度传感器">DHT11温湿度传感器</h2><p>工作电压范围：3.3V~5.5V<br>工作电流：平均0.5mA<br>输出：单总线数字信号<br>测量范围：湿度20~90%RH，温度0~50°C<br>精度：湿度±5%，温度±2°C<br>分辨率：湿度±1%，温度±1°C</p><ul><li>电源引脚<br>DHT11的供电电压为3~5.5 V。传感器上电后，要等待 1s 以越过不稳定状态，在此期间无需发送任何指令。电源引脚（VDD，GND）之间可增加一个100nF 的电容，用以去耦滤波。</li><li>串行接口（单线双向）<br>DATA 用于微处理器与 DHT11之间的通讯和同步，采用单总线数据格式，一次通讯时间4ms左右，数据分小数部分和整数部分</li></ul><p>DHT11 采用单总线协议与单片机通信，单片机发送一次复位信号后，DHT11 从低功耗模式转换到高速模式，等待主机复位结束后，DHT11 发送响应信号，并拉高总线准备传输数据。一次完整的数据为 40bit，按照高位在前，低位在后的顺序传输。<br>数据格式为：8bit 湿度整数数据+8bit 湿度小数数据+8bit 温度整数数据+8bit 温度小数数据+8bit 校验和，一共 5 字节（40bit）数据。由于 DHT11 分辨率只能精确到个位，所以小数部分是数据全为 0。校验和为前 4 个字节数据相加，校验的目的是为了保证数据传输的准确性。<br>DHT11 只有在接收到开始信号后才触发一次温湿度采集，如果没有接收到主机发送复位信号，DHT11 不主动进行温湿度采集。当数据采集完毕且无开始信号后，DHT11 自动切换到低速模式。</p><ul><li>主机发送复位信号<br>DHT11 的初始化过程同样分为复位信号和响应信号。<br>首先主机拉低总线至少 18ms，然后再拉高总线，延时 20~40us，取中间值 30us，此时复位信号发送完毕。</li><li>DHT11 发送响应信号<br>DHT11 检测到复位信号后，触发一次采样，并拉低总线 80us 表示响应信号，告诉主机数据已经准备好了；然后 DHT11 拉高总线 80us，之后开始传输数据。如果检测到响应信号为高电平，则 DHT11 初始化失败，请检查线路是否连接正常。<br>当复位信号发送完毕后，如果检测到总线被拉低，就每隔 1us 计数一次，直至总线拉高，计算低电平时间；当总线被拉高后重新计数检测 80us 的高电平。如果检测到响应信号之后的80us 高电平，就准备开始接收数据。实际上 DHT11 的响应时间并不是标准的 80us，往往存在误差，当响应时间处于 20~100us 之间时就可以认定响应成功。</li><li>数据传输<br>DHT11 在拉高总线 80us 后开始传输数据。每 1bit 数据都以 50us 低电平时隙开始，告诉主机开始传输一位数据了。DHT11 以高电平的长短定义数据位是 0 还是 1，当 50us 低电平时隙过后拉高总线，高电平持续 26~28us 表示数据“0”；持续 70us 表示数据“1”。<br>当最后 1bit 数据传送完毕后，DHT11 拉低总线 50us，表示数据传输完毕，随后总线由上拉电阻拉高进入空闲状态。<br><img src="https://tuchuang.voooe.cn/images/2024/06/17/FFDBACF61846C1E3BD19F1D79F936885.png" alt="FFDBACF61846C1E3BD19F1D79F936885.png"></li></ul><h2 id="DS18B20温度传感器">DS18B20温度传感器</h2><p>测温范围  -55°C~+125°C<br>工作电源：3.0~5.5V/DC（可以数据线寄生电源）<br>单总线半双工通信方式。<br>DS18B20共有6种信号：复位脉冲、应答脉冲、写0、写1、读0、读1。这些信号中除了应答脉冲以外，都由主机发出同步信号，并且发送所有的命令和数据都是字节的低位在前。</p><ul><li>1、复位脉冲<br>单总线上的所有通信都是以初始化序列开始。主机输出低电平，保持低电平时间至少480us，以产生复位脉冲。接着主机释放总线，4.7K的上拉电阻将单总线拉高，延时15~69us，并进入接收模式（Rx），接着DS18B20拉低总线60~240us，以产生低电平应答脉冲。</li><li>2、写时序<br>写时序包括写0时序和写1时序，所有写时序至少需要60us，且在2次独立的写时序之间至少需要1us的恢复时间，两种写时序均起始于主机拉低总线。<br>写1时序：主机输出低电平，延时2us，然后释放总线，延时60us<br>写0时序：主机输出低电平，延时60us，然后释放总线，延时2us</li><li>3、读时序<br>单总线器件仅在主机发出读时序使，才向主机传输数据，所以在主机发出读数据命令之后，必须马上产生读时序，以便从机能够传输数据。<br>所有读时序至少需要60us，且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起，至少拉低总线1us。主机在读时序期间必须释放总线，并且在时序起始后的15us内采样总线状态。<br>典型的读时序过程为：主机输出低电平延时2us，然后主机转入输入模式延时12us，然后读取单总线当前的电平，然后延时50us。</li><li>DS18B20典型温度读取过程<br>复位–&gt;发SKIP ROM命令（0XCC）–&gt;发开始转换命令（0X44）–&gt;延时–&gt;复位–&gt;发送SKIP ROM命令（0XCC）–&gt;发读存储命令（0XBE）–&gt;连续读出两个字节数据（即温度）–&gt;结束<br>转化后得到的12位数据，存储在DS18B20的两个8比特的RAM中，二进制中的前面5位是符号位，如果测得得温度大于0，这五位为0，只要将测到得数值乘以0.0635即可得到实际温度；如果温度小于0，这五位为1，测到得数值需要取反加一再乘以0.0625即可得到实际温度。</li></ul><h2 id="OLED">OLED</h2><ul><li>起始信号（SDA低电平）: 当SDA线从高电平跳变到低电平时，表示一个数据传输的开始。</li><li>停止信号（SDA高电平）: 当SDA线从低电平跳变到高电平时，表示一个数据传输的结束。</li><li>数据传输: 在IIC通信中，数据传输是通过SDA线上的高低电平变化来实现的。数据传输时，发送方将数据位放在SDA线上，然后通过SCL线上的时钟信号将数据位发送给接收方。接收方通过检测SDA线上的电平变化来接收数据。</li><li>应答信号（ACK）:在数据传输过程中，接收方需要在接收到每个数据位后发送一个应答信号（ACK），表示数据已被正确接收。应答信号是一个低电平，在SDA线上持续一段时间，然后恢复高电平。</li><li>非应答信号（NACK）:在数据传输过程中，如果接收方无法正确接收数据，会发送一个非应答信号（NACK），表示数据未被正确接收。非应答信号是一个高电平，在SDA线上持续一段时间，然后恢复低电平。</li></ul><p>IIC通信的时钟信号（SCL）是由发送方产生的，通常频率为10KHz~100KHz。IIC通信的波特率由时钟信号的频率决定。<br>IIC通信的优点是简单、易于实现，缺点是速度较慢，通常用于低速度外设的通信。<br><img src="https://tuchuang.voooe.cn/images/2024/06/17/9C2BB8518D5E73568B517AC86C456297.png" alt="9C2BB8518D5E73568B517AC86C456297.png"> --&gt;</p>]]></content>
    
    
    <summary type="html">STM32答辩内容复习</summary>
    
    
    
    <category term="vue" scheme="http://265832.xyz/categories/vue/"/>
    
    
    <category term="STM32" scheme="http://265832.xyz/tags/STM32/"/>
    
  </entry>
  
  <entry>
    <title>git 基本使用</title>
    <link href="http://265832.xyz/posts/518e617c.html"/>
    <id>http://265832.xyz/posts/518e617c.html</id>
    <published>2024-06-15T10:53:25.000Z</published>
    <updated>2024-06-15T11:13:37.000Z</updated>
    
    <content type="html"><![CDATA[<p>git 命令管理 github 和本地仓库</p><h2 id="1、git-全局设置">1、git 全局设置</h2><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">git config <span class="attr">--global</span> user<span class="selector-class">.name</span> xxx   <span class="comment">// 设置全局用户名，信息记录在~/.gitconfig文件中</span></span><br><span class="line"></span><br><span class="line">git config <span class="attr">--global</span> user<span class="selector-class">.email</span> xxx@xxx<span class="selector-class">.com</span>  <span class="comment">// 设置全局邮箱地址，信息记录在~/.gitconfig文件中</span></span><br><span class="line"></span><br><span class="line">git config <span class="attr">--global</span> user<span class="selector-class">.name</span>  <span class="comment">//查看全局配置项</span></span><br><span class="line"></span><br><span class="line">git config <span class="attr">--global</span>   <span class="comment">//查看全局配置项</span></span><br><span class="line"></span><br><span class="line">git config <span class="attr">--list</span>   <span class="comment">//查看配置项</span></span><br><span class="line"></span><br><span class="line">git branch -<span class="selector-tag">a</span>   <span class="comment">//查看本地分支</span></span><br></pre></td></tr></table></figure><h2 id="2、git-仓库初始化">2、git 仓库初始化</h2><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">init</span>    <span class="comment">// 将当前目录配置成git仓库，信息记录在隐藏的.git文件夹中</span></span><br></pre></td></tr></table></figure><h2 id="3、github">3、github</h2><ul><li>新建一个项目，名字要和本地要上传文件夹名称相同</li><li>添加本地公钥</li></ul><h2 id="4、本地（git-bash）">4、本地（git bash）</h2><figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">git remote <span class="keyword">add</span> origin git@git.github.com:xxx/XXX.git    <span class="comment">// 将本地仓库关联到远程仓库</span></span><br><span class="line"></span><br><span class="line">git branch -m master main  <span class="meta">#将本地分支改名为main，与线上保持一致</span></span><br><span class="line"></span><br><span class="line">git <span class="keyword">add</span> .   <span class="comment">// 将所有待加入暂存区的文件加入暂存区</span></span><br><span class="line"></span><br><span class="line">git rm --cached -r .   <span class="comment">//删除缓存区所有文件</span></span><br><span class="line"></span><br><span class="line">git commit -m <span class="string">&quot;给自己看的备注信息&quot;</span>  <span class="comment">// 将暂存区的内容提交到当前分支</span></span><br><span class="line"></span><br><span class="line">git push -u origin master</span><br><span class="line"></span><br><span class="line">git push -u origin main</span><br><span class="line"></span><br><span class="line">git pull --rebase origin main  <span class="meta">##解决! [rejected]        main -&gt; main (non-fast-forward)，避免直接push产生的bug</span></span><br><span class="line"></span><br><span class="line">git push --<span class="keyword">set</span>-upstream origin main</span><br></pre></td></tr></table></figure><h2 id="5、示例代码：添加Git安全目录例外">5、示例代码：添加Git安全目录例外</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config <span class="attr">--global</span> <span class="attr">--add</span> safe<span class="selector-class">.directory</span> <span class="selector-tag">G</span>:/Chfy_blog/PicGoDemo</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">git 基本使用</summary>
    
    
    
    <category term="学习" scheme="http://265832.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="git" scheme="http://265832.xyz/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>sublime</title>
    <link href="http://265832.xyz/posts/f92f48ea.html"/>
    <id>http://265832.xyz/posts/f92f48ea.html</id>
    <published>2024-06-05T04:56:34.000Z</published>
    <updated>2024-06-06T11:12:45.000Z</updated>
    
    <content type="html"><![CDATA[<p>Sublime Text</p><h2 id="Sublime-Text安装">Sublime Text安装</h2><p>1、Sublime Text官网下载 <a href="http://www.sublimetext.com/">http://www.sublimetext.com/</a></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/E3B9FA4C03F3C8F0EDED1D7DA2F6BE3C.webp" alt="E3B9FA4C03F3C8F0EDED1D7DA2F6BE3C.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/49F431C671BC3360FE7E22F23264EE90.webp" alt="49F431C671BC3360FE7E22F23264EE90.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/F5E99CD5E4826BDA3A25E516EB136423.webp" alt="F5E99CD5E4826BDA3A25E516EB136423.webp"></p><p>2安装 sublime text</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/F0C6BE322559A3162863828FEF2A7B5D.webp" alt="F0C6BE322559A3162863828FEF2A7B5D.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/3472BE945985239E9F210BBB60B252A1.webp" alt="3472BE945985239E9F210BBB60B252A1.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/86B47F0FEF0A697D764DEFAC0DAEBDC8.webp" alt="86B47F0FEF0A697D764DEFAC0DAEBDC8.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/6A13B0D344C0C97532CBB9189062336A.webp" alt="6A13B0D344C0C97532CBB9189062336A.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/A81DB6D8867EBBE0BC0F7BCE9B56D2F5.webp" alt="A81DB6D8867EBBE0BC0F7BCE9B56D2F5.webp"></p><h2 id="中文设置">中文设置</h2><p>打开 Sublime Text 的界面都是英文的，下面将 sublime text 设置成中文。</p><p>1、打开软件，点击 Preference ，选择最底部的 Package Control ，出现查找栏。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/303B2FF3E33F0E1D6E8DEBD6688ADCE5.webp" alt="303B2FF3E33F0E1D6E8DEBD6688ADCE5.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/E1F3E50A39B5C9C42DAB26A673B61A5E.webp" alt="E1F3E50A39B5C9C42DAB26A673B61A5E.webp"></p><p>2、然后在搜索框中输入关键字 install package ,点击选择其中的：Package Control: Install Package。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/60BC75CBD398847080DA98B518C89DD9.webp" alt="60BC75CBD398847080DA98B518C89DD9.webp"></p><p>3、点击之后稍等一会，等待插件列表加载完成。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/0F44619F4ECD20340F536214DDD2C352.webp" alt="0F44619F4ECD20340F536214DDD2C352.webp"></p><p>4、在搜索框中输入 chinese，选择下拉框中的 ChineseLocalizations 。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/455A8D622F6937E26C019ACBAF2A9B3A.webp" alt="455A8D622F6937E26C019ACBAF2A9B3A.webp"></p><p>5、点击之后，中文包就安装完成了。如果软件语言没有更换过来，可以先关闭软件重新打开，然后点击 Help -&gt;最下面的 Language -&gt; 简体中文。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/02C9AED2636329905C5C4117BA5EB3C5.webp" alt="02C9AED2636329905C5C4117BA5EB3C5.webp"></p><h2 id="Sublime-Text-激活方法">Sublime Text 激活方法</h2><p>1、使用浏览器打开该网站 <a href="https://hexed.it">https://hexed.it</a> 。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/BF8890E5B10B15DD5EBE4554B45D7956.webp" alt="BF8890E5B10B15DD5EBE4554B45D7956.webp"></p><p>2、点击“打开文件”，选择 sublime text 安装目录中的“sublime_text.exe”</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/1f3c0549c0d41edb81580f6da2b4e7f0.webp" alt="1f3c0549c0d41edb81580f6da2b4e7f0.webp"></p><p>3、Ctrl + F ，搜索输入 807805000f94c1 ，找到后，并且替换为 c64005014885c9 （4180 新版本将 807905000f94c2 替换为 c6410501b20090）。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/161EA831D2431914677627BD611AA2BA.webp" alt="161EA831D2431914677627BD611AA2BA.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/2bdf4baa-e8db-4387-9d73-be4f5ffa8618.webp" alt="2bdf4baa-e8db-4387-9d73-be4f5ffa8618.webp"></p><p>4、点击“另存为”，保存到本地并命名为：sublime_text.exe</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/798ECF386A8B1B9D67008D9C0E58D5ED.webp" alt="798ECF386A8B1B9D67008D9C0E58D5ED.webp"></p><p>5、找到 sublime text 安装目录，将原来的 sublime_text.exe重命名为：sublime_text_bak.exe。将刚刚保存的 sublime_text.exe 复制到原 sublime text4 安装目录中。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/982335C843150BBCD19A1E4F851523D9.webp" alt="982335C843150BBCD19A1E4F851523D9.webp"></p><p>6、激活成功</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/9DFB1E972C2CECBD80E0E3EEC695501B.webp" alt="9DFB1E972C2CECBD80E0E3EEC695501B.webp"></p><p>7、激活前后对比</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/67D7E0CA9BA70C09CCF1D04B52553BE8.webp" alt="67D7E0CA9BA70C09CCF1D04B52553BE8.webp"></p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/9D5DAE76FE5A2089275613498F0786A1.webp" alt="9D5DAE76FE5A2089275613498F0786A1.webp"></p>]]></content>
    
    
    <summary type="html">sublime安装与破解</summary>
    
    
    
    <category term="计算机软件安装" scheme="http://265832.xyz/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%BD%AF%E4%BB%B6%E5%AE%89%E8%A3%85/"/>
    
    
    <category term="sublime" scheme="http://265832.xyz/tags/sublime/"/>
    
  </entry>
  
  <entry>
    <title>有感</title>
    <link href="http://265832.xyz/posts/67481514.html"/>
    <id>http://265832.xyz/posts/67481514.html</id>
    <published>2024-05-28T13:37:54.000Z</published>
    <updated>2024-05-29T06:13:27.000Z</updated>
    
    <content type="html"><![CDATA[<p>你是一名二本学校的学生 高考志愿填报出来后 你决定了既然你在二本学校就要好好努力 你进入了学校确实也打了鸡血好好努力。但你看到同学参加了一些竞赛你没有机会接触，于是你着急忙慌的联系老师希望能接触一些竞赛提升自己，你开始接触了算法 那个时候正好在学c语言，你只觉得你的基础突飞猛进你觉得这是一条对的路，于是你开始自己摸索算法道路，但你渐渐发现这个东西很难，自己的学习浪费了很多不必要的时间。学长都告诉你我们学校算法难度比较大，缺少底蕴弄不出来，学校也没有算法的学习氛围，你开始觉得你走错了方向，你担心你选错了路浪费了青春年华，但你没有放弃，终于在半年的磕磕碰碰中进步了微小的一点点。<br>时间来到2024jscpc，你第一次来到这么厉害的大学里 ，伙伴们相互调侃说高考再有两百分指定能上这个学校，你也点头默认微笑回应，大家都说这只是个见世面的机会。比赛结束，你只做出来了两题，虽然老师说没关系，继续努力，但你还是些许的失落，虽然你早就知道你没法在这种比赛中获奖，回来的大巴车上太阳很刺眼，很像当初充满信心闪闪发亮的你，回想那些厉害的高中选手这么早就能获得金牌，你觉得或许你的终点才是别人的起点。人生本就各不相同，如果每个人都能心想事成，事事顺利或许人生会少了很多惊喜，比如在紧张的赛场上终于AC一道题后的欣喜以及听到别人比赛快要截止时又AC一题的欢呼声，你也由衷的赞叹他们的能力，试图去体会他们的快乐。虽然技不如人但你并不因此感到伤心，你调侃着和同学说WA也是A，虽然嘴里乐观着，但你的心里还是觉得 忙碌了几个学期如果没有获奖是不是就代表着浪费了几个学期的努力，是不是代表着大学生涯也被糊弄过去了 大家都说只看结果不看过程，那既然没有结果 过程是不是意义也就不大了。<br>到现在你也仍然为此焦虑，虽然你不因为没有获奖而失望，但你内心却担忧着没法和家长交代没法和社会交代，父母并不会怪罪我没有拿到很好的名次也愿意相信我在学校有好好学习了算法，但你却没法安慰你自己因为你只觉得自己不够努力，也觉得缺少了好的方法和资源，现在你并不那么悲观 你只觉得 未来社会会有属于自己的容身之处 自己并没有想象中那么渺小。</p><p><img src="https://tuchuang.voooe.cn/images/2026/02/01/10001.webp" alt="img"><br><img src="https://tuchuang.voooe.cn/images/2026/02/01/10002.webp" alt="img"><br><img src="https://tuchuang.voooe.cn/images/2026/02/01/10003.webp" alt="img"></p>]]></content>
    
    
    <summary type="html">有感</summary>
    
    
    
    <category term="记录生活" scheme="http://265832.xyz/categories/%E8%AE%B0%E5%BD%95%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="有感" scheme="http://265832.xyz/tags/%E6%9C%89%E6%84%9F/"/>
    
  </entry>
  
  <entry>
    <title>计算机操作系统笔记</title>
    <link href="http://265832.xyz/posts/521a3173.html"/>
    <id>http://265832.xyz/posts/521a3173.html</id>
    <published>2024-05-12T05:23:27.000Z</published>
    <updated>2024-05-15T08:35:57.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 密码不对, 请再试试!!" data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="1da6889fbfda7d6803907c1e98e7beb5dc5610312b0847f44e3c42b23f408e4b">ec3a31742d91755fb33828633f5c2355f9d21aa3c472285e5746d35a9ce878a8ee02334635e00eef92233d52f86ee4be7823a89c3b02a69642c9d0ed334c61578114b6a06f332836da52d8ef044cfef144aac2273f6576e3a4c5fe5a07e3aa595670192750482aef6d4918eed6bc71863d5e3e492e20c50715b974e605a8aca913553fadef43b80dcc95f0113c1937baea1a48f8ad3607bf66ab5455e01c89edcead09d304aa350b5eea91dd41b31c5af753d6141dd6aa6fdbfe4b7af615237d0320ef1cd302580b5f0cc1ec327db154089fa8d9b631162a93242e3b8ebd62abb316c1b908c2e8782c00c74518b96ef60ab2d02bc81e738268bb5dddcf686ab2f7c3c75042719801ee9c096635567b60bed19280c8efeb500870843088df2fa87d9d874daa91d942da36341160b74e4e72133c219c395d1446a9ee4fcf447d95f8f3acac2ad8bb3e257a1a0912b61691d98abc00b4dc5e34bb8347527cbce7459be6b8e30c8231b50c305c8f3b71508c629df8d812a60fc55080f5161ccd98fb13eb939e596718668488290f9d107b8a332cc1c43b5cb193c39d3596ab26a5de180cac62ebcab4a6a2d27f27af40e4c6218847b92ff66c470b2424b682cdc77a8a30fea3d99c578b011532ce223801b6b7e69c82bcbaf454d6dcea7723b232dd705b0429a4d6eb1c3ca75942073b250347eb1cfb02fa16c266da9360b259fe65a5b9c79f66a203e2858ce50d2347cac3a58b71f832ba667d485b60258e99eac5dc79b8d66e579d9f3f1036fa92da54954ee418571cde5492da601f44a86e603e5076eeb89ce541270b92d03251c3a0e6830d1ee744d4c2bcbdce9dcab6e1e788ac58e54a82794894bf4b416cb12155f76ecc345b98872d0565889a5289de89d9f2db8b408278b8c5a99e41bbf40fc76e2b123c182d0a8e85f9ca01ac3ace22d77a46233475267524c884029c5739d776ccc06d82cb172969f359cc4aab8d66f94f89a5b331e85bcf2ac748de7791fac7c7cab45cce0863cf25e6a9634781ea522f5f1946c788c99bcca3c662977cdfc00da3f169934f25edc523428b89f599b5d234aacd58e8302fc99dffcd29e77430981bd7b244518c01b34a4989145756556bda40cb1abe49f63fbfbd1b901bd9aa5c43e7fa0ccd341faf4b8a34870e86d88243e07894c4f9472bdce554f6d04f51c4994c50546dd7c8bd81272109a96c74fb746d3da70d861ae4b55d080dc1c540b9d07cf1407ad10602c92534789d28a67980d51b338a221e2299f361d43ee5f00adc87965b9e3b0f108bde6becb3601bddf89316d05895afa3bea5a69ae56a84da4d47af5c0cad3cf29402fe68efdf5ba1851503993919ce9a2f198843d0fd0025dda7a2c6b8cb3e32452e009a05bf0d0d127700fdf28b02ead1121411256fe24daddb9d719db5c816c299d0202fe9b267d963cf061da40ca9e8f7d39e9de18e4fa131b4d627f9cdaa665039222be1321a5d2eb9974e18724931ee27c3b9c9695b803627477932dbe7ddf46f6190d399ed2d0e76b35e2d3ca983860d19a1949e7ce12c652d4e4946f192cd227e6b75b655f409ffce6dc855617d7c51035a40a86a920fb98684d927db42486079d3fe57cb5eaa546a57fd65bdc8b17b4c5ea981b23044505fecea3ddd1a9eb2588f43202f6b7c68350df5dc11621fb1488a5c60b9a7b6cc71719eff42c8de62df930c4c30f0cab12b57897e1b9bb0808f31fe228b5f9e257a93ca69c941d889241eed32beb0280dd3a1e18361edbcbbdbb73719a872cb5079c6bb27f3e856040f0ce1acf8ddcf31d2118be7d2af767b9badb4fe0820bb43c7fcd92c11e569397e6c1ed69bcf0156ecf6cf1b3d998e6dd0dcedd922e73f7a2aa5835edc1ef48f1e8a4f7b9cbd5955f5e0fdc4f755f7ad2abc7c83e1a144964fb1bab71d64edc4530d3b27f77e30633d8b9a09bd10ecfdf47bd2a9b8b3d38c44f601fe320930d8dcc10430cedc490905da8088daccf88604686cdefb1787f8f61ed60ecea04def63fc70ad094aa50271cd64a8efc8cb5adfd33c1f7880d4f3a5a2f4c00cff03cc499a44e966c56b3b6a677150675ce8c0ea2eb3ff089f12c0163fd777500acbd67b5fce83e63c04eecb4f720d55a5b8b6d4c6bb8b96fb15bb4310a2ab3f5fa89ddea9d7c3c9c1152b8c4586f64c4438dda1c847610be5203a73705d1efa8817f28657e957a47db261908f9271ea387846009a62144e507fe0cfea279bbd7313ce8b6c9256d2416fecae07057fc907a08d7769b3e06e6fe9a4c9e7bd97394415a29f8831f83209b6f59ffa4e62bfe80e9d5b776f42c643fa528edea86d9e60dd8b1f4947a7171c79e97bcd5f48bec5f37175284dec1c50e0a7005af4d34fdf8db4253cf3ea08aef332ca1077669134bf9b90a1783f7f0dbba72686585e221ab04e20111468bad7a7a8aba2abad0a81e74e1fe2a00002dcb95c47a5504f2a9964607b15decd56c2509a88097e462c395022d37dba984d67e2117a134471381d91bbad09fb8890bdd43ed6d9e5f1c9353504e93e391bf2ca6917186133597fd505fda9a75e28aefd95002f0abae9aa28a48b92ca95bb8f4c0e4876672fe239fbf33b2ff0c05f10d66aa572756d78bf1f92bfcd1c4fd3968cb5bc46524ec388e11b9e4fa76b01980497d1a85f793f981775dcf4b9f27e0be771b7ca857e3ed0b5928262f2286c256deb84f08588dce18de88a9a2e92b3a3b05b9533b3e3237204c1413db5c9e28d7edac3e265e7904560025e05d48fd6ce01531ad10ee5281f6de5c427c062e0d3bfcde460f96b786dc2b1f83db9c8ee34a98af1b4490737c5813bef0118bfd9323f154c3c7d269f640018c847ca447bc93f87ad2f9d9818856e8999cada6c9da561429e1a12ebf022a25f84da646184e28e58ac81f50b2347928c599e7c5f7008b9d3f5b87502870bfadbfba54cd567b21f8a54670fe390ab185eab723e2bdcdcc2fb1687c0fa2de22870aa431ead95cddcd1f170f05c0613c6baa68baa53da9dcc847b4becc0fc6112d2d5258226a8e492d7dedd3071397551a4cd11e75347e0d54546abd8a4ecaf95fe3578f6f9dc2cdabff00abc89207d34242c3c247d21d5d7340079e578e887eae4d0574266850a110bcfa88f17fc2db9042cb1fa50f77b9501296a97b70ab38dececdadae7d9f4b3268af9af8979318349e6df8ed7654a8bc723f3ecf88cfb30eff72804a44c461e12fcd0fa6b1fc99f6bd58a66f00e0f079c56a15659ac3f17feb66d95adcc077eb43ec9a47f0067c66d0f6fd9c05c2b87b37090592dd84c4945b29d47d5fbd05be84059354f936b822e28cac72b01b888b3cba38a4a33bac574f389b1c5ba378ddf31eab46288d525f62c153290930ffbdeb65c4ea6976de9a0615262b41a9427eee9c7ffb38673dd9077820d1c66cb7b9cc4c7bd86b9af5b3e859352291f37dafa72c58c20613fdacea5a0fc0b826ba6b565441fab01820766751cee555448f4bad0f869c0bf9e4318f062eee547a6aa84dec879975c9a04f1d3ad8dedb95c613c87cad9dcbaa9241f281f96da94d4939713fb36af5dcd8427a56c7bc69dee25a4bece4557fec2d57256bfacac39d25220d112e1c4e796b50c290b4c9afbd6d66e10365dd739582a4d68ac802369128e92367cd681d7681dc78fa10defea0be922f3d9a1ce73b2b7941d2cdb6504a8b7d1f0a8a5bcc7eb180cd39016bf2e2f1f7558f62cf2d0d50f016476989c5e30bb39030bfb94c2c3100f3a8ee763cb9bbe3882bc1e282311d664d3a9fcc4055276796059dc13835a2ea3cd687b6b4c869e0e8a8ddbdea0c953b919a6c8ef814f17230590ab5ef8389528d7761910bcd2d9aae4df43aeccce44ef2d1fa3151f63e6707e9ee98d68b0222620a1a9a4121cf02c14eb6ea880245f1d19225cacfef71682a16b0bb48e02139183f4159eb38e6ad40cee1c5274fe03ecc66a32fd621389ce060fe0e31d5f37dfa13ea1471d7f25735f9c7aa56f30e3e5c310b598e02d3a65fd56a82cf6b3ada47050331d663f267f756f9f6b2c9d8775fdc5583681cd1904b11016f83e8d1f02fc3078de463010751b65c8d302cb5b254fa61c5021d3710b6afb8739948c8513d4253cc10e92292e81657671d3c3cee163b383cdd16b5f6006cdebc062141d19240be880b25418f88905aa645990a7a4039374d545c9bf68238d6d90ae69f59c1fc9d92d068ec3cec0d544cd800856fa0c7dc189c66404f8a9548e8860204c984a24d52e028abc727747ae3755d50a7fad8ae063c6c53e624791ac5b5e3fcd48d3aafd792d5313e158da4008a2d8770830b616466a29ae61e6a8223f7da077c649c3b3558c927c711ff5009debd132bcf3b9852cdb63abaded58bdcd7f90263e111d0d930c693f083042ddfa986b6aa1bcd3a03ee91189b8dbd2c14064b6394c34203335ce16667a99649442777d4a8f3be2bedfe909627ee7e8001ce4c98e8f7162b2b920ffdc0dbdfd67265cc5994889e8209597a8906906f4dd4c3fb58ea6af3d9d36c7408c5fd088382538e61f12b62c99af74c7928f999c63639a155899bd71f2334ed766ddd11549bc9d7f468c13534c4c1f567d527b42e1f69dc724c24f6025fc7b9b8ce294a1b2a7c8f5604ed8daf3902f52b508b64d90d2f96fe8dbc7733d7a857a3723e33fe6272e5cf5cdc1bc6f854bd28300f5f8787d1631c31eb9d2ed3401eccceb8b2af174ff6deaf7b902b2eec7a679e1e7942acbe73b0f086bd844d017018bc9c6dce68242b335343fa7b4c54e8107517ceb3c0ff6c09e7a4126c3b91ad384bee2aff1a20bff3ba715f86a456c803cea056b2dfec721af3304bf556b9118809bcaeec2e75091a9203d828506c4290b473be04ef4f3733b5c2b77810996188be906efe9aae3ba9cb1cf0e0013ba5f4fad5b8e63534c69a0cb4d7b4ce6cd1db21a79bb7fd98bd1d6f452c96a55f2940cea4b14566f7dbe6187c0a658704da74b3963701b234e556527390110a289a430e5d2160870f52f61c73a4cfc1b6a0e9e74ae593d0b9b993639ca907d74a486bfb5a9bbedf1a34db47b2619fde7ca58bccd4958241da7edd7d4a77c0c9ee1151d7d402fbb8488b2e5397c8f1c5aa15f5a6f752784fd737b8e23d705908c979b731586c679cdaea75e6a64cf82fdb46494118306dd9d9cd866e364dbe09a9e5b21e3c04a8992077ea107e2e50d24a759136f780f28988ec59c0871bbb79d64971db75a699fd94dd1c9817eaf25c65a31db550a697d2e51607eb1f65e1b1b3d7c7c54cee6cdb3f92933fa4db12f93e42f48bb9a1e9c319db6b6756b97c5d3215957b6ed19531556b4a797a785731f185c059dc4e3332035f7840d6a972d43ee56aae8b95cd2060dd884575bae25264822a851d6ca6cef51d0c4e74e3f0a01027f1fab1ecd28394b4d0cc81335b490c5e2e3ddae8f1ad63259e931e91812343ce151c9b768b1e1662d7989497de7648e84f8727718544069a7861f2eb8abb9b8128fe3bdc06d2fc9494caced55278e1c7d32fcc1cef195087b51d5622a749e503a66bce3178fa2d6b648f2827a21d6f48a3e6df82e78f06e4bef6a522910d424aee0f17ff9d40ee77844cb63fc62fa0c7c7a3ba8b611a2660de365861c727adb8293fec9cca8eb719ebd92a844b53907311b309f4ddf46b9b8552009dcc6f7236fa0283f601b3a156b3790f4de8a54fbcb1bbab6dec61de4e59963c8226611a75d6c25b027c13f7cde2116289e2e829731b5477a429fa46e2cd058ddc308e0326f34191bf1d6dc566073b4c8101b0fd692f4ac187a640aeef46a2b25f38e52d57a4888e18e2a2af4fb512baee7eebcf586715b30b6a93406f799fe1bf6150cf674e7611d732ddb1543f506b150e9e73ce138d6dd456cd482b8804ea61fe4b6d935dce47e94a29d30eee8c0257a5f53fab7ab34594fdb6da8409bc3c58b7281c35740d2abb9d6703148db305893565a327279e69df62acdf4b549556e4b7d315e0ba056f3b9e6b2fe53704d4190e676c46c985745d1ec66bfc474566ed70eadd15579dbb54bb7c9dfe8fb27303e433ce10bacbeca2eed39855db9518b927aab20de1b060370499ed26e0e2cdd5c4010522d4afe0a08edd9b9e7957a13eb4165871fd4a3bc11b9f501c0e44cc10802141e508acc76376d68ef048fa08aa669f25fa71eeef58e0ca6bf2464ae30a16f4b80310a8561d62b4a45f9a6797561c784ee881a5364778afb6c95d757c56a2feffc4d1ba6b2654903b3411c65f0e8b51e3e79ec31c4e88cf0b54bcc0975546eaa60260b37a21e63ce986441042ebb28b740f8c98401fcd1bac68a56d6a6146176ca8c1eea7e02ec86fb23ae5a3759673aec0f7fedd10d574926ab5f730c34b5baf6afcb5e97ec39cb24f2ed9eb24e0b154f85686c19403e6d1d6e904d93204676a2955c1dcc27476bceffaabf0ba3db1a566f92f4698e9d87164ce41d95aa0877ad62a645709e35a4f20d2e94d1ad2aaffc7fa4ea10cd683c9b87e0ebd1c7435fcc337249bdb219b49a1b4b61a91b807aee1f47457133032a12fba8f54966e254099f978729d5f8ad2bbecebc2bdb6687f7fddbcbb00a0e7fd6b21845863ddb6614ce8b21d9d3baa3be0d2c58d15ceebfd7f7138c49bd51b264af0b7a79ca8138d9ee30fa682fdb5fe44b22120e3e918c0834b3e883820671f8deab4b5b2cc1d5bf9e70d83629a05644ea9836a228ce69446519dd9181b75fcb35d03aa6f73a83f294be0b632eda05592e09cbee38d9cecc98e061d516e4e0f37f5c339268186490963e1e10ac60a627040247bd20d56794819a288d6f99ef42eee884ab318c987520984f0973a25a0e33e9fc7c5bb0e8dbbef5920128e8131e2d6685a4b1618c8c4d166781653425c2f19f0dc483a7d35173e242f2c9e3f898fbb27a53b0915eb281ed7ee976e890b5100d9a9a882cfc88b02587f8d8b1842aa2c6800f481be94b3965bfd92c1bb7c00f3e7d15754746549026ea2c63eb3a44c0b9ed1deb51f02c62ac2cca241e478f6bc3cf4f60bbc05b6bc7bb3993a0efa1e0a55c7846b2f740eabd9e061eee62dc42772859a781593d4a4020cbbece0bad347de0fb6179b70264ec8305709722b397ed5bb795fe2a35e66bfc418f0c3eeed68941e6534c5e732baacd9df3505ab39468a7c12556089554f9c37e4ec42c80a4ee489204772b8f6e27b8e8d1c6cc6ee9cdeb74eac860c361c3cac44bacdb612bcf4f158fc034bfaffbce3a69a011263bb566fb4a7d15e386c5d0a80c613e0759c02e2ce837ad7e0c4407f28ed456faecbd8476f8b249c40aa3bdf4bdc6cdc937ae2c93c7ae120186a3407f5afda8362591eaeb023589d2f4bdf4dbcf76b21ba2a79ad4a9c8a4727c52bf3579b986c4187f452812bb546b915cdd8b2763acc0bb4a2bd7f714edc865831f357d178f41e160a6daaee8330b3bd310ed4761588c2354499e80d955d679e11adeebda3f8ca876fc0bf082eb898af18c4b8fa7c93fc41fcde91226c71f70e4ff24a12f2146263e1945dd4f943de0f8cb8c3b0b9283a60c0c28002bcf32c5a1f88ff09dbf026410e3c48704ad24bd0a78e18221775c0ca0c14f602a6077f617ccb98713d007cb348428301c91bf211f6f12cf296e285c56b67b027a4110c5aeef54c07d001f4c881560370c928df609c2051fe5d4701e1e5d761c8529f55e125f36c19f8a85b2ea1dd80e74d086afea86d2c0640a501218ad9df01c90e36ba88e3b8ec3dcda716f7ae4c000b1603e49b4c0d4a301139005b32fe422508255b429dfc0ac42b845154d64716ce22e4a6fe3fc728fcfc80685bd32e526901493dfb08b622d3130ca3e3deafb3d9670ce39a2cd8cf9dac64884bca7f6dca30a7cbd5819df5387c9f22ee28833d201dae34bf4a975f1b42c9ce728957ecc5f35aa7721d47d84d98209c13526ff6ec57a6782a18733fcd1413b419dfb60b2c7856d3509907aede8c4aeefe271793b74d91d6ed2dc2f6a2f889d400b3919a76b607981bf1d280dbe32d6415e721eb0a2d7fba084c10dc34a9e5da85a114e0fb46f5f508ceef5a24893b9c67441a6b1a3f47abb9cd18a7f0fa1e6243d4f415aba0e598e1d9936978006e5f679db18c5e1c914c745fd965ef5fa13e9bc896b5afd27a9be12da75e7209e67d2c317e02458dab8c0bb17b656dc96463c5310fd98931524ea360098e1136b7bc889b30a3b176f449a0633da9d9d8dc32623c03c4ca7e36e17294a41a39023a56a742d4953f962eabcf2ff336dc45e07546753857ffab61a748608317da82b84c071c2dbafd12070c0e0760cd9555e12478cd24c722c38f0242a8686f5d3ec9e9ade769b714d6a992ab9a3820eba04c174bdc098311f92d83d9c8f1aad7dcad3867bf508bdc872a65f62322fbd45648754df8ebbc45edcee5fb612d1d6b0b5738bd58c8be7260cf2a578b64705d1ec71031a75ec7aec062489d7404be85bd5f0624160f3ef4a44add08d5028261a3a02875ae300a5294e2420c0c3647120d09b918375cba74df45cbec4bd75b701dc8607878059901d6216d6cd49c5adc45836fadfd9b383361766dcc12256eaddea1ac031de048c21741653d96e42853791b3aecd07614757420e6e4e3cd1278b1269f50a1e19f4d1ece38bdd06ab17cf085663bd688ba07384b9c7add696a5229a4d8ab0e471f1f16ae2bb75dce2571a07f781fe4d581c2c0daeef5ccae081506ba396ea7f69afc788572805058c9e8d14a75884125ac0198f15c11e67532f3b70cb8817e931443edc5aa3b8b774f519867c549791f86855135872fd449e51c03c3f578e69e535011eb7a56de6e531650831fb58e5342462cccaed2c280fced293f21d6e316c97bf47120083e874ee72e7002885b15080cf81a606b91f3f324a0c8ff4f8130792819012babac165ad2533cb5c907812fb8c4411a41d14ee4b4c9ad731b89e8b17e2cfde53b66b657642e0101292e1caa31a247fd3d7d09f7754cfaca157a16ffe9a2d99eacc5eb578622f7d361b107b477dc05309bd126e2ac70738fe97528bd0f9281bcf2edf15870d2233166c1fc9f6cba136c2134b4b8d3dd7f351b756a9145ee501d303baf36fd43d1f823a42874c9b6b67a820352d2b2082298f400b53912f0ae0185aeaaa5a5939d1807acdd324a7d6da9043e379acc1722cab24b47b6d072eb01210528fe13737d780aeacb492106100fb5a6bb2b5089c4d06ed4d2231763ba4e4fc5183dd7414bcded48c2599c9fd7fd3e4d5b92a2ccf7c10defffd8cc30b3a543216f2fd61dcf880ec0d10dbf6981488fa821261931c66b33375384a6dfba14d0394986b6d97cc6a5d8b90fe5f88c79fd6abc56b6b746e8f87a85d22128df6b2da1498019a83aa030cb6fc906b0b7b3e21cccfcd68bb4f265ec3955984cbe89be4e1b12d8d26e10c1cdaf02d3aff0f8a2cc273fe9c61799147d7aec53ce01716ff71acf43719c5878dec8d1b783e52a4e29a3b29c64c4d479966730abe845edc9a2ef6ee94a5bbec22d89fbc4db39fa71bc7d27891783aa6a4224eadd5107069f888b3ef283083acf1c597eb790ac85549ae43a883d3fcbcbdba3d8bf7df321a05bf95df7f7f8ed8f6a5a41d1ce9e8210c6f96c8b2a95f9180eef1e391cfdc16365d35bb24aa5713431e8b748c65a09441aeba84e496e52bb77e9f8ca3e9062c3b10579bd3bfc6c343995a1a991735b32ef0b64b9ce36e6fce60c12d5bf6f9d9697f66efe93464b9fdd0a8def70b595e34665b99b6aa99155371d0c76f64486a83e01fe677c66ac7333e92609a3f85e92d6d514b05cb72e814651ca0ed07bf10d0971ffae123157946592b87f8b7f52e2e216a16ae0c0e1bb3ef22fc96c5af49982ca9e22c358edd2e77348a0da5d8b204e2be2afab6990fcf23f070e64e303a2e6b57c241fc5d0bf71043309dd5fb852e270ed1bf9277b4ed3a107caeea1d50c9c6b43e4031b0db1d2951d69bbd3d1f9b12eba995573d7e1293c7ecfb4582cc17271d0b2e9adc1e6098354c04e23092209143b3253648519ee592ec27b1e065411092057e0b15793e04c479ad1c7cfb0d3ec1ab29017bff5332a816c10d3556f5b013fa08db9305011174de65957896f64c1fa593055a311a0c36301513b9e0d2f5712363e3b7cfa911af8756e49097c47531cd3d84cb10e3da226fbbbb56ce167df8b533a7e6f6884f0078ae501d8373741109dfa7164d019638eb352e73ae1587559a22c6ea2ee18f1c3569c835920be18ed8772c8048ca3e295dab74f5f27651a5e709e55d0430f04ab3a036ccdeb1516361b730d5e73f610fbff949c481e83d62428381bc6d4a1c9f72ba43073c27cd8e2bce2134c1206c9feece716332ab2f59485b5d1427b537ef08bbbbda7b3972855ff97c34d7b189cef7599debfe99d9efb05439f196a7a79c02619581fa3e3f219c0e6ed37de8592c76be63934050116e34851443897a3325d6dc8fe8118bc0f794c19b68e95852055df2a6e7a876d054862a7c7ac15afb41e47b4188817a3d7b17ba344e60835d8c4b9a3c03a9f3078ed4b317ac3f985bb3e291608890140ba733073ff41b9f147188b20f9805f236d7def9df92c8f42671a1cd262f83831f8db3daee5bcbef104ab5de9e0c696506c6217f1a39c3fcb2809ae49eee2baaf406e4841c40aaefeb0bd0b618d9d17eed0934324a8f6c43d20e2c211148a4d48001ed2e8c274d72b94c5b41888e9b39a65147488d15c48177aef4577c8d5dc1913574bb6b963ceeffee7f830d16f6509f7ee1ad2a7dd15d7dac180d062ec14210a590f4fad068ff4f6bbaee8456c1a6d3603763fecce6c6bd341a12f5210c5fe483fc722ac599de74378e5e8af61447a9c5dde401a2ee7cb28ac8b7c975dfeb03e047f1773e9f6cfd1a20e1c33ed84baadb7c30a0aa131fb20e6b7cb8624779d4aa1c7c7db6ec68b40a458eb8cd7e20408370d28f2d3fad9c13a1d50a81fda8f0cf3cdb71eb79718830e74e82dacfa47bab0d7750a015f40f9a3c2c582b2737a688c7f697f745a1ac4de5195c43f17008796489b0a1113c18a3ffc37a264886c2f4b050e5b3a114952afeb24cb59ac6d01f682775188343586fba7e17a1ff94a3faa442764f296b6c9d088da8be01be024cb1db316643a48c90cb3d96b9496189b1a02a4184fe3553dfe9beb18663d274debabec20eb44edde6684b3cbc98d9ae0883edf75d82c6f4acdb3782aa719d4e94c2544bb90e6cd25280fa575f2d17510e8293de035daf9fcbd140c9622af0fedf17778755ebdae75be627782b29a16fb52bbe86de37fd551ad057e9501ba36517248036d1ce1f9a05df0bb814899c30d4829256933ade3dd5580890945ff6d55dccfc14d4e13f363c538cd606f42f0637a5f61f5e93ec2bb50e22f4c24d3598a8d896826fa7ffe93cb9228afa52d6c5ca9ca0d1cc40ec7c4176e0e7c3663655cbb0fb2eed97f08cf22ac12942e9f4057bbc5ce34db9eec578bc40b978eeea82da371a3cf37feb0bfef72c2347f05ca917551f07a11ad8a446cfe8a0abdca119494e1888cd44d540958541302d9e0f96f699e9e7466f5ba34f0b69c2eb027215db824cd11659049bceca4bed0700f9f5d20ec1132857a8cc4ba6150b70c981a9095d92540094bf7aa3f2b9269e965609860e72040e64db4a0f91ff0382a8ff705beba43844d4a4abd748533113b5c75a11164fe8e3a12765696927a3a32dbab5a535ad463dd47ee29ac073ebb6a3e0e8996fcec7e8c06136c6b94f00f02f2093aaa0d64cf0361fcd276573680873ff0c7b731b028073bea7b4b6586adfa54ed6f9f9819a5ff5091d6da7924e883bb11eead414056f757dd6082be74b4c521ff31740e2a9f6f6b91c473e5f331e88b8a54ae9d4843e3b4e40d16df7bf1f0503cec075f5d5e7a0a6040e960aed914be35e1fbf8740269aab61e7bf01943ba50b6bc3a03e3059776878178ebf6b8cde079df60c17d3d9e9e6e19b45ac0bcf91168f711005c730744bdd6d1237f9a4c26d8b5c602d196f60bd642084b2aa28c7eebebe1929eb40bb2fe74c4b923b0e707d6e78e6f5ab7c3a963d66aa492a23f5ef6581c2b9d5bb4b047d2fc46abff2804cb5ecc877cc8f67805a6a7679b510c1e609d6d0669046e731f748c895a22a60da0ca006d532b8a03f5e98302545113637f268b1f2a085f58356ee3a2c467a002e44ebf166c1a3ea0918ad5614702f3fb93e88076819ac3166fd093a3372b875c7755232f5cf4a7ef8f63b8d5f881c7ad19df791761c4de857ec9bda39b82e0b0a6bb8dcdb21f3972bf0e036f9e20d880b07ae030933d0de97eaef6ab227e397ac5b99c0a340890b7338f836a8b8b5c5b4466caea2b460fc58460177b4059c7101ad79600761158cd4cd21cd59a1a2a513adc022a74c905175097b1a240e417954397b4af0f8abf279ce4e7733daee3a4346cc9351e70718204ee1beb48c00def580d3cff7256e41f36c42f70dc9ef892a1cdae8d7faed5f0eb77408a59008180fd9746f32040cd5a4daad3f8c9b904ff3044d109441e7c31a5cf20341881bc08f19e26a404f1b5b37d5a3a73f4936610d938131b49256014b734c68812eefbed89f52a8b721bf5b0e42207e0ac7d942f827eb4588c6d87b07e89bca61080f737fb938a1cc17a01ad1f3425eb717b72ad4e1ad684ab2e1f9c8fbb04d2a3d1962853d80e45598316c7de53ddc29ba706a330b378a20bcefbccc2d190d80ca57ae26e9ee5d4ca358aac815be984e6f052e52d9a655d42082a84e7416f90f116c455215694f50f3eb10feb34321eae2d0297ccec83bf9a7e30700d4b5243ee13361cec5a006c555500a7f3a5f7a15d9906aede9103b21006a1af5ce8236a41e5afedb658d397b7ec8b594a3634517ca7614320e01430d7f9720d298a7026c9feae9383be6d622d3dfef51dea8041953a92f45ba3d8d54639a9d1e5d1bb24278a657496d3b6655924a48b815f8db4f0751196968b929c16ffa09e9a7674d1737a38f12e0c77d3629a19438b47ffbb16655c4c6ff6ce35e086cca990dc75bdc22fbc5cc8a33d61a89d39c87b66e670c6935a5e57a345f800b7135482cc2f471cd5e79a4101273f754055dbd1b77885800092f849d7e06f1f12f246e5e1b517d510561beb97543d57cf76ed358b716e8150e58e28430d121e57470435bcd3af3f8052d0ecc6bb4cf5c295fdf784fef3f6bb8a8ead9b4396cf259cf0462a9641fdbae76bd3f384977a4dbc07d8ab253bab572fdbf59a8d9eb5d0c7e5b507f406e477a9f257892186f0246620e34b8557f07316e03cfbec0f4b45dadcb0b04e664ed4e78011a847e24b9cf6dd5a76db54e85d007472811c308aad292311d01555e70728dc11eeeea13c5728d23cadb8e608236b8123b515c13eeead1f698c1d1192db07eb3a53bee0d3e570283ff22b5290cdf52320e9423e0c0ef6fbc12d8be4f5fe4ff7fce8ba200282a298dfa49fcf91db5a8ea558d6fa4b76d9b0e3a2dc1a0436317886ce6622ed79c038cdb42ada7e02351a9be7d13c3f47d7618d7c406630aa312b89c4159415639ddacdba47a37a645a02df9fe9a4d53e3b0b42a7697ff85c2207e641087dc85071da7b9c9db6714776db3682e21d037dc50b0e1276a960152641b011532c04c47c8b7b8b914e3950c652a9c2d39631f76fbe6a8b8675fd1dbadd0e2c08723ad5d24cd46fa65a4883424f31dd003736b84921cdfafd4cc39ed0182fa318d9d44631ba55adf6534604c4ee713e032ab9d69720ac8c84ca206ab9994c4d690f228860b56c0a1437b535cd12a5eae891ee863e45a6b48b4bdfff9415f5e9488fc9f8d6970932a9b1638461fc7d124313857154f882e52981cec6c111fdb5288d5948f869d57115c3fd88592e720bd1e7e7bc0987c5db8a92d8e3b23e662c58d90cedea9c52e8e97d194b2a82e83eb8c10b8668d0c92b532f04d141a17756ec5e2d96ee41ca5a1974be492da9034b28d56a67f1e2d92f9dc1bf9315e081da8f9c1097ed3aa1a08d0635b1e4d6728bc790f46848003292fe3982bb7cc0527aa5f218f9cca0476074242a92e73b83172e54324abc9898499cd30dd3bfe11456163ce982553010c4b53408d682c243eaebabdaffcb33ebfbf9da76a8847975c686d2074a560013ba7e325404749654e39193b20fff52273dda0af843b16e5c978cf020ce2045b9a5d96636fad48674e4daa8024ce3e32e6d3965d4edcd6ce3be6f20a06e2bafb9751b0ef6190ab0358ce327bb3bd3027ef93f4358b0b9cb0034e89336e49b977286c80559f4fa8df4a2a2c69d6904393ccb497ca7dbce5e6bd170bae2ea3cae9e3bf69192643d2197eaac777baf15b50f19dc820bde5d960aacb758244d8d3718bcf6e138b500a1cd1fc457bd9018dc2a02269af0dc06692df1736ee083f82947ddeac257f20c62bdc3cefb512e0ede35afd5c5dfffa382914b8d4f86d701aa004994874c198cd154c9b52b540be80cea4098c533aeb86871ee0d9ee4654634b208689c5a367d337403471a45f01d71671b34f20736485eacf9371dddd1174c9d7c9b26bbd1365e68676c68131bf6445de75d38335d0e569f1efe3bf9d9fbc52563742d363109ade92029c3e03692de85e9b613bcdd29e5ecc88cafc3ba940291a33ab0db8beb91431204bb268d6ef570c329f323a2793a860db6c8b58e09c0e6a9a552b5ca984d8220d65ded4d7813b6726dfadd2b833165513e2af17596fbf55f97c098b81228ca3b8e67ad6fb4bd4eda21e9d6ae6c02c7716176b37c98da2f16efab2450069653db2e6c16a67800f69cbe13064016d279f110b5090bb505d9c2bd324c6c42fd4e88db63ad0e22b268b5c17e3608b1e6187a732c36f4503b366167e3dc438a020b8ebfbe6a64857a250e495ceb800aa35d055066feda7a3116323ca758719de3ae8b04c95d5cb10aeba943da43a34b09d921057717827c86c5f2dcc4dd2de3e48776ef1414bac19427e869d9a5d21a739d6344f745269663150bd1db35eccfbe0e77f6634edb9fcad9bb6863b6db69fb54ff6daf127245241f56cf2d320d3c94443f1b45c84c95aa71172348c4a84413d036e19487e5db9ad5c76891336849aa3d0662591c9a3d4bec00aa621c96d65f5381602d6c7e90ed33650afe0e450043d524e11bf67aa48c5d1e66b55059551edbac321b468ffe63930a963e0ae0ee1c30faf8e92aaadf3474598551829ad895c19575f68f7139a595600f566ebb3a8de86e45a62e6380b2ecbb38e05dd252faff23ef25b87db606a0ce5c0e7645936118f05faf4bf2d3e5e104e943a46ea324324a3ed4c0254e2bdece4f4a202c3d274939cd075964c291118acc2ebe691ef8632f8cd69258d8bd17acc4e3785682a0b26ff9822df0b6a3f7f1de34b065653ec562294e44386a0dab3e77d8478cff713e22cb227daf74c6ac94405fa80a35c83a739b56243328a69d283fbcd96b6c01df3d4b004baf3d893f9c3f0ea05d76d3fc3652628552d0fa361f03c63a315a614961244f1705ef401c61bec71c104e800311d68ce4e8cbdf11102a91576ad5d52aaae20eecb5ce9c232b61280993b661926f5d8c2d1a0aa021973fa39cb602f2a7b4749848fa1873abba67b3dc40923e2b9b2cd454a76ecec43e9f95f85bd6d2c4687189443ba69a86b631b1f4c9d7727881f17077f116ccafaed85f646c665c87864db1323e47ff2ee4406075d92be715fb84636cf945f2a3aebe09365bba9976d5951ddacd7613e068293d87588befea913a3c53381052634630b9b64d4c47f3d1e38b66363b248bc8bd8c04ff87ba1ddfe55b0dde10251981c652ee01751096d38efe8b6a0c1236c95206292cd9444737adb88a05c28f0375bea9bd03382a4715a9cf1dd9f8642819fbceaadea1c7c36cd373ad679d3a12d6bf3ba1e590ca55a941bf1a8098fc4d9bbc97511fd432ac1ee47b6a1e11a3a7db1536dd6655637373c6efea060002b14b2eef4c2640dc2de1a1488c27a377dd01c926235e70881878cf65849058cb78f1cd8dc5510424a14e1c2dfe1e88bfaed9d41b2a0d2d2e466bb9a89d3d4caf8ec261c545835e8e733d7de232b65ee123d6002abeea629574c8a542b9a4360ff090dab8ae98f3068a5859b879f613c0a51b88264295494a8f901f89d55e6ddcf7a24750a265d0f5703171ce37827ffb49d9668abc3a86e5e942a09705769b79db24f7bd73088993c52f270de2e388131c6844a7fe6b54ed134685e6e00973b4b942b114c8aacc80d3dc9f2d8858a9bae01d3a31fc867b443be6e10fbc4d99241f38d581788077290c0c0e4f100304a84a957891e94589bb95eecfe08e412303924d6a189d918e200cf62f825a725803afa00d67b166a6e2db417b4b8304048b3ddc028bc866e074a05e9904700734b94b8d141d8f35ce3432e2d22dc8d216074a79df3f755a4e2e3755fb161cbe7ded1d31325ad0d12618cc933c04c193f76634004680a90aa539456af38c8482afbc086db29d0086942592ae3bb2a8c814ef249a5aac96f7a8a5f488cf156969dcfa57fa5a21d7d11df3431b83b5eb457fa8fe6ff8a6826ed6779e06209cecf25e929b0a8248b7cf84bd6326b1f14b1cc667a6ed1e2e55124d4262f7e7719b604c05337b0ca756593a90b563f9befd5673b350abfe21bea6bb2ca9b61863897273746ae82d1c05f859a56175862f09fef784ff3c0bb0c82e9749e1214f6632c69f979246bbfcda57c68c457be3d2eda9d34f1138c8d7d9ea75c92f904f32e2424d8a4e6bde5da246150fbef95fa9d4bc03b36bd05dc1690c77b8338fc053b38f1a2dd85990ecb9bb39e4b4b7c551b3bdeb5f77f5eb5c762cd50b5879e834ad57e8c60323b22d1d633c64200ba4b60f8a9f3b27f0659d5148f66ceffb0c6a4ffc02cff2264b359cb8b4806c49ebbda2c3874be632d0babadb00f55d2f6352b6b349a690220ebae009f5286bc8016d4834651a092c242455922e440e1de532ae08a8c2668bee84f3568b0fb78acaa14b0b2e1464c5204fdccb44f1306e63032b9cf8f5dc38a65800ded82412817e7380a0e4d9c6c2685ddc63ff2b4f9fd6b32883603ce39e474ae0f5010b809ba4d821c37333e122e3c6b56ce1f2793399a8d1b704a2005f52542272132c031dc544c4434b836c5fbcb5db67bc35a6c9f2e1f698d1383abaef89844229d21f996d68d8c608d572ba8148dc4bb20684b5fb2cf0ca733cc39af9a0680add3d66fa61ca406dd17542018fab64ab58001b427b123c564f7dcfd727f422a33f309e803030cc306a5116c9bcd27ac775851418ffe77e1b47dffe1e99c3ca5afd93f3ed47028de4810401a59ab6f7a9f944c16927dba9ba6e5ee8b2058fa1d4218e11f9eb22733c122d5f516bfbeb4d7de39951f73e4c5368daab7fa4362d63c4240ec8de33e34e31c53551d0018fa2c0f051a9af64bd6f49e2793b5416ce7a976f00e1b52ec13ca670ea52aa14671231395aa185e334d6dce771c077adc493aec6ee5dd2238d26105116448f7248d8c68551431dc53738131c86377ef4b402764da597b202c38bea8cc3e94970f48cc62bf89e6676f3043fd89e19d8d005fc1e62367a3698543fd25a0440efc4d203f90299b2973888045d6e7d952c97b0789dc7ef95dcb0ce2382a608361d0d8eeb96f7a7ed50266d824821bb7c333cd16ceec0951b3cde514f26f140a20185ccb66a0418c8032683aa1e27142a2c2cfb4cf57ee709338d9ad6286e735c8ad96e464678b35e5daa436cc24cf819d4391bf3893f89bf9597389eff14788f8ce20efe05dd1cbdcbfe94d6de7bd52e41c374313562cc970fe9aafccc584f68e57a397f8f408ed6e94d4c780111fc9497113ead82cc9de3ef75ff8ef23ea4dc07203cd5c175a3dcfdc263c5252f9769e2947ce220e865b2bf0e734038c94a85a9f365f0ef1e76377b26f381add97dd972583a4a3e1093d03f37d781e81586f3892948c2e0a321e3827e351a39faa53b6b02198ffaecc27cb1cfa2d83a90065a988f8fa0d7f3b2dcfceebfb74ec901687b71fdc8551d492c9c0d607b6e05234aa7c89646fdca0876cbd6848398614292b1ed02c2941dc70322f32a0bacd35726d0dcf097f245e028d596aa2dc2cedf0e3b9371a4b71239a59a06a392de784ddd14f8d40c421569ec9fccdfeaf13466b9a85bc50a91e8310f276d29ef8378012822398005311f7e955f19a0ba023cedca03deeee844e0c7a1767cc5006c7ac9be7ca819fa800734e74f14578418f5bc44cce3ffd60975b28940bf400f3699a38640f06586d0ff1ee923c726fd4fc0f2659ffc158ac00dd9c51b20f54ce9f91f41d8c0b2d25a6f3807f672952d2454c4086e3561b6c214a1d7a99e3f2a5b8a7be1d03fb4d467b7058e68daef8b3e6530de813872fa07bbeae992cfb264f3e405246938bc98eaa6aee880ab36ebdf43fd216b49a315d5f693784cdf518097f8d5654f6d7b3b64e24628c1e6360b5f4ec1edd303ec919caf99bc6e13cbceecd292df252af136ed24c2a5f12263e37cd8aa2c27f1ae22d4deaffc611819a17004eace3576a7483136714f8e8f6c7ed18d4133acc414bcc0b13cd1d4c533824c60fd7ce8eaa9cb9ad60178d29d123d2861cdd9ab90099522892093d6c4fd9eedbf7d263dd016b7f2f8c46037d6b3345bb8ad730d451cd58a5b1e8e21ac14cc16b5a96878a671694d5df7269dac3c7cea61e171dc81a44bbf577300f1869f3e9df40b9169f719c2a92f5a57b8d15433eac7153f9544ce3143794d5cc813d947ed7ed164c087f40299f1254ca22b9fdddbc7927a77c180b96fee457f7e2f73cec85a17441b96a281e3db65a64468034cd3b256164fd01a481ab836008b73305bc4ab9e9ab0b3b406a3e10b5eb62feb69cc09ed86b14f8ca8ed2b2b6983b31ffc30dbe956fb50f62e0edd6fbc248dce9e0769dcae64b8c7f521a38b16b375e18de5973195772e760d7492dc29ec65fbae936a42684dfd6332aa1d6b7a0cd8169f6f8d864c055277526c828446744246f4df9810cb1211a3a5402a035e3e6eb8ecac2d671427329488518029d27c527acf317d97c5365be750b1bc5b191612926e2c9a5cf653ff72f0f57b080851adaf44fa86c2f3e6c7aeca3c9a690e3d721c4f8445000d5adccacfe131c4c69d025561daabf38bc2716620bd1b76135bfb214b5fd14c80dd4ba168334503f81846c68335dc78d84c98875e40c4aeacf643062d0dca393d7ff91a1207d420441389f31dd3453300b5340a13edb78521cf5c6f8c12c19d2800e72ec90b37b867ffa66482b4292724db3c4670eb3676cafe57563ff682753e9ef92dcd530e1c12c41b1e2df3a3098fede179f24d34b1de6654a0f340b5d97220b2c427ff46605f450ede77c0027d2af1c6e03a190ba0840a0ae1ac0e33ea72b2e74adbcd8eea900f213a697210963b5af0294a4a71727e266e6ffa17fe26edc7c40145278725422fb60b29b16ed5f06161c099a03f57331b0a2db05a1b1a1d027480862e891b2c5065bb96a03c41b81bd12b316fb1253b0d9e440f790064de63fceb0cc9c90dce638d1531313d4ce6547d794e0626d268a5e7d9f0ce4e7f98855f6bcc00b79310203023b18eb34e435caaf99257202d8efb90dc29a99b7b6f764cb2b044fd1132492848b49dd955adcd56aaa322d394cbe3233039d7d27697a397aa41592f030d2013f6c86dfbbd065cb5720b880f512de618034a408585cd2b2bedc2cb0d922075afa2a31d9a942735ef9ca06278551e6dfda0267c548931111f44004ef03dc245cde809c47acda25d2ae4270ea47b40e33b9944a7a1866f506eecc77ec3a88f8e51161be4ff57ad20390e901ea83aa64539e2dd328434a3c555aafc02683e1f1669bdfd95af41bd9cd65c1af11e7e17ace9048f213ff212e67df080c6d3d2f1d1b7f49a35f939aeee5d035daa26b95173275e0fdf9a8aea5959866e30076ce81eb7cf69f67d7a174746cf8156ff38548ef77a3cffb1f4892628955d89a98d2e091a9313230d8df2aa55cffb982f636b378e5825c54765648fa163782d3809c1b850224b89943f4026262874bfe95aed10edd627e2d192cbb21bdf9644625cf1d38943ccfc2d5aa4ce3d337fa98e889b5b6e2490f510fdfc7df5d1e8b3dd6cb753571dcaac20feabdceb5a882cc800682dbe96375bbd958eca4d186371b5644b9c8b4b72c2a20012fed65f309bb745117df35c2fa1f05ef64e8e0700af226abf1b494137a6657662721a8a7b18ea6bcc8eb574230623c6c97a15dade234f48ca5291c98636e196da9d93943fd44625cd9ad56d52ee16c20419554fd5e31e5efd3f335fda92132736852439242d9e48d3f665316fc66cd81027fee312cd6b0131489f6293046e38318b7b8e25f809b515fff4519a98bb032f0dc2d338156f898abbeeaf31257a1d20552311f950e70d2352731afa85ccd5a511a7dcb45147fa1f92a7076757d2246782c741a9eb236784f8ca98f0c003a6fc998271c114e54f1c617f6b138a8fa09b6b33483d9b0baa997ad7246daf505914f59ea0afd5cbd58cc0df7df1cc6ad9bc2c90ce33119c6f19ef3a67a522fff7308b1a96aaccce5dadd5f9574990d1cc9ba97d968ae4790fe88f57101dc276f17fd6aae513604be05a41488e898eb4f96bcdcae64e2d8ebe7feaf314bce75f66d4d8c403f811c78a4b7652ff434a1e28d8166774dbd10d4228dc72a458e40ee04ecbed2aca6b651ecb91f7273a3b37ef593d59dd16d517d4174b7a59b05dcc1179606b081e8691356f53838183ab9dbc50221936ec9f175f173bb594c3c024988287adb4ab923053643d71b444f5682d80f780d2277b47455b6a116403c5c8a2722d2cec1a117b43c4e8fb0dcaf55a517e66c21e875b7f7f17d660e39b72fb9b7d92ea9b790454c5f718b6e33269c08dacf8565d17a019c80046d55ea8a75f122cc824fbace761c348e5b8a78bba48b8a907d10c1d5f705ac413cabf6f98eceee00456309f6066ef0fc786347793bc5da2eec37534e3e9613d5c635a3182a99f6ff597d40ea411b80ef615521e69390a494f203e52f674517e4d6c870e771ee3e0af37ef15a1f400e3ebab12c087fc41e82a8d917ea23e2a741786b096a09f54170fdd1a158c62f1eb30e9766d05f2101c68a01a29ee2c1029d184ec7cc1488c1115a613e1b21cb38d39fbf41893f352609bdb532ba407f241b2e5efd8354033a9fa2738e11850324e2eee595fe27b01e3b39bb5a4429f5b01455749350dec41d535a8f4f305548606b4199f888175aa4a69c5428056a7eadb4311c0c12f24fc4912fda2fb5a90c927c69378bb54f74702a73cd84bf64d7ece579e33b5e25d674dcad1f9fcbc91132362a9d9ea513a1e3374cb015b4c74d14cd10400854128f04c5dfb1c55897c130762bcdb2d42d0bfcecc67fd681c7c1e657b82136ea367a4db291d2472a262f010022c3590b0ffeefcc73cfa30252c12ae45a5025e3fe21844e7b528125053ea8a55c0afba5c0d615ce8e1b695a8d9bc2725c3ece3c3fd0b2feedd677ddece8d06f1b85aadf99ae8e97f39ca0bcfe277ab65b6e1fcc66f55bd27930fbd72b3e473a52a7b03eb2da22f224a1165a8fbdab48d1b47fa7c272c7ce0b06fccbdea7610cad366c7c76917a8cf9b02601a678ba2c6e981992403e868c84fa7df29f598cdaf798218bf97d1b8fe9801adf61e3c52439349f789386fa5ccc6ce84e432baf9d88ffa117f478cfa4988c3bdc9c6b375aff9b1d133cffb1f76a59eee523a86b0932cc6a4c0ed5b4efd4d72f6eef83c6e80242927bf558898d498ef9000a3d4ee04749a2401bc408bff43d7fd730e1c89253d104f0d60b3bff9e578b3386eb2e348d75f09555eb7242bd3f1d1f7ad7c3a82394eaf77b9a29a1a34fa926eb3355698c385f85bd78076d283ecd1bf8e792efc19c0e211ebdc24bd95ad1d946bb6d2078ed4b01b84007bf25e368a2f2588508f0e6eb07abe3319bd5bb7e4f1613f45bcb95c4e0e261eb210e564ee1a70ed1576ca91756c4ca69371de68722138ac8a3503fd8cd65ad6d9a7e44ac4eb6c3e8a7012ee1e752c0f053a40be0f500d8e6c0675925b6ed56ed5fa613e361c2b357c5e29cf2b5fb64f5e6adfb978c22b73de110fcfc5757b8daf3ffa49452877d40392fda58a517be7ca14cb8d99cd72431b95e539a42911bc64f2b9b90195969e9e537f90a303b5710f5dd02b458100917a9ba000719540e649efcd061ac05aefb11131b10c69088d0debdedab8bb8b1d4d1ab18245bc267375892047ab1cf87857c895e6c7a53f54d2107fcbecb361b9a2a4b222d2a4537f4c5b34df56d360797b83c52415c235f6496a8fc1535f9a9a83bb183ab681f50093fb6cf4ce2e12fb60e70689f16e63014f976a9e4335af8bfe73a19b6b2adf7e5fa581ece10e5bcaad898b2a6bf8b24bfbf9ae9a3fb56ba9eb6d2e9708f18a7e3bd6c4f4a2b9cfd031caf50752d2f05a47b68cba0b98702882781477bdd298ac83363fcfac8ba9b8dbc025b4a0b3567eb268f8535c3e90716c8bec73cc32059cee0d3a2dcddc871087dab508b5eb1d806e98e29c5266e37d49462d879362f0b1d25aa5bfde7bd97e9fc2b8f8cf9489ea8f4092f2c9b75becc453a6111ead19cd48897bd938e3021fa904c82d1654e61718508071b8eb9610c0a2618114f9a39ef639b2206aa0d358347ae92ecf3f427e08f37dedd4f7aa03cd58c7ae49e34bcffc04ae615a61ef3195961787d6331aebe2f618f6dbf8204d96f975aa29398f5fe1f4c993a5c1b1b373bd9f7cf894cb4480f0fb82f9a1ce9a1211acfc96a318d315607e9933bbe620d70312f02fd0a9dbbd67de2139ba1967087db6ef08296f091ebea428cdf29a6500092cde0241a32ddcdec49357dca7a5a6f187efa0913e98a2e6d0f33248165fe8cbe838a45199f6db14e5c34f57cf174639ccf2d4838a370ce412e9cb23e1f05ba0b5a58355cc498bcffbeb0d4a4612ec8da3cb2f0b5a272072be9e723981fb63eaf58806bae4ff03a904e8f779e3fb71bdad417e5aabb7dc334f1fde16ed00f63b6c22cf69698cd4589d37ee036f4a61fe0ad1aec50cc735a3d63372934f7957ebdfafcd423c99df175c77d1f67ecf04234638a3693703dcf6b2b084ce4ede4f8ab8b29edaf2c08ea4f1d361b78e4b0971a88163ae0790db62a01252263db4d3a883a4a064facb096a2e206592694d2d1189129d481305cc1f7d054bd1d1dc63afa3fccf98e9172b6fab813ff9e887d2f6f58b82711bd65a3e8a4b93f720bcb4398535991b93653f1ebf1d4e99ba7de99dd4474044b8d3f5d12dc25806ebea12b42c53b648999d08831d9d5dd8163979b894fe8d27f90d8af7c869a43c04b7a91bb835470feff447b4764ff3c5699a285e7a71aee71f64b9e38b976c0f6049e3a68a5c6e74fab9d3dc11e9c00ae8ca5ce0dd9f557c1b282d066a8da5c087c65223b7a2d5887f4a68622be1c55ba5c95981d4c0fe0eac551e95f46dfbab28821c871f530322812b44396052400bd8e9987b18295409c4efaf20105def06cdd6e656836b198a424a870a563f118f26d7ab3fa3e37a46ce386389edf70d4367f0751d6b8d5226ee1806128a14b666712b0fcf3d7cac9010069914e095f6aa5f98e55961c7cb8c14c46e58635ef3074cd733aeb3adf769a9c1cbba1b6f9ea541823a122e623b4f9de32722009799d52e8078a276c94915c4a6dd70593f16d1296f52708d7dfb9d9f29123cab9e7d2b3a0c62de563362618759419d90b6ea057fa2965dae8ea955b724e9f775a0ef313283ef72e3cb2b0445c3566ef5ead4995be5e211efd5a660652e5a904b4e8a8e64a1da5342d307592d2e3ff3e6355fee313db348ce562383e52dd657fd233882fa3d32c2793164801fa1f8fa5190fbac0cec00d9a916646435741cbeb809b616822c928eee426a6d4ab7a7197aa78a25bef783e00c30676ad4a0276e7634dd94d247568bffbd87e88e1adb883ab836fcf9fb2d2c2c84a5b273bc99277104752a54186b4a4b285cf9db6019fe87c650b07fc2236036df91bae96c7d05d056c7fe1c6f894861fe10e6277bef622bb21e827cdac0ccd7d36f859b987bafb9ee558d3e74d03f70207a9f5a7a41b462f7c7a33dc1feab7b751697cd81d456f764cd8c231fd22bcc0794548182355ec4b55bf70af5e795c9cc84697e62992fe90d91c7a9644874389bdebafbf109bda8fc03f859eb750e77029a99f7b4d1b1bbec23ca5c9be77034ddad5ad3a2ac8559794549c5b16036c8058a1203a9c9235e829f64ac9f08d5e2736ee83f42d258d20f50d82497d5302c6365ac23ade43a3e4ee2ca6c4869546a0eb70ab17d77842deda426a3cf02d39d4de68cfec6965046774092f384e8805d2bf58659cc29cece59deff46f6f1b090d6796a6d3ec8eccd0a1b95a92aca0672ef1a3ba66f1c9bb8628545acfcd185511b4278af8fd47884c0299de91a2b6309badcdfc6a2af05c58286dea2e36d7f55fc79ebd2c2fcfcad47824b3ec49d87a39447106af180b684ae0b9af7132b1d1a8076da0f501f41ffd6dab8e9c7c60c0c6a415e04adcf1fb4043faf04f1811e401db2254b349952d348bede61f67e605a65d580cfc0c1e5866b01bf1c788d5ecbe3abe37a8693fd3b670491c581e9bfb10049d084f7cf1e80b490174abe2cac7f4f102edbf9269fd8d7856776d49ef7f106f5cba6f73da5ad89d3603822bb43302cf8a5602c1803d190a4a397b070df5c4cf7f3ada30e4f8eb02fb43f49b63a107e8a8a56aa3080bfa97ce4d446e7a47028f74356b7855827a3389b9fd0748939a03200f7154786935eff3b2116780bb38ccc7dfca7d51f1314c5ac2ca5be1c1da38e2ac07fec0845dbf78975fde639261102bf62cd00644136880b827bd759de8285da73c739a956c81ea0f42c03c56ef077b10e2f3ccd68022e12d429bf618dd5df852aac9d891261a591fd7ad9898f0db6f0e28969d8a6f0fe3e30cbdbb5ca14601fdaeb045d66838da6d2624cd6de8f3801903b17ce42b45d363ce9e60168eca1c55caa05bed6bc38df721cab43ccf38cb0c0430a6c81c4d90d2c420ef22060a681cf7a9a689964af298fb01d0f58974bf17764c786f428d9c19f2ef5c4cfa9849398fcb2b19554d6ac37b13350100706a2ab0f39eaaa25e8e2313c8f20a9a791241caabe59782ff37616feedea8dbf2c84d7a7a547d715f1caf8f93d2afa189c6b42a644551831344c09d7d41f52f943dd00837f0585df5e65c0c65175d7b33211e374bbd6ce9087f5896d210c9693bf8a07fc91376f86c7e1ae4b151989c3839f231ff7beaed35c43121db5d87a99b20059312fc6eb3fa5c5650e061d06463044ea2661d5fd1b7f907aad140c2ef6bfdd90c9e7f888e27c693400847e18d0924ae1334396bfb4a866088d73687394463d22a5b1f0340c51dec31835ea7f3153d656dad7b575a16a867b4f51d7a252a08ec4d284dd92a9244c71101da5ef27b5f8b8c7e297fcfb0db9f98dfb63fec3b858e2100a53211cf52b815ff6dbf518c360bc055343f7aa3d5140578c075fd97f11c98d8f29315b89e43040cd194fd435e5e412e8c2a940610cc448a20925d7df6d81d6e8ba522e4c380008d7fe1c75ca0b4b79a74ef60af9d8704d0d82ec4b367f2247e46bbf22a9f68a26f48f65d760488bcee7567c2d4320dc6b81d3b192a65bd68289ef89aba737a66541b25d2d02ce576cdfedf729419d638e2ff280b5e240dd1a05d7c16aa51c191b83ad0315a67d0e73971dff065e7c332b6eb793e8d80da374286d30eea2fcc24ef6a5c4c7ce928bbc4345141cb7f0b2a97c1a58b80ec3c1deec5d3a4b0a3fb036285354ac9478bc4421e84a455be59632c8527f3ff81b43d00c6bb11562bdbc05abb73520b279d98b50835f74c3cf1185735a87c3a3bafd8921b1ee3577ed29bfa5bd8bb2cf142a3f888a7a65dc1242ab748f0c9c7f90f9297a50652c2e7569174656ca68a24051720c01e16788a5c39de74c015afa411abc2d14c729e424320d1d2ab06eb8ce3c7ebdb1e11a335f074bd4679aa003ee9b4bcb437d367721fa7b6a562e2c35b36f4a8b2b41a1f9c4bf5d051f1a839f9626964108391796702c3af0094236f88b37a0bf55fb633385f4cae6706e45d3d8fb12b8fcc84ae32f8e370ab03cfc4a50b7ae21a78d71a3520a817cb79ee1b43a18d00d12068fe55fb4157326c93301da10016de63001c5f69f8132ff9074b8ef734ff7010a4bf34ffcf101ee82b5a459b8cffdd8b1c365ea3aa4955ce4c7fabf5aaebd722a6d562cdecf0f39133b00868d92a14b7ce42a025086ca557879cf91f2579a7b8d4471d20bca1b34c7afc384602e17a453a636a1f42574d4daf0cc8e9ba268bbc97e7716ade206f70291e2605eff78e5f173b65e7f1ac62a55b730a22f0aa4a389d502e8c7fe277dfd4919ee53ff40b9b5b4cb4c8e5b2f2d93ee327c901496f42313ff97216958d738326372d180f36aab80f4654df49446f50d998cb3e6f71ee9299b0f99cc3a40094b7913a211c5e0e21d4fa9f541814a88df7eb3ef5f0f5305981988109ad7230bbaf76f54b49cf4061df8b5a7f3e6f080883694f1c6517ca911a47a4aec4fe20f4417ceb54ed07443d7cde156686e8c422966800808da3ec7962783709f91d72f18acefe43e8faed04f4e0c17004a19006dd692261b1d38808ecda4fb5064128e41fb04622afad7eb19519238420cbdfd2b73bd7bc579992b671fb554541960a7a2843a9b9279ee7f6c0949cf6bb87e81cc0c69a495272b9f41f94d1465404c31ca718e4da40a6fc00bf59a2d12a205e3156c8f86463fc6e96bcd3edce62acb7f3b75f1bcf90133a089c192204e72290a1b24aa3e1c911055ebf350f292c594a9835c7659d9b85e25c6d9962b13560a32670f5b9bc39764d4feb70d650e104518ba9afb02f9827ccc35d3a844cdd899a605a6a527c072daed4a5bee88e92588c493ea1b4fd8be888086309804ed782121bb70deaacfc9d05f0a15ef3a1afd24df7ee52ca07d032e39d6e084353736b7bb5d7c8d1da502db66be882101b13af5b80cfc94a63d1d853446c232e432df4837f4909520a2ef0c3f54f192d484170891db06756efd98ea01a5f6c8bf5885d3716241b4d612dc02595c0e69efb802e13e209c74d89e63e77b432cb1427b1ce994d76adc748bd6e9b24e97fb39463c8bcb70b8bec827d7383abad0bc9f5ce0538089a9012dc1f441604898228d8597c2466fa4d465b5c1bc6d207ea6d8474a4d816340e1cf093ff651d146af48d91966eb5ffbecd2fbb4ad047b760dc71b83028f88dcff189065dc6a85f667600d38ccb95386a3d7277dff0f8e61379f53fb4c9c2b3b8d99cd944abe68e4608e06495f86d3ae5097309767ed66c39afd1d4f856297f655d9eee7d651bf30a26d2fcc6de5b9564389fe031d2a5fd34f1cf99625fa609459bb1ae313d0178841f5436f2214b98a585bf370bc25c9896badb9817cc970c1a5e8bb8989b85d7f9a37890abaee09873bf7c2f1d42775c50b3def8abd61de074e7d5865a5d719a8895be3c9c397e070bc18b9ad5b91497763e0f9792ef86852dc6323bbcb679e1b8950bf986af250870b5c420372053867250c4defb9f57edec6d788c1b6d28221bbf952d8316c674c977a568b148d7f27a9f47ae7c7bd4bc4fef31611ae1c8fb529d72eb7ead811713dccfce5c0b2a05d09f764c010faacba9151de63cceb17b479a520740da4d195a3f4ba8bcf872567ff3c8fa52dbe492d6b8897edc5903c93cfd5ba1a5ea557cb45a4aa0c004539066851e463f3a9db3dc2b15d5f3a439154d6cf7d4382b30c42d6aa736e8ccdd380904e674b33875e5282607f08c6fb05ef07b069c4e559e76cbbfbe87083a4f01612e9f2c9e87eb31402950aa64b3341f10a424d2502060325d19bb19e6e1a78ca3dc17557af9bb024d126081e3ce96f51ee7d254830d3a5376307652ab1a890e36233b4a1478715116f790cd1074942016a8edf83bfb7a7b1e63bcf702086e1eacb50ffe6193742ce66432e604a443859269768621d6efc4d52171b40d07f7a6dcaa679e27e52a27a462df1f06ca18a18064a21254c4f442dd7f678de7c06059d3f2cc7a8a4456848e420ee7670805cfec3e219f6be3dcac42dfe1f130e6221ea070665c0301f3d5bf1415b753b7f7c9e7e754f423c7008073827b59164ebc42d83276dbd8ba6ec10c1d1517f953486495537ecc2e1b5a8988297b6dc66f9c3f73725bba136844fed82faf36a25fa6ba4261191b0b028ba357a68271ca45d30e2b609aac895563a0c1f1879533235db7ebb7e0dded3a619773c998a7211f114f55f35b08a021677ccc20d6ba2aa50d5989ec1f759b903215bde4ebe160712e600b590fa44f73cfa176833a85c835001d9c6d01ff94430902bbe46bf0a08f97600f6e211f15d8488a034183e1f1db7b8f5d9ba80a82e44d8df10db812cdcdcabfd49da8dd6bd21352eeb429b4371a590ca2ab1bab047006711b714d0f9097e2a5b539d09f351090d03c2e2d5c0ce1c485f07d7e24ee68a7699a6ea5f4238231e4472154dc2639c27dfad1f5f9a257f55bdd9d5bfeba11e4d975d3826d461bcdcb73f18a4446e1b26c918724544b2ab387cd71acfb86285bafd4e9e75fac469a6a0bdecad76781056dbc260421c175191730e4ff58717b72242299e710fb76d7da6e369c9bafb1eb6eb586d94cee83f294a17703b3ca7ddf0837d85eb88efad2dd167506104b8d84ddce4bdb518e7f98072a74f75ffb43ecfd53a2e5a1b88d9137e8722587046d40c3290ba427f7f6e78a0f58220c4bde360298513b932313729381440255c62cc403e894b6de58c9a7202d6536f23f2c9da35776489e5541e864e8fc70f01566149b93507de6290eab52713e94007b22937b7332c2eef352ea982ca0e356c2ca792bb2afe386f99745ef6d201a95310de2b50bcc3d5da5be6499c9e4b58d596631c940204b89a07bc15781f435e5662c811c73d940fcb174f0e3c2de955eb56061ae4914df06695f6e7ab63c0ba04d471bb83348c062b7c183730d196a7be111fd456a2ff9dc9644b4e92b76a82167acfa9d6ce83f8a656460de8370b18b8c2f6783c52ce790e8be77c676189cb1e0ca18198179138efd03f9cbca98169fd620589c97d7fe8d489f98048986619e53c10a2cb0fcf9cd07f3d72e8d99be975ce6775945c86217f7b54c4e77593fa518755f085a3032995663d0da7cfa9ffebedc0c02e975ea0e966fee79c7aa97c777879d8932c9e27d9cbedd8f996a88aba35adcca63cc616fdf5c37b14f0ad7ec2952d2b551b5df5b8e7215d54b10b866d2c32169d2b87bb0f3ff385e2123b356adbe8d6889de411d3e17244eda4a692a615b4ab4878610e5a2c7b32ce29728b46126ae94b2b117279eb2722c8f290901264ab547dc1928a97f3768ff14997dc1222b9ceb83ef4a0b44e046761e89721d06337fba6386f0a338dca0140071753d3712d241db4152338067ab721a9e2eaffed12a2f4672954f986397772da35ab3301ab66bcb32b86e97c3eaef64872c1fd2f77dc75efe2e9891fc60c9ea7a0ba211a2898f01df112f2c828821fdb7e760b90fd769f88241755dc60f38107ddd16b011c3c9c155b1673abaea34312d8db04e88838670d55440777cef76daa744da5a1edac9f77d77b2259b06753753c4333a77a95aaad4129c5f668c5b7c1f6c868781c4fd640d482c296608cc8bbc6b45b9a17bd69026dc0f8d47dd8e7cc2aa1636f9151a58fc13559728d666e26335d5fcbfa33358110da785041415ed20cfed2da4e2d5fd344e63bff2307be3a77d8cbf13528d8d8184a0f6b9e33dd1fa85238c3c27b493fa51584ccc9ee96450afe691b1804896544a31a02db6f20e5ce086a44d44d143af1a86dc50237b4cc9691b55953dba254477764ada74c0dcb9684d8935e260643bc0bf54e7157d5b8671b5d43f5c5edbb26b381b92ec227bf889b4a376ac5bcaa9c30ec08935414ac19671facef8dc54f54dc9ff5d9f2af311670cb2642f67ed3ec600e0a3d8942c9a25fbe84669d24fdef85986b4cdac1df3b663790c09a2330cec4853768b508c0cc0a8bc387e831f8a25a6e7d7c79a1b0972d03c7d24d59fc281ca7a67ad0b37390c6b898ac77fd8bdff12529422809fe0797790fe4d6826593b102951605fcd67e69353dc9e47fbfcac26d73e5676170ace98a7528b3e2b2b1a59eba85ca7496e6be8b3994ec9aaef8c1c8a4701c407a7c1bfc8a8b5ce22a9c62ec28916cb7c9af2c66e97c14f7031b4009bea294092a9e1976a6f4de5c3a574fed8958e0b444e399ecd61e1aca6cb75421cecd542c34ee9e6af1cab98f95a23150a38b8a543508cbc043ef9254c843baae7b9b25ed031eeead3a0373d1fe45d81bdd8d5d9a0e86e11b96f514e53fda24ab42e8a266a4d5b6a118ece250172a9965838a8205b1e1dcb02021dd4290592bc3e4249efcdb80a0d199c10f22e3111143117fdb47648e3f9caefb0eadce1eb649917face381cf908d69a90c2c13f401df5deb1c35ab6a56b703ac81215c4f5c93ebc7677e6c4e4992593d5f0cc9c714427d80681a394eb83cc153673970686d4be9320e308e9449ae2a5681b55ad32c0d56715c4a22993443a75c50b126cd600b52ff184af007741862d6264039d4239942d1f4fcdfc6767bb7b35309eae565adf4ad2e5a67975609456370689d30be98f75673dd9bdb960c1c061e96f4aa6ffaf0e3a45f816950f0ccef47157f2eee2f586ba4902458259cc5e52bb7187f1781b6b12877e1cdcdb81b1b80a06cac2509d580c2360681ef31a325a839349a9d33e6663a8c853b7ff8d6a63e49485c37ca34e18d895a260e903e1495d089955b35ef26794b209c855cb047e863e1eae445c1f450dca2b4cbaae4980b80f3ea6462ae1ee50ccf43199e3e42147a0262360806a4bb81789f738753f9e590c8baa91453eb9d04974d7972090754d400b1c678e9a17748b654c2193bfb2dc991e1f2c9aaf9ad913695c508bb41ad81821e8f2510d3277531f3483b850647ed2bd9d3a6499813cc84fb0eddb22104b0abbf443716b45e102f346319bdd4129cf90233e4127e627434fda97962704638375f240e964059fa27fe65c45093d0b120c9fc89609f8b2fd84ae4565d3d806736cccc79c31fc29e1920aa4e45b6e5eac669c47f6b72f9164548c109e38092dc5c3ae08c3873409dd3f661f3a9452dcff705957ee94bf385c76fa91f0c69f980899d6025fa470e9bed2226ecfded4751f05d2c9a9be94fbf272de018b7779291590978968a1490e4ab8bb7e68e06b7abe07566c4e9b04e46a70bd0e50831d866ae5ef6c41385454c75da197238ebb43f0a77abbd64a2863e09a9956fbe20fa22b49758f210c90e53f58c8b2fc56f68bb0072650af907ab24d529aaa17e66be00470802ebbf1c063e0559b7d7ca29ab227ed61cc7dda0ec68b691d926756a2dce6b1e72a756724e12ca9af38509c0fea48094133f4e22e6d10bbb7ca605c399ce22e4e452b9bc6a364d05efcdbe8c6f55df45f49110598845e21058c0971317e31e53462607629670074c21d6b92777a804cbad2c71948e44d06750384c690da37fadce62e30601441efb047f7056d049e32c13c89f5163b57c30ac42315aba0864d4745a235fd4704c10f13f7a3bf010958f87e67aaba58c7082d9bff5d0ce443f7cad2f98d2738d78a1bae7709bd8f64ad36e67af09bcb82e3fb82b2fc508ab6b8892d230dbafb9d5637856870005a6a43cea2209c3c014a194baccc80055d12cd9b284b5410fbacc5003936183b01a47eb15d8c44fe5a1970e24d3e03f0f025a50831319b4c3cdf06c36dc3cb53fab9567c3f5f6441b22d277581dcfc3eec69d2b0bf1e2b4c797242e2ab61f8b9ed77c2c634c6c14a44a85beab7c8fe5c8d7cdae5039954b4a41000b8eb99830e58db5dbd917cd6b6ab501ff00a889e7a6e5a78fa2c649252d93694318766d446994cf4d394fcf0458d56223305492386528fffdabc8fda78bc0fe2e2228722c2a3927e7dac5867e8a479852cb6d986a4c04391971075a7cad8f9793c6c44d2102a9cc676b05199e67821490c00818c009cb8f9cd22eba2b6b775815f539674435e646f0ac7fa24b4c37d3e49ab346fc8d0ff40a2f022ace7486dc1645514e9b702aa70afcc22c13349d067d7e44a2f1c2c11106c76879237b0bb151aa5f94b146085ef5eee36058b3544e93f6e782fe9d00f485204a6523e516ff5c9e3a373949447e85672cf7d7b9cf47053a78cdd6fa5cbc7355826a21f3b509507b5c17f78bd9c05009d5648802db4b54ec8eb7911b1a6ba3e5ee6cef815dab394401287005ed72fb87a3f0ba351424358371a2a954ca1e53cdd41e6abc36ca9d9734d25f0541da83dc81b0126e477fcd4d9bd829b3ab3f1c0765473ea01ff665eaaf8f38eb32c16980873a108af6369aede8ff81d8d1473b767747e781e173c8a78b4dc1c6a1e26aaf78aaf1fee7e194f391bafa63d788c048bcfd0359d1b4cae666932bd159ba59191f73d93694f98de67bcfb4bac728496e6c4d20476b978df8fea2de3dcb38cdedaa7539a102a73011eaf4d78290ca970835811bf91d245dc0daef65398c2c0c349662ce0ee2941ffd191fd3a9fecd9ec5848380b97868d23923455a21472c762ed9797b3265def1d7332952aa15da768dc87f2e073053d84af0ecee9af593cf0f44ff8a3ecdbbcf9a8b5e46628055e2bfe1d5089833d092ca5ba6ef580bc71211dba08beaca67c17458a66b7297b4ea71368e45d17a9c237d93209decceed9cd7a54ebfd4cf10ca3ace4a51491d20208bcd06c9227e6eb6d9d1b1a24d706bd82e948d2124f2b65ac593df2e1419d45aa4852ccb06f8e3aaf86e88c285820da6f34f13ee4c18be5c6e815c2dfbf227a74503f319fe143c4996c6366afa92bd53831b7ef3a6853425bc87c1a186f1639fc8bd563e1c2060849b7456f52b54afa0c35d3fa14bf7080aa1a852c05d59ac6db48eab2a9287ec65a606777113b6222d9a4d0d066f45ed19473dc8daf2262e7408c4b6e4221df11effa3379690eff690dccc85432de0863d559a1c5cc3f0cfb74525b1b028fe7e6f67dc53c50f22b0c6859581d10029dca6a063021aa2f19f2dbb87f418e07bde4a9fbc94282f85efd7c053a033466a968c52a4cd2e93c78d9bf89a4828a7d6959a26964b2d3bf85bf7b99d8d41de2fbb6bb7186f492cfe37b0b844d3dc8cd78ac1dad35e8bf12d892cf269b6df57734ac577824080d7eafe2f38b299fb6f4ead8351322f961ff44008a9f6d34f73d0e1bef99e5d6cade1043ffba4a206a92c1d463a674b94efe8e41c73187894a19a3986d890eecd1c2b7ed57cd6aeecf1742dfca969af635aad65ee7290d877921c5cfbae83faffdc371ce1342538938a9e5f2c37aa2746ea2ee304c00e6683b9e1c63a2e06ac13dfd930c87d25d911d3e0780f5a159b4f785a1b0a4cfc85e5d5ca93887e977bdbc3a70fd53854b8fa8e135fb16be926911214fb026b8df99e357d512eb6e15fe34fe55c05475e213d1cfbd014cd253e9335111c7672aeb3a21a8809a04a419fd6b0fec406326a2455b0b16481454b5ce1997f6b9e0dba9722c306fcf673f1e56b4592b7e647d0cd3b47815ff783652037bb97ebca211089bff356a9ba6404016d7710063d6d2fa8ee9d7c89b6bc1cb022e2655e3fa84819044fdf87ed7eb7ce27ef75fa0432c06d1a210c5d27ec39c22641646d7e357b90838acff42525b23def5686e34bbbe241a47320e6250734ca68238f41da0694f4ecc3d546558867b017a5d0b7e0b3340756cdca471c4d37edc7105151f3c4754e8c563dc1f72222990bbbb1981f1a2026af04088153a730426ffee6f0ff9cf1addd9c314011d3c64d4162b8042f027f4bb4faafd28189ca9569d9d1648a70f4bc360d1d60531e5cef451d9b9fa5a4365dbcce6abf947fce4de16b121bb1d80ea706c0d368c694766531e4d7cc8b844a2440161ad1c56f64e018d77899f0070c216358c116f52d47fff3d957925238c70e56f807372e861217581bd2a45307fd3abd5f93c917377effd6279c812f387dac0a18bfa9d64417f4a3856eb302eba6e0c29164afb9aafb7f22e5ba4edf0fa12843f9129422eb651a8e3c2cd82d217f87a710d14cbe2670fa5bc8b7d6597b76ebb407e6e96bac32ba3cbe24a40e5875d8d3fbfdae75aaae7bfda10444b1b36501623ded2d9eedf530924620873669b723d3a333f871a1fa69a5e2628116d523f606523e007d7acb2ba12904dac504798d71ab0315146bf226b97fa1d163aa8bb9d801efdb43bf49a4afb2530d0b711c07455a45872b9d137f19e02636a15adf21e8d0e83dceb64a381dc4ad63fca51e700ba13a5ba4a24e2ec434fb4d8f9f95543f9d79e5bf54a515d694e9f56a25924114dd689d2e2d19ccb1c0a63bac3c00077dfc300a4bead42cbb3fa818a6f8f2a3708b1b67e6da9ee47bb49a9a21aac79629053c67b438b9602ea6a812c62b31e508036e28f4b837b003165235e328c1192e2c4d124e03102422b495e96a6bfc97a421110e75e11fde9075f56ff6f2ac915fdf89f0bdf39b3ebb39d57a4a0989bdf61cc40eb817baad7bb56e25361e1b403258dbae0e5d6a028b9d9f52283214cda76c8295e99702fa6a13be9637b6acc280c3d196098d17d5ab3e00243930cb978e036856a96950c43e62b358206a8376c951113892892e0e9f20c049d29dea38fb606d62c9da2ed9e41c2efc4f6f0c5a77a2dd9a87ece75823a1d7cbd15a2bd53c7205f028451b68cdd851df463b3f4c45ad0b5a77ce174b37a726dca93fafedc38b844ffc189c9382c44b0cb3e2d9e82c16cc43aba73176ae0d57790ef53d692d34bd6637519c1ed4b2bde2f3b999728ea8385e12c6830cb03e0af7aaa517f6ef1827c3dc17f877696337d83d894d04f2fc1132f32c076b933521c09f591e9f7d4ed9d63bc11d64cd81cf16db30f095cb53e7da9e2538cfa72ea4ed81ba6e57ff16c33c0ce87a09f38ea16b40c5378fca59a23bce03d9c77ec863de972fda620ab64d5ff40fc17be7b462ebbdc0ac84be08692036dfe8df6787e5ab788b5713b556036cedf5ee91a45ce8ccdf23bf16f97d961e0700c2b815eb9487ea9adcf4ca5c12584f47b213540a69b5514559a06f4cd81a945ba513e9e2095c30fb46ae3dfb2654aba87cb3fa8d4c425d34a362e1a7427619ada53fd9cf35ed60476cdcf3689cc1fcd9c430ff0edaa504c29435fd285417099470ed041ee7954d0d449fd9a11ae02ac973adf838370cd9c2010c856279a51e7be320affe7b2ed8ea2d4f769107772ea6cb0800c23b6f6d61aee4562a7726fced1850c746f72b6cace23b5f791a7c17d3a5be5166207cc93598a672019e6032fbfc9da4b93097b2c6e72797733ad8d8fcd98829a8e6cb29ad490fc92db1367a631914b9224037c85150bc02e5145ed2e473a8dd79c15ea964cea52566cea9ce4be5093c0a0641cbc0ef1c8140e498c1c042a0806a8e486e81853f8011de65c1e76f1666b9ec7dcce20f05714ce56d1e458cec3eb309585c23eb4c043764f897f221800dd14bdd71a919e5af4e7924e9a2f0ebf6350174ef2ac51e717f963ec3e294c105ba365bfbca174fcc30c6b7f5513940bc44f16d2d24799f52d69d107e9b584753acfd0371c8ee7663dbaa2ec06df4dc1fdcfab0a540056057b41799e18dc30598a0346377eee743f1a8da763eef1a374a1003a3d6d02a68dab43886ddf8d33a6e68d36a831b29a54ae175c9eed3a36ce85388b723fb49bb7944a6e3f2a88a8635a042e8c5b05d12255728708ce06387912ec9d301653f0dbfb1e6f6f8124bb6e8975490e8e082a0877b6f3e011a112099dd658525e55c6065df60f360b3b96ccdd2c4bcc6dd6f10eebc3120c9dbe9f52923849278009ff09a079e7c015feadef66e2e7eb3750c2526a525edf990d99a58f44c886303740976360f469b7fd5fd9cef8580c77a63b1c7103c8e75d5eedc8462eabdbbdfb5aeab436e953499514b74288a12f063bd380216beac46516a5e94943b214366ff913747ee100e72be17728f726afc35840aee84876ae11129e567dfa87f022c034fa4f7e6fb785f08d64fee636ad6ab35818e5defbb7cd6ce3483070cb4d1d401331776b82e075683b105e3d90fcad5f1d3d3059456c548b32c8446ac7a3a451b02886365ba6f2ed9708f1607f153fc8269c8ad4d01cc1a57285b206dcf0e38e6b6261a2695b34b2d8f234a7b41ae376b85baa60d53336ad20a7b48063b11eea6195734326e8ad5bdba91dbc19b2141d5462da69830344a29fbc0c777c4d9c243ef5486102fe3d971741015ac8656dcb3450734a69ac18a81d12b91bfb1bce45da2ab438cbdaf9efe0e98e1ebd52b0202da86aa521a3a87a0ac1ebb59abcb74c53160a34c3bfbb35d93412a0961c50658986813d264b566c7eae448dc4481de120b274356c6fdb95abcd5cde32440a746552f92092cbd13320cda750d3d98a071356959dd699c6bad0f3d714d59c1b8f48d7195d9acd92546225ac9a2032ca14c099a679d722c0a6c382b33f73ee6412384bb184ba818731e77f12a9709225a81f90541049ae7bbdef579a0160d007925db7a382eca891988d046ff09c553721d365b27a457fb1b9b1844f430b83cd785c53ec703f0e905d395a9f60cd904c55180ce2f4b4da6ab33a36f2bae69fb69ebdb842ad55081223e99029770c54184728c7ab8674aba2f6203504d91776e74da4272e4c9ee6b863f84b5b486b09d29dc500650cfd7262ca2587a907787b32aa6ae4b76e00a241530e43ed211f71cf503d9fd8c72de491a79afe15a31ed73757c76c8e7337935ad620ea9ac3ad1bdb0dc0517540d30e0146566f59e946e570e30c77f5eb9f46f8d33aaf276a751c73917f9d2f736d96fe763c250506019486b89662202f2451ad887a9dac5b2418b05d11a80251195fc8e86dd0c1bb69dfb5d365e2e2b909427b3f030692d06d59be9ad38772d48ebe7391c3d31c6ddf45439103e06fcb72ee4d1aabf25aa4d2cb60bb2057c94ceb4629ee2c29d0e87abfc0cdc6e13bf611def6be7ea5de54966a0f4a24eef37f76f3dd3aadd8f0c8413fe98429222ab384add1ddb695b3ec6dd6cf20e30a72c7d79e70cad80fc52902df665725cde1a75a0f0e9f5ec0242a0e01dd767ee4b8e993e88d584c706ab80a81f5c6ddf81704b6fcdb6d33455a76d1c127eabad4182c04e04f2eff0cc6198e9c71ddffc6ca946f9cb6622db3f2e52e8fbb7a3ccfaaafe316f4b7fa15f6dd2bc11166798e1336187e14cc82861371024616a34085191c36e78c2306528e380ec7a18e2312b60800cd1fab656b4ebd831aff0b038682a61370760439d7bf3f11cbab0dd7d813d7976c2afa892b688d42258c56da1db6b9c93355ea1f10b872150adad03cadfe323b459f2a32f88f4bda7cd1910337474d4abfee0f963c17933be8ffaf03c4deb932a1a571a348c494233f1a0fe313f0203f46a71d510cb23ffd34b2e0029703ba70059d9877a5e785a92e3a7db8f3daac3b295ed1db767209eb5094e2b5c02aff0408964f0efd5dfa5dc60fb31d40047d84efbd517ae2f8195c87afd35bad45335a5b0bb56b6f54ae00034d01286aa197a7b220b524b24cec09310b3e2011ae371b23a428ba7c9a718c11bb0f27f7639da0f14711a368608b211a5c753b153f38133eeb69a0ceecea4e4eeef85db192250a92c1f419fe43694a4cc0793611bd07da70d10e67b30002f83c764a309e8fa036e445ff96fde8f06f510348ada7ad5b1d2d334b8aaf6c150db38cc955530d4457ca7f4886710c0225779bfdbcfd78addc87ec5a6883a004b59421daf9554155a6a2e4bcc4ae986e5fd950355a124f9df36b92fc4ec4b758faa6bfd988cb256865ad97011eb1825227e23740b7f0f343a5ffca2caf45eca8eb38f1a38e9ffbf2e5e9cd3d9e1fd6783292744c81a3aada190e07d941c62cae0c13b983b35eeebb5e38e3390db248c9cdceeefdcd24537f764f3cfc8b1691f865617a917d5922e6667c695f4693c11ac40327327e569581a0168d253c69d67b9c5fa744c9b4040b7a6974a818fc9779c4e1546eeb11b3d0dc641b031c0c5e3fe5bc50264cd034b03735fb2b18c237879be53f116c118d1b7b3d7ef269a10413578d26a7541a417ab5ddea19df9eb5cb957f4b800edfd2e13e4befa7bd82b0f00c2e61b23ad5dad901bf467500c656b77f9fa2c9540c6d173c592fbc6e075258b02a0b9a35a957acffc5cba1d7efb9bd8426b235259d1b41e4683b5c03e5994b66bb70c29aeb89854bf2567d6a937bd5dba9b8170048b05e89f13a1021d2d6e0f5fd75fd1afab29308b096082a46be3caf9d894e83df984c408f9d1c0949b43d750d42b277873e30dc027de56ac5689725fef75aecfa6558633bd57b01462211eda3e54233fbd305fe4e2fa0a55b1646dd47fc29d611bdc55a3170ad411fcb58d376f69ffb453db413f558f75779b819e799e30a7b88c97f9213db72559f7eceb6d07f839aaf6df88c8826a3adb403a34b6d8afb7730aec0f757b64aa84700491478d10488fa0039bbc560cdd01551811b6f21833d5a166e6af7bbf486f3aaab54414fde15e5ef26790fa7604295c7e41c9663d7f8025d9165ba986326f165de7ceb91e59a21319fc7505b7b988bc2a27896813d5a677e79f6b770cac926965a713864f1b31836931b3ea5674f64a37d2bfd8f9c53e4f18bd930f906339345f3936414f29788f426c30ede9630793a18c54ef41b98ab772015916523ad23542e6ea1eb29e408f0850a2764d24ee6e2efd7e7b6c1cca0e650dd7ec7986fcc3e18718d7e40475f0c2ab9d2c3225ce4d2d0e0007f7c0518bf128ecf795bf5d51f613194d76ee821c5955d10108aeecdd6e58c676e79317eb847a6ccb27807be5d5945c18c2f7316d2fe7129feef2339d74198e8713f3f9b5c529a71f73e5ebf80cc4f0b6b7b2f29890a3f6764dde25b93c9579b33211ece932c51f36246cf6c70e75dbc78918ed6bb0e11e5696d746e6c714a77c68d61ecd4613f63e2b7a461fde129da3d8b48c3db219bbeb921e12657dbbbcbebad12afa7c5b938757c1af039527f02440db116fa6808d2060c15cd3dbada8f077345751b0ca216db1cda0759058252d396bb47da2a8dc3ec9cd84e47f4a4e9422e098d4b160306d5811e675e6d1ddb939b7a951fda13784afa4f6ab9bd30cbb1255c3b6ad494376bdd61c0dbad3e7f3abc3e615e4869222276000a703cf84f75480f90ef1321379439287a108836f4233e3c41e4c45e92353e6a80f2af09b21807f375d85e61358c373d4dc1f850d8d76ea9f4ea5bded8262daf16905cd121b5af3e075788410c996e1b0956cf9e9db4ba27b6577f7c41dfcd98a584f77d8cfdbc6069dc55c34040608cf02b77910cded781619555ef7fac7d2e87be6c69dd20c759a613743fafad8b8eebda361642c5560065c5bad8981a9b0a7abb1842673a71d828858006333398bfaf4df5419a2d35882b4837268baba03a7f1b96ba73a0da3800b7f17e70cfc80e6d1113b9a3cfcf04a92918ec923cbcf003e618266ac4c544cbe66349a6843977ea8f35e7d691b6ebbe86d9f8d55d65b6651820f7ffe26eda4e1929a41c389434ac1ffab2aac8927fe1b2c59fb867b81d076e04ae586dd20166a311dac8d914a6fcacb5462265e023747e0fa87eaf96f90a348f012c93ff4baec58ca8f742cd3a635e4b5a30516e71499d18057f216ccc7e5be7e697600e21c2b0bda1e9b5801af6c1d907ab0430ef69e26b111fbf337758cab0ee6a214a1ef3ab6222b8a64d8a6e9bfbfa1c1b0c970b60563d0a94370b94f7838590a03c20ad349a6c843cc4d01429397d17d811a5aa0555d5a8e56ec15b34e274362dda2f0ab76e44ba8fe93523317e1cfc5025c937aa10829fa09ac634dcea25e03b8d2371273cbabc546ad38628323a4addc642d531c9207ed27a7e7d81c042bc4208d5c154aff632ffce01d608d5b06df961d439d0d9acbc4a2f7fabcccbf9036653b44423ebdd44278ddeeb7f6ab55932414274aa867fa3a2d9af1417c70e9090781140607d3f1b060541cfdceec85c70cca1de1fec327401add163f163645cd7274827f86bcd2a699069934fbb004f0f5066b8a4ca0cd31676a711e06fd01d50ba99edd39c14dabd4c278afe917de5c47dadb6da5211d964b846b3e5029e52b0547be82a8cae2c47a907244a2cd358e0aad48419966133faeaec0bcc9509c2a94177aa176b3b3405b874dbc90a1d2db646e029bc8bd5ea578ec24cdd9117c25fcdc522950ef1465f5f414a36fd35834ea5593d2200ee3f1497683ba70ba0689618f0410644359d874cf113d3d648569b65ba5051e75e08a48c78ee85d4862d04683b7a7f05b42bd2ba0eb2d8dfcf975382fe2db9c0d9cfc1fed551cca6a688dec603cca6f0c6d156b47ecf8bc78d9c2d27c5cff8a09b561b8404d90ae85042934f5df1ba8a7b3ab3cdbb648e0f34fb3cf3b8f9ec45854c7e39960cbc28db2dcc6d3c08def1a9115e6b5c8e646f96201f0abcb1a0277e41114e9a4d47f99f62229016d588dd6e6905234a794d451f1ace349cf51b8df59d605bad545048b8c9bc6e7948f679003d7a5393ff5dd0efab10b6a59673938401c952e9a489a79dcae7e4502224f2e85163ad002d45d1f722ac10a3831c4d9b0cc304088c9efec2ecdad6d4b7387e7a994471ddf96304e184ae26bdc96c22df10ce03e54d4ff5179e3692594cdd1a78af0fff27fb310b2155628e08539953ddde895647b4ed7c4a930316ae2216d09e8d88fdfcc91a483b077c52c9ae2b59752184724fb9e5a4e4e5b29552624f43ef74fb37ce5fac48d8f579a083e94024b15c569ea22566674a483f1e8d65c69c96a198832d8c4216b526388626d7db7e9b9f812394d8bb90f9919ca1f8f435552bc1db3eb8fcdfabe782c3968939b858a54a28938ed5b10405b46dc52d7f9794ed6e5cb9471dbafb407da747bcd466b54962f1584085f433d66a4d83eac6c0047d4e3d37bc9c4f949540d803eee932007e14b52c17c62312e832ce91ecd80329779dfc6b399c3c65aa24c3af860300491bd34bc45bc61e542b9df5500a76105df385767fc8384ea04bdfabb575d1303e141c504dfbc47064fd721fb513f276e1d141443018f57b5c3f5e6b894ffc20329a8f11628b0cab05e75b2fb66febd878934da706db48c3b14b992aa93036dcd9670f0db950534be8e9e3b3f48151222287425019270520b9fa5743ec80b71729d87088d8266568e26fd718cf6fca6de77f41a3875bd61c13e5fd1d15c95210bd50be5f8b28f2dfc0a88605b3524a5b2eefd5ad8c8815393f96a5e19bb8dad4f747efe38eed12fa60e52afb01fac4f35698a8597acf1c7e2cb5730dedddcf1bd70cc9242f33f77e41698a7f361ad3fb87c24a2670f74dd2fdd77e781817fab1a73c5c9831007dfea90ceb61803d5b8ee43515dcc41e084e6c9b8b9075449832142eac2a20b34b8e8898fc08e4ffc7c558c16fcba76bf3d218f980304f20d22a878a80c934482bb27e24534dd4de74a22b7e9ccbd1a4abd014147b7960e5dd1792f99468cdef1d23e18409d7745a5efd6b5c5362dafa98b303d650c3f53962237e12b2ace1b10faf35cc60ab05e1762475f87e327f8aadf49e821524e6fb03090b99d88657917b78a65631f1704d65af8b3f7fea138549528366ee4fb8f82ad68f9b0bba817bff199306d8ee79ea0157a550ddc64ccbd5dd54949850ba37bbd34e1e500f9cdac090f55d87d716966918eb262cfa37db381b4cbe6b928945a2270420dbd68736c70f5bb125a1fb1f6e3328ba08de2e61f708cf47724cf3a0b14564ddfe1e79a28d6e3ab83e08b8cec45296d71c115e2e2ee4a26b5705f422fe6efb0dbd9c8d09d5bd9d98bfab28302b68a5c71e09b2ce6e7213e2fb44527dfcede708f0ae0035a2c36e6057116512fcc7983114f89491a803a9a8665cb7867237b4</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-xray">      <input class="hbe hbe-input-field hbe-input-field-xray" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-xray" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-xray">您好, 这里需要密码.</span>      </label>      <svg class="hbe hbe-graphic hbe-graphic-xray" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">        <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>        <path d="M0,2.5c0,0,298.666,0,399.333,0C448.336,2.5,513.994,13,597,13c77.327,0,135-10.5,200.999-10.5c95.996,0,402.001,0,402.001,0"></path>      </svg>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">开始计算机操作系统学习</summary>
    
    
    
    <category term="学习" scheme="http://265832.xyz/categories/%E5%AD%A6%E4%B9%A0/"/>
    
    
    <category term="计算机操作系统" scheme="http://265832.xyz/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>Markdown语法续与外挂标签</title>
    <link href="http://265832.xyz/posts/2013454d.html"/>
    <id>http://265832.xyz/posts/2013454d.html</id>
    <published>2024-05-02T04:45:27.000Z</published>
    <updated>2024-05-03T00:05:57.000Z</updated>
    
    <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 密码不对, 请再试试!!" data-whm="抱歉, 这个文章不能被校验, 不过您还是能看看解密后的内容.">  <script id="hbeData" type="hbeData" data-hmacdigest="7039d018305e434afd31fa324d38a0b8837d15bb34c7b584a21227c899ce2ba9">1f18822188a49c67b2892b47855ee5d93f963692bb75493514e7b4d4753b898d17c22992f70ce237c987e379d2001c49b82649bea1dae201f9c141512b6c6f4bcb4f88013b6b454842f505341e7a3373cf8016e71433bdd849aa5a75b3372351dfdf55e95465afd70305e9ca56c9f25070e4f993b6626498e30a94cd9c39eae0f271bc4f9bcdf7e6de97e0e1ce0f83e389bc36ab8c1a43e8a2f3c58fb47238339157460dd0abf385b8c479bca40df30f1152cf60184741102c2603cc70215c6e1afe38f064c63e9ab019231f45af2980d6a3811ba4dd4f71e405aaf6c7c3e1945d2e5d1068e215338d66fddd08f1f5e2b8c015f69e772cf2dcd4a2cef76515263f2822fbb28e79add113cce9cebe3858b0053a1bc5af67cc10b4537a1c7238812e5a11c7377b204338da6493f7a993de7a810f4e337036d1276414ca2b3a3fa6529a2823bab26c0d9a02e5db871c5c5ab69c80b3f2bfac824ad53c66f216c7448beb76c037b2e76e2404e6115e716b481b68c43efb09f35317c81920fe92ed1600c61c60b4b4e508aa6f4158235b6890ea58391f2ac6318adb54be9fb59dc10f49ee63ee696793acdc440bde797e1fe69d81d48e3419297303b7543fc7474a621cdf6161962da247f8bafbd710ada12e44cda90f5dcf4efa7c66db3220bcd68099cdf0894d0cf43d8d8f3e3e7995a515930b6a0bc63955d73791a068953f0c092bb608043f11310dc410b278402b129f4db689fb2fb602b66b80884c711c1638e39721c46a8b6d7b284b3435847e22c0ec880f8172074315a0b26a034ebe3cee0ceda7348639eaca34305723314b49e18128e5e907781e68aa9c6006b5a10508b781f12357d92c298a05624d272a4feb8d321dd8a9b42339e23c6b55009d08d588b23849e266c3261eb2054ce91a3116baa8c71a5036780e759fb06c24026ddf9172b7d72ce7ae796c4ec6405a22014c8d728b079d54de3324aea8b2fa15de9de06d20b0d44ba66583fd8117247a0a3cfa4ba18139afbe88ffcf0053475c6aa78157472259809802720980753e90cede8ad291c9503ba332153bcd5b62c06303438cff11cac71d00b0350f9e31c45dd8d756f115a7a6638f775bc9e26c882317d5e497f398c327674ab6ae73ecd62717f8a22d7dc821f7a8db0a19368453d412c342c36f2bb65d1dce9fde2aa7e593c2a9afeb84017e2d0f1e191504e15dad1de09ad61524e7e68183079c4b4730aad6b76a642eeae659802762f0fb0fb1475b608a20cf6e3f4c80b804abf71b6ca7dd4f77b928ebee514e3680d974210263b4ade228ef53f14d113d80dfea001352acf2a73c5e02ef2ee9eb958361afc6978f8cf98be16ce085eaaed4bd03405a9dceafdb79e6966e26f7ba7c0e27e7776857c32a4e8c559df7c8ee9067f023ebc4cf0cabb696c5279f152432cabf60e1a009047f9268005eae0d0a1fac530cd555bca53a09e897d8f0f58c44892d2ac6f4b2ffddbbdfad3742451d65ed99345b8125e5cc51cd9fc604ad32019a84215da7dccd649a866f55a6e9996136ca23bf89ed65bd33e7bf55c3cfe852997552d016321a435d466bfa9b281cc7048298b8148585047002a3d4f151a524b783ddd20d7f67cc0dddfabb30d48806b70c199a062fb4d5f24c28846775f44d205ef6228ed733a897b64b26e94227b47dd3bfca1338df7c9bdec97fd74bcf19a00414f5f4d896398d695b8cf3940e5fad1d4eebb8e409fc52b1ff5f3cdeaedc8eff3b69087dc0d8f48c5fcb086e5157677deb1d28806a312bab36aa5543d4ce2dc2db04509ad156d2a8f3889b10a922fb2b6c6c86675ea74658a787ebf20ebed5dd70a84012530fda9b6bbc00b35685aafc52dd35bb375d8fc031143f8f6bc4561ecba10559f8dc075cfa0cdb78b66428020ec25e45b2f436e91b7cc6e1caefb8b17688840fc7f54a1ab27ce8e3e4797d4bed1eb493f0718b1cf607ec2568f8d77598deca1cec932ec6d8fd5caabc73af2b6475fd711be70a5fb24399afcd3ea3c8284a22c62c8694d5363a677eaa645220be55f7373c58ee4e3e9cdb885f18f2cc4a2f1839d5679c47983ce993d8a4c8bef6e7e0840129040ad2a130fcc02b749608c43d9eca2a8e492b36e32cb0864d19853d14358e3c4ac2e79448b8ffe050acdd967c769ce261eaf6ac4ebd92e8df0e8eb1c357746316a1a6803ce6d9de3c0772ea43b4888934eed6908e4d35b68397dc268efec4a3392ded0d73fe4dd3ee83c08db79f560cc0cadfcaa8081c071bf4c7e874e7d9fe9faea4efa71defe3c51cb1403f47dfdd412c1950fedcece81704c427a187cce9d58529525e9e705783b0a95624bb6fa9761a7365627f2cdb439cd350b02938f87ee8eb97491fe6a752004ef2ce4bf60bebc1c82fc3facfd5c2950ab4ccc1af25b8db3d5279816717beab48c745f3260e72aee2d0bb3bcdf013bb84dff8da187085b7ddcfa7bbd509b25449ec5e3e2d7cb1794d6801ce73424dd12ff1002dfae0ae911b76cca217337e24f0f0f8f98ae4768756b7ef2720a16d5ff24f13291eb7a497623fe238e689266d757fdff325ebec3b464f5acefff8f02d4e676785f43381b2b5ba6eb8d5caa905c343c26b1c6ad06731b4e4babf36b8cd81669ac41d19be175ff7cfe8866ed5129b36f99d20b16c1a6d188ef36d90dae3b1a7a34ba63453f644cd22704d4b9145bf6f30911c8817651a768f1d42445d0da6e610fcfb79df4babf69a5e2373c6acd3e9914c4d3ebdac54494d804c1e30f952e2bd65fbafda416284e0922cf9cbf7fac15b2beff02997246d8937252e3edd4ea670fe99cc325ff78c3d7c6aa7721b510615e4bfd5fee8b54ceae3f2c3d9993a0a21c7670506f089a9cf12f04fb31ca6ce1972eab9b00109376e0c8b3198c89913497bf695b4489fd7f0e39be863a9837dfd91bbcd8722465c7ead0e9fa78196bf285c59bc4d391bbda1ddfe19e9b8eb1125472dcb416e457f30933ae848ec8f9fe5a1a5e71c3111196b1200f01920a1ada56e982adf8c6fd0026ff5c2865749fdc665f07fbf486fb464b522cad32a59d375c21be14445dc1b4285960b38ecec81f7d97864ecc06644243f0bb43946ddcca26d360f0ea1c9983463cc016eb8040d7dfe5be5e6d604f04f7c2fed21692855d4c72b0289dc1a12ebd5ee77bcb394dc9a714bb9148cc90990c23f5a1fa8d3602042b9c01367e80d0e96576af9e8d8003dbf28df3d5c05edf21668622d48e2d7944605035386d90812aef1706daf2aa9262582199fe9e342b0150ba5fc5fc426872149dc31a87e1f83ca70136667cd56e424a816e37335d1be43067653bf468d6cec9a63490a2b0486f03c33227a7b39df1059d8288f4781b93b6150de4c5ead523190668cc3fe75bf9f108e3b6ff5d3c824a5805702891b39095af49105a7811d1d15aa9779b9958c02c6dee9764aafa9719f97ce115dcf022a538afc4b581dfdcbed51186fd3716f47895bca53113d0e483e7c84cda47ab3d0be3b2de6d417e709a46b02c37086ee025a44d27bb327c1cf944e97b55b4d82f7673029187ac555f997b4f0268f3b4a3d85ef1c16acd9e511fa92a516e8d03ad48c2b29f7d87bf83fcd4c704f94282caa6888cf1fa60bbae35e3296ddc65224e08ea8f413d8dddb17c3b8e5d0c354679b101f6d4be0ece2affa1e15ba348274f943eadc45d970b97bb16619ed15bb7677f626f8585e6f2a5378daa452c709a92bf1b7f8a00796dac241332e76974f2611fc22ae9d6f0af79b94443480da45def54aadec95561cf6b093b865f72ce7819a6913a4c5943bf047eb439ca58df713a84b62639d9a4bc57d452a90a76b07e6dd6e7f85c93c9b3c4816553eee853f6ab0641c2b1e140c6b0052786f7d1fc958d5d601666f0750797c807b5faa53d8c84cd2ddc697ce7bf9143b02be82552a5e62978bc0ba5e07e6fefbeac4544d35c5fa9282bbe222729b05e3d03a44d4d50c176626bfd3392d91a57c4fce363b89270e54e6a15594ffce0a58ff4932a0253c71dbc6935e7919dc4463ddbc694a2491455d7a04049e32beb09234879b3bb3404af16fea213c50c546c31f96875bd700c07f9f18d3234e9428d52d721a1d9d3468edecdd06ddeb46c1d582c8cdaa144869792bf889a576a265523b122ff968a04a12497afe7260e45fd2e25d7363edc38bafbf95bb610bbc73db8c9a6f3c2c156c091e3e80484933c76c21560916095d6d7b5bf6e287ed5dc1d163cf8bdcddffb9a61917ff4e947297076663fb2b0e5fe8c94201ef471c72e9335879271d1cdfc19464ff49d9c311df1120e9c53eaeb73743ab2871ab1877b96b9babe93260647b136979efb56e660916d52e1c7465389695790817909f50622769ac49014637043030ef08c1b9b8c6d0633032e8fdddff80fc5f645f1c2f5949004f05972b42d063f77dbe8c2f55e0bfba2275bede4ae88b2833dc1de3d91e5723d841d879056dec56880dd547de1774a243406dcef3ab10d922d84d86e4e990282a36e3bb4f4503241d6f32dea4f015ad0e092fa2e3bbc22d45a952d1d65d979f0271cfd7b37ba18a1e143eec393ea868a7d9beaec5d7d4f1d5f575468efc3bcb08667699dd63657ebafd87df856c93466f1a98c2ebfffc6e6b08a04abd542f7f0a5f167dd46c2c3a9b8acc15e05becb037a8ecbde84b0327ef8c4d46270676d4cf09849dea094d8aa447f7acb48111e1310fdd9ff8579dcf2dd665e699480b5b30d843c05c4388ba1e8d0406038fe74e8b4cba7c3abaae46604a11ab52430728ec3565d72f86361f5c70cae856fb23826cec6ad281a61ce93782922b47e0f8989b9fa5acfd825cb70798171f14893b25f54601b6c821a70fdc47a3bd681ef41b043f6018014968ed9fbb1f27c49b8aefb239510c7f7087bcb95699aa28dc997d16139f8fac500d638deecc3839c804f25431bdd9dbc456c0d5e41a98abec83383db59f9c074ee5bade6986d2855f20fcca3b6b3122fe6f01a0271eda77c2fcbe63c6c826975d3e7734ccf42568d7696116cc953b0bbd4f3f1e5c9ccd67fffcd40b4b1ef6a2618339059373dd2b4ae589c72bab5733e66241ce20c590d42c597bfcdb67918dae1426f6876af30d884439399b8c1bcd881987233a6af17d3dceffaefb0290e33566e1882baf544fceb7c51ea64dd233eaf72a718f91dfc05b08482aeb13b4b75ee5190f2519528046768ebd6783a24bf80983fc0733c5015d752fd3e9ae970bcf0e4be179b1189d8e288caefb29a0b6f1e84a4aebea069900bc2b7f78d3efbb74e8f2b9bf9f228d472caf85409890bf98364f5923d3d77c0c3b471136864123d62e188ad60b96093feec23ae891a4d40dad7b973414807e579df7ad3146ff927d8747c59651e975e33598c1d8d65c73c592a9977fb0ed0b33b19add839b72c2df41c20744055aba5cda87751de9064c697d5a618c234c079b9f63c6bebbb0d626a1896a6e9219c6a06a8a2722c6fd6c85a0ad1697e252b6c2b374b41193ea7861510ef0d53d081903639770d5985084a5a5c504d4aeadb5d1dca045288dd812bc84175fecd7d582435272536e3d76aa54513b5ba77a985f96f2d8000416f9dab2baa36beca7dbec9122dff49b3ab337563d7b52dc9e8162d921090fc272a756ad1d386206e227105946ecff970dfd73e098c38d5bb6493d389b1f826bb4ddb6b07c6745878755ed309908a7de7dde75cf082fb1555f6bf715150c637272acff5f31a4ebda9c4c9efe2a98595d818b63ea8a1efb2c234887e0b5c5a3277ed9d9dbeaa2b41a7bd81583fd1ff508d09b5f82f332dd521fc64f06ba6435a4b3f5d29b086e0f8070d4b4fe380f288b8d4fca77259f0ff944426f2d4d83a92faece0e88ffa0df89050074911bacc4a1707578ef13f4e0813f3390c247f5a54619795f2d5326ee29216b26330398b40561ae86db4e775db471b8fc137ac952c04ee197c0610fef8b41d4a858805c6eedcb427b869937516c71811552f088e83ae88528766135a510ea8d110c8d26bc518dddbeb65424039746ec0fd98a24987c2d62399e9ac52e71ed010b404ae2351b6d046c758ce915642b47228dc707350fb05285e24b70f40ccc9a9a81ecda59d923902327ce57a772efb87cbd0e450f3b300c45190c56c7e3925ee92e1255de6f11faeb7ca2da11ff8f16658e1e51b9e76c71050ebea7ad76351911c452927fe6424eb674233afc48a1da8b0160a10e137af2e0f44e2501805ba79bfe1f58b8aa52fd86a78f4d2ae06ea98451966fbc3de448baa6e57f418bc785c25754cf6f81542ae1c6a98aaed192dbf6c69b6ce6639ff80737cfa506d605c36ce4c829a485b13e5ec51b9642b5427daa38c493e85fdf1a2b446170d9bd8b0aad1a80d50f66d52daae12eb9f42bc870a220d60b3d6c3dc23b2844f35c9c22e703e3cc6d2c82719c849b6b0fedb6ef005e9e1fe3208416198b5baaa32789cb5e88eedb683d9905b36ba5715983cb90d7edb8677d8426334470afd4e03b69179acb08b2331271e589acab3ec5d632d126da13b0f8daeb5810da97825d799ffaaa38108f2d6023eba531c94ba690e0ba47e23145e42684dd09c532ed1a7553755e389a2fb8e8414e905cf98ec49b7956d2122db0fd1fbaa52d347ad2ce354ca09027dcb187db0dec171eb7d3a6a822cecedf79f1114c22cbe6d6a24c12a4b492d3b8fe8b36cd320bd722d8a232e7ec9276041cb010970a6e2078964b694ebb5cee28ef44b512d982b6433735e4a377df8789a2a62b2249d690595f652b1f8f91a9615351c13a2c44b74e518ad8d53b65dad58decd053831618059575199e8e4a820dafbebb992b32abae1c7a2fc50140adb54e60ff14ae72694a61cf53e26c8168ba8b81a97d23a973aa0064844bd09929dd0b817aea4951b2eb28bee3c4bd381705fb2ef64d6b61e082a31bfede572e98a9cdee0430ed1b743b5060959575f2b2d61604b8944de633a2c57bd742175a7b72ef2982c41b7a36e28739bba0b501d4e108832474f9695e636036bffa304da90cb7178af4e8bb01fa4f38a20d3554877411ccabc8e87dc5d2a76794da06363d5af8fab9165dd9ee2b5e2d382829e0883a42497b22fad2e1d474110d1c97caa9036deebddf6adcedba41fda6340da70bd23a44d361b3bae58f06caf505511ada113c12346c2a973fa873c0de02f8114af8fa1c5373194ddd59ecad4c100abea16affe7e10e7089bbbd07c816a6b464fd3811657e75f896e802f7e10bf14260bf4939e861960f5ef07205cbade48d26ac722941dcfc832a54e9b4ac927efe3e38ff442fe6931600548ad77e2b3def17fa2b5b3724b18edd4d8cf9ba12b064725d23a0c5f7033cf413021a21980f61d261a1a39594e2f63228f0aa949d030d678440b3cc6a01d9ea7382703da178bec793da231afc928d39c25c01528cd0cbcf6cf80683902e7c910f97938f32f1edb61b38bcce637f2a62a9e33fbae2049d62eca8c0d6f1331dd8ea9d0444afbe614378d9e9e1a3cc8c000c11d68d8477568d82645950aba67fd36a68e4ec074fc5e788db8258e575bac92acc95c4941cbf86f5258cb9bf983001954770c88db6917f81d344e1c8eb038694fa0880cf65f841c1c2a92798e52b1c6a7748b460fd55ee443cc869babe166309aae96fd9bbd4411c3532228395b572320331e3009ed73d768fd2896dbf91e8433b3e785e2018afa5c37fa3fa1e3a394f187882cb922943e01869a29ac271eda2bbb1aa84692f2983b7106d27f7dcf637c18138a1a44c43d4a0fd0d29478726366fe9ce60e4f161eca16e7e9d5ef273f6e66c0999e189a2706fe146d9ee4b15bbc1e98634ab603a9a3d1a5eb11f63f91c28a3b1ff579f5f6767921d3acc21c9c2a6a8f3ae75ccd9de57ccc2c7862a7cc3f3a39f2198df154e47c42420f061cbe5d2588d8afbb330436b892c7ce237c02691f27a32a6f314be9ac8dd7de94771cb56d02b118efd9d6d57ba1ba33ecadcb89490a40881d573ee2827665f6b002ede02743c6ac781b86f3f3c06604cb799464b63ee447890cc198971f71f2a91fffa06fc6c487a209c1e64a87c740f1a46b634e26e66207633af8291d8851ef7b987a40bb35bb70231a82e00fa912207d36ecc1d0ca70c90ef740f5586b5e8f49d2d72bfbc906a026f5d2165695768e82c8139115e083ccb151bcf952f1b069dc9a4fd9df6dfbfafde82f285bc3fbffd412e035d75f56c7b88c11f9122d2ff1fb07fca0773bee0817fd87537f5e5290346fb66bc4787a672b83ef08a509946cac8d2c35a43e00d96ef66684b1346ae91f574e2ffbce85f55e98eb24ed1b7366a77b59a9cfe0ef8389cb3a33318a1074c43aeb5f787df58ff97431170a2b8312e6b1c35bf7845c03057d28c91d91eaa40d2f198cf7d7c2efdcb55397c1730b260b71e50739405aba5aaed4cbe9b6c7da723ff8b7bc318fc18f024235f79bfe9a65a1f7f3eb72d27108c0526e6d1908a3e163dc4f6efc3aa9a2ce645d8f6bd516356455763b478ab64f3a02ad054cdc7eeee507283c32d6a3afc17ff999e958bb2364a5d5adb6eec82a3c675f81321765f9b3a2b04a4be3dc71066963df6aeffb25c67f44b1cdff44e2bf9421d9eb970edb4a94289ed0bce7c28002ff2505b6e3af72f9066a5d470dd9251e026096a9a4545e04aa4f575e1a0399146486e76763ac0cb3c6cdf98bd992cfccd70470ef54390b0092304c326d33a1be9b97b66af807731b2670e688f77d42df4f824ffb6afa35fe4c427a91b1cdc9ee9df17873274efbb7f4f437011a527f4e6155cdb5ce0a05a4f1148cd33c2f9e8240b4e1d1f221a5bf07242dfe1a20a4dd88c14f31a6471848467f14d3742dbcbac5fb925194035243aae49dee06f1e3cfcea776da5ee9c6420b24763fe6404b31d7d5d1f48c6360af2820a44f7da8d1ccfcf0c48e210cbdc690ac4fde453f5f66cd6606f2a11b43f523aa703b90f78af2980d0573c9e387ebca902a2ae01e8daad7f4259912bc595fd7d3ece5b192d5320d985bddaa206ddb28797ff71f59f36f49c4a7b9cb99428c3cc2aa75ff11b19624d5032807671ad851427ef415aad64559d5e50ac76c4068c70b1feb95cee379aba2377199882e36a7c5af84fcbdd19a54bc0f20f2033e365d281eb260d27dfe61ab0e0c6c3e0b9d2e273c352f93e991e4db78ef7fe0fe93777d003ce56a71fb1135d58affffb7c630dab43b03ca4169c0689124ca4c7a55aa1070d5116c03ba096809870549c4cf3863be8c04161e7ea53ce1dd1f5f67f605c2f37066658bdba5bd99d15a93078d45f7d7af5814829f71577589eb38c6709afd9748b4e1222851c00222bed72f9f559fe0acdb08428c59038b57d4fde5b46719da9aad642dd56ff960245da34d41fb6d1fd5031c11390279cbf9539e56696885c717f13839eb05eb71030df3f340023d1dbf7843e803559892c33f99268ae1c2c139a1926d4f56b9ae8f2fa5440cc44dfc7d45fdf44499b3de18564633eb8f073ce8ab5354d79f79b7d9bb35587b99f1dd00dcdc8e6d4e35ff4e10d3d7208ddf60f7b0aeb18ddc1271a57c44e80751e30a3a5f169dd838e26b7cf4fa05d356dd8c76e8a2533e7594b516b0bd3d1f32c5ed99e285956a6777aa35a8b77bdf4504887b0fbedc650caeeae287045f6541ea032b50f1f8468dcb4b0ebf43f27136c93b8cb90a96cd981ece1a996663fc848cb1f4ea4ad619817618c30d70448540edd561186adf77e7484b65a0da729ae1bc2bfdb0ab293a486709ea8bef9276593ef7b64301f9ac725f0c32b113bd3a395d5c30aae2eda19142e40f1607c4db458d62e9fb1e0370aaf3843f2a8de96db86957da7096688499bd70b77b2d72bbadc710f05d8951ee015d16851d538bea8c87b58451bf56e72b61974935a0106082451274198a31f502fe53fc45f2ca3716f99f46399d493263467b1907d4389fb211861492d497c50a3d9ba9ec3626468885c27ddda3342bbbaa5a8a301ba62ff409be8938ef43a340e2ba168af64aafa080d58715f33a311ceffa33a7a3ee51c92c3b53e00939f6a19d90926c586a4f948b99ca91c344ad95b8d489cdeb09ab6b3af4608b1db0f91ab5ec483121e48d7d41cb99d017394295fdf6b86764782bacceb0995c728f20d1e3db101434822aebcd94e24adade14d6591470fa4a23d4330b55e3223725b5442e0b3713e3f27908072ca0e30838ad3e866e95b25fd4b09313f19e48566b8a8b38e424274bdd30380ccff8ac475953fb906094cff0504219371f590db7e90fa9b1f557cb84585c4f0d561aafff2b6cb5b77f271d7a520b426616014f70fdfaecb06637651c7bb7343f1c1c7402cd37e045ad5692c81d8c419805ba96fa2217babc85596b584336aff0d1cfb35aab776acf594861679be0845c5137240473a29e7cd1646962a7f7699e153875f1d8f5633a40cbf05219e82f3fe0ad0523e4c3344f83d75c273c3ac77e0bd28acbb8b908e96dee48a7b5651c24e707540d10c989dcaf42bcde7f6b4696f7a2606b16a6c131291e10be6667d33e927800f0ee86dc423d73ef7051569477e5758c671c7bd5a9bc275b2423b9e3f9c68ac870db883175889e40083dd7e2608f51378190b0a4c3e04778d98af154c83bbffaacb28e8ebcde21a8c35df351974e2b370dc8f7c2564379ccef2bded72bf891eb1ff7eebd77d2fddd48638922e08165e1856bed8494493f89fe476a0472fa0bd992daeb16919c2d58fddf9e0aad5d2158194b6503f9bd91a7ade064396113f790cee87e60e124e2424169a80bb1aaf6fcd57811e68b44016cfb58c0856a667da866104f884aa87a3d2ff549e2d7a89ea336996fcf5546197e26887a9820faf304f01929d6b3a47ce4bc532a1ba100b7c5736af68cc6376b41fa450056c19a8179d06ef02c26847da86b395cbdff3eeaad695f3797f220b180ce0a606103dd2998ecd4e8ed20c648efd7d08d8c8d8020bc154918473bc9ad69b8e46ef006fdb48e3198a0373a469f2cdc6ebed0b628ee3414197842c76647243b247311d3024a46e2e1a4a7fa80b18926f11b68f7fe5837d9cc9f0867b4b4dac9a0a0783b0ecc10441cb467d315f5928b907b126bb6aa48565284475ea89f6bb2c4c44952c4b05c1172b16bfd992fb70fcca53b8cb613a649fb819143899b7aee0f2bf19e6e2f5b90dae20d2d4e21e7c905079fa6c5688552945116738388da6e939329393aceb048fd89caac2908142f75431ee3cca3913c9d1a8fc5676d7ae5c725da973abc82fd26de7f56e430041121d54bc2fd2b9b0e847eb7f27d03562598452adeca68e379c5eb9b13b23c08e78935eea8b37d85c4405c4efce5ac105740f15eae4be3e140b957e2da20a4f065e279304569853c11f0e437d583119f03cb80ac6c1d6d2fc4bf8155ef89869ca6fa35406802e39752638d2c76815bc9b1e9fced9b757d96ac413ad953a1e07fd26c768385fc7b9cd7605ba0bb02973f9a36113ebb4e838044b10b6a44917bd6c6326c4282557d936fd5c74e3fb5e1d3c9bbe134ca28b8a6527a4de6edfb9cbdc892cbf557584102e061fbc6d9893c03ed2674ca9262160540547ab11b265627012280e93df8a76be348b6ea8220fe8c321cfc962d669b5379c98202e315474e0ef0d17478f7688670182cd4955866839ec2c1b16e745051bab34b3216b5989220c026e84e65c9272dca605fcb8e11e86268fa9102b0abdb51adb97fb644d5e86010f539bdd82e95742642abf7a8bdb4561b321d6695fc60c7f2cec7b733d58fb6f465e154b18199214ca0e184480764450e13c60fa75af6d3c9b9103beb168343389aac33da57e7da11bb1798351e5cf2e87867e219dceec01b9a4d78a332184431217fadf10aeaa47333af6ec7ee0eab53dad5b7d8f94b545e724bf14f381382f5a7a43f283f89b3201302451ee72bf623e8ae8870d8acdc326909ddd2d827c886fb74729e277efe834dd9493e633bb2b516f9db1873b0f4ca306925c59a136fe57663a83213edddaef47e49fbe442bd8a27308db71d228219c3b325c90206406bd3a0cb40443c12acc7232a34f1863c273a38ec846403126ec2f3d07221eb60f32866d1c6905ad430d58205c5df26f45f01910d8758158d3389104349035d7fcf15a3196a1b6c6e679326a6b4324ddc25b3c8d20865df95e975611c98354efcb0183ff08e4b275baa814bf66c87346caffaa58195d3e1a53601848046ec564b9f8d8918d04a14aedf16924044ecb908e56888a186f570e1f56bf84f67aad039d385b66885166d2776b00c5c5a5809857710d4dcd0556bc1749abb933f6958f129d8c18d100436301ab646fd0ab2ba8c02c539939db2716bcf5b808af7beb202ab2dfb104c3cb0b75df6ed089770fc23a1041841925ad5a42b227d024cf5a6b1ddf4b9db210aee123e3cb8af6f4d4b0c60cca2c8ebc84630f9e16b4251c10dafad97553c7b265ac95b63b26894a61ad14dffe576507c79c2b07e61c0d252ed721e5d1dbdd8378331fc85f66bba7790e248e0ffde3500d3694f2026022b5f9336b075430b4c35b292d0f899a32660e5606a2dd276739f4860ab7fdd3593cda03a0dc7f2ad44609122185880eb269a6837009c8adb229d7b04428b54bc440de7c550bdbd81411b948af09f2f8349c59679aca079f1c5ded9345288ba17808082b1851a31f6d54294a06c7bfab04165cb613dacebb138c66fc00292aa7cebd0a314431a19e94f6b34740a66b88a0353aaafcfb145909def667b7d4fa2f2395dabd136103b4a94418eb25f50572cbf00769d0063105e15099fb659dec16ee8eb10c364c450385e7c68430e118c9fe0064f08f608cfe93d7b7a9c9d671c234577a985bce1909d6a1581877a6dabe8bfc98ce895b4c012bf313ca79755f24f0c6e9107b8430cc6276988aa3b82d9d078caa37ab2ab72dd72e6ac1ab1a34a94bb69f61adb373e7f7a08be5857518c6b2d4abf7ef403436b75cc8c10568281dddb5c6014abad2377ba9a8463c72818e2948722eabdb9799c50f1bc806006b00cc07a7b4b9f0a60ffbe170555d3d3e4ab9d444d3e08f6029776e46e031a7d1496e3a7fbf2bfe127546f956cbce530dfe0f2984b057c5aa4d29ad1b355813ccdbbb60aea3b1a8afd6f19a661d4d630ba277babfa6c2d89e72b2d1a8d95b02923be41d242523f5ab83dda93745a0ce45fc0b4d89408b6678f1a56aa8bd4ca72686082ae32c7b603dd48ff56f169292ec2980daa76bfdc65903bd987e47fd2ab4ba801e9c0cd0697d0ffcac12bd6d1554d0830b67367843c43e8b783c1a795dc96cca390b8abeb56537a0e376132034fd0f556af8e353982817ef452852776c4c67163d166eeb11d00119511ab19d18fd74a95ef4706be748c0c880d8ecfc7bd8c74aef2898798652dc58bdcce983481bb539a60f6074bcc667c02f929d31fd61775ac26226cdd6cad46f843f43443bfb4a8dca8e1c3853a7149163cdd52d99cc605f8214da67e2ad7ff1157e3b4d45128da62c01090797c341929374044472966052dbb20c2e3a75a952df862b5c79e5d94dd2d11f77a4ad73b9a10537b938883b86c870dd048cc14336bc995444ad038929ac0839fd1f19c4ec7fb10562fd8048e2766a2dd714859678732bae298917631690823c88c96a2b89c34e60c85e543b76cd9ad939049720df747b0c1ffb497b06dfb2e4897322fd68e16a772cd845834a9029172ca821fe5afe073e463bf3c5a4d2fafa42f5d497bb44ba0ff1a0ee1f7bd5e75f4e77f88562a7388a9bc04393f0f3c96674b3e5700535c19be0cb089058da3cc03070725bdcc9e085b46627ec022ac525acae1a65ffc84fe9136477adeb00a3888256722f609f6b13b5f082d19c2be9570cfffbb58fca14f811434b64c3f9a1e114fdccffe14e83c7e150eb818145cf6df894c7283d63b25a04bd080c6dea0e27fff3d221ed6156fe10dfcf76ab1b7dfcfc3c66bf899f72cc100e6a3e9cb7f38d730bc739b64b8d9e9a13ec66523c04b36739be6d0237b3720dd4a127b8d31359491db9e18da962b9dd35c9068ca626998e12df97b58ab9411137af693f2c1c4f702f7eef4479aa7efaeeaec83b74b89cbea2b2a8e978086fcb218accfa6546771c9e97d87ec3905d90fd27686d0976a183de7a5db8289f80f9214503a4e965527ec12fe034127b8c3b9332f234456e017461ded2d3f381995c495f7c84c0c565ba2cc8594798bf89a4df1b0bfd08ddf6b4137ac484ce09aa496f9bb1fb783024e4ef940b06285d7f551e1114fe4708c3b7aa2df0e027d612f2fe7d1923255f3caba772890131723816f10abfaa12a8a82f6952c8dcb9343c92c437834b477e82bc04cbf1740ff275151a31aa3a192b93e3532fd7d24d763309e4d2c54a3e3ad64a82eab8312535c2d65d2c113e466d09aabd91cf01192e2f6d9d7f09201c2e9fb45868d07d60d61576ea1bf9bf160d08bf70db4d9a9de46eb55b922f7720a925bf056895d54b204f26494e26d9206d511c0f087325363b112794c33884e756789e7bda61a93f24518b45a0cc1f64d2a702a00c3e02d87738f44cb03c524756fe8a4b1c4f46b34f4164777b148c537483efeeb85df035a01470935aabfa9ca76c7364d6c0e5ede626f0dc121b2db44f7505e40f5064233596dad5e0288375fa36ee018d4c83472631525bc428fffdebee271cf3615adca09f0a2f42c920efb08db0d37eb0b95419619863d584a282f721ded6d677bfee9eca4ac8f7a2d9a14463dad6163e087af2e061efeb8123fc158579474fcfb840584d40b9d0e949160c1af5e8f1542de8187ab4ae1c31cca4fb9bf96272a564bbe19fe99250f64f168f2376a19e6bf9ccda1ff196efaa82acb8269a8d3101b50077af4b7f006c6aa7955c1596cd84ff1bd9df068e7c61dafcd984eb3965cd5186695e55980e43401d80db55c5521515d9c2e16b4990775bcd621461d4183614acf3e1a6743978ee71b67a6a3d8d5d60f6575d6177f928482ed035ae9ff1de37740d77a8cfb02f42ee9dc4bc6b70f07f800341b383dbcb8422f9caf087f6fb7edfd24bd4d609afcbc2b7a4865ce0d08b66c8c70da5ec0ef5dd9fff6122387c04214e20f64f2069c2399bcd83e6e8083cb97ea2bb18f5066380c9637448e57d813be9776e74114e4a752fc7bae52ec07ba340b01ddbe55b3792611abfe31d07a9e23d73bcd66a6e43ccc5485798973b8ca2b63b1cf4d46742c37be24b6598cf74f4d7954c948d4b66c6a747138a1d3d8f2db3ba5043765f179fd288cc635afdfe6219fcd0fd536912d32a2f6b1dc82c14d785597c0eb139f01e0540f7103a61ca4775cc4c01f9f215d3293fef430ee02e6635be1b1601a4b6a5901a5af5e59d84e53b75809270430a4d6b310ed54ecdbc085cde17dc3ee867df5a861f4787edefd9c2727179c4c8636e8e5476f2ee005b596b8c5bc61f6c0bdefba73e9e762b07be4edf5d8651831afcefd74032ff929412cb07064119f1dca487d1ebce711c6255a6d153c123f18b8decc82e90fe9c03974f75af370058ecda141e550094b6d9604ed397fc58b634b1ab5fa2274dba86a9bacc5ea89949d60483c867ec8333a4fa6652a43395f5b18fd1685282c2671c8c7057644781276730ed4c7ee56e8f1af5bc8b198be34d349cff526be94e51268c67604ab10608235fb73b45a5e0a6bbcb468b8b66642af50acbce91d4ccbf160b0106cc77e506fc58d6e1a7c69ccda8a000be8b6f051b7d20580e3cab7d742056816375fdb7f572fc8b56be154985a6e9af6008b2543502a56e840e28e5eb29bfad600cb9cf7ed70843edd9cfacbb44ac48a976dd6eda81f2fdfb567ab456f06fe74aa46aa5a8016d55dd25676ca224010b061a5d0602e847065dd11c78fb0c58b6b1cb6bd4603f3f979b69c6a0897ac063e4851bc263b53f7e7f439fb492f0dceff3a0c0d818eacdcbf748f5abe3361bba5cc922b884175f17be5b3ea9b2d2ba83c12c8f0b15c75536af2e5bbb8faf5e4ff7b6f766eb2618a8ed68e6269388af05ea8ea385be7836e9d5ba36d1e87aa493794084af38390098d295514c101d63d71c481106c424ce3eb65ccbab87ff275254fc98d6d3fad49829e14681e55ba20f60a29eb7138f215034f807b21125ec0cbf5a622a5e78f3db603e4e28ac9072372f8e79bb30ae12506b6eb39d4ce8a5bf7b462b525176fa96e25eb75bde94a79caab70d3a966ec8ac7c897a0f9cd69337cec67cdd3d3954bccafc914ee048e12abc6d5a5fb19e280ec0fded107337eeaf6448631912aeee21836b77f0fd90d4b5239a73e832d5bf9fff3e555e7e5eb02630c1c2afebffb17c619552ec8df02c34ea29952ad13ddecf2b77375e5b4ede2fb5235fa7213afade02bb4eac084256fa989b9454c1a10af7e98cf4b3295a471b9935d11998cea557108ff5f1fe4a1e2c8c4f01dd82a88c6f69bf2e1684a468a3ed2c17fedcd32da909963df7303f36f954e8fdd978bacccbbecc4d42ffd121acc4fda61ec4b1f2015dacd74a936baae50454b77a43a8b7a6081baa18c99660ff0ff04ee42250481b59cb6812d2e1209015de1b005f4c898f268dd788fe2eb74547937096386d75e1e604cbbd32b2280199c97f84d25b8c0c99608cae3f4b0d990b7e5ecb3fd1c9f7304c9c6178bc5afe3b6a191ecd131b9ef66e5ced7e88cf7be1cfd2fb7dd2fbeb91a85c33d65f01c2dec0cc94616f092579eb6f0e811fc75b0dfc096510e3e808ad1ab24aa2668da1dd51d9184e489e9166d598b5dd7a3826878d332603a46f534e6fb92b4cd930c3a224c6241e4e12b6b40744012050a43b028f789cea263076bcbb280f56b7187016cbce719be25bc27dd4ce4742f4ad0669ca5644a03b4edb0b863b619b3fb72ebc56b30f3f65cf3602cb993ef6cc5871ffeb150bfee7f2a2cebab59b52093b85c469c57674d567ce32b8cb55aa330e60ee4fe80837462c12ebdd94cf01039237cab9a51b9665e4b3bb5f0ee943be6a33e3085e94db79b9c86b67b6b97be8e6b4d165c6982e26716dbcd5982d11464caa806a10130ebf36542c7a25e0ae8c387bfe884185a25aa80d8be5bf1b9f8ce2cf7366486316ea806422258ee0068d20eded8178a02c3ed3349023f57fdcfc3d6923ef66449b73224341d42e62f4938a8d202a2b928846f4838c6e23c12e7e7812abf647655bb607c6ac554b9de8e0ed138c22adf2cf218e3de7bac0d67ebec23173dc53fc0d2e5210bec45028405d47b303b92a10ba4328ed4e2166e6100da0f9cb7059e62c16f8bc139adaea6cc99e9977a759908f4b6d7e4fe3cded71c126bc5eb9f7703ae64ece1f9d559edffc4c935f17f13ff5b593a1201400eb369724f64b7c87308c59d95b907e2b0566ca8898215f1155cf41d9fbab6d8ef1be370777982b61a6562a0ceef900879cc8ac306f12e01bba043c4947584645d883abc492fa097acfb5e75dfff1f14fad5347540f21a8b2e0fac9c4ab4e2f6e26fdf2255cf4d21f867c612f5fda29136d3b51393131e10ad03a097337decf1ab342ab1d39cf366bfd387767fe79fd4e4e6fadff05a95b171eb3ce04c843dbb5b56d75d820e9e7ea5eae4ee4d029745975a7ac00465c399582b211d495904bdcfee0f75ce1d2ec422f0b0ee991980d4ea8385c20ff90c6a58fa4cc62e6848e8434b7cad847f707227918d9b73844fc2d672437840c0dec4d814d32689d4fcf52973f192a49d5c20c735697bef7c831c798ddcc9392c27606032285b7678e8abd82c44c0309568bb55ace06d00c45dc22a87ff12ac433edafc405a494af63953b9b7209d064c12d2e2c25bf63c7c37a7b3ea3d70d9268edf79cf4e709561fc71e7146c308dbc6e448ca163a719e1b0801abe8515e91628d98f357232308c6e59b30fdf3a435cc318c90965f91ef53f274af22b2b5589929e77e2718717f009ac3f4367dc976c8f421957131f4bc391fdc6f055d76ba2a892686c3a16e4b3747c8016640c1134903ed2b43a1e6c06e0c20e534ed8affaa43869290e27889ae85101a4dc0d88dd4cb8ed086bc3a27d6b24fac521d0108a318cf8c351d7649655161aa0cf6088d3e197cf82c14d8bca3912870d3293fbc95ec2973ef1fedc369dbd2d76a64ef907355e48390dd97da72476db52731e71cd83a473490611261fffdddaf1a735cb920d0a0778bf6d26ae5c77db5482d2b89af5eadaf1bd60bd56bbd3c902a215bdf02a66bdbeccfc2c930f03ed9c860501d217eb380edf183505ff7895a8f8c07690a8f4e43eca7c955d4f24d1c3b80263707740872c0a93de18c5d4c5884438df26d3194f4ccffd32510ff5af1fa3cf7693a6b2b821353d62060f95ad5cbed52d7107a2923277de0497845fb8d5337b9b55d377c69ecd17e779e3aebb1fb198c3743fe23ea1611da2485531091a5b763786f0ec489f1480d6469cfde8538c6c7edb162c6d0d1d1e71f1ed582cbaa26c73174d3da39832e9247c2e8dbb69c00b7afef0df6ad3186eab11e7cb1a4e6148658e2b4821801dba590aa7a1c1a5f90a6c6dc422f451f5930829931f9e92ed4a8bf5684f3e0aa96216d1b583be984958413d3c849e6885081a4f1f98cb0a01d6526f29611ed5e3adeceb47d6d55b156a82cdc52565396a8fece99f200abbdedd2ad9e7abed61cc9e85c5888249816a903a071dbcc6232a7dda2488e475ca53f49726af52cb6087b87bcebb4c6405930c7aa1d53dda208f2f859d4dd0309dd568e8d338377edd80ca467fd5fa0263ed09034ea35a51a3c34cf8656a2f675662fbae327c7c52d839739a2e99b1739f01f0cdcac303b8d44bff12f3a44ac9601c1a2c0d0177e141cc6a78b74378c15fafdcfc95dea3f4a8c944b926490a64b6b304697ea0bd8ecbdeecf82b128d83c1b94887559d5793615dbc583654a81c3f44a5ceaa580b97bec40a1e9c925a6852f853ee64a2b92f1d3cdbf22bdc0096fb7fb54e3432396f23a7f216e1b9851603aaa7e14794b844e7452482124c0a4c75b844e7612549da4412058a8d2f6727e70ab35c4e60b585f05eca9e9fd390dd32cb1881a940be18b7aa7e171747354b483e53133d64c8b2f0b5ee52059beba3358947577b148667608c08b8b709956a87bb2ca255af1e3e39061ab8e31466b08b68f34f1a905fa3049382f68a35086b64b0ab96bb5b47fccdb00e68a6ead73e04237c2a4cd2fc0c2f9c20b85ed57047b06d1e63218a8f6707e154cf396727936cb7cbe50d4655960e17526a6541615a8490604a960798335858aed4e7e85f109358464d4ef2960bd0c51b8bd5c9152d0d0bb72d2a2ed2e6e08ab44dfd9563395b078cf2196c9f8d27381a2c5fbceb389ad9382e4058b93e76de1d3f8a412a2d3c1b68ea82ce1efc8b65767b46ae36af8b840e6a4f27c78eb0ad570b17b1d04d17562abb059e275a3b3b6a74fe00db7fb9be5b169250d60a714597bff71964c752f8a0470302efa596b59f8995bd4251eb0a913d7654510b0b1e9e85144e7d57d9839795f5ab055fe314a1694391287a93e1d38494d9a93d128e9377304c6d56614c5eb500231b27cf69acdcc36732b1c0fdeb21407d0c43a60c4b677e7972a856af4edc864c7e463d96c38e208d6ee49cab6cc6e76d8707361c7e34bee1aa289b61ef3992e3de861f8640cdba305a1df5805844ffc26991ab39f667c8567501a14703bc21622802d16507e0d879590a6ab52ec191f4f1e8f9fc1b9a23413682de4539e973fb828cfe29c155c2336eb93f790e11873610db7b8cb0ff147d9be3ecef0448cd97df4ea3fd3819c8a85783a365af0dc5d5ab160da7722977551fe45aa0d6c14c9469bcd59321cdd4b8fb24f93b7bd8f2d0af57e32631f581b3c0cb0b6a86b78da908c73512ab9c95cd9e2b03030da6466c71fe9070cefeaa456b17094310f69439074cbeca35324f5c498a0549dd9a2e91a7e61b013431d1cee99f0a1173fb2759d17939e6c8dfa5c0908457baa0e26abb303f0284378e078bad475b9f8b03391ea515b2858bdb22f4076a60b5d32a3bd46f4cec5334bcc65f0007db405a73b511bdde5f004b82b2d28afb3ff252e0f7f4b5f6cf8e59362e82930545208f792030dd7f1df708ace638c32ff4923cf110a9ee14f26de357390518c303de3725641b0dec651d5ba49ac5bf1d9c97d8f30370ec187b8664d5a4cbee7181e67f32930bdbcf836145fdfeb2864d5ed8e3bf0869cbffcaf246c16f4fd7bccda793561549ced7dd21cd27ab88494516083a1fe12f7ee8d8aaacaf0bab9f3309afc7d71311ba086d3a65ed44c62b79da1ade568f38d6ffa58f2d8a86488316c917d37a7c472a9c860ed37051b3ade26561d40ade163ed5051381bf1aa5466236d32dbf0a7f6e5437d2bcde3771c966561ab4de07bbd25488525cfcae94060945bea6fab75011d0f03a2b0f1fe717d06dffec8be8ce2ea1ae179be35767d1ca1d9e39bef65827f59bed0692d5c39062ef17037c4848be24ce2750c614f429a7dc3ec05f6b50f0ab80541291ceb90304b429f50522730a06d40577740e8c7117dc138506fedbcfcc3872af131ba6804d385b0e6486e9bcd468fc3a4dde2c0098d2b91d8c58acfb25d411ead6b580a737e9b8011fb9d976ef2f013e9d48bbcfdb26ccf98c036ee2fbbeac50fc4c086bd3858d5e4a00b1f4780100b53769ab7d6d2823988f03b448c6a96dc886150487966616da9de8d8bf6133ab51662eff548c0de975dc752f90ef5e418a75159119bce1c19b7c5d5f427fe1654cb3b15c77d7701b43b115e580c98871c6cc9a180e460ffc8c2c7ceabd15aeb6e07b9352cfbed1946f975a469cf885b5af3f2fc262e8a5cc3a33d41944ef1528a02c42f0efd83802597e728c44d858efbb7f98af039238b071b236495827341542c124a90bab7257875ad1f217746fd7311da5cde1752b17e14837f3cf6b5d08589adbaadbb3b4593763618bfdf21eaf39921dce3ce6d4a20cc5e878ee14a71e95349c42d1b9013b12fce6a079f16c0ca44e36624127a4cadf557c4076349333a2f60a524df99c09def7e14666373ba6b411d8368d9300947f005c21a8e6cc63f68c78b53016f93a29aabed154e6c769dc39c21fbdc67f36e10a365390ac1fa370b3d831108368d9771c5e83ac62703c5844267e4697d091b7cff0d4346b2803486d44b966111d84ef479a9ce7330be876beded922c6649c3144efb0fff1945211fe2c712db94658c42dfa6883d512aa213fa3b1e6b8e5e4d9181b448095c40e6743a2224dd7d40799325f8f1381b3353f898592d75fa4e793cd6e67e7c8e03aba4ac043d9f11b702288645380937eff6b7201f85d17834e93c3262edd432ca73c3fc9010fdc9f3dc34ae6cdd0dfeb61475241a21bcac38b10064f8ffb4aca69326798d77c2e185fc27b411531385191d9dff5811300e3d37467185dde949c0072e529fb34208544c2c5e0c3dae86ba86913fa6e020b0cdce8e0fa8431608230b731d3ab1fb079718dc32a348250342e1b1cba313f18f6982e5d510f4c7de33cda114c1a347c2460933a4a03a7e85e2f8a61594aa1427c9228b8611d3c490af30fc13664790c0316d255bddfb7ec03b9809e544d0f6c4e02079f59a1d41c6f2fad2976fb389e420ab017b16d832bbf176c82344ea35262fa87f1f9fd6d52a8834552f2fcc50a7056c6f1e4b21621ba8fdfcc6a7cb8b4382a022de5bd0911bd1143310162471a6577f85854ce26d5e2c328cc15ee53a9df241163b9e1179915fc8763718168bd9799e1daca77dc08cb7fce4a88091eaccf481a3b24480f67f3dc6157ab7005f23a3537ecbbddcdc1424a917af71d581c497cea61ebf1b6c38f3f116639fde382258e4fc0ad7994f555ffadc4a05d8cc7ac8576d49529f9497760e345e5847a9f14a3e56e80f5a2b69284d39f15e2021103d91f20c49f2169a21de4b8e8b9fee7a611c7c31c5bcef8ee2952d84ccc612289c4b450031ee77715596f810ff84d5c0bc92ebb77cde70eca9c4cc91a0a819ce0fbfea3dffe687dc04839563d6b27e9ffdb07070f49bf470b8082cf6e8648e42e3aeb06811d48ac8fc7d254f735435be23e8898a58cc51c7c608be3d2db6e8827e6cd807c5f44b3ca04b511f77a4677fa8589a0305ac36689019667e0bc3bebb23f2f94369b0e45133c115ae66167564f64f22814effd171fb478898242bd17dc139c5113a8307e27ac708cd917035994b251df299bd7d87fbfe9f916f922e12e296f018afa421936b45bd8671e0579cf9e8d438e9014574b0492e0a9762550ae84e7e9baeb26b30ed470b279e94a3f0032455ec7768b8bd4d757d4a4cb5529bf5e0c9a19839400a6a81253913d0c3287784629faa9a91ac006ec12ab309834ea141cc72657f236fda7fff616614024f3aa696a353691522ea23c309898ecfe437d1f7bac0073411a4e20bce4ceb25bb4f3eaba818f0c1aeb9875e3fd4cd8f077d5d93a39d7df2b3707045038b8f0ed22576e6b3ef918e6809e7eb3b15c02fd61a53306b2691034281b671360c1cdd71faff2969f6f71c5ee260ec9f4e40f22443a2a0e08c93118eabc18d39485f49efcc987bb036ba809a1c976233a195eeabe4a1f034ac0b6fe56584697ea95b11371ebc31d8a9c69b267c1dfc718c68ca4797c0cbf65c02c43ee2178c4bf476eb6d0204a88668224c9af750a8d5ed81114735dbcf0afb081bf5c209d93775a0706b47aeb735dd9a69fc88b1fc6f8b833f3d9e36c626973d32e3a53884ce4dad0317be928c2baa984a9c9dfb3c8f5b8ca741ccc84baa12f242d643d9036e71f0eff9ed1dc6d49c12b472de7fc601b4ded6f3abdfcf0a08e7255a7907a785027b8f70f9fe48c43c988a8b227fe26347c107ff3ddb71d31198ef465fcfa139b2be2a699078af867b3efbc77270caa2f0d7699244a434dbf504844b192359a1fdd403462614ea88590b9a75cc4c30de8cfced371668b365a924acb83ba2b0f7d34efe149c33aac415e15cc285a0a1ca6574aa4ebf1b3c96d455d04d7661e0ee48a19083801ddb0a557d6c7d69f613838bb514c43f2378ccae69585917b51fa7bd82b405fd61dff94f0ece915f1b974227dea1821fa08af4c9bcba82acf8aa236d17612fc159edc51649ac7bc1b02db2056a7638543b71c8f80d78d9caf9b55ad13759c52f2797c3b130f8397e809547f403482e5a99b0d50cee29d60d1a1f0b489addcb06736f40813b3bf56161bd4d2432d16b199cbce4a3c562ad2dfad03fe5c8d5144e20aaa492aa22a5e881d344f5c460bcffe2306c480030cb3042cd015cc08135d94120b7c724c5b186332cdcc7bc50f6e437296fd96716b7dd20ce0452b49c89443d90394c14069e6c618cfeb88452ce287aac106c69c0664bbdfdd11f4f39e1824e19814daa5ae50505d9abc4b2b5570ddc499e271842ce1e01c3e917fdc8caee2f719dc06edb4fe736c55521a494407e1d5e95d530cfa2c081aa7f7089dc75d1ea03ffa22a9ec1b2399db7711e4ce0d28928f4e85dd8a96e8767ae0363577da0822a99a09cd70b4aae1e044e67b4d564c41977e2c712d374e1fd1816ce90b5df95f98a51889b99f84051f09c2376ec4c4d92f8c0bb122173722393af4f06599f8b58d2c9621335965c45dd9209961f8ac1f5d61cdc9aff676246bebe1b71c9a06e4f2eb8e319ca79e6097365274ad96ec8cab1c89ed0ddaa312fcf4d7c5ce52898a9c275f2963de75e43aa6f44646f3a8178d8669e2f46f61ce044be68bb9044d7495ff72654b62badacd9adcca479a33c4ad7c0c5a31162a05bdf5099fb5a1f736523a2bbb1597300dca3b47c9cf04432786ccec8e2fb449080c542c96806f52c1e542e0a503a855491753dc64f1877647c3f5e884c4f838a9e9ae1bd97765bb09369fb54aa5a44f054764c48133e6a9464d5560a5c81ccb5faacf87a04061ae21db700ffdbf97edd53dc087818d73ee5a212ac42eb8695abafcf90b3f7b875c44ec042c7494382613334853bfe1133b8ede68e5a0104e5656c521f05c3c7738ca3d406109a2ca744dbbdabe2cae3a966755feed0d61fe0e165f7c09c95e57c9411790813990e3779ba848fb8f22ce949aec78f045a8a7b54aedd9ec487109d5ce87557be3b03b8a39fce63ffb495e425e4403279f2a9513d144431d46ebb69594a8b2a1fbfe1cf4a22e58010241582ac5fe9ea5bbdce1f97f40e139d3fd46dc70f8dd6a60eb7cb32cff88919b7a9ea0c878c1e66634f4c08c59aafb64f8599c712811874eb53004c1d481ba54070bfe4601fe7de6a90de7f9ed2ca7a60b63b4fe05126293c9d541faa1b3f73638df5720bcc6e2012dab711ce16f2b501a61f7ef00d3e5c504c321a0e3a9914d31fb2d39a6846d415ec6a9fa5f0b8dd9bff18c42df25340c12b5e18fad0e96c39df9041fa15ad04753fe2650054517db6a67fb74528abcfc0ea8748fc99f21dc26b457954b649fee7d5f0bfbd6c5eb8b85b8e17e427bb0e19816d683532455d1cea44ce70f6e99785d3858e02e31bada967ed0476cd19923e84256eed79af13ce8e62fb02c1ca55e4dbee505d41c07d620ef78dbf12df2b1aec18873c4ede9f574fb3999eb4007b592f60cb9bbf7b54ec6941e70bc56aba74bf9cac2bf629ffb8e402597cccb324d67fdf4fa24aca7932272e2ebb20e51396ce7e932adf46baa5de870905083252d3b1c7ffeb5b6136e44d536e7d80bdb96ae7093200dac8d64203b4dec8d7ede68cdf0b1c2f4f890f7bc4986fdf2fa4db485031d568f49ff6b21b85e9bbc74db054056bb96bb98ab31960ff6c0b8735464a50ac206d09bd0807375eb2da72aaa0220656cb0ebbc81a2ab847ed7b7bb2dab80bfdcc7748b280456a1aafa139e7595a6aace2b45ae8dc82d40dc3968887373d011e583630a91b4e542b7a01aa6afef0c62d95ababbcd71d54ff3ba61e7bb24ced521955e2d37922d454e76ed2adb56e13a5394a65d300b4b3a4d7b12d1b32587f32b794b445d9c0a111c68d01bac7c48e8740c3b3f5a0949b9f0b96e321d011d79460e0562fa98a8ee19b5f86d37494e8b697a65b982d2470fb289c6433938d29238a74d120696862615a2278522a45dbbb005262a872a0f49cabeb8af82d871817f2788d3c1dd18f9dd6f979dfb0555509dda24398ccb3a64ac36681713d80b2f84388eeb2ba1b95dc6d7d1ea1eb5dbaa1ee910f3e9d6f01bdfe312b9888a550d480218d5c0081bbd1b8489b07ce89b38f369dd649551e9db7bf810f7d7b5884e4713a182081cf3d7f70f0e59f8fe1f0eb4a39f1390f7377a468b5231c93bca369ed8dd4592d357d07c71b35192a4cfff8d3dbd198e711349a9878b916dfd9b21bbc263d67e7b5932556d8720f1570cb377fc3d598e557351d7dfba0bf9bb85b14fb045e25ad1f7f98257453f6420b182da8eb50469fab636eb7d88d6c4b2ab70bc1734aebbec57b9051629f1f987a969fc9cf2fed4bd2215347519fdb7efd911115466db3b5d7edb5803d2675d88cf3193c94ae6bfc7ff1242784806c45755635552b0e43b3565cc22c9e915a5df0590962fac0e7bc23d74e311c9d7aa6eff08061a0aba52f0ddf46bd675539e06fbbab1fbeacc28debb119aaff61c88b556457cc4d33f82500378aa3516d7dc9255b625580433830e34381314620f24a9c068db9cc341a50aad007fcee6d0ff7f0dc0013c80df04de4953352842fba9e127de94ea552760ad6875b4951e45c89786b371253b2eb8f1f243226c433bd12fff2a00580eb9c56a4832c083910172d4615a0b48b0fe22e9549364b20c350a617ae36054ec0b1623a2100bf1cc33cee70983819f71360d0ca6f8b7ce22f43ad48a6bb2c1c39e553dfd86eb3503a74de2258e2160f702cee0e9228cda2764f283ac172f86aba8a12be4a8d5f3a9c622a802e64a6f5687a1a44be6933ddbe93d5840890522fa22f714937dc483cc929481249529a181454b38d3e00c54122556442dc617716af0ad367abdaf03f856122e30f2634abb57ea6fee7f6d82f9d817ce7b3de29770ca73985c4759eb7600d7ec3f08b67533a672735b25762b3205fd2c323521865a2822729896736e879f6749b477aec2c387b65f1bf1d0487c826585b2c7641dcda6b5c01c5f734a6059210aa30192900cd7765e13033e19bda6aceb3388db3ed41dd244b51fc115a457b3ee9cee2b7cd2a1ae64ad1e70a5dcbf8bf16c21495a3afc837157116bc53570a1f243d1214d1708b5b3764528c9cb34d1202d74224048fec2fbdd57de73bf485513a1e39f9121474856110a49d0dea6bdeff7c669797f203f44a616e51f1eb2bd1f619e68c01e514f7d881d6bc1e153aef46c40f51f4e3ae72a7fd1613aa76e4e75d6084afb3cb0abbfc2ae17ff103b1a3200976c74c54b524490e4d85723f9e60b495c9d582a319622678b9bca4bd798f7ae2eb84fbcf2d72a75cebc6607b17d27d4c263e74dde5b88e30853b3d4fd5dba3935fa81247e6d2db25388aad4393174ab1a5c6515d34254e22b6d7899dcd73c9f454e96b29c3be1f4b2ad96dd996cced8c98c9f8aa45b0bc28cdb31170dc6d903ba4d6f08ccdb2b5837bd1614da6672cdab9d5d54f1fb477b64a2bafadf0689443e0c3fc3b5671e3e7a298f710d0f0db3280d4e4b6bbe0eb9fba7c336990b86a9d37c6af7e6d5255cdb9bc05eba981c928284e749fe591c2edcc7c15dbf46cedbf676901af9de30a519c69d9c1315e9dd72f4124d19eed07a778fed3aee8ddb1a473ed5532c15ee2eac160144953a073115d94b9331037280f6ba30be336800caf945017757e0454ad2fdb46dc390126279006a4679075bbdb83927b8ae24dedc1d6b6ea23103113ba3ded2a7493484e4216e4c429731a6389307c1cc1311e224903a0c295706c7c0c8e533d70dd9230b9d85daf5a78acbc6e40c72ad2b0cdb6c59f3b63714ef46b641a94613d391f042c2bf731940e635d880baac7b1b4c28a10e5f66e806ca590075da266371ee5edad0d54dbd81171611d0f4b9965c5d37e7f67557738ae6a3ebb3841aadcc86d01a10037068550be94d951d3f54f7b9e950b330546116b62524bdea398701a6a6ab3ad2ff3cc2c17b0cb152171c31f74777bf096b40c0696c6bf1c3d92f55b1d74b370b4b3a65f9b3d975b38718b1baf3e09b0bdc1e6199fb3ad3cff737172f14708c48f228c5d81d0e1b59dc1100a29deed18783f372241b2d294ac7dbf9c9be1d2e66ae4a0b5ab2d79b0cda34f524eeeee307b72a71d1a5495e74b0282250e52be1ea34fc493427100b825e1409550effd56ae95a48e2d2b13977caf33026ca055d706f4703613bd9a9a2b8025b48d4852a56f786645972543eaa7e6e8e56aec52168f5df3157880069afffb67bd4956e6c22101a89c41de4cca5e8ad2ad260e239f995078520958a25d3633f816c29c647d3c785cc19ab719086737ef89540bfa533da7b3ab26cff16646b7fb2b8b052127f8d53cdb530d3dd0c429388dafd42a391da591bbb8373762d4bda5885f9d013a551aec67e86f4cb2071116776a595b5ff91761fdefaf58604a409b87317aec86bc8ec4ad1ed71cf1785c4a637ad43ab7a67fd8e6e8e50789da54e0820892623109d38955733aa8d6f233e6e600428ac2970a422c3fddbb3f612d20aec66feb63c1cce85c9d03c8a21f43f3223d51e381ac4b95697415304a8ebe51158ffa01c54c781297f5130a3db37098c797c05d1c599a10e5035c979c173b8c6b85c2486a636197378a981e4c771c15abfdd05f0e651f20c39e47273aba7245f8fe30cb543273a445bdc878ca0bce481246602a4ad9ef687488e04e460c5a515ddc8b6def78f4499ae967919e525fe61c8a71257cf58ac4efb2b9b5d2d54a6baa90546fa3608a57eedb119bded5c3fb4018dfddfecd7cffe126af59cfa141ddeccf69186dfea087c944dec10306bf7f2eecf22f4cd9629d2eb49571a07302ba3a62b789781602347e25875a335e5d580e699d6440528a15eda2fee12134a7b0a22707089ee882add3e7e9780e52e0920f4c050dafb8bf29fe4e5f0cf756667c9a294a896d09930186d12386f262ce7bb5bc8979cec6e0cafb068c17edd25a0357e62a17c27d3a5c3ad7190585245a00332d2dc3678c67a3e89f22811e9da54af6b0c375699c27ec6ecb96e9a4a8ebc82305dcff5a1705fadeed2418720e8c82c05e3a084e13c37139931f4eed46224e92e59ef9ed1f754be9a316ea9525cc152b5008a945e0c0206ca8c0c64b325f4f5218143963467c397aaaac8338568166447b87a14e27601f25685db2b8330f1eedc6ad970e3239d6c89f077750a0b43c6e397d290109fae6d3357613b9df23ec3cc22cda329a1ff0855c030a6baf5006bc3ecac5c263815f6f9e962db208d701b698923e378fd4c60f3abee6b476d06037e185a84e08107c4bcb4bdeace80e454d549dd8af75c734098c4834af3a28c2f0b1c2f04d20d3c0b978fbd98a04285ed890ee4a98df1cb2f8480cb702598a656f382dce74feb230c803984a743534d55d6b5e2d3cdd030d54d158313adb9b6def3e0f5bd79e5e4d636d2cb2bb7094c1a1ed80364f4d3deafdfe17753286f3547cf839b5ec783ffbc719978326a5b0a396d32f86bbd1a8c2c709b05353caf775eb80f8b1e3fa1593e7a1b076556aa4f08806fd78257ddfa4cc1b80358ce4138f977b789d528d704abdeb3cbe3cfd892e159bf704d79dfa9d896a77a8a022be1018966d290541b135c98b7e14953c38b0c4e21db24d7c8709e00f0e1a1381cffa3d5459d78e3421a376c92736e5b68252e83db7cec1d668233076f26ef96107bb64b4fbdef87cba3c7c8bcd1ceeb271c55d704956e79555fae07af9ed0c274325359786cafa6b801ffa11e2c0b7eb2434f4a523ecd7be702471cc3fd1766646dab0ac89206a92123e652744408e788ebb9bbdd31b62f07b32c566404a6aad5cee01d4f7e6241630452a38de3132a3702e517ce7f7432e67169354eab517e05ebb3a84bd0c9a6f8c00fe864a374ff87db8901f47a9713dbea25bd45f61e59c1ae5af340a07f1ac286e75820d6f0eebe07616ecd76adf5f06ddba1f739afe15b9bbc74af070e94b845ea9ec60574441ecfdeda70d0717773fac3c1e849d79dff234a929f2e1908990bc8969f28c6ca8e80f7b104a2dd1f46b21c39a3babe058ee90e6bae043c892901b8175293c92198bc9bade4d82631cf42ff25a2b6372e26deab8ff074aac2ca751bb8e91096b783be2f3fc4a7f987cca2d2ee93930039def6a33c0a7a571aa6fc4e5bb962c003881a35a6039a0e1f7d3aa6d48f58d43db05fe5ca9e3b5879982266d3363699bf2bfb5cab2923688bfabc2da3c84ffe01b571a0ec726eb1ec5db83a85b4c4ac089e5cc613ef0585585fc06a5164c959ca3497598d5f5289894f61ca1295e849656016a8ebc61977c55c0da3958cb0b3d20a3cf174f300e10236cf75b4a539a622ce9daf0e50f28edbae0f66a8c6caca4c25fd7cc122982b256adec0d01f589edd0451b53e86475d68692345760021795d3bb6172f569d0bac796c4da74edc206184178f6aa293d3c000f4a23ae3d42329039452b74dcb268b07836c54946dc6033325c997c6682b1bb47e5cb26f728cbbbe0b13eb70d12b1378af0ff7e3f58097e11c43a88779e63bfa3c1558ac38d864e2700d765cc4bb162355b9b2ab9355b708cd6f6d40bdf181c8d3c433f6fddf907e7be8982a0b47d1745dc4f1b1f738e6475a22c3dce97310e342950529ee67daa80fc81dc68ae4ac24ba3fe2f1ecc224a2fef59beb0ad56471bedfab475ce199eb1dfc25d2c2ddea39c96bc7fc5fa353cc605fadbca71f4cb399b238226b48417f40e8365a45fa0168355b8e474c09db6bf6783f9d689188dd6157601976d48e5a4985e544f8a781cdf47556529f5c81deda1aecc5d99c61ae1dc2187fadcf31573ae5665536c138cf3f90b9589de7653481c38553da63e098f8d21396ed61404d3277423b147545aa60096d59e53d787535fa7a6bc8172a804b58c7a19f163339d10cec21df06898146262bb2c4066673a2f54de627a554f9bc913d20205125cce1609b736eec57077e2f5d8a3357b0eb3d9d5135165478780c424ba7c2957fbfcd972e472d5ff4d4034b727bcdfc09e5c49c6c72ea525972222e5baa04e0f9aadcbeda7b9b80c9d8d0ab2fd61750da6c21ed1885d96939094a21cbdc94bcf08d951d31aa7cce6935e79b26df830ea609edb0eb5d89039d2fa53852363a9893188e072b845d68ad3903e00c7c2ee3cfc1a9b38f9babc14d46069ff0f7f4ed25283b9ae557d3b2537a9868fffd10a961c0d300f65b6d0987695f0d4c96adb0e17aedbc84068ca75d577f93e2283055350d61ac677beb3a0d0207cc439ef3d93c2abc1b82acd2d9e8dbf703e24b59ed5c475ff871a86e04ede4eadee58935516e48dd3afd84f2f3ad26da53b69f496d2c706a0ec037fcd34c3b984472799acb48ce31f283414e57d978e58880a89f0b9592d7c16b3ebe2c9ec85b3930a89356f02e543e707d8684b6a6f959bec246114029fa781fe31fb0c6c6c4a9f734a9c9aa72e064f8b568670097b9b6e017936d97135413f90929174279315b7c8b7a4697c5464346d95ac5173bc569405d500d9feb1107ef45aa86ff2c5d9024cc941c610d8b78119e8cff6b83ca214ffacf210d0219012be3d464ec05564fad5de8ef7aeea661da0400cf9b1af12e3cfaf98230082951833f0903b5094e20f721d7488d3df8441fa6b71867e461367fb82ea451e7fb58f1624a9a44aedf59fb7279c2fa9acbca28ee641c52eb229ce4a2ff69c27565067a2c9be36576170979ca975a10665612c5aba395833a4b1eb56408162c43a09ac9ad52883d591d1303ed410c2bdf0f2439e24dfef257d8842025b07edcab4b35869b042965f0582e624bec67161ad7821fbeac0007b4174fb1606d571d9f9bf36ef49cda0671f9e93e2f114d004075bd1425b19bfd7b30d0c57b96ef59bf3492cae26cc2fe4d1e97bff432f8f31fa91deeef925cefaf996db1562057654cdfbe6363ef5a2023688243f4c7ab38f0957b6283084285f50cb91cb82e31f9021c6a8d652c7c34af8224dfb58685ecb33be9cdee64bf347fd2568647a769dfc79acae303b152339968508d2e96e378b4a6bd256f43a0d3a4088b5a1e45e64c4eb82432e63acd63a049e5358dcad5f5eb3995c52b6798adeca471d7a0e892188c8eaf6f9a5285ee8f2ba43f0062254295de17ab3bbe03d43611877e357176d40a1286d29bdf15cdc7669ca9b96ab3b8c5f3f2c6dcdeff9590e4559cf49b78c7751936e5defe755adae573e5225e5fa837edb89a0fe40558bccb052eb8acf988fcbc2c89ec149f36d161fee94778894465393e31890550914bc52732a91521c21d7b3f4d42c1b762d179a4aa98a669f11706b72ef96ed5fcd244965ea2bc5fd735e67937d925268acef47e25e30ca2b0169a7c050fe18ddbdf04ee5450890d4edf5092f7cf8ddb7732f7be2822337339231199b2c2aac89cd983ba624795db21057d1cb3f964050291f224c4bbc4061b4156e2ab59532e648f520bedba0a36bcc359716724883585cc5065ff1e634a430f4da238e60436fb8f4d2485c27bd3e9b992b3313c789f4aeefa3f28ac5ece3a60a1d6122ec2f046ed6c0a601cee17b7c2c4f9a00fa9ad3ce9859dee29192ee26c3507fc7b4b6196e3ec59c7776e5fc8d37c08519f669e58a9fe79e5502c835b4e70590d2e36206a10f43d823d321418a823d1a5566c5de433ef1550b38a314ad87685f767a55ea40d4726e30c261c6cd67dbf5a4b9947c45e404a6f1f171a6e17627c246bde6c91a9cb1edd97b31b4188ff4389674cdfa6f988d574a5dd6bf7bf515b8a03fb599812bfc1bd96c8b1afbb67cf1786a60dcf94142884026578d8a1962572aba872192a1b23edbd9f72bd7f0e296114b4e119d0f022197eb6a510962f5b74463843eb75b14f5b44dfed73e8839c1bdbc7f52ef63e0dffa9c29cffa85d806190484b97e5a5701b8ad14901be0c6fc45f0b588fe663bae1ea07ce58c0d46babd8219c633a87a2205aae4bd2d419cfb17e3230a4790b9c02d592e2364f900267c8b8649e154f03ac3f3acba14e8d6d138f7f62cf27e280904785cfd0f86c148a0d4ab67188cb2293cfd7488ab8ee13977a93b0f0c3ca7d5f3403db54783a09c39ce2c43fc5198a34bbc0057dab6fbdf490fa2da25208e89bf180c2b4cc02973bde773e6904bf86e6ebc229f974fe2e2ede5608e9e3da2e79cd4a597ad4b5c1a353dd74b9019b0d28de17a00fcfc07780fd2a83b67499f9f11927651479707eda9691127144931ac06140da25a39968dbb18a1d0dd10372c286dc074d3990184779133d31004036996217d79a2c325d6ccfe15d5ca3e666d89544c3b19e845e5b16cb37ca8a57950043b8b7bb35c7a0c03457ae4a2320f2d3b3a88fa17602ee539e3cbc6d30e8bd364b5253914b39da2771a9b8b0eb497ae954c27a62c01e19719b1739edc50fe919f1f0353fe02b775aee5f57030baaab387fb7831af2decbbb5064bdcf6ac0496081b02f07a815bd9c8ed8abd089772ec92dbbae853f0c319efaac4af53864a9b7e8fe81cfafc8528d7e7e32490d303cb05b2d942f0ce4ebd075abefaa01abe4c3253ae4b90a17be333489b103de2bf40e29b238bd36358794a440514b237ba140ddedbcbd2d22336537cee868549d6d6d14c037ab348a5dea6b38aa5171ebf787f4ca1e1e1dc12afadebb07da915fd71c976254a40d9b35b89d874e12da8359c93f9feeb4aa3c3161b35b6aef71e2578aa70c792f13d36538d5ef442cda7b3b377f09db52e102048775443611cd24eb5df862f1a82246b9cd8fddb3ce531cdb0b994218c680a914d6b1ce548bdc2688b61e4c15759bb55eff342895e05b339053c2e5a9d12374e34b68916ef59d4ab90fe3cee1216a596552414052e0e52c1cc561a3252f07879e2faddd9262179fbec646cdbb6b67845ae9a709a21baaad8008d13aca101c13d9c4065053875f15349ee589dc38c60c44e29230e9055ef3f3a8d079187a4b5cd955b26ffa9a0f407e0c80bb4d17741cb6a65e64b7c53403530ae39646348d7bf93b8fbb7732d1471d8cc00e3e53917c377d6b4895f764d79537792eb3e483ec9c7b1d03e8f19620822b7113ee4caeb92f9f395e428190cf34a76c5d3bddce46a3fb7a69a5b001022167b8a65d9411bd4e440396c049abc8e2c0ba3cd342af773585c158cbb5cd1ad4d430385522ce7f6d38e251f9f74e7f5cbb55dd63f9d3cf9f94c82fb3ec16db464798e0c5c3e405e48cae8de09d5dc109e3ffaaa14a51cf285d2182bf0623b26e93b13d67752217333a9bdc47ca6b6332b457fed581befaac5746c65080fcc9992c48d4042b522781270a041b387b371be41bfe21c6c608c6d799999e95e58b6d2e7e76381ebaca50a4bdc0fccaec1c4da0b4fc4c7a79e04698f43d6ba77861bd3f91e248f6625550479741d7a11732894a488132c59519b806de0fe515078e8dac9a758de9f2f9188361b22380d7318d82ce769c9c0140ac82d1350d42cff3a22d9bf27b2bddcb40b0b8d36963d8ca7e8e2d1717b1104181e3af6cc9afbddebb748d1a1f097e3e19b04efa2d1779b16e0513139ddcdc2fee1ff82efc009c3b4494814c99dda078a1e6d7f1a939f22a64ee52534de5763723021f7bd8a89638712f01048e12c7d20d93008711908a7c40aef1aa5c4458b7cf8bb5b7798c935339875536ce741f7292d8d9b4e51e3d1472f62fdecf38af701fe28d712818f50ebf96173100f4afc0c9c3581b1e8d22b173fea0a5a2ba2143bc140fc4ea3a7355ea9ae6ee8d1efc163284323c2e29ab0d0fa657f7f325349d9b888ee26555dd5eab22316a4cf2c9fc9b1745142850c98d20d674c34068b418cdfe66741b3652115efb557aebb3cb21f6f74e4ae15b1319d2bbc0862aa6a8114e450d1dc8d5470a7bd0d71ef1a42fd24411e7c18eb2d528dab83c58828b0fbb7e7163b3a229fe1f6408c76d1fb6c3c6a2cfe1dbbb4d2feb2914dfcd0e248f7ca255af7a2d5b1fc69ee55a622c95d1c016ce64cb7c605971456fc167dee4e702317700661835d86d38a8086ca9d6cd2fe5899205e36870c7d363d07bd607fb64090e7a2ae79cd09d242655865cfaf597c368c43f8c7b249fd167448e39f770c2c55f83e2d45700195b3419e1debce56816de3e44299b9f56583926fb26f56a64635ddac97109318bab91936f452a649f04532689cb69823d6114cca44c0a7118a44802cb9a36afae23d6ff9262ea9136a5d50515a5bcd7059d53b62d42a9a9a6ee6a0b2444d7c7b7f23282ad97faae7629a9ece9c634eb7249076e72401ecc91e4a3a885cd69295717c6532d26d198168ab1a9a3e927257244ae58186e05ccdb32f0bd2301d06dec6a3048cd57a00428d63c36f15a7b41af4062b3e0942eb74616205d89f97bed4a720b3d28033bef381c3cf70c7d2b494ac3fc14e10ff9de6d0e09d07e2e3246ef8a2a6f9a2f435b51032992d0ceba3a35d05b6d9e6a934f6fa06dd369340083f3d4246814f7f3bccf18b909e02b72a3be83ba58d965ef1db9974d31fb60e1d49ff8b8b2fc982264f3441cd3d8ab6e85769322a37c58422885885432bdf82442543775d6c39a1c441048994020499b1d197d947d8a4f40b185242d3dd4216f409c972c9ebaf63c33bb9448141833dd34c032f546bb61c99cd87e43bf241f5dacba5b41d049cca176c04683e031104000b251146a4f72514f1d0b9c0ed9fa340bcba18a8298d76087dcbf67f526c918d0fdc373f5ae3f83658f9a1274c3ff407c4a6a5addcd0112affc1042d4c807a8f1138b78b8139c1c300b1a06ccb5c11b839bf89a6d739ba4a0b9ce70bec9a408a75819b0936c029b49d1fb2bfd9182cc03f686610bd9657fc93cab6eae3fd44ea63991e254f6546c9215239b1289050d5ad910c7ff69728f694ad443f73dc38dcc4f3c5a53038b0720a122d2e4f598914fe4723fd962d3f552b00d029fdd8f54398d22b37cf2cf77e432a1f708d813076cf45b7076541088957d3f60890b78de5470752a0f0037a7ca37ec60de6ae7741cc0a1d9b8da6b58619ae2c36d02548c8801c6e662e789f8757c85a24ecd95e63043988b9ecfd8ec268613ba2ffa9c3f452ece996bdb010f3ecc5ee96e427f75d42040ac26a56eb627592d89c9053870ab63f025102874dc5c48ce18131b7cac052aabeb3f838fb10ae33d0bfd98af100d83e4e0a4784bdbc38b396bfbfcb5e1a737ca0b42426d38f5b68715fa43ecce676411a91ba17bc0d4a4fbb14cec847105dc9a04fc72ff65d2c0b2bb6806b99adadeb8710781e72fc9c0bfcc593cf04db4ef7d21cd2bc66e14388149072d5e46c652546e9a4e59bcdae03890587d4c485d124a66c61d0eee3e5ca9b7fa6ac6171d26ce9091a92a8961b46701676df522ad5864d93c3270fa737a05be2ca81ce9dfd7d8a5f53c422c4ccad3874b0acc7f05a18c56cbcd30f25f39995941e6ca13b8de4ab6d9be653319d4f0dcfec4e7b9db1980ce1ba64eed30e2853fc09466d9ef6d36ebf7de2480724a331c8863faea059b7ee8ae522ff68506655bcb1c6177e75280808b254ecb3c4aa94a7f80e8e820c5a02bd1a371b63bf0e045fa50a3c97b6a009dc4071fc47d2dbc16532570561e3ec9985efd73e1525298aaed85d150350c60233e6d42b4cc5bd63c600c2c5b60d85994b07ed82d134c3e67f505156f9d0930cfbdff7bdb5a7aee73124d45617921136c93b9133d94f01b4449448af25d0f384b67d9abcafd19dbf184e12c14e50c2b2ca91d72090e53b38a5ff59735d0b3e17b21c11a87b13bfc8e1afdb038f57122dfa7408cb27e4fd6830e24d55a36811df548edff122ecfef85850d10adfda545c137863d6e3618022aa87952b63f3c5debbebcfa74372a2d321b3640c4297c62a7a19d3c09c9fffb289cc7375e89609337db9369b0a4ed869108d40c573dfd4fdfbb9c3b44d5dae54029a7a855209109fc398d3a5471847d2a9da9385957a22a36670a6d0ef7e48e03200eacf22309beef2283aec28dd885ac9764dc55e7640308ff6bf2f286dd029a9937bedb187b226739ff18b0e338b5517508c1c2a0b9d94561b126ac6f3beeff78b5f03f56c66c7b41a8b8f72b18333ed78bee1af7ded3c275be6d1a2cc0a3543b6e74ddd1bf691b6226fbc30853b6b7572cb28667474a645f70c7e98b601b37c332f7155d12b5d1791c8c6012014e88148ecab58b9315b38e1680f995cdd92b751dff4ec753852496dd19942a955474eb2a0963f766e27b066f715b39ea61d5c28ce0de91b78ecd00c01c35bbf1e40af4d174a20c16a07bb95c50a7bac2228f8db80ec08688d13249352a3e495d4c529fd2180c4b9e71ffb6f0b79e3ec214ea32d5a72525e4a1bb99e67d11828c643a4529d99a9edca750cd036ec4ac4cb2d425b4da03cc30afcc7f360405311fe823408652b188a81db39e956f1286d05a0e93cc23bf0204ca8e15ff69409cf092899d9bcd7001537a352db88e902cd0e3b14b15606e58540d24b33c28c9b6a9ef57abe3d23a1cf35539ca9750e692ed9aab93fed92672277b5d38c6f35705be574a3a34cf3086951860f2afd87cc3b2d541cbf0bcf0b047c6143505dedaf319cd6ad1e204d72164593398cd24647862598c3ffca6477790e2ac2a16d5e580d98f0b2c6066d1c6b0c3796f2195879947bb140dd747e2fb8d188a62e3575d3c1dc3660a0376e1135169301f1c4a85753845b0dbf3e789ad3839161b338f3269f18d70929c4184884191033b01260d87c04e3a69da39ba8337a8ca7a1535fdd305261be79d88b386c81a143058f64216452d18153d7f65e83e9d88428b168bbd538eebaf38d050e09cd9f61e21e4ea64242266909311bef3c4d98f2195f06c14411f4b7b370ff8d8d7afff62b1bf4a277f263ae97c4ec1aad03f0755fa4288e3143547f4a79d3c0613c70a551dee3f10178f7913be8910e2cb42fe2f8b6b0437f4b5a268f31e550053d6dd438b126667e5d9df8e7f9cff30171251484e7767942c99a85ec6c21a1c177cbd023732edd15c7b3cbd9d54d1b924b8590531370c220ba26f63d90bb74007903f10679c9f25d59022c2be177b4a1169453dac37afff1a324d00a3aa0ea84fd936a63c06bfa5f325d9f6391784c8cc1b14de3f4931f0478c69b9e9df57db0097f13ebb11067db95bb786041ddb062fb7bf2b1995f0c3921f0050c190a276a34afe5a477763f97b7e03c7cf6a2a32c16736cc6d24c7bb211464fe494a4f2f30f73161d190a040d7909f76e4b97bac6d65358decc8fbd6f4786bafa0be0b47d7e3f1cc1d77e418e82077a7f7d2347e94b376b8a5bc4a616aefdf8858a8d43e8930805608de767330ce95e7fdbd773ee9d271142e8c69378cc34573aa1baf79a52c7662ae0872ac0e49e904d4fd144d598966ab1135e7f22858d9609cefbd53028a5d35c093772be72ac6b20e5d6cc140da465918d72a518af61a4645f642f36687b1fecbb70543680f6f03cd2bed7c4880ee3c9879c1bb2568a612ab47cd7a3a9a7f3b65d5134e42e957f8574829a9537ecfbcad158d302e7ea26cc717a3838dfdd2963cb7a766225138a4c1c62a88fd2ef1db7e74ba63c363554aa27f86b73eaedb702a3a6bfe2cc02c115d9ee3e882d6c5b0b8899640c1d2f2ea487d40875694696e8e7140619d245eea6634c017d7e18d58d5085ef5cf89cbbafdce5c432f5a5ddef7505f3eedb9162a6d79130738814966438e9a77266dbcd63c777cf5ffd43576df2cd35f7d7a70dbb2406a159fd9b2049a448b9f8a9073dbbcc4f236312c4874e50bdbb1b8e93941aff1a88be0c53e622dc3f99bf0986bc2af0409f9fa5ae58b0d733a58f2823165073669a64ea77e8e3e536fd49897060de2ffcc61593d70661f70af97c66674b857285bd5c4bfe829ba82a09c459c7d5171a8d3b54fe25d05fa55942c43248d3742175571b14def2ee3db26cc8aa16789d247776f7ad78569be62abfffca1e8b42952a3012933018717dffde8c0fe9278caf7b656fba6dd90f45c5219cad6ebec4caaba8369eed4ea90352121523f8834e5ba6b5352f5708f19e3b793be3f222f58ba2556bcce9775a261d6d6ad548d8ff3ee1955d9bbd0f27b1d5666b16922acd7280b8f9d7c6be7feb048731ffc682855dac1135bc908a1e1ddbac25de9603b0b54f86c65d973e590895a24027b349e270a61ffd9842896216eb204d2b0de4817a86f0c9306747c1290335d51e95f64702aa4aa17b94d3df0b50cf51bed75d4925d146a28bff0b6916178876fd08e1f0d323e5eeb6d8762283ab67935f84f9c13449c79519f8443c9c9a6340a31ba87e957df0ae0f1439a176444ddf584389948a1f0b530f1ee39137a71f25066901c08897b2257b83f5278c1b29b4f25efad835d65732f05656d7c1179f6818b3f854e086b7b99e5a0652ebd785a63b07580c8e6a5ef6c96f401e5c0bbe3966c219ac84702131612de469d67f25a071381aa6e0a8a601beec7133a7d48db5844c9ce1bb1ebd3223a0b3fcc9dbb7e0b522bb180c9cc9e01f8bdd7bf56b1aecd2b6679c0d3a4e7d85d16a92754e481315e05d6793b32ed24d1a207d9d66a7cec3df82023a12f8b5048702a24304cb91534ed5c6d8adfaa816adf78ee3f768936db8d5ac48cbf0fed58d0fc1a369c63e5e5f5a2a32414d4bb3d7b5d2d1f9319014aad8b70aedc6a27471d5991d70ba1367186f0461c07568c231e39155e39b36d565275fddaaba8e0b2a1445f642c67ce50bdf0f700350f65e3940b26044dbc07630a2fdd5b9623de77d9b3d2275ffac00293f7bb8d0e95dfee6ec0c9f1c6daaa68e26b1c7b469e45d578ecb122f282f4caae4115de1b217542ef86984e0db795e73fc37d5888829f3fe8971469e1ddd2d3a90371f81e9bdf8503a8a19ae826df5c291836e9634dbac768fa1da31ad9481f610d37675c5bc028879981722c582ee2fa8ca5275b5347eff78004d02e2230f6851eea3022c84d04523c82c4f81f5c1d388daadb88f2a1b7c5a2b74cffb31c4b5ef52d196bf379a81f4977181af35724453e038ba45c4d755e7a877d3fcea035791eb9e58e39f9a98f1acd106a9e434b53d75bc2c9526fa5790283dab293be0194dbbd9b422485b0eacb4e63e994338cf78214095fae825fbd49886c96a1030564a68b1d16a12da68b29589fbef19ca1c05cad07c6ea19f4cb4b9a7da0ab8a4cee6c15ae475b02869b9ce0c79748ca920ae8b4369bfd4c3b2940aed1cedd43ff204f15bd0d24f54f9b8732961e38ccc030f3314d94f8f7090b2e119a38236dda0d33006b6fd920e83d25412fdc564096ad2f17ebfc2d39925231c880ecd9fdbec6a05d7da76984f2912c326d23f26d0ca602d62de78819aae3b468ccb8de1d55649d037033609089c5747408a2eb488111fac100b677a762cea6a700fbe796b7b82d80603468c77c05ed664e84a36fc51feee98d02f7f347ec98245fec933f752c1927cb677a0ebb7f25659710b81b1d537edcc7b41b3d2577cc350ecef823e532efbad726368f049bad7eacb7e8f6bf8569ae80853592660d971caa367a5a45d1e3120e9b4201f1df9394588f71d11b33095d31d254685e06f12f7f20a407a1c7033824d134a8f2523a5269017cd71f94e5b61f078362b083c7f4e4ec8d718879355749a97625b7bfe640c0456fb258bd8aa22de3b9c4c1517a8468d56cafdb19b35360a3959b2603c874871732d21f5424eccfaa3cae0c5131f1b70077d03491bf2a28278aa8053241e2930949e942d99218b820c40dd9ef2f6cfc5fd5dfb229eff403efbeaf8d7ca7277c339d420631565455667114db2dc0fb7da0b7702c7ea4b78a66a90b40b75fc077808c2541ba43a575ea4d9ce4de7a884fa81c1677c161679de5f47b7083e9eea028e14fc21f12e611f8aaf3e85275ce073239e821aefcb2f45727ccaa50c6afd44e87b7e798cb71687a5696a31bd97d0ea9a2e7964fbe417df05b9085ae4e1c4a045e6a42b86c9b08e4ad12604bbab550710f1e320df33ff05b296f66168a44b2577eef6fff9d4fe899fd2ff8cc23028d65362ea9156456ec63cdb707cfeb3eff8832cf9943691c33de04b5440c6612c4c99038493d0c694dce413b3e0b9b4aac8135e27ed8dad82651d7b6238b69b8291594e6a43662534c91ef710014daa713fdf62b51920d9bc90d152a9bca1c5b3011961e5ccdf6920297b31fad9d0c3fee37781dbe63360174237d7aa6b06fb67a183798d7d6b2006db0111b6a280175d4f86b3d6fe39462138307c4a5de1299a95d76aec2da523cb4e953108a8ff0608933e244ff63e63e361692e4e3fe16c7d825f71c3efb14496f138155f672d3266fd968a54ed1a064ea6f9474df579433879562c386d1b697b4f3d464cdffe8d58da4eb129b6cc0042f2d02ef22ec8c9270c0b12ef7d420ec35d9f9c0aa19bf3413874c6daf5b73be036f030902547ad340309c0dc2c73597e47edba0114d7780c63d139609003ff9cdd91c56c52640ecc6132ca3ae7168ba0246d5cacbcdb30dd7606ca97d77d514cd09c713f03e1f954fd6f60629a3723fa5cc81d70ee57d87710d395289e4d1e4ceaff522d812165bdd7f83e4bb3514c57f721b79612933a8979d6dd71d0f9d9393c05d3beb27ac7accc11d31de229e2916066618a7f75e9874770715964e7f66d3adbcbd10da85f6c72062654f2fa0b3833e0443305f5fd68ae06f87023c15869e045bb57eb53ffbaa2ea1c88b031033089759db88b503f861fdf798bb084189c5ee7229eeadfc1e76118a638cb35a7e258231dff72e56d56205353da38f4fecbc812bd2842f6a2f73cd23df263d5e8f51961ecc49e087c702c9d53570ef72ed96e227adb095ebaaaf814620c31c30d813710d7c4a8d268b2346c58de2d4775fc96a21c0593e8cd27b93dc435f7b34c1c0611295b3fd7c4f92fb253cccce3787818335b4d39a11b3f8f51f0b037679f1ef5a2b6767cdf1a4925db88d84c72d881ff974b4a9c88ba7f293740c6e7b085ba0acbf69a2ca76181a92b4f7d50954f6098523ab4f76e4e425eb425840f219dfa647f19c50e41c0f6decd041cc0b632dc22755bd8a925e68601cf5fd0e088ae293d3a876566072afe2d4e5da515f3802d044512157c1a2bd4fb5d8d28ccbe916908ff78a755c038ae136a8f42f540867b2f760a4d87fee1fe17eafd4a1316aa2e3d42c6106d821fed780d33c61c3619ae39d725d5c44b86baf89624bd5108747981e96d2820d6d4f5f8e03b4d4474999b9e7459876f72b86bc8d0fa24af7268df4e475e5261d641e277efd12099a1a096e6d9bddf170dd8b95169ef2a286a194e95aad37a564dd006776dee6aea52cbfba0dab50c50f2d22822a0ec113e168857e9cec4321bb07b3477ddb5e40c8e4490d3837917ef685014502b262c54a8e871de6a22574282026f08604b579e21dcffdc6699c780f925d6d4f005c5d2d145ebfa3d547f439575fd7fa636f9983dd892e652de60aa7e93ce7523fef070757cc58b9ad6b144cb281be48cc18077953ebb79bb397e5cfe1d35aa57431e59ec1fe6d116c074c6e15fabd664c544315053e7cace0dd95c3e081fc84cab4959c3c37bf54c16ed69043f2d8d61046be321b48eb8f458c08c70f650be91bfe57624266862ce5559780ae0daf08d3d66c14d9816e78a5397c78635292e1c5ca13785f811b4b5b3f199350a40878bb4e7f1ae95cbe17407f720b727e81e01f98f9d73bb07ad10084b311556fdf97061935a6cd59a58ea0ae8e168755705477b456510f4c23146032a447e10e920821d9dde47fd9ba421cec4ddb09ffb35ae2658c7ab9b16f98570d97817f9855c246d2e116b2780953728ea1f2ed562723b913cdb3b1cb69f7b03845b3757835cd08743ed9a270f8fa0b5faceeb1dd64da2bc863ed6843a5ebf3c64dbd287445d91a03581e0ba606ff34a05baac6c929550f37a2bc989ae4f95412000cd8a5fcaa2603adbe4a4eda617033ee7f120a53b2f0e8d1ee2a54fddca586dbf084fa410e2d6e67958505782fca0e52533ff7951f1445583ee5c71ca227ebb7b6a46c6b08dedd6b26088706db84cd635968ae3f646a51e9949d5095340caba186be669ff7baa1245393aed95ba5013abc45e6fbf8fba8930cd6b679d1c76e3d298dcee696ab1d55e8276bbd7840b1577eb34bc9047a3f276e5609c319b6666f074317af048341d8ec6ef83c630ec142905539f8a7ebfa42c9a97f3f7dfaeaa67958383d4567c9baad7366e256596222eb244284c5c9ed1e50ea81c5a1fca68493bc8ced28e29025f1fc6137ed1529c5ab531366b659910f3381f950ade5e4edd5ecd73fca0bb6c539ae5f9025cbbdf8b91ab99f06d23037b21096e730bd96ca5e06a22a37f0eb7acff431eef958d625a07967468c614b1ddb5267b46aa6893f9b2dc002a61beece95184aa7578a7d2249b0be19f4385a1e0e769d82230b1affbc6afa1ec69abed462f037253b6abfede2a1bf2000dbfcd3e5a8c963f18b9da92033d8ae8d5c915db3feeba802469e9793f03eeaee55a119567d202aee5ff1190b8cdc75e332bc3d8af5f8d39efa87ae8bc560004e40a4170551be96feb8d350486862e49e92161c90a748b7c30fe59677025ebfdff4a5b597d177ff27230215aeb53f08f6c638a7cd7e948fa57aae7d4a5ef90287cdf3de3d62bc9dd6ead79ecf294a65995cecc4649049ef51d8804880f3b3b7ca7000bdee51ffc2bc7adaccfdd96a8dc5c4f734a358d1792536dc2bb5b73aadf7bcbe6487dc7ea34f24f651612ad5af175cb7d847de6f4287f828207c2be97df92ca5935e049d50985c6f77f16d4f7818197d6870955b1761ba16df3f78e01b4a5fb54f85d5951a681bd09c3d8b5a37f6baed743c06db00c796e08293667d98c705437f345d35ac0f134130d57c2d8cc9eac7a42df4461677268f36425950bea79785ac29824daf337edbaee0a490de351b7127cbd52c10827d01aac09919f38a30b29e01a1ff51026c4f23f398dd12f58356ddaa4733ca84a810e37834bee5c6fd98a1ac88825f97f890697a32e87efac3e9442aa18192248c49812d9bb0d7838dd617825a4a819e4a63106e4ee009f5b750fb8cd063b446b4517f14d855ec62b327d8bdfe97871626480a43ad57644a4b12ed12de6cbad1d9cde90a8ff1f295fec288c43477b95e540efca549759b320c90e341d32b6a718c611a0c69269e3cec60a4ad98b97191bba024cd023644b6f2437811457c3b89dda3132e3a21ab5cc3e4a5174e877f1d40f35a788bfe1116344f2b3641b5232229950b7304b95d8ec5b9756b525bbcf4ea6bcd385403d3c1a50b190e89f8505240d9737a98fc1b81a0db439a4ccf66c4416e9ec2255adc5150953861c92e021ceb5b9bcb3fc16c84a54913733a6ed4470a2f6adf982709d0c83aee4954697751ac93338aca54b8ac8efcbd8848fbb866842ef4a9616948e7a7120cac69213a22f34db57c4557b73f01a6144ca445b93e34cf93b45d1cf4b981a461eacc92846f86bdf0e08c7fe763f51ffaea19641278494d847b6a01d4aea73a8bb46dd18540229371ef170b7e3bb0f3161711fce3bb79ad718de3758a01db9b7ad65be71f729004dca02f0ccaa822299c63dd5a044e0a190d31fc528f0c7aa8e87e65cfb36318686628316fb4fdb0abc3189dcb7e93b9572cecdc33f2d15f22f88a233ac099890b85dc7513c2132281f282f2a7d2cfc501f45fd76b698216349810e8614179223de5fd2940433389bb35a8e8e945205bf15dba3fbb6454d8374968f2c10b85a594476ddb0a65694fe31972a50ab2e088bc8b2beb7ebdbddf07b65e6838d9f4a99ef640748dbdec0bbd4e964be88caf8c1b914d15b59f31f062e64de95f20e0bc00a3c02b5b5b478858b32f422a8bb2c19d78e33eb7bc5a42834530d7e5a040bb30f65fa0c91639178f3dc8770223e11458459d40b09071b161ab7c203465bc30a6e70aaefef81ae037523a54ea54e0bae817e26b1311e30df132411f85e84cc63372c5ca35bb234494879ae382609371875722a1fa809759205c8189d8674f0de96b232c2ec437ce8bec8f78f9582ad34b9b595c0ec2b9abf0bb5efc597ffaf229c055d09a4f69936bc3c3e092d630a87834905b7201ed04d00961d8af14c3c6bce59d555d80c348ceb165ef4bc1e11f99eb89a56507c7e9e5e55c3d7267bf3e2355bb776a20d07a99cca27c7475bc77bbf18cc26b5f3ccbfa10ef16d842548d1557f1879b49760bb61a43deb30bdbc82d0283926d549f2057b4612b9e62b5cd0df5926de9c3b1d58ee5f3e1a460eb93eeb9271306097081dcb7989bd1c70da199221b628d4e6501cca919c781fe2b3c571a68c4526f6ff43139a9a6b89fa87b8ecead4487442069f1367b18cbdf3fd0da620a5c6035a6689983994ba524cef562c790491aa2add17587008dc881f7102baf30c997aeb3c329b687b0b37106df342233958066de35c52cf712b5e09e1c8096f7f0e72aab2fa68c52d208a06e509352451a6219fd87bcca510258362e31ffb5d7da10039e49b1fd8f14e7f9aa002d1657386d9a571cfc8fd9e83e323301df2151f56e0055f5e2de16ed3506dab3f91277e82cd43990f848e592144735fa6e3aaa11893a3ce07f16e195ae1f6d8c6d7a15bdd172c36f5290e4821fd8664b1d600d1052ddd1e6930b354c47e880954231c35562b94f7ef1f23d72923525282962ebf3ed780fa41c4198c3b570334918366421f7fcafe3e31c357976669da65f553b3f75f0233488f5870b623017e5e483b4caa3f5e68fa9d93bbdde4369214d49dd42341928bf8e5f6123aad59ac2cc1782fbf836920f31adbc3c3709bfed55682eaa0a16d377c912b2c3e0fedf243e44bdeb125f2158af77c9dd1d6631c377693bbc10929abb35edbd43001326cd446fa333991008741cba5aecb2da8511aefbf0e2cd78505e25703cb714749274eafa230eb0ef5f6db1cfa40e1923fc5187f7b2f8155a36dfa098874f818e26d44bb8691c014d03aa2ce9944b9e55630e8c4186bb6dfd17b0c51e6d087a088533d26204bf3b1f2fc7d6225ddb8559680e40202724cba745f71f1f3160437f967c37301b98b864cb4ed2f5ae474b6dbfa9aa227be5810a7afcaf0196d3ce6cfc8e8528160df65b044d130e25311a22ead1ff6c15c4ae26f3ffd251bca93b62fd87098e3af1da25530c94ff7392c4c534fbc09822666f4e49254e00933a1b839d2339026f0a554572b63f61f50e79c0bd1b48bdb58e8aaad821f16111a5e696da936b221d43b2b11b42001c6eafbd2f72c446efc7e1ab687474eee984b3eef51259a0a31cfe2689d859c2b8ba368ce16592082671bc858005be78383ac0d71af6e327b26f7f719fd6965fabdbaf2589710a8ea0ff9cc909be9b409e4ef5b1f05a4b736b67aed2e10bf0e31f0e455154b4801a9ca5dc11d841b8fd19c8223548eab9bfef1d1cac72ade7807ab233974eea7a89f4aa60dff5a2f41c3a0d476ee24fd86480b895c2a5af24817239bbd96744734852d07a1bb55c85827dc488548ec51e971128376717d4b95b1325b02b2be6ddf18c793e68cce8bff81824c91d5eb30948c6d7e44045842dd420ed49f50cc32f4e687209e8c9740317cf72ff145d59abee9e0af3d195e82a13943cb67f3424598eb6eaca84ea0d38476b2278a4c2e7010c9b6f5e4c9f3f03dfb5582afd6610120be6759f91e9969248e4b7d1e9d7744e0ccfe9c9be75001d744fe05ed99f939d94173fc1a5e02aaa426b4dae1d347186442e7ddbeb0cab5a6f2c8e65513a88a6e554d6cd21e8c202fd4e4941467f7846a96dc88cf2d93367ec5ffef550edce27b016eb6fa163fa8a8acbabcd7070a7ce6b60b52ea5038879c73e4639e8232c0d4ae246bc20f6b569b5d7dbff638f86d898aac1330c7cc61918aca6ad180196509ba43f4f045d6964b975b7c52e54f817d5839ae301585788c37f6d138b1bce91c9f69dc329576ab716fd18d680f89d43ab880b4ad5ddc7c06727ef68ee095c9bdc2f778860fcf5127c09ed9f9a8ef9e8d25d5321e8770a08b72375be8c29246e49e7ab07d4a86e7031d394bc2d198b2239b5ce8ae6e130fc2fc7260fe6cf3285e58ec5b4fc48db13670e7c654ff27dbde9c935aef7e7dcf50262196212d05494aa3baf7c611156a54313fddeecbc9ca45d2ce0c0566b46fe671d3092a3f78eab26b6505726f983d41fb660b2f1b69410deb6675706839ea7e5f4544c23e20a728b2c2228c57d0504052dda5b3e689df6db9c009526283f8a38a78e7eaf4463bc57457c382861ce2514cdf73d478d1bd128330743662f0daf4c17e10a858146c99577edfe20cee3111c8c396f5d744e764cf6ea2455a79b34c7d595c51f60bfeb17706eebb7993d0d3d42bab55524e13f5a39393a1ac1d0f9a3114124cac6c632a473798319f2b1e00d1ef3a2ad522dca063ff54d3a8b0cd76a00929071b8b4345706f1a31ddf135f5bb7a23b4673f31052d796b2a50b89e730c1b0bc112f95cd3b9d8308d6cf50c22d900d1d40f55d354c440837b195f3ca7471dd2daa4251a5ddf9150656b40ee43a6a983a2af648437c823af8b17022b4f6f7a554b19bf4679324c845ce30cc3e3af26d559c95702aee38a72ddcf6760cc0c96e601c1097c0cddbff4d183857009919fd105e2f158d6f3bd7c063b5bb1511174aa3d18940d31554736783cd39fb470b18bbe672433345c0e5dc8b07c7e027e5a144503600ddafaa5c329a0bfc3cad977cbe6efb2aca775889c1b96e8d01975a2a19f77248b16837d6d55efd280ce49a068f78c06f2d22d7e2ad49ffa79088802b2866569a7c9d525ab286d3ca630ad66e964287b0f3907804c8ec248677f56b7ae62af534577c973454333faf8a3a8f948deaca7529672bdc7d7a489008d2aded1399728513bfae23420b5492d319373d20272e70e38aff61fe6a66196c22368266f49f11e72258145d5617825076c1fd183219dfb10361c1544b3a3e0d15866a8127fc1d452bd57cf3d907fae0ddf2084371c06764eb9a1dd1743378e2c91def353500c34f9d9eb3286a1ddaf3b17842482327d570c8744412f0ff92362546fa097651009e421485955062dfd1a318ec330eba066474094f5121354a482f8a38afe5b94a107cf4f47d765bb227bdcc78fc8c214fe13fe13b3447d1731af103ffe2448d4fd5dd731f0c13bba04f6adc4c7efc915b3c0f8eaefdf4bd4bc8e7d13ec7cf278642d5e83c2d93cf84db181e26279481294ee78234307e4b05dc6f76dfed07fda19ea4cf144843b6fa92dd4e89f27c5ac113f99034efe83cd708094516844689a3a8cc723f2b812e5064c7e01ac9ef3f0a0f806a44409bbaba3d5ceec24ec17d45a60d670de42c3f629473394fb19e17b933e1f2be64a5189dfc673988eff4ad8b505059cd6dbd8420f8961d49b22024972ac0b2ddf1b8e519654f28177883ad758ff3fe2ba2d9134ff18dbee8a8a0242ca2d64f208546b1ecf1990c1de0601267c65d51330aa8b63a3f2cf1919191e1d932328ba82033a2674f0eb11cf9d309c99be8b271c10d6eeacb0daf60c1b393efde1c57fd3420319f0950081fbb4b8006430c7d0821cf2d77169d1a2a4baf9ea728fe25c33c3619bb5e054af28252b613d636fda55b62a450b86d9d6eb278dbe5a58969c56940df54cb89329684b461c38349fc92c0cf42e8d4974f7a8c8f8ef3364724b87ad71edf4acd1d65081c122d1e54250a0222a62550d53aca4acdf9cd512b2f969a840e296634b137ec319de8e6ee532d60c93987ded1446753660b20cefda856496b7b43767c58b46cf39211f83e103252dfd94f2128a41415cab100b11cb92295f00932262f7641788662fbdc4726c34566ebc6e52fbbb3da86f243504ed0d9bc2b832376dbc7a9515cf05774dcfece480c975cefd780381edb94268b64f46d55654bbb251945c74693caec2a30cbda8fe030487d6d3223fd44cd3ddcfea32e2553f0e732f97e3e17f01f8fcbd8474d5267df89b32e07c83cf6fc111b240c66537addac24796fd46ee43916a1bc794943f4b2a29a95441a749e0c072fcdcf4e9fe8dc8efcf261db22422dcd4b30c4107c591fb87ee4e595265bbec66c989cf2ec04e406c017697d20be4eb4b2db4c291780fb6e41f9bf4dc9934d53eb245f5ead268e3f0583632cfaa959928124547d7b1cc1a525b9e90f5c921e193a23e69aa3ec1b9601f1af687bc0b133d8436c5d8e32c6e7edc925ee38eafc922e98c509c367a0388f15142c00952a1fe16775566bf440e4907578844569120810f1d93eb618a4775a43c547a0a2db0996c336f1d50486abc4845d132971b7e86ae6d3308378b996ce5f46e78cb0a2d1fcc1696e63b86ae1d22e8744c4c228e4b3d56147c78a01ba3212af2293db7693381fad6b2d56931aa1ea741e8125d6845df09327e6791e602ae25e20f290052fcf143b902ca5e64271b2a8c91152fd173ef2536327c190f2f28fded5cbeead1856355fe77a6d8c21e6cc0b38a3e0318fbc87f689347dc139f0ab68c9de1d0795d273865422984c7509a745877e606cf17f2744d50e17d9241587887143088381fa8e51a6aa75114bd7fb297471a1c3e877e2f4989873f121e444569f19f5402b229a006a118e2ecea5ade22d91c12160450d5f9553e1955185db4dad3ffcc3593cfdd0447c4311b10673edb18f958d54d24d78a2c9c32706740e0f1138acaadef0bf44eb7cdf35d4640329f60dd73a684e19f297cacdf3eb8922fe0b06ba576d5c67ebdfd809faad1b78b881f23ef59c56958d2fbf8a29d594f1834ccd64f8ded34e47b5f1aa2b87f665f9d7496828d75f7a9024d30fd1f8cb9e52d34062e188b935f3ca4a8903283fc5736a603673075f6f1e1071d723a9f28e72737ad3436c1c41577b3956291fef15ade7d10325b90b50cdd760c4bf63df8c9b6624235323f18eba19006cc1b38e8ceff589f89ecb79005afda49b253be020808541444ebb9c00e6e155f6394105505f5d295f81086d9f42693ae53169c96da1e3c3462e8bdedc77292e92ad5bd3f920d1c4b604db5a3333aaf608817f4a2eaa6eeaf598a61b3a354884af1d1d5d5a3272f5f2180abbb128bc727a24d5ef07d96bd39c2b7a182ed7c0c1b6380b9a1a05fdf05f042fa5c3a2e64c8a6efe83368614e028333104e48fe98b22a85c83ad88bc1327b3391293beff1b21474a21328e6680002ba110cc634ec42f5509b1e0b36e646eb44997be7b7f62cc39ad99fa5529aed11522a97274e1879b1d24d1494737dc4053a447536683e98c38e18b62b1156bab5134d4dc0cd93d5a2ba520a54fa74b2bd9c1f9d23925f728c9f7dae64ecbfead0bb064271e2f5cf9435d32aab90c94a94a5e16422e243c835d1a860a731f53ea5e0fe414697789efafa87705c111056424b100e0ebe1452122713feb2666ccd4169599c3a70d8df2e273e397ee3c520908b3f0cd24dea9476a96d01a84e600b390864a4c250c80d7e1f7017b583f2f1125c269e930245e2d083aac922411398b734d55020a335a2ba76d68adacbcc5ff18cfe03d836f4c243f1889a818c6ef8188834d60221da81945884d3c93be43dd643b1a9d04edee47847c6ddec6bea496ee4295a1e791e7fea31293491a42f1ae22ff0724ee659842b8c0578609184262b6454a2e7fc7eb89b7a683d6b9c71a1a413f6098855be1da630d5b1a14478143c3186cb7b5cd64e1524ce8200aa120521d0a0fee52dde0e2128954cd8cc810fd72962aeb61a043edde6d58e8e41f509b20554fb4057be2b5a30bc57e06b1e9684ec0658283e413c21de235a1f8a69858f37a0b9fd79c640c02e3dfaccc502aadb6be117615b1f335ab70d7a7377d8f33b279ad995a4b98f0cb956d01d1913e068d199c2ef98f6621bf8f77778ee8ee02fa42b568848853f60594fa2e407b4158542cdf65683ffc709336f8f1ad86249582e51ca28ac46b0dce0cca220ca63cadd737623a9e3963f9fc2c231a738113de168bc7f9327369206379d995cc1f8f4b335b5ed2daec22ab53188b897a4016ce945f5004402a0bfe6e5230f7d4893af8848c3c1459509895534f65f9e414429cd4d64921a578773cb4a4ad805ccc3f60609b61ea6d0cf67b0155d68bd1ec32b14238ad30c642eab198b0ea2bb20809104970266cfb4b99a6e58e84e7ea39cf5f286451d0ed98ba4334e55eb49bf7df2720eba1f16a07c97e59e49a7b241e0b428faf66adb693226dc740c1dd2628b9ce1f67f336c7f1accb875a0711c0c1f5cca79bffa4342e243b9542aa183b7b77f868435cb592e0b509799d117e3ce55835218f914f57149e0ff26dd97160d2ae84964224e3edbacf3ba94bbb15bf52dae0bc430c04c55fffb0a834c47dc5135b0aaf4e89376e7222c6636901a4b68e839dd07f4c62a2cf7736aae602a4d54db778e26130ea416c146c2d9560cfc02273cfd131c4201155b934bedfadf147cadff99a481c23ff71ef6c3ee61f41b42b7c7ebf217fb8dff43b4ef62c78feb7c1cdd5db85084cd6862af0d0d725e67f554d61a1071d19d20cdbb99d106c1ad1c9b9f37ee0ac9cdbeef37f10953b1c04223f6885a11fb792ea7cde77f178f2386f38828176214659c438bf12f486d59683cb2923bc864ef7aa18e9280f5eb3751c4d5a4c7e382bcbc2d25b17f2a6ddd41104f07fd883cd5b53e9fee0f54c27194559b858476ac25619b5fd2b051c641e7f75e2cf31bdeaba05d91b9b21d3d3418017ddc82b407a132445c3139df9f03676f3c034ffdd7ff53d76c2d1531e354a35aca011224bfba69a49e8ea2713eaa117b59e4c171740623640f1849fd78c796d709249f37ce7f07f98950ec7a4a8fdc78689674bad2de2db785e219dc1114c30be266e3cd8e35c6e31d6443c69f1f1e0f4b45551e633c4b842b3fad5c052e1c0c3236a338ad17603954330a388304546bbd195ad5d1c87392661a5338727676c6f85973d13c3c08d9c82f316185631fed340a72389de41254e50d45622ad1a4617d94f8867237269eb4fb0098de0dde417375fe61f4533fac90294c925f214a87135415ebf345163e70720305bf90f66255e8f6e674dda3df7dc845a944b9c4bad10fb134aa66f4f63b8f8a33320169afed03c3e38c1e5741aeec604dc9d6de9fb7acbe3005c8e8e86da30b557287aedcd2d591a8c612c09809384548655824e045d8e9cbb6597539d555eb658fccfe956a72758410074c8c6adbb3a241b7b07e933721ed510692bf8b39ac2b3d0ad4678541456f34e7d1912342be5cb1ec3b54a014da4c5f2a1864b331cae601f9dcd529f540beef7d3a0473ad7cc7bf72fa80e2841a6e62f676167b73deddb47eb2ee854ea1d5b060cb337beefb1642a20175cb728050598463b9108df88edcce228936b1597f0a83293a8111a88a2f805f51a139ba2b294e5e3d034add3e6ea7c7b16bcdf17c996d1e35e802dd63f9bd08dca4936c559e4554202b0560b32ac66fe9f98ac603ce6f191108ea2d608c08a47f1f31d925904b6d4a46367c8cf48892211f60e219a04521f12429bdd5afa857fce9bd097a99a922552171a18191c4481315852433ee66873e94d99ed5cc0bba45d357b5bdd6eed34d3a91875b5499b171d1545c73b93f1209f021c89bd3b4c0898e98039c063dae456b6a4026437d82d719f308008e134b6663fb6470d7b78c6ecd6f7788748a118b57af898b724a010b9a879fd7239825165497863dabb7442949cc59cfdfea8e0c79410c3be6f61cfcda424c4ecae398c328094e4899bc86a5d1404e22c8167133c87b958191feaa9cc9dfa67b6f14f3e73c561997fb4c3059554a442c4f5c3bb0475f1bfc2a5c84f536a7555c3a564555a6b8645696c7824efb80b7b4f3b79966aad0a4d610dbb43b8dd7e70d517a6a01231be5470948ae66e868e040f06a36939a706245cdd0a0be46894ae5f59dd384c75f460266017e14b0e7a11786ca649608f81a0901bdc3ac8d8ec73c13cb0a02370efc441092f2664d23478cb1656f1788cc02a1c588f1abbca7f93e3067249d612b77088ddba07dbd094010ec9279d7d1762e3ad725eae15708d6d2fc2764296afb1199a4b8d58741a9c214553e62d5d440f3659eb0e16ecdd2a12930952f5e5d3dc976a61d4a53be5a3628219a4b1930f9f427c6d9dd08f27f94a5f3c43ae491d611e184554f053f9b2be912b4c7136e799846b4073b183fe8786650e34dd0bea278d43b832d468b48f152f7e3340c7f8398f8642c8e0c1ee249da725075391bcd54e3dc3e76651168ce203200cef6e21d26114d9d1e02df5c993e50b09b8db800353daa0805b2b766273505dad4432e1baf5d151313f241207b26bff6f123f2a5be74c392a5d1947b4a2b6eb3323ce4e18b66e38b919e4a91138510a4cd3a786c5e01d907fe1d2d44915d63cbb7ae5fcc7ddf82b506712d1c7c0d5c464e4b59da6abe8e2f1eba68503848e1a9138e4a0f9a430c3b1b1c4e63d25851e805daf81ad5ef0406cf0e912c859bf3e2d19bfaa1c9d63fb20c67e91dae02f06e6e369c247fa7c5b8f293cb3334d3f4973a922154c399ca17a8b221f78982a1c7fc5c7a1c7aea912e14a4c8f800fde9ff438305d7e26f478e7eea876defe0cfc0b7954dbb663fc1561f504c96a24063cebf150a8b1763a868824d920044f63c2c998b704ed82804a97fbfdc4e14a36bfa0d092d4496910ab17ea9e09703e5d297631081c2e7d1b799ee1c9b7541ea19f45f079eab52459fb20fa6fecddc2dd86826b4d99bfbaec0d611b50b89f9d813bee7f672e55115e89920f2178dcdde7808fe359ffe579a7c044bd98d7d6e2ccb49a4a17cef07623f2fbb17ef134d8ff8217a0473ce282b362781953a81f6f3361c4034357cf514230d3494de986b643f6043053c197c6fb2a7a81e7c2720e24be78c530171a8fdbdf6ae0052dfbb7c9e8153adaa380634fca5e2f23409063215af9f666203b03f78c0f88b2b9a74fe6ce4cda0be03ac99c104f34b4a468d1490940dde73df1443bdb74edce25d09ff463f67c1436aa9230e6c84fdf579138a9d7bf6af4e206b87feff2816472c8f618302eb3efc688bdfe9777f36d97a6ccfaaf80b5398d663cefee592934e4cb5ccf876a5946387ce858cc1060dd7599d54d8465d4aa794b1b6b51bf87761fbdbd9cae4a9157d8070f29080d98c4ec46cd3aa67966ca56b95b058d6278ca0aeb4f22339734964e99199717e9e6046c83fba39ba239cdab4c7586fc1b0c51d8eda95564f2051a1e88bce63846c4665dc2bf6ac1803607c10f5c58dde8c1082a333d6c8b8edf079b5144bdd0122683d8a676c1918d4518d054167046c5e2c933003cc646e33bb61d0321e9ac72b790986340b7589da604d6f7fb7168a483e66b25063dd4e95a33d261e351b80766d12849997e5e08dee52a56a2f1cfa20a807a705db03ca7936a450cc34927761b459c747a8bae03ab076f2074c09db44ff4638939335c11ad502600dbfd907efc2666dc3fcf9e004ca39e6e98ccbbe681dba9956ddff0c03be35dba03af9d49efe3f6085a7f2e44eb86e59bdd634bfdf2b2fc7bdde9cab571520fa760f87dfe3bea1f889ad285f54f533386affb16d751b3e307551dd996750bda65472fdf4d6a82727fdbfe53338dc440cb6aa3fe2618f85b2e1b4f83c6f282604e705aef2000929ddd64bdd31966ffef9ccf4edcaf1fce6862db69d35e25b43e8c58fc81e3c028922ac7f2d746b59d8fc8334fc4c135a2bc6894fd33f52534dbe2f48acf7b23684184576fadce63353a93d35dafb98dc8b86ae99235e3579071502692cb7327446ace95913829261405cee81618bf8c31694b16c52452804cd72376f637d7200451f0c4ad25ef9a3d46dc6e2b9a70116517c2f434f0e005cf23551bdad45a68e2bfb645785558eff2ed25d715b05698711980638d7bf4727ba5692582359ad14dce9418ed040c749069c7f5cb868d7e9d00029ce3f5d9453a8f7fe0ddc4bde8bdb9dee936db63714d1b85001043f9c0f7e0f68115cb1bddb20ad1aa4b532d2724edf3f8519e19d304180c92fb546ddd6d5be443a064ec008a1f742b1a5318d2864fe4109abb1182107cb4cdbb0403ff5aaeb3b5a3222767d7a2d233a891ce681a4b051a58edbcd474a10d2c162a80f11df58c15c20feda2e93c596828d7710382d6b349bf152d4d92ada65d878aa1e02e2101c13da65bc9a334ce530f3798e0bf947ad491ff78edfa0c6809325e09e4ecc167e731642c08fcceac4bd20914e727354a85b079c5b5f92043e0caa089249ff0b46d89f161e65ae099e69bedd5dc1db9efbc0af120c6b3a8d0e731be3647dc935c6ff0fd12448aa32677d9bde3327cd388dbe378774cc17e0cca4c521e59b29361150a41c74c83215b169329c07bebb9e92622f6be926958e86e37f07c00b2ad4ddad78255ef94a895ee2f82f7ca69e7009404db2726af1628e4454269efa322a32c6bf98f1ab3f35718d9c5a2f10a1c2aacb551045af71adcd828443f1b8ddecb048db332ec2e431da31933fc5cd735cd002500971f77d722a0aecfc90c0951e6f55a05a34d3dfe99da8923bcac2a7afdef049c97cfff806d71f9c61ec2e59e2ad973050dfcc5059da643a2834538b84138873199133c8fe6f5919bda078576a6e970b3e983517c4c13a0fff84bf29a1aec3887e362d6cb1299e7e4d16098cf9e1e8a7a0c60d3e29866c70cf86bf7921402633b61cd6f9c046cad3a04db551cc34e20e03f25f34ee94aa12e48cb007f394c720a254d5a37adec0ca4aeed68af1fd1fc85e9d774277d56709f96bddc2ed5441c18442bc6e4d5b943767b52d842b68b569db1539beb5c93c0bab08caae736c238dcbb4d91d2bebd47da0d95c133c492db59d02ab0f0ef42c2e1a1a0261bd23b9656a1629a130717297065430b9f6e48111836644941e9b6ed20c8ab855efbb153782d9aa37baf152df2cf160765c107f4ec130556e2088ab07800a127d087dacd63f3faaf62c2eba6c06dce03d8b73323ff81bbb93d872e436ab37e8bc244a18914bb3c67afb076ec0ccccbe32aa526591cd339365d9f343b5ad625a29f8cab381f1b3adceb9c5372cad75ea5234e89f79eef47ac517d222154bc40f4384ff0ef58741408a5e350e14a43ce93bc9599a7bc78dda7e860269c83b2b1e883a51175bd1c5422894e8fda9d60e39fbc36971b2b52c353a1ee7ae9ad0b82ea9fc36a12b0922ce2273ae8d4f3e06e04e37a9113bc060414ea940926c972d5896d594f6d671d1fdadfd5af65a36f64e9fe03bb31dc830eededf97024f9d4593aed7a80e1e1d21496b7fc3fa2e924ae953e0a8fd22042e15ef739375183ea2f0d029cfb882ebc7051ed83b51f86bd210550b57053499b5dba7ab892296ef19c954043eea3b2833c9685c1f632654bdc8a6ad749573c6c2ce27e28a37e13c83e563b931130aa913d76851308121cd205b259639d57bedff0c07e4c732ddc5ae8ce90b633929e093ed63983f9fc8a1b24bef7836e8824923542175cad12004706feb52aa2af58332b90155cb43afb2c8df705aa9e85c37b1db36547245da78626619508d4de508d4504d66ace1dbbe41bbb6232c067f00d17d836cb8edcbb7d5a0ad47502964663377382ec012270f55424148b971bf068c167316a10624d57b9eb4165702ffeed445a36006a2fd54a5fb7f7766d4529103bb0805a959cb7a174515a65bd298b5e32295a5ccd2f87241634f86eca9f3a6c2fffa393da15acbe25e5357c6216cce5861e8863dafd6db404aeeb3ed8f3429d12eac7cb5ac9bf87ba630c5222b399f9faf85f5f3590c6780bfc8c4b3090dfe392b8489176a6a95f4df8ccca3cba9b2adbeeaa0e0b8b06b326b902202faa1b9ed0a5b42ec1de2a54b39a08f227e30a2f117000ae2a47b74f862d68020c64dbf1234e4b73369ecc5800f05c634d7760b4086a259e2cd3023bb0c3f16075a0c51c944621d29fabafe448bc2f3a8e6b71e454501b8e47dab7938eabc0e280543fb41a52e2aa797d5a791ce2d9142e07692914a895f2aaa4ed600b79572be7b6ccfe3699350dd11aa9c5413b7e77f2abf42aed92c3013f794e4f44a15cad7009eea6909c0cd86f7cb03ad8bd355fdd5796f1f993121c779e8dff354f0a1ad4b41d9b47f1f385f5be6297c79e65d1a7dbf5f3e3387a0df3e543b22c5bbd8dd1f53768b3073279b8159664ba2bd0a668dbb6d007a8ebd96ff31b3ab7755f4088d2ad9757a8ed771c780a802c6d44741598c637d4790271fcbccf29d7319a10297c3416451d04fd8e642c0f970cae09678adc866fd35c87a57cee6687bda08e6d0b6995c6cc83adbc3f07105f7dbea4d12e54dcd6fb6e343ba76a2534cc76b758121b91f50069c8104051619639db5b8e7362d5ad271bb39ed8dc0e8ec0e184c44e5bd37177564f6eeda905aad1da70e9fd731e7f14536782b8c8e330ec9c89ad219402585d641914851de083c7a17eeb1acd88b1e806695bac24525c8e8af45ec4d21415ec88250e60ad01502dcbefceab43ff9d9afcbe99bb5b043a01bc264b87b9c03cd35a3a5fbe8d94f1857de9482ac1dade304deb14aea31a0585c7208c9e9ea0d603dbfbfdada58f93752cbddde71ab671bca16a4e8d7f5efff6ac4e945d745662922f21bd32ff2254cb3ab706ac8686c774e436c3d70553b1e523b42aaab1a15bd636d396b87fea6e42971c034b03a048ae4f3f3fb79d65152ebd58a97f60781762cef40517df54b0fe80b2075fe18bc0455b7c3fd319cee33b79784f80a61385b6bfb343c7cb490d1d02652de13fa53ddc63ea648392209521498bdd067024bcc720505fc9f2b09f621600522efa913355b3427b1e8b79f5f17c7c96f3c919807a8ceb88b08b9905b72c3d9784118f9f03600787f7be3d31020e52db1b02343e7abef1d09dab4f81ebfc9181b7bece1380e1db11bab7122a102b4c2747ce8ec5c8a1221b063001af67e08dbd16d55c62164eb370c1aa8eee4575902681bd3b1bbe66f5ca762f5d0ff6922f9296cc0b29efd9aad46c7498a884a369174cff1e33f4263430ba1a53a90f75f0f3d849911b23b2404171d44ce8784dbfa5d3bf86e0a6b0ef5a30b74f019919489f77c043302c3f38e59e24344a2ed69fbdd7ca4580b4fef7960facc8203695d44f26de56f0da3f0bf1f37656ab3d24122648972917ab41476289c1f64ebd327ee44fe696065a8c9686b69b80f10cc99b9752d49db0f453340271497342c403785ce012937cde13f34607a3266b0752f533acd092810f60e220a772808c4ef64999106badb64f20f27096df9b908ed239babf57074a57384f041b675fc446a75d01f83d506b66f1552f0758f69825cab8a7567450e77df7323293d52871797c4f73b072d27cf0aa1614ed30e3be6bc9ad46272a77a1d0e7180e587519c394f0d093154060f2f26d4f8b36ee30f363caabc853dd10b44fb2ca2f085e48c08149a766c86b53d06675b7ee77495f4ab0652545daedb1d9358ded370894b710ed854b730f0ecacbaf3b730c09c8d4f79499c91b8692573655fa122c5d788c1e90d80dc600c4c143e8cebe80c743f4ee28f86f9e79f23e438131e0cfdee1eedd9bb030f2ad88995dd23be2bd649cf673f61a171ef0740acbca5551174fc89e2238ffb77334a2ce062db6027f1e1d746b79c7b383e57443400feec34af039ae28bc1101f7aedf42547a2f4d1807fc4c73a70efa529ec4494b16fd87d476955ca5af7db7fec60a24e52c9d0acc5cc9e11abeeeb11f7f8943a9eb834d46ce4dd7aa67f687d84fc0dc3d22b0d491d3fdbd25da37b12aa9f4e767d2e2693eadb01c18d2dac323abfadb625ef9f400cf630e0f403d4382ab8d12e259a57995253390d46d724cccf5f2e66d50dfdf42d2b5bcdb646329550478316c25a7bf0720396e352f33721021aea5bd3c066295dec91790cd1cf9b6ca9de10b09a5cdd2c2bc3f8a965d4a6aa59b7997fc40497b87b1cb50b7f59ba73c1bb256c1bbb1a1038cfcc7d1c2541e128108b3e2c084ae077751ed3e0d2f1112687f90b666dfbaf26302122ffc916947a1c24320a8ff95087a8c9ec1e41823f82a6383662ae13283ebd82871f6b16aaec08e35aeb7426a53d896b9efce2e0d34385789510c9c23e90185fbacb0cc80433c145954f88f2b84204c9e7e6f54aaf66dad14885a119c775e03e48babfbae4c446e4d92b3e2934cb6e9ff22f22a447eb65ea202414bd23fe49997a0a06c034926454cd1752cb6a6ee70cd7fa2c54d7299ed13bc7608d6798c972a03dbbff92ffa978c8228c5ace25a3d220f004559c04509710d3a8d1157b0ea970f4cf5c4dae433dd4e96ab29aa7366b50718102bbc72a1328ba49a65e3cf09cdebb54cd91a78780c292ce71d287927fff4d210ac7762569d068c71da8e9d0be1bc872941ac9b26c20c4bfad4361909cdf2700b72606c4914e833a91924d54377131f65f5ed5e51cab9d213bdf9abfa50e411763edf92b70d2dfc9774f1189c521a5e6f9ea21d37bdd94a8a384089e66cf1f5c93c615279ac152f545e13fca166ecf640998ecdb1675ff42a4e7482ca40eb491522fef0607413893ff73795e6853d64cc9ad9fe32613e93bccf20341f5de6c54d41b50f24dc201fd13f9cf376774057b5f4962e3f28185d6f4775dc09b836abb9e9230966ae74e6fdc3582bea5fb507393eea6a932d20ee703aabe8ff098b1d6fac800f8f5ba3955a967e2bd1427c6a86852b9cd21a0ed51be81293b42c19ba124bf6640d6334a631f9e0e5b92b06e31e9d1d72334940dac583024dee5e228b8cea82c06e94cef5a831123a43bd8bd4e4f5d616c0f11411aaf9855810edf0a085bf500ed84b28481e0a0ddfa79cf52314efb8c848b26339fe5d0f9e784ef303f263306ed4d0b346ce5ec0d7071888aa21d883f8fa7719f54f45ce86c9e615951bccf05f8f6310ad581659b3fe8116d25938b810fa07b24da0969286f4c853befa4044a2108b3a373fd80181a2153e0c8e7e0b01af1b2a56849fabfe5768e8963011bd94461e977c388f61f42a1a10022071a1d73080e34d97d279c98d1a8af8fac31e42a6b82ae606794163684a0dd0157ecd908a2b337eeac2c9be77728a88945c685b2a32f2a694b6fdf760eb7bb10287e3a154ee68e26b7d5904e9da56c38135f20948a1c4e30714d2bcad18ecbaa626d1f664b23634c4e778988681b6f40b7a60a6dc71fd5e4238cf791cceeb756df3ae4fb7954deca4e519c9cf60d0ecfeb045b4e65c4d6c35d752c98804a020b2ffe4c43af71b696b2e9b17ff97f8f6f63416903d53d26ce01916d2a8dd0a624542fc0594bba6fa1dbd964ec26369d75b167231e062cd62b04c39bba10e9d0f7a719c8adbab0c3d9645512a83f65d2bac88ea6b553a80ac33f571032931d6953896dc564c402de165180ca600df7c852e715e9762d90bf87c3758496027f593d928453a84e044d59e8b4655699f40259d204793507a8d61f99296213974597d4295c0c4b72776c4093847dfacb6a0be5191c8b0a2df7361cf62bdb3d4e45b0d1bbba4af9c9356cee1548d4aeabd43155c5609e99a1e8a76ef2b4bc62f8c0c3c17e9102d79f62cf22c0841524c1df16a366ffd7859a3082292a7ee6c8cb2fd97032e7b82314fb2fa4769b0fb47b90e842c72037cb9e749cc040ccf02e40b997ff8c57f185d7a48074a09a5e0e0541ae2b39ab6f31a53eb76b05acd0d35d78461d36297abf27883a0b29ea844a76c78bd2dca69d00f8de6af2d0ee14958aaed2eb627500a9ba9e9187e55f2c0f8b37a9056d7bbf3300a2a5a49a6d8d59ac06169b7a748fec66547d061f7eef4b05749b9abc8eac413ed5ce1c0bf988df1128aba640b5cce69463d60623e5f2137a09cda158cf1815307eab479cfe28c043db562064b54d26b87e112b151bf49760db7f3f3f352ed66867d6077140395c4402c34ea02f42b649eb74d194bfe54b389a6b383d6bdd2c04eecd27a2a6beda35cf6c0417f7b16875a9202a767541ff6ec5576b81402635df69c5d2e03ddb30d3fc7565b1884e6c3dc64164594b7719b0bf72ee445f5bc7e77ffebc0ade65eb9d52d5a093c9756271c9eda058625cab32f386289cfe12e2bd656f0bbda950f7c96e88128ed32bf3758b0b3edac19e9c588abb3e89e2c3be48c55b65002eeb4892cc938b82ce7bd5294611053f7af2dd6ecb3c9196569abfba86bb4dce5b1ed992f7e290a2a3a7301a3579f76e709bc27358c40983661a6c6b97d56e6f82394380b808f80cfd9cd0894c0a5ce6c698f470d55f1ca5a163f8fe0348d3e7aa5c9ee7bea36e6788e843e9bec86dc4628f59b93f2aa3ff680b42293322cadaf626103cdfea5e6aff171e6f3de7d2474d4513c930d23f20b9bbdabb35f863dbf5c3ea485f5587569d2546b739ae8fd1173a73b87c6ed403eb75b3473259f95ac68a6ca3421a41999538e4e04c130f2cf1a30009701beef66654e9147ef0298c0fc2f9618453a266765af7755af6e4b850ae92929284571bfda41bfa57e24086d31d01d02933d18c02ce2cdfadbd2fb5b1b69c1b7eecd29b5c261e83a4fe875f03b5289be1b97379bc87929c8e675bd2e593752a78078f21176f3472b3f02d01eded85cafcc472f76cd3d54a17b2aa86238983e8837ff3dd0a0c658aea9d8fc2d09f3165ef68fd3aed61f0eecf4247bfe5d3cbd0b42828997a6448efd93ec7e98da161d79f5ecdd5f0eb1228c9c3c46a1ce0dda10200a158d46587c9a4652d650c5cdecb572479090cc1e7eea649a6629d7b0b352563aa0b8cbe80bcbb16712b99a81bb8eebf54bf5030f3a4061b2a687875d01a92f8763baee9050ef9757985f8f9bba6faedc3559f0b500c5244cd84276e4e14d583bf6709c91161d94bc1d3d8d0fdcc6d3594d17beae84a17cea3776696e8b91f437a4c82eeea54d414cc0637ead64558a7bf03d5b1d2107621b3166b95b89301f47f2628f9e22cdfc3c352219e4998f768f238f75d25d53af03066ac68528dca64388c17ae5e7ddff04ea268a5ea696f3202420d980979a531b1d9698339ee850e2d56a3f6f56fd2f02ac8e6ea6f98c59ef532dc9908aa95e154f97f06be7c5b49c9bd5abee2faa5ae11e8cc00e1d19b393722375a9f82312808fbba122654cc9bb3519bd867528974fd8e91bdc79c1ff5aa264f9d707f02fb260312e703880003cefe764ff7ebe8acf650d02259706f9f4aa2695e07a1818340ab21e424c06ea4622cf082533b2026443f53eb01dc02ac27bbf9382df5bf444561b625bcb58d53e720c546e64d2b41b3804c614a528a80e88272244c14e111ecfe7a52a6a6944e8ce802021517acbdc5d28fc7216186768de31db02666ae202ac984b4b2cdab7dfdbc206254d756835cf42f4c2a05331f074de9214204565730744c3ff6169ad51e36c81f1d1043881531e6a510a0de3563a7d132187a9e1386812a45816483bb9295fb65656a5872900b5f82f616f0ff7b1992182fb1646c540ac04e9e6f1cbfc369b6d6ed192a333b7cc528cf1f092a298158f6f450d598efc6dacc67abdfc962df3a7f0cb1143f057cddde39dacdaaa7af0841ab1446974bf0595e714b3d0b282d48e67b0c42773020c2c7b629f1444e1a39eac8b589e2b8603f2fc2050630e6382e792aabddab7d5b671906c0c986a6e7ff3c2df98da9a480c0d4e1ea210956c29374fbd5fc72453e94530ab0f9f0b1b70b83a01135ef3b720a9ee9e93aa682cc05641db2cbf9dd91ee912a2fc852fefe10412b2620c0cc91ef50fbc7f481f0896a7adb2d60c120cbfd45a6b840e5c3eb0d44144bc0a4be4841ec0ab800c91f05b8f5a9ea3cda9cca2ae9c39b3fec45b07a2a88c6623a42ecf3965463c20cfc111e135a11bd56a52ad51517a4741008c275d8de5b3f9169427299f4f1e42dba032e4e6ec291622e4666ac144bb657e1642851dd251a37f5c5ea8b730decc5441f8c9db1fbf127cc52d1c528fcb55f22d64eb822d7cc7ba658caaffcef2b0d3d4aedb121258703fcfbc25b5a64d0710316dc611921896c8cbc75ba5310e309abc319b1990b4d9b8ecc435c6afaa3a82beae605aee9707826ec0b94dfa7baa28a9d6bc650d226ff559e4bfc494c7445d98fe81307f71e6d2b54173b76e1bd758a5ef75da79dcb63375e039b26c3e9520fb08cde5a658512a984f35f9b8d2839c466ff795f8cdc0f665d1614e4885bff9725727dcc69054c02b16096acb0320d54b087e74ed98916626b68d332bfe5a277f6bc366a68b84cb4afe0288c1127167251acb25e76a3a97e82ca3f32b4c981fb16e924bb07350bce0f402c20e436038e1302dc146bb4c92207cdd67394ca1ed05b0889ef0753036ffe8fd3490f2c201850fe16ab438639b652f6a446158820551fe411844b629ed99fe37992e933688c203afe3589c9071ef3f817f966304507d667001dfc5cd550401b8fdf3d52ab843188235122bdb7e8f5c92e0503dddf0c44b4fb2ea58f40043c10b8327ae243fb2ca47f6d659c8e476fdb4f0bd50f63c55fb06e4ae1e55e29de7b956e656ca04db760542cd98d32ed9d0901c793daa619e1b3eb993db9334f57c4e8a54ca1beb283ec6a916749b306e6b6021915f4e806f952498d2352895e9c5847bbeb61a0b327e1209cbbcc49f2687dffa68aff1665d2c9088774d037d2e474232ad84402389e57536b73a0ce08388843923d6db34e21ec6d8faab6bc2e85819e09a17cd374c6e6bff2433a4c5d97911276806aad79174bbbb13bceea5d0ea33ef17fdcc5761b019b226529945426db87edb3f7eab482870a75547385e7f84021371a6bd090e14ad5cf113836ec8bed2d339ffeae6753f970a53d80ae1036b9cb8286f1c9b1a6a6713b83a9f35d6d549e8e07abcfffd4ceded31bff34d40b84147a5c884b94dd5fe9fa2cefa6d55b87742bc2af16e7b8fd479eb41e27aa89f8761080bd09092184c8d2a4d0707c18505eb6d9979f9ed6d837c1f85b5f4e9309452311686f734d7f46c277f07c58f351c9cf9f317190897b026412b01e2566a3a79525d4680a48cd609ba6b82bd8341d8a0d9fac3b01927b2bfe281c0f4a6e1900957340371bfa462625ff841e40d801a775c94861a25bb9e2993ca132f7a6d683aa4f8772da0fcbbab2686c4c48bebddbebfa7ec2224ff6e1587780b5eb810da32f66fc0793c1894338c9e6dac3168d104693afc627e1463b4d82023f6abb193d8648596f1e187b66db38f7056ca47c3ad760164c4a468a11f730f397e6bc6ed1c4eda5aade5b3ab5b618c752ce3d0d91a2bca8a22dac60a9bc60153b01552af5a2f1bbd485f35ed7106f2d5b0beb68f01db64c2900a56d61090f3b3c6b9655797779cee2e8ab68824b23fc3ae2d8a426f1ff17309e6b33175e1f506e4843f9a722146a6d0df789bc089b9d9ec25943bc80edc3b258b208af6fb7466690e1186de3ae3744f8193876d5aa1658c8587aadbaec3bc3fdc216a8836fc12492c55725698517a8e923de7926e5191e6c9670b5f41d1d02ed2631193bfa3af11ca723ba9435845b5caaa8fcf2af5b661e7bb8d99de0225680dbfda6349ba6dbefa21b8f0e8e837ae3f4ccdab8909059695050a94b97f419088c96b87cccf694ed25ad08d520190211a2d9279c1a7a2936756ad7fa175d051126dbb749afe8d00ea71ff96258ffdaff8a6ca1dc5142cb767f4f149456a95fe3d2c7603dcfe03b0b1411a3c1d718ae5aa4dbd6e81e615ea42b156c107a601a5abf134c8de9bc2e252c5ab1ef734dcb4cc5b2addb84aed646048ae2b6fdc12309680eab893705a596e8acf6f29455e517897da66a5dffa780c61fb25cd8be84a8f4b06d96b996a49d908eae179a6996fd9f8811290a1dc878e9cf5b8f0c604d86d615b438aef22049047447860487dde6bc5c8c393d0faeb60b2f3921525db6dc3806b005d146293638341845757be7cb239e8f2e04cf26010688c3b05ff3d07abec8378dc99555016c7c857994571d2da690165e859e658d582f711529c2c97e41de831a2e14b8735ce18b0922059ef238d04a9f95d0987496a6a2c64e3c7bb1a40da0be10345f9f51ac68aa86f895db6ad7db14dccf56bf6778b1426a67c4468b34b56ec08543d49e83c17f96d138277a55249440112616725c648f70a95c520ba09099c23a72f78a3d09f12a1a2d6e3f954194019bece9508a17f7c1a5da575a10476095aebf64ab2b43b4ae8c5d47c4c7399edcb3e5782e0082422b2118d43da75eab764e97970d463bcd0e82844f078982beeec8e89e15e87bf21cec9f44ed58b891a076cb2a019cab5b395eae4f6809418aa939ee094e6061996c83994aa8d5ad1501a2a0a50ac0375257c56caa48db93df9654c10d32103f33f8d6c71f619bead3449ea89aac4ef8e04d160b62385c288a713d4faed9f4ac2ccd27394646a8edcbda7a0f96f107973d09f078bd8f7c73638a460362f66a0a5ab29e66f97320cff90e7fc8060a637767d30b8da1f5839825829efa0494aba734b88f201ae160ac7c8e4394af94a13f77d5a37dcdcb6ef7b1206cd350d124036606270819d5d0a0239ca6ed51afb720da2a2cb6da7e7019f8e75175a02e8ad63c11271b652a36eefca357714a412e274f45fc632a47a4fd84c94b45ef466dc32ad5cefcd9cf2ee39600f48e25df813779c471d1aabd41c49387959cea4b28f3a435e477b63bcc6d5eee23c293c0b4541c028c1b6135ef2b0cb3bdc2cb541475568a91a032d3568bd83e9bde839ebf131b039e8f1cafd2f67305e208055d0c4ae2cce4b0e6f6a7afc93301847117712de6bd712f24f12b7d8b076153aa8878dc46f2d2c0c2689fe58fd442f9327b41b11513ce851405fbff18e11240bf83f2ef3a4b448cb5ff8d3203ef2db1f2891154634084686be96855c9772b14615f1256d7152b7d69c5f2ba2e042c1c70cb00646e19092698ae70e0293f8b3479b9f83fa2045ff2f3862390591703d90e38474e1d34e1b14569b6d31879c2d443b483a9e4eca991597fee30c4651ef073cf5efe1b10722a3b3cb2c97965b10afc0a0e45a8cedc92ea02dac61db1716ddc0ecd828aeaa7cb192be4b32770504eba098a7f13455ab599ecb1078a9ce4557b741383e95df3d3b260c741a533dac91bfb9a8dbb617570f69d014d65ffcbafd94d6ae92b1b3ee5f88e8cff0d398daf22d195f4f11596e2c106dd6a0e14e06040a9cec2fa1289455a7225bacd1fd2bb239aee9e6f248139ce0ac56d824d86278e3a76ccd1acffcb16d5ee9f204a26824cd8f4cdde18e4c991c136a808233b3170bc4476584419427d8f533b3ee2c2eb5f6ae07e70d41d4b7168eca866610f1cbe9a154c9486f23e8eea0528697b794eb6ba0ec72266982320d1496d544af37199231671a461353b9f469ce38967b125f201596eea94669cc91801af89480f9eec467095f6e8aaf9401fa3f0295721f39fded6cc7f7236bd984e590ce7b75ab0345eace068a48a358147553f573f40adba8d349556096a3163e6efadc6389cd84a157e79d5f596b9de6d923742b3a4946f68a92be3a2d1259d3aecfa86eae4d6fe0ea6a375f383855ef06fb20e80847d225f130da2c97bb2e3e15cfd2df195fbd16e96891e6f97ae6e42e7f2260906bb683c46ea4da3e61b475be4e2de21b4d1a6946a630b9452de85466a61c2d5cee5a3a12455873a6f519089e454b079b64057ec2d012ed9470ba51b6b1130f5fdbd122123ba93da3ddd4d2b3f30bef8eba60460659ee9a41eb55d7be456db8af964e72b49f5cd7589c870b4f726832a4e2bd049e827dfd645b83c3790ec227f86cb20f155491bf189f43da5e56339a0808209f586403032c8a65e4ddd4c5b1440aae684944a3436c3e3466c37f355b124f69ade1f83e30bacaa21da96e5b6ea1adf427bec050dd7e188e65ec796beb9939b0a07e8172546f9d5a731e7c415dda4acf804c092876592498fba467df35477476ba56b647573a1fe5b6c439dde38701696f2ed6b3984c59ba5bfdf4e243199f92c4320ba479dcc1308cf7f1e5675b0052971cfeb741fd5a65e497b3d2e3dd886a1cbaedb395f8291431d6a89045cf0444f418a8276977e277d0dcabe1c5f0afde5db3ef1596d0208b3c30353d44d41c0b6054ebaa7335237a61bf4a8648d3016e874adba8bbe3fd4a5fbfb1a80badea6d155554d9e85fdc0a7e6ebb827380305503205cabaedc5547affcdda8bfbf65636cf67ea949b10a4999268d6b5db15decf3c090456fdbadba5062f0766f82ef07eeb8e4337d50bce9fa06e9ca360dc6491096eef920654979c68859c5c1c20da8220fe29b61426207dad9566afeafebc534557a6b58d15e96b2bf1146d01660f01a6807b297da2e9bc545199108523f76caafe4d0e1da09bd081c2b5204d20e67b2fb401d56a4f582583eed158398f7c77a739fdf9325f275c3d75978aa818fa9136c35553df2a1cb98fdeaf420375a00361f1e2fb381fd25ec7d2ffce427e699d6814a1244b0ae9db59856095b96ced8682d2939909927bf070025ab27acd3ee2d795e984e0f3dbc7ef45f039b0eac481df8ed8027d219f7d3c880dfba811ab9887c5b40856ae9d78dc94bc765fe32ca541f0f7280bad4dd0ba6d4939e09ac08fd11d3ce5d129a6b77da5cebdc7b06ffb5d372d0d91da38883f9d188bc3e5eaeffa46c6df96d38e3e500a876afd891bd24d8fb598fdbfb4a8d21ce858027ad535aea18c52782abeca1ea85430b7bb7cba0056578548a6a5893df84b66b95e16ae740d35701e26628b55731a4211a75f4bdeb79c9dedce711a524b7cbb0139ebe4672fb9c351651b368f5801a91217dd042e72114839a46426d1ddcdd2a13d8590510bb43713d5ae2a9cbdc1e6c6c4c0e52991e1a55ee45868946e269d18fa6b09eca18e6c8189b2f007084c4292ac44cccc8bccafa353cc0fced464eb203a619709a1ef30062625707c661673929544e76b3cb4121d67668d619fb22961308c26ae77530f06aebb3d3dd486913f4d1a1db612ff8ffe4d6825219444eb516ba260e617191152ccd6f90e69672ff8e5c2b8e0ac5f0b212629110602cbb0603fac926314832a9e297a08d807cf4a8df41b03f155a5cbfa9a85302e45859edf8e8714220acec8665d5decf0c0f62b8cb65dfa8ea4b00978a6076345b1b34497ffda2e6ba64f857b217a30aa1ec999c5d652def427eae2601237578578c57bfbb9786fd3bb02abe5297a2eb00ad46e25126563dbd4b8f4951e48c574a7a489adc4b1ef94f16089166574d271d75497588a7b8b086b1035aa4c28448500d9e67a7a80ff8fac0e0036a902d52c8e21cc86d7dd4143aa5da312631349f6dcef01a771d15e1946616bd34ddf0cc7ad9dcf974b32e37a37acb44d977f546c6dea34c623bbd926067f9614d8fe77343bf9e212268c22db454d0f4c649febf1deadbae3d5d84d6b158e7e91aa2e82a79094e02cab48a7ee3e20c5f4f0c025ceddb4fd68873a2e4d130a4abdb7e86e8ec7deeedd25cfc92e9d9c2925cc533e5474d3482de098144db63f3c900aef11518ea426a6c0fd3b2c7da50fa4a6d629403fd86a31e79edf691db9d2bfddfa7b5a8c5c0264473e1d2d03e368e7f22f39287cf94b1e861ea35844975d7e2640b36f63a484966df20e3e67289b08a6bcc20785ac3b12ade146aa0bd2ff6c13c7995c3b67d2d88282805595279d64f05d4c2a8962b440ffc16cd59653b93cce94bcc05fbf2a6bd80c5703991ac82a173c1475a573c1268ec8083537704d16b303862f53cf66bcc895bcfa7822b6f4d4e0143fcb4e3a3e39cf222eb87c3858e640f95054338d64f5e6abf6efd2f48c60719cbb5c143c0b16dbadab946809c2085df62b74a3e995d70eb9a7e25ce7819e949f4c3a9ee56eb3a19187a0810a954c4a6e90aef3ca65c26091d38c4eceae8d3c36f548d7e9419d184518b70777425aab3a132da65412f0497d18a1530d779cbe3891ce3c7a5ca1407c38c51b7eed339f0ab63a609f7ab6264e2b0836ccf7e941e56253ca2290d22192da33be5067a4c05348dadf21e30c6078d84cff622829c14be68661ddfb281710df10d8f245544ac842edf8c458825143e24358182fa0d969381c95273266b30fc00a9afa6d5c6e1173cbf24e2e58c6495c45c4f090b926a62c8e02e299676e4660c20d1ddd7935063987683cc3ba336ad5f1e9ab6ed1e0b89ca44d0569bae9d2da39fbf0e94c731b3b44c6f33271b4d9d076e8c1b4f8d7facd6f054eec8561f9e31ebb5a7c858044b5a9ea3012152d9f3194750b49f21824fa3a563db13d26735541195a8bf7735f19a1b9f799cac90d003e4e6a6bc3d4549453d0eb17009682c6ab89dcb569ad2a1f4c5d863d4cdae2635bd93e6d127fcb4eb06cb128d4590667af9e45db3d62f0d4b690670b1855a6d94a18310002c477ec89e8a21852988c5c938ab5260cb6dad5438f946406eece9ed9683efc738d2594687d4a6b049d00ea53810fd97e88e7bda8d010e6e5119434438a4c4400b5456a16f079e96b9205b2cc04eec79c4bd56569537f6c961b4d39b02ecbb540d46dd263ddc32558da383fa36278b6b03a34d8f1278ca55a1f218ebe1c1942b719ccf6a11047b57b0a77ecc5e5b7a73aec6d75871c55365502eb935ce55549bfe2c62d23610733a4c075e0cfaf028565e37b37fba24f31635a0a36c46321992de262f21fedbf14d99f769cc936dced3667778f62fd44fd2a245574d7d25a1c68844290cb0ff3a2667268fc568c8446b14ddc76442ab0244d4bcabd097ed21bce0a0dca86093e778c691053638eb8f8acedb872d14bc2feb7a690a2af9bb56c475050dd90f35368904642e1111956a35fd99eda05f7679bf47f4e5620055954f75cfd43b99ade51887583707cae31478e21102fccd0e167a2662ea4d1d89dafe013b24512a8d5af0871322376d6221a3710bec12dca994f6f8da65bf1bc145ce8a3f5030445676070e0ac87e713b867cd71e3e75277493837d4ba1048192518b594ffb29065566714bfe6011f2121e8c39f507dd0b444463c02ea3afbd94b83a93c120bd5c043e5fb660439fdd7833d210526f2dde026c7df4bc1bf1821afdc8fe20c17cb42e7b263c7e09a4b1505b8eb74552e93cd0fbe0833a8d27e27ff37a39d44b3413205afdc85e34584058c9a8d20db667879269cd782d8e533e8dba9131fde3b2dbc8a0b04fbe370d6f2ecd2fc795cfa906b33bb484edb9767124672e712712069ccb7ec59bca0ad4e8d57869e6fe86dffa89f82b3246f136bf8f52e02c1ed25e3bd7bb90747b28b5d794d11817b0beb627d3a7918eb007d4d38233500f9b3f2f8bf24c33f6361137cb0f7ebb3e55e21ad6dfeb6c41343bfca2cc07c1d65bda725a0b0917aa00fdd7b1ee1f32ea4a09c2cc0819881e5900c828e84ce3cad2b42a9ccf32c220085ee00c63f2fec4097832eb0d947725c1c4fb0cfe36fb7ff41f5ad6b1a4ddee6cbea9dceb5213d832d437e0eb3287d4d5ed408ff6cd380ed1418698bd7365a45fecd06cbc2234657a6e3c8aa7a098af0287d1e749fdd3a90bcaf69d5ed6e12edb23b100afef2105b9999562f9bf4c9922dd983b726eea855306e7cfeaa17147f59c5dce10811402e284a513728820a2de1c44ab1e6d9e2ceef27beace2fd95b5bfd6aac6e40d2cb8963f414ee7c2b263e23350f35c9f5d572b9f26e5ffc72d392119086a10dab8b5dbc06873a6df13b29d93cc39881e495132dbbac071b13def3827246be1309c3a2243a2f20c368770d470aa26ddecb1f966849fe4ae2920eef28fb7f9ace2303213d9e44013eef558f6d3fbbdcd8cb522b7a8dd50088b9aa60b355e939bd161372f6ebe9646353f465a37bad95f59166822574b53fd8742d7116df145444c275fe6ec72a419310d6be7b7ce146dbf7e6dd6d1393cef27d6f57e752b289fc62c67cd3103d5891bc94c070a31af013b58eab135b5faaa17a41def607287e3815495ee554b71d7faf1afccda9abf580b3362b8c1388ae018a6f16563abed510250205cb701c59d258e4c7a4a2cd1356acb3a2d18b3f449f4f6756346eb35b8882f1a73d4f12da1f5cc6b6a7f9eb8165b452c82f99b4cb0d38e5b874bf50f9bde095281d4706df2a73a5319b231fc213645c532b89ed4e785c08ff51b19054ab2795cfc6fa6553202582fccbc2eb40c4f00c6736de98d98c52730e2e4da6b49d3cf928040685e2d26528132c2580440d749b3db623b451dbca997c9835d7f64aaaf1ee1daa18b25cd9e1be35bf82c44191de916b985cd591d6e00335386cdc3828a7821896553cb4bbc1e7cbdd66d169dfdfed4b07fd435c3e4ee03d21bb86d20b2888b939aa026bf8ffc9be7d6c7611db5241967f82c052a572e55beb13570f7a4b4495b6ead8f483e8c9668a6601f15a9bac8d87cb64e4fbbf370b409854292bbd0ba46da1db08359f1f3800623eff8c28a618cc6047493879a2513a9471fea26ed966d18e538d53189daacf493c2a0c18e6eb97dba4a45c0e2314b45a0ce4f42837eacc1f3199025617f7afaf6c6e4f615e17ba0e3b223a1d19f618307748d8c74eee22b80ff660937e50baa766acda3aaa1051c48dee53dc9a5c0d972b87ea78434ab4366d776f13c51bd1ba22f22c100f818c969f00a3b7c42ad51950311b01a7d32398ac7920414375fb345e8b9a11c78b112d310967e967388dac465c39c9c2b7e6cbb17904f1d255b2cc24625f5cdabc2ce06935a26bcb89cd48b0cf37c104440101eed1ed2efd453a0c02f9647d221b9390d2b73614f23871b83b6baf092d87193525480d6e1b43b41853f9ae1eae2c4b9033a9951970657d8065df35ef6223636159591f1378348f742ed8cc5b5b56dbd76b211a19230b05cf9ca69f54bb9d03be9118b01e71f140668d305704eafbd813514c23bf7cddac14959913e48a50d2e8f093df0f79658158d4a4951ff8069fb9fbf45d25e4f4f407331ca5620bd19d53c56600bc024ecef2305982e3c10f00947e8970dcadcf5e293cf3bb97fe519065e46073821fd7268187334ba30659c66208942199300ac0ee64916a33181bf016a9c988cb7787babfe242a89f3242adec9370902dd4a807516641dacf4c055f381e67aef67b5373c6156a947b226c16e9721005ac035b344964376fa5f14fa1c1455c93a0328846512eab9accf84c252f4d8d074e6acf613241476abe715e293a4309fba0048e3d28cb0d3f1312750819428569b1da5bda26dadd2440d544ac22b26c783e41603f6692a406803a8a92f463b329a42db4deea08d708450d1c2a6d21294ac4bc2246ecfe2cde7b9b587d36c1aee4f6ae280f7575f1525c5b3053ff5b962a3060f2df2db6078e9a4148935a2eaa538dfe34ea1129d77f0dd2a01e2732fee8574d1f0c1af259c09b9bcaaafaedd1b059096426cb1daee8fb2dd06d715c2771d16961e92d12d2bff2a323cb6a9d9e9677b6f4673b30a347b0308b946dd2d0f99e96d9a6a5a95f4bd2e4929b0e1bdd4e5880f140dfffb4300a0fcecb02277f5949b5dd7895d1017cba2f88b0b9a9e68f2b887788f94e315662140f36a3e5860e8e06efdd7410f6964bba0f1367cc30d7188902d66ad8716b5153554980cb86bb2722e5d853e37a410da2357674bf228f297317d3d9e014e47049bb9d1d451ae99dc7cdeb8ca0b540c969a307aafc68342c191553cac5e729c8993ad4acdcf3cc5636e496c626c91a853cd96235b5a1e79c09e95c6fc20ab0d10840c4afec1967b63f39353479b70e5a087999136bfbd46b60a80d0c0f337adfa65eceae336832996b76ac4e514bf7d756c91e3e87cce68c6d94cf8e9b21cad4e2b6fd17b1b2286800514089ae93a4748a17988fa41b84addc20f3cd99cf05c0265d7caa9736e4dc016564a30b6397ff1a01cd599cc164ad79df469505e2f1fa03b687f0608d7891d1d40a67dcc00dde29f5cce0bd42d4e379e40e3c69e52ad4543d48ae8d722e31dcf01239df8ee580612794c8e2a5c8af4925ffe9b125f5689aafda68b86d5c1e46de0bef4738c6404462afa52bd61cd4439883974a799dca96a6a59cb21149cb7c706951b88812f0ef3b2a09ac4243bebae37bda39b22a6722d5243ad9b3eedd0f735976cd73def096f109f43fbd0d663617ec09cd235cfc1689eccce7f9d1a9ca18c5b975466fcfdafe43edd7843c05e823028217efd5d05b3c53346c2cf8fd21908bad562d2b6dcf10237a013d252f37ae93b55b356eb7bdee80090229fa31472e5ec52c54f570a02cf9fe1819dbcab0a7161a398d899692ba21a241100bf10cab0028dccac0e3b29c985514e17ccf0e577ee317f9c2870df958f02d831d7685e8b95e9c0f3fb92ffabd1a979c6b6653870caea964da0d091529f69325b35207ab4f102330b50cbe13a1efb60e1e7df1c1ed2721a6b20cbbdbcf0392f8c637290db6f89ac870334bc06316339001291d57fca6896f62f8fa8501f4f9d65ed55e2770c5793211ba7d6881da080c1d237150878225350e49470e50c5ed4b164c88157d467be537f787378e541498748f9784f8a5406211d6a34204cb3f583cac1d954033d3cab9c0adc887f19ed1c0d0fa7bf29d3309ce82c08d55107061d7b8afddba39e488ae9e32c755236e36ca7d83f4477feaa984f4929d9533b4947fef642316ce2d0a2a59501938b165d8640205bb5e1a2af7bc83a4a7fbe77e6fea7e6f364a8a01986833e2461c76d4179aea8c1467e5d11a343321dae1432d459764924970d75a5c22a459bf26eb37915bd43033dcaa08f75dfeeee028e39109d543d34dc7fdf751dec921beb159cbbe8d134ce33e82714a00f86a33855f1ce4a2c801d82000ff385251e60dacde6ca843786b1fc94765f57839b00a092cb61e626efbe163e84e4f3a7aba6c4f809c9f40d2c7370f8027d9ad5adf1dea81fc225077885adcc8b3f3b5a60906a3189e7bf6c486c1fd5412e08b96d2095a1c672d56db2692283abf7ed169e07295604397eb059f9abf97b91007d1e93b539beb4d4d00ff7a6ffb0fcc73d6a2c1a3da23357fb9b7e66cb9678c9073f79676218048ab22fda704781d2cb8cf9cf1f33c95c68e4eb0bdfaf883bcc0613f70e3d7847994e89bdeb61eccc505959674a5ab49e5f93e79b25e564ce12960b07bded82456331c2d7767a5fbc9d905bdab3368ad48997d7c9e3645e76aa7c4d3df0b2f58e0a5e6a866487f01d229641892094878ccd5757566c4e6374a7de1124f970e06c238e7b15b987a0aaa76d64076fc0c12d633865c2ff60c0b1965cb75d3c1e2144010e24c81485f4b39c131465ec7d0f8a1e72f54e96433fb7bdf551df5b097f329f43941b5fecee5536ee61c329bf39e8312546c8b20b0bc7fbd7a5535cf533e8a82d806d970f46bf951ef89611d8ff256b99cb210823840ad3b17ce674cb84454180d86dd552c53333844d1fe19bdffd6eb60b1aad14714bbf06e88de6ee33b76355284a56df0631c9afcad505a8877ea2043a65fab1175957c43027894c2bf38f0a079686276ea6eadba1982cfe641de37a8aefcb70e3c0fb6facbf338becd09727df16114c7063360c2f06a096a7076f446e449d2bf44a8ada446ece26035bda51842ded666080d11acc54129ba2e68fc1fbab088d31ea4377318faee97138e13b71ccaf3b18c4f2e857aeaf7edd337a5f66f6c162226ed3f6f235f67d5344a2d0ccdef277e6950505d00b9f31345f42a4a427b37db649727e9f0e2f0df299b3426221db83839d77d37d3b813326480a1c82441fadeda72d1efd56b287a7d054fd4dd6a4e384c9ad095238f03679cc2a4961c764f496eb405d75d48303da78ab4981a81944d53970cfe898f310198427a84be949b3bb0d40dcb0c1fb7d9449e2c8d619605ad30ddb8505447406294ca3e66cd29a5cc0b13b2d4983a627145349674fd2e356851b1ff9ba0d7270d4a33b4d66ad41f1e1e67b5901322c16a3690fd8ee1211f5c6d91a0e846842564f5563b1ea95253ea8ac07ddfa928eb94727d485fa43db057b569275c46b0e65ad59dcc07811a4a9d2974cf8080e1ddaaa47bcc196311f11f656655f6459969f0dd321ba756f7059f8c8ea1e76aee7c5f2820ffce27a9703356878102009dc2743a363963ab19354319277e6448f0084526cde8a3d58c2bc21f49e466e6fbd5abbb7ce9a079cecef12ac5a90834311c77aa127fdc9ef2b643f2df3c085268272c83becd4a81a4556ff5c7ac92cefe4a05dcb96fe7bab91f8effc2cf262885b672f4c82bccedea46bdae9285ced2857a252818b70af83802aab10f1b8e943e7708e58b9b92fc5d558a4cafba82daafe03d250a99304202def748bc3720f64ea906901dbff7815063b8edea7f8e4bbad8c090c3b98101648c888e1a308a5370f1b96bd6a22abd9922538255c0f299e5d819aa1f5e1174c6a6c2246500ecaa36f520ed3cfe0c9e60cc8db968916b4e1096de83e385ec2771e9012496a526d776856668decc7d9d12e5151bf74c3f295e1b4ea4e2e013ec0c5433d894eae95be0d8d03a3da4858dfa085810b2d0656e91568972bcc55b70520140f5b9d3c0a4a3a23f80c3e9cd44919a1a54c2a170bde713312df7db66ca2cbf1341ab1bea6a1dfc9cd3b1cd2755699890eb9f2d2e322611aa4c2eca92d5ca845fd392756bf7f0adba86e4e37a957dc3f594797d4869d23a332c7e0a712edc684091fff985925d026e122e1fbcca0610e46844407e4c4c39ae32fe75d1359e9a8af1a37a0abd8dadc1ddba614d6e9c34e18e50a7f8e1335eabf2d03388d559b520d2a88e8f6dce859db3ab56712075651e5618582c2a0f9c4c7eb6236459a65e81931ec6cf141b5f492ef16453890e9821878970668932a34b4a7e56e1b792f100495ad501a54c09ebee5523f1289d66d6ecda820dbb172918a3bcfeb2dc3cfa6d2cfaff6ac3334f451c2fc206bab835260e589bdb8bc7a87a5fdde3886ec7cb7862ceb373e4566993a9e013ea77ee2bdd84e1934d5bf2fbe32ceb7bd7d9add49d670dc65b1eef8caddd1a51e096a40395f72569285da50115925d56029c6f2efa9df29af3cff666fbf5fa9dcd7e1fd93dc8990bb22c098c40bc59aa121a0d72e9642bd193f91a4206d42c3cbd3476835183049a878d961106474897d15ae2e8e17517734c813d902fb18ca64e521c62de3e51d108ef1dfb93041cd816a9443220cb135724d3edba8e73ca4a8875ad025b726c4d26052a58814e0a36812506ef0c6391b6e2b21c8bbb7dc817702e1fb671f66c85ff189a3543a9279e1a411b0b8de2db389810f6c85f62b64148ac06a2663d4fe6c7afe56dad369641e400af6617800c0faa04ab2abc754d581a09003accc3028f2d42e8f3725db377e5940c78034970fae48a04f005837e604922851d98b151b4a05a8a7b58cfe7b8b4909bf9020c0d0882ec4056ce24dd122ee1e744c7fa83b50d46e5d8d6bac262265b21a8eb302f21944bf7528fe850ad377f82da5cd3cc8637917d9f1b03e3c9d17686d3d164801ac1a726451446296ff8109250f53c758213242485ab7e14f2f39b13f1280c807a8ade715dd9bc3d1cc478e059c5a6425270638757af274b0960670769a5b9dd2c10d02d4bb13c0c8ed90fdd5998c8569da9e5ac23a55cdcd07a2c46746605689995f7138cd34380821e6b767b77c04b60ca1e0913c742084ba18e911a918ad2d9bb4af295d2798f63288f2783dd3f842b52f0cd097c9d53501596f1538211c5228a87f17cee4461064888f0cb1ac5c6c0b236196c269e28345b2636038b773cda10641884e92674865c3d0d7db869afa81d1a1a901f22c9038de6a885f6bef6d9f00b22e701593ae48d02bcffa5618d4a5d001567e61daaf0cdb8deba9f6c34ac59d1874a44fe0fb3c66612eff8676242673e069c39edea9f7f49495353da33feae75cfc73ff5af9c7370d63978611e03b1a2a3d6fc9ddb5c17d07091cc3a1f9333f0c8e0874d4133f3d305ad8d5f13b80c6ec722d67dcc241cd4dc167eba81de379a2e0cf58a089ede4420b3d08fbd5666e23c331ae8370638716b766bf8d7c674cc5f4bc27ef66fdca5f1530a439f16815fb51ff8c76da6d4e504446c2b75768514ad41d8c8caa875639604e95d5796aa46426c2814224a1d455d4d7c27e8e00ad6a097b2e57afbf921a38057a150d759944a432a3252ac975b09314d89990bff0a35a8630c3b3e5a6d93e0c71558aa8a1b05177c8781c79bbefba6df927f5705f3d02e63419ddf534e2cac8bdca13a6ba2e1fa0c3821f38dc286df345675d36b197dd9b381c11307c9925bdf8404ad9959a4087ebe3627169ef06d490933ea73efca91889afaa779b5932ff98f41dc515f1901c68f8a19f4b880584b2ea9d1d6a65e8162ee64d52e226b05f76d540e51c38cbdc94f7b8579bfc6bd49b96a7e7456cf1dde02913ddbc5af5401fbbb77c6ef4becc36f710df5b2ee23fb4b7d8c601e933230d4b5a3e8a1dd9579c961c55d1a418f1ab300a2f842cfba7912a3e0bf6748932094d7f547b5ca5f09ea43ab105132c58fbc9e49854de157d6c370b27ca855b194ba2580277064eb43eae9fbc7226b8c5770ed074a3ef020ff739421bd9359bdf4bda32ee29e05b4ea1c98cf20eae39a95d38d12d26e29019cd92dea2318e5aeaf528d845a8061cb0a14bf24ff889d93a83c108fb276a663286778b5f3c1f8bf3e7adec2560dceaac3b5f3d3cb676cd4ee658893a9438814517116fb07632f8fbd876538af4d1a6738906c20f3ea896125d3632cdd6b4bffedb4c3dabe6612510e34de496205dbb408757e7c8e6d0b40bea82746c91cd0b2bab7f30fad12aa1bc086dd4e47ddd86eda9b8f418c7c9f0882d8cae0aaf12d14dbc4b10eac0e6e291ee45b56c3f33729cc5dd081fa00ddbeffef847eb3d10859f594631a7ccc084fb16af066f21484dcd3d266aacc7f47ab3c9486c6b07983a627e6d72db225c78b98d1a46fd29d116f20633b3c355d1976cec531f9bf34095075bc3f7c3a02d405d2bd7a27cfeda35d3fc68e6e8ca819b960a78b7f7294161f49954ac9295e8227e2890b2678c31e7488fb941c6b505d1a0463c9b83cc512df8306364e008a8dab136bdc528d2f29177ef55f426f57410cf5c544a0a40745a507f03251a884ec131220d77c2d228319c86ba9867fe288fd60670372fa5a2d7a623ca1662309a3f96f64ade4d5e043070ba1bc9526aeb88b95c8aee052f9754bde81c4366f2917f3f925685754edfc4a3811c82f048023f3353b0987ae5caed2338bc0743a07b06d3ceea8fa5f43f19b3ff1755956280210a0990a03c529793ec8292977c176939869406141ff0c35b985b5d8cf5950f88a9af47236ef3ad1e75b22b8a347dd23cc88779f6e7b8648e5737ced3dd3b0ebba54d8f5e823eaf4f429a68f189722119e6b065549516771e2ce00a8b8b60231483156452c8aec9aae7aa536ff0751d8aca018f1ee65a7691d3cf69870a6e506225f96d7d652c20aca988a8c089a3abca036618039f38cbb2337bd670ea56474b08e3b97668e3a7541222df385f4236509a03112b484e57497f709752e97f9b3b02680e79517b074bd95d653b7ede363a2b8a34a7c33b67728ee875e310021d1ce16a5d0d22e5c2c47baeafde01b4e2a97c6306a5fbc1332506244f8045025679bb1eae6fe9537a2e8a8d02b207a8587fb21d9a90e2faf1a87c6087aaf2b8a26aa7719d56389abc9e76d74e1ab6d01e71967e3c864b64cfa632fb024051688c0273c31c77db98ff23192fbd761918e9c616e48d34fa6d0c2e79d546d157793863628960cda77e013af969e95b760f415ea4d386ea30e0b01f71bf4dcb4d9e8cd6064e6b32f505e75b90700c270b563870e89a04f21f461a9d4759a4c74bb0aaf65db1cca230ee98d9f4e1347a421291b57608e11cb12a0858d8aa3caf5aaa87ab0db48ab5252559315ad63995fbded927e11f1545e27a4de1101671f74f635ab523cbea2789e327c4f582fe4937609f0eb85113a2c947c889b728e8f5d69a950c9a06e139df0bd726fa2e776c4dec33e2a7a96a2269e7f28689f9e93e10be0190f4b775d31c99d8d1de8d870f29f844a2250da75241af112621d5e6c62e33cf9d07ffb4c0677b79113a87ce19bb4788ebdf8d9480d8c411860bab2ba8fa7c39ebd0ca9dcf3435d99362e2ad66b7a4d71d45d4a6007b53fd7c1b112f503b4c7a09d1693123752b25c74fbd32c96b9208106458ea4225322cb7c31663e2f0c525b17fb4cca45e3e9f10cb1411eae208d167f12dca2ba4a6c6c75521d370e12d7676265dd3fb5cfa6d0b05dc3c8ee56dc623938378e9c246443b5ad4d1635f8849b9ea05db786bafd400e798951c206bc7ce84007d4be72a2093928a994df3fe68043d5713517f7a50f5d34c157ac768bcab4b855b3e0334110df56f91c0cb453733f632538e3f26fed4bdec004418a11fd91e66ea9d636f55bbf25ef950000855a3b788809eb51bb2cbbe16ab16922e8ef3a19d661b747b5ef88d09691b25f540ab0c1e91304810d77b5c90f00b3d9e084ebe8678b10da04a677e746214ea021f1941bfd628f8abcb2f5cb925134ba9329b1b640d2a1c81d9a4ee377e2efe09f0310444baf4502c9c4eb970f177ddcf803ed6a76c32d9a741cd6af085758330fdb46ed903612b7be116bac59f97617c2ee951c9f3aafc4b93f11c26578fd33d402f7881ae658b3a311472ccef924fcbefa47d9008ae725f623afffd2f44d1bd18db94b6ca96a9494aebd74d5f9fd39fbe01379d7b121aef1be1410eb45d8058f85eedc8bc6aab6e9e33055581597b1e9d135c7368c4d18bd87e05a4b091c8b523a28b273c0a00ae937dd86817a0c8225399b83e575045ae1d0398bbef52ad9526b8cd0612877543428d477bbf32bf2df94cfa7539363eec82411fd3a04e4609052292fe7ea442a2bbf97ef523aa3195ca00d9f73b31ca29e2545f716c83b2347f0c2a590e20cf00d00c25114195409a0b01dc2121df39bbc00229e0b25db17ee9c761abc8a254b18dd0b8fdc85974ca7c5d183461842124622457cc4d4be271e5e2db385d94e934878bfcb32733b1d25d65caf4e4ab02f34d81a9fc98873a2cc9fdd53478103d8646180b8161293731adb3e9aae4d4319711473e3bc0364e95d6dd409adf3d9c9650b14b2d90a3f764a0868a3c2c4c466c0db9677f7aca0b325ba04e9ce46b09b6de833e1127c8eae69a60de3c92638c6825a4b36dce0f412d9c33a601ecfd43cb612e8c12c331f3f1eee4a90c65e6246b95ecfc231109beeae62ee9fb6859cffeb97bfd82e17a9fbd2ada35d14d30c813000777812b3bd3eafe55142b6ca7d0a1a4991de09a800631f6678499a3c0d9ec335d860133f1e28b528af00915ca9835c8f140cad436314d7c833eeaa1a4a465c313689456742385cf8107ca4815c086fbb776d3077adff21495b60f3643af72046984a67e3487276819b9cbf792bae339c979aade85e015dbee800d8f8ca1f44e28b050d4084d27360ba8ab6e40cacede197eabddb76b2ef80eeb0c313b47928b1262a45c9dc0eb99dad83840d3b29fff370268e0397e5181c21ced156d45ddbfc0daf4bc0857fe7ed57e19a15767efb76a8f4d150394bad522b076d09cc99b4d8e64e6d4428caaf7e5f4b1e903c867eeacc0ca73fc9cb70b7bad6e46687d4c0ead44828d40ab35b83f854bb7d95154e181f8d43c67019e3bdf66e3f6cbc93d3f05a6f0f76475173797752b8325cbd88367fa5a184bcaf20744c1b654ec21e86b4a77f58175c74bfa697bc4ea356d7e1a8b7fbda239ca6be44ff527c6432713cc4c5fb3396e47731d1a336da8140e4eb40917816ec0ba6c5d26d49737bc531fd5b5862e01d4dd66dff49000dd2b09e7f04106897b5a4ddf18bba84a659580044dec4f9680c0935a443d91d4e36f33a6c005f88e8d6f9af2d38b8068c80f646265e7dc690088c912022153e412810750cecfaccb7d7f4af2c27627e7ab24edc2fd1bbbc664eac032d6fb545b82718158e4b0a6f02279dccd7c93ac71b49335a1b6074913d9946c2d0ec43cb967346e2b41a57476f3e9bee57c1bbef464b2e14bb4103cf9591d77c0fc2fb846986d72522a73eef0110b3a31075e7f7bcba271f1ab94bc071e3054312a0b4bd465488cb506f980d71e0ff2d4641fa86da2289c0787322e75689a4c75090d91c5b80b6bd231584282f5e92ca5b4936f702020ebb46231e1d8c79dc2f97de02e6c860fd53796fb385f21683d68c160795bb2077fc9cfc724d4dac85d799a05c6c211e6f521096e7d5fdd2ef1fc054f0a4524175b96c1963ceb9fa1723467d23c14c3b34d0ce446668f1e4d90444df1b4bd0278c903e375111343247025098c9d65f27e8fec52b282d6a1ed1f090e5cf737b49728eef32969eec28a8dda3598cb6b54f88902661c696913d3ee4b46b74c8132c2dd8f36345ab13807de36e3bffc80e0c0a7eea85c27df4a7673644c27a22453dc1da94a5d69cec75d52eea765a518f2574d5116ddc7561a6fba94edf334dcf261d8a7b6ccb57ebb07358bdb1366ac4d343aaae5860275bd38251beb2c83094ba48b4312ba86d4ba75ed7fedad9d86ce7ec4d2abb5503ee49fb5a8ef5c9ef8a0ce3be30cfd9ba71d62d1e39fddb5372fbd998d8625fe2d85ab8a46c2d42344ee89e0d718d45e32764c7e48805493b8fee5066294ad148cabc0bcf2cc8ae64ebeefd893091428c2273197d795fb17c990f43ec32440c1abf86b488790943be53ead08db7d346d5bb83c0a644c7ce2b32aa6886b882680771904ac7fe8eb17d525d29002161cb0dc1e33cb2c539da4ae7c1d78a86c7d3b9d1c5ca72cb708752352ae3d84b51afc5260751a841d38cfc1561d94af1fd8ae32a88508737794c17db0c6dd30b1adba77a5246e403e918203fe611c68426dd175eece5f3afe596ba3504746202c2c2b7a925bff2c6672c95a4ed80001818284c7bc5af8bdde7490429a6723ec3173cf314b8c7f16af3fe4b5837a9540a85cd2131770b7d9fd059cb8b18c51e0064428e1729dfff1f0ffc03e7d7dc3526132a733de04757abb9439eab6424c988d7e9da57ed8a285e2819e1f42ae62f6a2098ecc95e1737b2113ee3d8901cf1aa4d66fb205d168c792944843d6e3c406b7ed96460151782cd64d5ac170a49cae71c91293fddc416cf9f1d230331eb1bbf34746ab4c06b0f31046c3cc4c9ab5adc610c598c3785cc06c6fdeb9d5d8f4a15438f04bf370670452e34f5d3964030ec61eae6d69cf544da17c676cb568db4420eca59d13a8128b116871aad9eef4567c27f1df092659461d5e7a0e2947f2ca29df2f4115425a50b6806bc3e883473430cf71687925874b8f6e2e7a5a36f81bca21c2482d434dceb927bff6b3342fa1c143ae3829325c71a7bafdf04cb085a9b8d18e554b82734a54120b6554f7722ba2774e3a4c27ac4454d8b65b5464de36cd100de2bc8ad02e9cfa286714a192fe07ff62fbde3f8124415b1ed98147fc345293da611e9d63a83dddb931bdefb209f3ee8bd87a1e0d3b9c4b312ae0520b391aca001439d415aad3942081c87edddb1cc04eb40455ef5042ddf084e7d743fd6f131f57dc270d1fac800fae1c09fe74859a9648991afebb42afe605bf938fed98b08b395d1206417d02e5b2d2aaa8e5ecaa145217734d47defe24c4353c707e3f10258ead52c3934f07ee3fa60f251a2f8b20cd16fdea919eee02bf33e6bfbad1bc951876c2d4184061ac6fd7a3528bbfbff86b208d01412c06b694da382d728db4e3a1c3199aa193bd070c0c3908ec7a207a1c2280589da1ffeb58d002d4c3368a29d02f47497f53b40acb2890472bcf0caf180f1849b2c5a53bb07a723d5b52408c46f1bb702a38690123cdd4d66d9230e8a40d9cda98623cab6dd6fd48cb2dab76cec4e0c31ad3d38838a3c97e497969c4f6ea2925fa65012b75534434b461f20d83c29d42cdbef53d89f9eef652e40be33af94702d4b322f5190fc9ddb492b051a3d46b3a620791be72da3d4ef156863e65a39eac99e62896b3638d576fe3a7b8b66fb5794954cfdf4c1622a4c7cf1e8c70cfadfecc36bc6439c5a2b1a9c0c967a2cbfac97311ebf17820e1ad45b4de69514e003918bb2df175b495ece70abebc1f4991ffad69767ec4f81d3ecbb949cef7be6bb8ec6b77a00867afc432e43c5836ef073af78e6d88bdc9daba9bfb17aaa536368bb81dd43da3be02d31c30fcb1b1050ca11703ee6ae1e8d1db75fb941f4e90c722a804545c75cd2cb897abd676d489cff67563aa4edc09fa41d0b009ecfbc215bae23b4112a1773326a1438caef0b07af343ebcaa1a5995874678412f2a22e7e836e51716b4036a8cf8da4346d094a9c322dfac18b714ac7896aa197bc2a435356fb6345d99f95b204ecc65975b037c61f0d0ffbfd425b7d6280817ed7ff2b2810443b2aa984faedafb9741ae043ef09fae19b4f2cec7861f55d80bde083ee763f36cac4eb63b61fb2c05c870f1ff5f5fd054518de38244cca83d29c988e8a1d7547f9a69a4efa27f77c95948e930bcf629ffd90228d323c674099a88f14c232d99bafd7dbd57395860498495ff1274bf55787db698f888f13e893d976075839bb88b0cae03dfbbff27c8180779ed409253b87fe21665c133e012d2dbdfc7a4f4866146876fd381f8283cb3703c63fe582f5d9decca6d6925d84b5d2eab4e5d8e3bfa27774c0e0fa87e97e1faad83bfee2607379b298e150fba43c0aefb2eab1e2d804fcef7f781711545eb0790296a58b902a7f117183397797bf813f8b3b53c1bbc416f89a8d7bd041015d34bc431e2186d75b4af305a9b04fc6578ab3ee298532735b498a944c45977eca6178d720a4bb4de6905a4e415b2f6106ef312dd273a4f2aa1473b590a24f07be9570e3dfc5a2e7ad5347036d02e7ff1a0c2ec924a0aef55c0303e2bcba1ccbe54d763092f151f826180f32d458cc79363a9985827a24347a14d6de545cf67b7776719a29a2a28aff0618f8d90dfdbd8bade1d9c4413fae140250318ab4a1ff3520f37e27c822278e272ea182c75d5a06550caa3bdc146727a123aac8144fc83ef2d971a367dfb9aff618f647283d2c93d90c0ff4ef7416d257389148ab492fee323079462e335213e3f2de88a9c6253e2a522ab9a9c6d75e7e9cec46ad97a3cc0c0c663bbef4f6cc7951213576c363268779232c913c64efb087b669b8a175dfd5644c9f8298ec3b68ab59d2e0ca9ada0721d3912cf9eb5817aff825dea9344684c7d0e0daf2a20ce36f7226a094748c795ea288c4f4c6a5abc583abd35581b383945d1d52fc61b242b81e97dcb04c186286f72e0873856bc7edb482df5e3ae32d0e170c494f15ef3b67930b55fa052fd18e5ffa2aeb661b74072dd3d471dec53eccf9ff1c62269adb4bd30bfa693e7b4fc3dedc74c029ee9f6a19de9d056a3a4e7e76a76f9f18365e598174e496a601f6f3e6d158e51b6b26499d7c8fa982a6cdace309cf3ea690fbe6dde388dc43914c9ef5b2a6e9a541c06f8ef258830782815b3a205536211feada93f44e419cbd7e7c93c7e5b7f83b08329282c0ecb6ce6e65a02b4a393b0368fa8551a4fd082b25217ea3fd981d259bc19eec961e9449f65700fa5eddebeb316e5a05800c62953eb2335d763221f67aba9c9758b84f8fc9a43e2eb8d8c17ec6f3e703b4741f045c4b9d810e31228061518bf580015f4dad2fe1a169d8c8b931f49a24676e623a5530f40a479561e1cae445cb17f4a19e8a6a261811b6ff1b158e9cb961c16f46713df060fbfcf86bb80e2377a47f12beec0a7f33a038b5c33de87d8f295bb37903e08670b1e7767e931d99a32ab16eec427709962ef2ae8d6d25b761083435863620dc9da13beb756b8b7a4bbc7fb88f026307f594c7adf0ada69bd41fa2d5fe002a4e1e4e392914ac61927b2a0ef1e944733e304e530f08bd24320c013ac27c3486a2c85a65b603326af7f2c876c35e7be356fd80073e914c214fe79858469c30d233d82a5bc10477d143998f7b8a6fa63f26f4676bf034b8939e363e1bff4a7f33c117c4b22b4d04534b7244857abae30d9842f4abec05f5be8ee02e9f49e97b58faba4fe64df3aacfa7b2b4fd09dbddeb062278f9a49496037d75f2bc8c8b10b96b8ad320c3ad42d963f26eb35a44e9aa9078d8d4a8c27111974372ed623f755d7d79ab2cfca40b83a83cec1914b0ef15cb2bc94487d26a3e9d63881233623c863a99ea4c58a92ec6bd7f6b0f36d3a77582f425f2ef1927e4b9a77f1bdd1cdf4ea9c8eeba64635099dda1a7d6353cf266c032147c98aad5b99932e1291590ebfc493cfc33ffa3f2cb686a10c64b65d8157fc95a18120b1f85dbe4d24b2eddb648fe5dd875608abc37377c28b0ac7ab24271a93e0466f2d18421406e54f93e5f9471efd1fd453ce0270602f090ffb9d66515cb733ad07605e1a30901b8842733b398a1fc9c288ea77810b5bbf1943247cd31496e456be360e7e4fc01c9928c05a1ea763e617f6d030fd40e215a12326eb338c62219c93408349152b36ec8eb42b9809cc637f70024fcf122d1474b8dc48f1a5533f595a3f860d6e2e60476352d4b2cb73484800376c35f1158a4c72d6c8291575f7be4d6d1fedf1886080d98469606f9d9d503f6f0477da14340976abe1cd156c2c5e62418c6999b9bcda6db26bb4f354a66af8f5c0d8bee49fcf9cf9c757c7efe0a3593b2e6d51a82e6899c6c86574e2b0c0296de88ac11ea6b3a997bb1e44978699fb05a12f767d1ded131c0163f2ce32e05b77bf7530d65399dfee13bc3350a6ca1536b8f25f8e502b2336bc9b39979b3eb8288e5bc9e762fa66645cf06c40f5319a905d0fe2c1cacb78608de259540970935d299d1668aec743c41ac39b499fcbf0eb2b11616c97f2e3933833bee157803c0427e9e8d879618482313238f4e46d8b57bf39a00de4fd11ec25a631be48ad9396479d121f2e653e9e45dd6cea91cab6ed26bb027f652b0c241aec53b3dfdbe1d7b5fa3adf86a6d6bc7ba9120ac5ec69ca4492079ba79fa0acb228563f02068b289346567fa8ffb00b14725ec097a3355cc8248a74f6b7e276b0bdb4d8c56c136f4b2977fef9650780f51aef05f18cbac85d0af7dd357f06a71852bb2244c32e9e9cac7523c3351c5862c86e6dc65d19f4af4c01cc4d49dcbc1b2bc41f4a4710f8aa2df498465b304fa5fbae98bdfaee5f7f5dabae3c36c1948fec9bbd5674d9c6fcd20d2fdb60821ba3ca7644975a29d1e253aac5f8b0fa8b72b3c5e0708d26bc5a8d9bd1150be4eaef8e742e82a24932020dda11cc603123bb6d8b749a80dc52048acc08bf0f2ecfbf0fab1bfd5f75cfc95ccd3063a82b176ab9e4bf25f2b8310b14c39daf28114d2d81ff7485a4ef0bca922da2bf33c96d9ee4f6cb24eba22d68b50b1a075f03ccab72355bc235aff379051d14e27d5d02655d5eb89994f0055ace82d6c6a8bacd03a21626dceb853012eb41a73ac802762bda5889eea12946ec6a06ed4d94e6934f6be8b7cf5cdefb0e9f99d63db82b48a06ac5a35988d0b515655a373fbf0e52446b186f8edce43e3c0124d5aad7582d6ef73e19481362458b7b8340b871a1236c2520fa32d55737adb842473df2e8d0003f5bb79f8e9a2675592510e56129976f16d23cbf4cdd84eb32589d13f3da567a0f997c776bf241df7ce5e52d3260960fb080ad78240057c1b274c876e6b49277cba7020c19d4606f87c2a0a24b02582828f71a869b5feb5a2537220d3f1df3ddd9789c44cb05ba7deae57057be34575571c842f8a44c5d891b4d26de476a2a4f8c167a922b1a917b661149a6e7c991c285f869349612dcfc310ccbfb23d1cac2363c5809053f3e651ee4da5272d7dbb8f066abb5c06b57edcda931c9e971a5ea5a24499363cfa66a1a22f26cba66734ae3e97002e9c24c3f1ec93274234132a264659531b6e9b6539777bcab025c422938c186cfe0e2ff78d2728ca6feba04d654449088685e3aea8e3fe69723d8547ff0fdf15bb98b6a1256938057c8f8fcc7a5e9f88793d52ed92cd1f9b8309183dc8c2aa812aab67b23beced5e6b6fb09e5d8e13f8f68292e4e7a769ed14946c383ebd17983bac8c175a3597b06d051a8deb8e07ac3bdca2da654fd5b770d6c9250804618c04551da76df0cbd1e11d8a1bcbba8b437d9e7c913d19d2dcc5acbf2c5e6c1a933c8be3fd8ce7d9be1881194d4d9b0546af4cf009dd8f0ec1df184dcede9e330e137d203b8f5b302fad93206379f79f3a9cd8a66e08c3a652efc75c2ce0f81d9cd6e52cdbf9420602907e5e1d66742a42c07cb14179d3d5c2535b7cbf2d5ce745d402a499f4c23d9d2a5ec679cdb100e777c39f4253fed5d4a8261a8700a89094b999dbe8bf833e976ae3224885ea0709d6f0d584bd1e9ef7bfaaafff0210d1cf21f11c1a4a0dc0a96123d6fff5b7a8b9353ba7a871894deffd1029bad50aed21b2a3949d6c27d73b14c3fa7a8eae758886f11574ade2ab487bb054c82bf06e50ec48fc9c83d18215be5b0df86db1f114c723e08ebf7753af1fa02e287c4e34a5fa547ce8073b3cae50f777abb3a81188230943337b611fa7d5d00eb82dfd69b2a62dd2e9572abb610ef4727d9fa8c5278364fe57578fae1df13cc09b3472dcff0a218947fd019d4edbd142cd9f9e791d59ba089030db2bfaa84c9966ee09cf1eaa32ae199597153853fc8f931aa373321c8fc1be58ded1824b10e53cbc8417b42d782153469356840f018bd968e4aeb63e25c366b9f31469c34de567b512c3be54f68055e7a7ed4858c3b75335a32ca00c6307319f2a823c91c9b7c1b3a1d9e7c3e6d3a21ada385bf38ff25290ce0b5128cb1c3bb2a93d26ca894dde1fc40b16f34aad6776d7bdbebd69e182d06c0f7706a0497a46b773ad4afb17928f8b7b7d369860c9acd1ea21049e6b60fb08fe9f4445d4a65f05217a807c7bcdd90db8426ac6ae9b980bb4e31d769ba1e46a886caaac5469e6eea41c08842e82f67b073eddfebf65fc21cea746cdf5284af1c92986c2d07932ea53c440cb354292d37d85d6dfd78d0526834aa077343f91d2a87d734466b2bd78e8a500337cb73af46760711015d80662a94f04d018604a867a1ffb34a4bef1afe4bd3d5ed2d564025efdc92a625e035b6dfb080040eb1c0aaa4ea7b725c045e8e03fc75e1451f7cd564601b7971642b83cf198f3c7cffb2d9a682b2301f34abbeea2c43102b48df0f6cb48f08814e5934eee581b6d294ed50df7d1c7bdde7d35894b75b15b4e8193e454fc01ba6839d12a6cd2bcc4702b0866e1a684d04fe26075af0d1a124f1b5bada178f6e617e4d2aa113729dd4da56ada37eabaecda1d2a27d887954f8271e6623bc66695795cad5ee678adc7a80178ff9504fb4daff2f5208039ac8fc8a3156cca9939d9de54d57b922024f1e5eb72a3a17c90f7c994088e2a83b548f246db8f7bfdc59e998523e8da0eddfebc1a96492dda297ceb6d0c3bc4cca4b1d8671eee2a65d90df8157a3b665a264937fb1dd472adae7cc27bc52b71f056b15e5a8f219334b1f0500fde9d89e7c7e1aed576ac7144f93331f448c39b9720fe16958e6d3df0578a877551ddbbeed4696e56ce46fbf449f982c3315f487ef372324ea6b3b240d29c182bf6a0366d9b83942eb536dcd9e81d89a9f5008591229a28892311ce908ad2928f667efd0f60aadd340c9e949482849f5b4727906e120d7c29af68df60f71083093b4db327acd527c3fee5c61b429bb8a7172915d07d84c6b1d8d3a0a69a57e84787cf4ee9db0202890c8c21eb5adceaa37c88e44f83b0b48ded61a01b6b4d2201332ef24e5bae03aca99d812440b51de74c218d0a20f5a1d97bab5a98ef312550957850c040e600d842b0840681017a9ab1ff79ef0b2df83759b76827d677ad55b68c99eb1b56dad55856d23a7c7845eb767a925767817c1eb27ed94dae84c9514758c0d39a7d0f63c5ace2cac026eca38ee3a9861729d3f92b6f8d5ba706f9461a27c6981edaa21ba0f17cc6a3c66511e921f2759b04defc20a27cc54ecc46b4ce06d1865155ac1197390e526c3a9cb0a55f2371225fbfcfc0509e66f0e7f60e5660d380b8660d8a516eb606cdca0a5debc489c05c6f99ec0384645ae0016a47cf93f581d8dcc0e4611eef3232701f5b1fad886a6cc7dfdc13ed6eb80299cd29f8eeb12f9ef63287dd8e4cb798d20d8909760f5e164666a1a69a46e2a9f8d56d6793869b3dc9c746229beb30f347c7e03db74763a35ffddb71e63fe665c4e9a266777d4469832fa3508550c36302f72819e3857895abf364cc4ee6b983c57a020595e931c5988906e205215332b4f6d7aff534ccc99478b9d1aa51c82e896ca6f2c5491c69363853bb4c5b1935ef63adc5b983c41ad2fb7eac8a2aea6ca1a8190a62c69435b3bd39aa98467f85829100d92af38e575b43a06709d6dce70e113138176b89ac9c6f4a8da28287120077e3398fc330b80184441da22c1558b592871a9deb531be9b0faad0cbdd01ec406b6c04407d48d3e6b4ff123c61baa3f3fb2bea20a5e7545895e3afc5769e0359d837793faaec7d438e76aee5958fb6cb5e30cad2eb01a14362a869cfa62afcd295df2d963a27f912848b76e544241240fbec023285de29de15895dd07d53be055b074e951ef331321e27c2e6f3e7b35f0beb6b05e26789d08ba2f3e4a72fdb842cdf70a42caaccf386db17fee86c31379c2393a0fafb246df20a2c4977f39febe685439ecc5073a4d4e42665ec3bf9ea3e09a01f4ca1854ae9d70d53f7b77f757fcc1ce36a210d256fdfb7e2f169d183eeb25ddce5c29e35201992b6d0d76cb97cf7f26b34ddfdced28fb4fadcef3b3806a0ab315375142a77fd18c47b1a3b1b155b1628d2062780a361269fed71f150be459f9b6f14a43ed4b6c33763a1b697f45637c7715d5bca0aed237774847f0359fb12ae996691df0fc98455d6111cc04c29cbdd5de6c2d91c58f3ed9eb25d312854d7464ec58048b165e4aead42488230fd996186e719d909d1e0b8e12fbd21f0eee03a03d2d97c1aac54f781a0b55a66bbdbf61ae481de8dc87a02bf2d79ccb73b2bf110363d8388615ccf7027a6766c141a7a4f4d002f4e1d6207a4cedbec23f6edd849dbaacdb155f7589b9196079bf787ae5d453e411677e0c0a620407ce1ca8c9425c651dc1702b31f1a7571783d3597c8d60db76629f224f726e7bc31c3ac6fad7d8136f406d107865768ff0a5741e37523cad4ff4287f89767909d22c2429122887b2401f62fc5e5a924aae6242cf0b7d58c0c9c66e518c5d00941258046c5699d0f82686622460365f6ddf6deefdb3ee3bfb1b7e1a6378fd6bef95de80272f9c95f3f92c4322cb1718fd85e8b111dba48959b4cb27d1a71e72faf111aefcfa5ee1a912054dfe47ef656f4e1c68a5b79ab02b5c16849cf8281851973349930d1e6391fd1db6eb012122bbd29c4ec8ce1f40bb573fc68c96acd83f2183371e315fd6ce34ec3d4bdf4b522eccde44af91722912959c38ce60cd5cc0d77d6d2e5ff28b8bc75ec3da6b89427720ec4279840390477cbe8f527ace4b3372ebdf4dd6155cbcbee39f15bfec370646e95ead95763e22debe770abc06028c0424f2a1c10891d3f76db173a11fee89d0cd44cf4a470cc5eafa4a39e444dc8bceb276a340c928dd01b2360a0449e794d06e2d7cbe2df1a29675b7e03322b4a90d9678146b96015cc0211b4af457fb8f92463f1e54f27aacd49a264ca17547e6c485a9fdf44bb4971e70102802e2363ab46872edca3aba540cac83127b15310b061ff7ba4dc53abe47e45a495f679d96056454d7718796beae94b252fb14c34722cf7920e0254daebedc7f46a4ded07a4558a39dc87b3405a71701bd0349bd27845313f3c4129b6061953b59e35f7ed96c92288c4aed1e96f18a1926afd0632ad693e78d449a78b1b98ccbcca4fb58200e3e5dd59a8cf89321d9c49d09b1c524f42a4eec7a4f9eeb6d64ca1292aa0f97b58c77d115916dee29d8f49565e6f10f488d2cb4306854dc6d3bd4a4d2cd9ee364dec6e487e41df022d580b1143f7eae9266f924187c22f9389212aca7c38386ea4de3b3bff14fcc8ad4086fb2ff6cb9d3a1dac0390eda4036f28eb576302612d73af84ba8bad14901f64b733bc7c101dacc04fbbdcc336732fabe50c20cd9735af0a5bae753cdd30fc10fed696c12c5818dd666e22b1a1a6f6c53ce1c3e5a74c908186c7fb0ddf739b0419e162c1016c9ab92604377184c422ea604e61b4b207893dfc41f36185ba487e08dfd0684fa51f1432cfefb09949b3ebff6a75ab75b7487ac38ae833800ebc080d575e56c3a99e1b9714f9f15707dd20f4a112cf773ed9576459428e7be85cf8b99d365d697888adf98f889df027756155df76db100b2cf8f87e20023ce89d90caa596d1870233c2d30eea802bc68f85c8b864b1978ce4a408256ac434ece96d468ad76331f4df49b5b8615919cc13d9e13f1581acd1509bcc5948e6bd3d9f0bbeaa2172dfdfd74cb490d8a5aade914d47cf159df246a3cd5b6700a2f8a1add5890544f9aa7e9dbec3b9978d76a468a54f10ae24c589f1b44d3bb26db2523f618c615933e3cb8e0b9f53252fb45d4a7ef0abb2fdef0a8d5e7aa281083b8d635590d8534208571c30440a1ef668b9915ed5bb07488d39c64513ebf6f19e73c6321c8a93aa6fb899b3fa60aa2a347234d065817afd563c49af3561ea1fefa3776476b64fca2ff0d3c61be3c9d86e5d32243c55753ad692251b80f8b7a3fa4803c40f04fb2e58e182595f63b5b8f3e3f07e773c6eab6bfb976befb844e5ff2eeda5aa7732dfd088f1486cbd5ac12b3264740689a97e201a96b8d84c3cd5f2ceddce6f1bcaa5e8bded5c52f1174d5adf39bf62ba07d8f2e01287802b20f1c7ed3c0a96be0a6be65c4bd5fd5cbb02d2f0f5bb53f3764a2f9d77934f9f607d6ef7d2f85f6221ba3a068cc424484fd0896678b218205f86b197beead27f9d2971b85b33a3f3eee2c5368c1707e673afcf6a705a3543ca6fbabf1175f10d249a71fc0518290011786d3446a189a0ddd56b1f57eb3e0771f37552c396c15d942ff97ba53e6709411278cb91a1f8cda24abc70b06da40b8c56ae48a679c542acbd91bc45afce4ab11626a1de3ad5fd82e5462d06d305cd6acaba3fa43aa8adee045f4bf4f58cee3e3593427c3eb6144656b62990eb937df9fac01906ad57994014e1449f07f70ba4e0dfa75014d9209a7acbb6b08095c9dc365b105c8e36fc5fcafa756a25a93a0e1325f96932e499a7c61982dfd936c697dfdd2f7a89ce17cb7667192f72470d7cbccf196304fe78afc7cede3afd83170093efc2abd08b66b382b0d39707993aa3ffe3f273ba1fef2bb02e3a61d553729ff7461cd7c518ee9dc27a3a8060fe530fb8d852ca20416101f87d7d7f6167ecce62fce7ba43ec240c31d946b6377e94472aa03cbd62493ed5821f8f57603c932a979fefc5121cdcece421396d48c54a7ea770ad41bf4121965c70683eab9dc72deaefedee47502b879c6b356a96a511f01995478bf560653a5793f40bba9dc9eaa9b7d829d7bbdb900fecffe2eeb643a667a3d0c5350e8a7d229c8cf38a6f3d22d4aeb1049eeb56d5f716a31edc8e6fd294c082c51dfe39cc96a1964956d0940d550c288761eb833dff06702fba8f52e81830b240cccec79c8540ec0f10b3fa3e1ed5132fe462c609858eb26ee98359463a70611c1242827848ecbe0e9787ae96c3cf50a3e00d13325451def9c29649ce21912cab4aa14069ece7efc78202a47dbf3bcb83c32a08186fa45da9e313fb9e28fabef6c14a89c09b55494e1d7b8276d964d58a42f7e04ec39a5a2de5af820e6b393c424e7ddc49f5d56d4a70103b7b8b2f86daf47f756b78f448a683f290053f9f1cd4811a2c5d4760796ce2bc8fc4d8c86a4c9e13b090d754bc7bd8d5a3703d2c43e38e1ff5c3f68198cd40caf5be2c3b7a7b5c534d8c5a51f8d6d57e351511b90681b8dce1aab03d3c3a38ad20b3fe4f9638bf151317249660bf774959a9acdf434bc6eb61b8f9307589bb9b2645152e7150d25df639e787daa5c5c5073a5c0a16c7874c75529fa88a55b5aae6888062425956e1773e47283180d742b07190ca800aa213009ecdd9c7387f6e095ab4130d5404bf5ef37942dc89934a38668ad5443ba09379bc2115c4a5f358651493511958420cd266c8e2605713b87ed813fe9790b1f67a2cef85d65241eb98c5167f23975e9072a519707a91c4e3ce19b1a844ab88adaa2c6fb027b15a262438a1e64e65e4c523a17e0606f0b4ad6c787cc69aa4403c1e8e3b03b4c998f8da019ad50669e7cc4b393602ab4f8e61f62ad3e7f32a6859670e53c9ca50f34b48f22d74b0cddd15c996ecfd79e86157e477cb736df84b11e69219afc5b5f1b8dab3f2670fe6ea1c9402c81c71593d3ec5ea78004f98e7c362caca8b4984ae5d00379651e60ce84eef75c236098accb3f7a322a0471c1509a0f5118cce8c4443e2d28463460a8a14dee5d6519fbf643d3bde736df957fcd2a82c3973fe59a193d8a940102ae5bd05bde261e55cdafa08af9048dcac94843e238e00fe196b6da874718bbe27b104d48456fc7e89a39b95e45ee7d81059465ec6f8520e1e1a449144fe4eca594d51993a0195b7577f6d7a2884e827a79ff1f605b6e393ba2fea6766c5cc635380efff5e76aabb931052657448327eb34fc0e951f869dbfdaa86fdd3c2a4f0910290263c17ccc1900bb9436438e785110b83a77e5d5f5a007bddffb2ef489368de0e8b77553bebd58cf5f5bf94fe0829af9f7b41682325fe0d95889645a0d4319118e3dfb18901d714dd5512c4f6b4d509fa8ae749cfd489cf67057e105dd1cf11cf6faac7972994bab00213b7ad26a2f240cb92bfc0d790da2b1779812854f600b80aabbc1ac3e6521439c766cb66e0468df5fb02f6d568dea4efbbe1a3cc2e8dc6d32ffbafe1205a43654c00a9de7109702dfe8ddbe065f392c9d8491275cb8ce48598c46ffad91792142c4eeb7813e4b23e74d5740613cae3ed25095eba0a05aba4a4609e6ba5d4f269f5776d5b0ba589bbc3a5988043b99bd315fe12ed06d0aa5c4c0d889d8b0f030d9b3e15242912982ff743385a500468f1f7354c528e9273519cf7a997e21ae6a837f2c3693e4227c979cc55b85de6a88e197b42e1e17cfe1dc095c26a4d7e0a5f93f84a5f785ff204f97169b49af9d2518e95f1cffdc56dd5abe3694b062223f3ff2741e041703d7c32aa77864a2be0532866ab662b3ddabb8eb2d0695e787ef650a0b61e3976976ac967688e38660eba78b1f1bb9adb6edaaf58442cac7b5c96d8f75fbd15764bca51d4857d0b03ae8bb20d8648513cef6ce85021f9b5c96308c32cabb2d94700e6e7e59cca8a14511c3913cf90ecce43b53b273bea9d8cf139570815ed7f58bd283d1368e774f910dc74e89b30b186d51508f38f0dab90279839c5157c655e55bd01902ec3fa212c9523d951e1478d9d5fe5a9e8c24987ba63be71347d1b76d5f12bcad1e0b0854aa97a5cdf676acaf95e3674f20638c7de560c9aec1586b89510d86c2c58ae79c904f35b9cde1928349e2885d9ca05a5ddd3c15c541b982c84e5003c2f67ef81ed9724360ab7ea5c77782f3d0b5f932770384847eadf3d0afaecb848030834e29723e6496703e281f2b4b686029d107233068ebc32be286d9119d601eb48a25bf5007bb34c4ac000fe5b58200b0bdcdd331255de3fbe629b2f3383ea1ffaf40bdd0a8658156f7b32b36c459b1dd2af901147b3039763568a11107f55de6ed280e94ced232ec358f1ad4f7d1e56dcbae0e0f3c2acd3532cb71854b4fbfd246d24a0f7999e74176e8590632de57a8cee20f11415cd4c206bb632d6181667556637677a387f5937c4ac00a34352ca8a4bb1ccf2576519dfa9404df87e1728d45fab947c669ad050f1f013b0b84200a937d3b46f0b75ac5f3fb4180058c7f7e1d2847b4907242e12a5db7591e08073dd000d5521de2955bde1d1fa1fad761d7756abf8bd62aca9867ef5225eef7732469d8b196be66be2727132e1434b4b1d3303a78e62f94369050310b6d9e38f3450f279fb4c2c24d3256ff1a99ddc20df227f5b9d971fe70f855a98d07ac5681e15079ef99f8ca53e5bcfcc7eaddd670f57fb4e99b701d7ad5e0128429b3e6d6389ee74e6d4f0139f92c4f3ce59d3c5d9423ddc08f91fbbdcae90e10e0117a5eaafc7c7f0d9c9e988de064bd51ba69c06f623a96903eab265e58bbe706c8f7e9df38d0ea5813f011f014ba62e7152e6295723b5a49b4a5839a3f55c75f6474c5f3068115ab0edb2f78aacd3e4bb060c9149927d2331f3646e2cad630c138ae3086d2d6ecab52d3822d55ee1697cfa7c62d3a66e9c6c38aa1d2b34fd52ca3e01d6922aea84d1b580924a4c52094cf8433c8558126204e2f7a5ea4a2342a03a9dd5af3b7b4430c00d63eb2f1a978e24a8b0a2fb67989e5e2fd463da5aea564d3f677eb382d34f9856c3de6b96991e12745ff217e36adebca67edea0815b6563254f0e1274ebba880a64de08eb92d5ffb197e01d7efabbd6fb63a3f1a61d0204f6bcbbf688b3f2b2e15e2550e954a0f47fa54f717125f01146b29b3bcb33cdff2280096f3fe2dedf0fc8165d3b607b412eb8ce3ee41cce9557b4dbd142ea6d36a2849a41ae9c86e216cedd67a1224605dd80c0ba7df401be558eb27a1f6a6c6917edddfa4580a0a6ed8123f4914f9be3aa7d5850ac9f5c29fdd4540877770d1c5ca67ead4b2b932a31f10440d0f5121b2492678dc5260eac49447f2b34582135e365f9fe98da88e6d0f2dcaf1e35500767ebfb7bcef7e73f23823e360af54ebedaccad35f01cb1ec34262ecb61808e3f4854021a40bd0aea7f71d5b0b71ef54d08b1a187dc45054628989bd41ee5160f5c4be8cad66b8ee1920844aceb65b4df9ee188dd2ffcde6bd6dab67e12d84359f87a4842e5761bbd3626aea2214e921f6e20c7f7765ece7362c6470438339243db74a868c857b113324c96bd843211ca9fb9e78247ad814b8dcf2fc3179bf4f57d51e86f19e0fb73f2a4da41534ab2697256b68578485429992d2091e54821a6d054ae7c81673df1793e1723a30ca8d8c7760fb7ecbba5167efb4eccdcdbe63f925a9ab2c78260260bc2b3d0b78610f8b403340ae5af4d54416a72069971b2eeadc83578a5637aca28aa85038e1da44a8a68c9145962f5d29d4b7604621a5bae92845fb3fc5caf05c260a77594ebb501ed7b9b5558b6de91797c44a446735eec1efe0ae286ee4e01ce96c4a4c5aed2e2b75ba744cd754d9b45c4ca7b507b1827f897b66c08864a4176ff38285ead4f228e4a41e6a316594deb582f54ef9097baf40bd24f5185af04e4bf79763b8cdc010cbbd00c66d30b639cf9b4fa1e48ff77856147065b3ee34a85da07acd363236349279d6927662b45b0581b0facd6a0e1e199908bba63219fa3fac51dc16f9e93eebd99947d014ed7d48c7dc5980834fa391e7203cf18bea6d2ab2fa3647919bfdd817055dd13a31a5c0177c4e15d6567df4fe2ba186dbf5e6214254fb12dc7caf7b9c307e455be34f5926f04575eca84d5510435c2d5dfbea1d563dc477da4068f382747933a490445adf18dadbcb225c9fb5943601a84fb182fb802c2214df8b2812ab7e274d5edec27a49f219e86fa20b0f0a7c1d036ff415638dd3e8c7c4c84174023aab9940aba05e0eb2e305bdd3454398497c64926507c8fde8d2200dedf15a9038ed8b1c2bb8be6bf781527727e0374a5aa5ab8391edabcf4b2708588ffcd9d596065883254521c21f3a527cd2ceb7fa7681b1280c2fa5b34b7d36e86c69c0760fca56ef0fe3c14928c602a3ee508142c14b94f9eefbd2d19c7c244c6c897091fd8c7f348393193e9495722fe6c3b849ad391ce8477aba36f3e95d439519703fdaad7244d34f17ab7f50d4487164fc5823e042046c192532dc56ef097d570633e86c543f095a1a5a574db0e2337a0f8345efe10d902faea7539ed4dadd4bfd6f498d93d9f6eb75082e7795f793fa8ba83d03036f1d7e5997005408d69bdaec7d75ccccded599d50ac523fa47ea8aac66870409f7c9679ec97c62b222ca3772327d0757baeb45c959a399703e63126f1463ccc161bf388cb9e55ebe1141e1474eeb7e89e7f9aa3ea1f3e416950f49c692bd2f8fb80d5e5601eab0c62c4c34067fd0dde13879c5afa3f7c0fc7febf4705142cdea6afb2458d14a43b4984fcf03232f3d01b472bd875e89cb1853f6cd7703764579c891a783c2fcbe9b25eaa061613bde24ad9b9526bc8a53af66cb5459a96e96ab9ac55c3bbfb9256f51eff24fad2cdc6051880354d239204b2f4e896afc19ac44d58f22440b8657c9b427af41f0d1fe1f14ecf9811c28e1fba493835dd45d75eab1f3b6880671ad17d502757e54544da3d66192707e5ef3c692b75d0acdc82c68a02bfb0866430e7e0023bc885d3e96c12c8295a914823decfc4feb64c8fbb2cec2f1086fee1c24cfa65c4d69e0b0eb741d92ab00da3bfd1127357ece2b3835389a91eb169741a8d4b50cf53008792f6858b7c6d6b4341b91781eb265a618ea691e4da9a132a6618f62422a9f7eade2b7dd38ec53c61cc5ac1094b2a6606c3f93cb745b921871f49a404b00cd83df354276a91b30bc5d8e115572a7bf029be5144732f393928581846858e6acb501992ddc3ae311f8a68a6c11a507e7991e76b76426f9255528477b0befab2421480cf7a0e600352b867bdcbe83aea066278367417bafb8d65d2e61eb869a5bc505b59f22c0c6698f9ad72f89702eb9a29c5c581a35ac1ce485c6fcc89720187e38db4492e87c29155dbc87850521b98b140bc603ca7c49545e191b3cd67972cc35a039bdebcf98d681b76f875d05e68bac76972bcfbcd79a27e669155fe30cf927675ace29b2ec6ff6bc0fd862b93f0f75dc4d57dd2701183211ac4a6f0954aaad2b9828e4a42179d31363992ec708f9c552df5f0ff7d241d42e01a747441bff2934e9be342b61fb9099ad8e52fa32405c2d2da77d2dccf94251e193a2c47ba4df4c25dd97d54449e96b81aaf3510c9838fc1d6c9c5f0e71265dc82652e39a2060fea7ad38c4f767ae99a5465272b33e57e9a575ef976c0a29f01b0fb23fa5775ec0e861ef9404ee99d86fd884b477be3e0ff5e82f06488beac54ab49a07c233c28960592e91c6a40942723b2924322ccce837ccbf590676e05d272d48184a96a89ec08e125a4969cc566fb6fbc2773d23b5a4551e017a19152a16f630f97ad25ed82594168f1ff3efd83b182b56f8497d3b46bbaa60a0511e4c4bc4ce1a625e03266aafd7a52550087b70853a8bcfc7a9faac27841924d4d798722268dfceb58226f296833ca946ccf7679542a1aab8b663e93eea6b63cb5c0f7a30132c002f2da169d8adc1a3e54f731b5b57be9367d5bff1866e28fe0077be4ce0adbb9961151be5c245afe6b7713b906ab386d10ade351600346f5202625fe07281c25e6612e03a74c18d5631fe27e77e92d4125af8222b4452b9797782a6f5972cab71e899397798e98edbd6b1781da1ca032d8a7453d999654a6600e23e4b49b173c8c1b41772baba9be9c638a41b1225767ac1fed33309e74376b49b66d5b6a0ecf1b5089ccfaf668521a7dd5333bd3e457d6302f44b311080f5ed9ac71b17e40f4f1ef3d27553ef176646661f3f64c449e47f4d45145420eb445df1a938cc9f37f4947d68ff840263ec1b3e59eabdcfccdcadeb40fcdd44d1ad5e486b831cdb9cd4e035d793a937855e0608016a12cd8692aa1526672d58f0feff762d7cce4a74d7089ba8932b2fea2bd69920534507485af83533a7ae926ce62f0da8da6db6753e9a9be6aeca219e969e11f0fa976d3a4fc1bfd7d260c0085a68bb42c240a62b1d5d17561a1cac965b07022a59f997897b4551a281500b66484e9f0972d5b153ed10cb93a4938f6a41984f0432cac4de3edf68b588afe11589ffe90aca53ee9b7c45fc55d155192a69e1ecb7ad41290155f425332cc81e49269955a89f5bdd8115b3b15c21dbcb3e96363d50d360fe30dca21b421dda0dbc2fd872367163d5cb3e36e94ae0d26e62f4961f2bb13c4eea8724738689b2e91b5ea3b4b47c2c2a08e609a3298ccc4121a3c5a0673226b79276b50fcfa1c757698c9989ba681f6be00751120a9e0cb44110f0d1b961fcc05e12bc41217e508a92df7574e54c45ba54ed1f75f7c4af874cceff87b482cd36626051074a7f1357f0fffe77dca7b07ed693f6ccd44a4f7b2a8f6a6dba1d76d922bef20765bb25f55cbdde482dd747d6581e2db155824d774c060c95f5d15410203eaa41d60edb0efd4649015c2dfa80ac3a9bd8bfd384f44e43989b66c0c47ec98c5e8b912df910f746986eb5f86fe355a59b7be32a22904c2e98b33dca37c2fa7f027eaf2f1fbf5509bb159a5b21fca9930cc88ba0e1d22f7667914543df7aaa48bba2141f2e83dac11b022aad016834d12b1606517ca03ff9690e41389e1e19b95dc3d25fba660380f9bbc4e4d2f9154a70d46958f50394555ea249037247677683851c257a9c4726fcf7eca86cad77e1393006471becc2b6858ca09691c031ef2c56af61c5b38cecac379c3376671302d38e90829d442564ff671113e6fc6f1c1cc7ce3726db6be1dee4ff4ec18a30fdf8139eb1456a6c613fd0decaf95b50b98574b1da7b2ff884340732bc3698b76ddbb6f1dbaf4fad20b2dfbcc51a7cb22ec2fd8ce2dc01728d423cd29f91ddc9655db91a1284d142c3b8508a4b6ba70066347bb42bd980d10a1e32eea75570b0d6f690fdf272d63294a8d0eaf657a4469f9b7a805cc10afe418cf3fe6460d0fc91ae716e90930f5284ec0dae13c65cecd5b6d833ee791b6fb5bfa611e0e7106b24ef9947e9301286d0f63ba10b8c4d14a9b761dc60c91df26f5f22b3facfc33c2e42494b63473b9818df4bda99f084d0442913b9fefe60adea0353397bdf6ca5a9bd789161865b4c71b55675e363392539b5ad04a071f603a06f210d9eb584b4ba246c35cf70ff240fc335eabdb5b2c9fc9a4cc450fbd7c4e617114edb77ba16c857d73d7040ce122f9cb30f5c54b5e6ce7f6a6513f653cf117d0a83589900f3ad011118f07ab93b5d764ac27365c4ba73f01a728eeecab14398fead23958d14e0b76eba6dc337e421a79a501e142ed7494528e8209f0559211698a2a262e17d8249ef977b4800b3c5d49073e782dd039da19166fc180dc46cf2adbac80d99b96fe834d1e7655ca481fda8225fd635f1119780bf80e386fb2289ff8975cbc92cd909faf62e5924d2df4d548c5cc3a076727241e17e50f10d24e02e3eed4a8ac468bf3be6de629d7a4606af3650c6b07c296712c57a89fdcff043e28c2466a8548eecdb66b48b8c093858ada91ec30f1565edabdfe6b4359e6e54da1331e1d34a636c60fdf0dee099977290c720d6df5c2838d15739f2cd7baf2fcf61f6ef4f3cf1446421ea58d3981bdbde7bd59168ef3137ef73a1a7335475921f39c093aa6bc613834d67aee24199f3ffcec1d58cdbf176d5af5ffe57a6fb928eb5e819160b18567adbb4484e21d2a766c77be55d4d01ddfa4256bbfbc293ca759a422d12eaaaaa512640e3381ab163975411f9410df89803fe18eb33019e78b6f0b56ac8678a743079e4498c843cc4c84bd2e2729206eb5f350c27a68cdf9e4563710b822a2e565ce2b9be08b68b3f05a911e9edb8ab0550eb888e3bee9d6e413afc7e1cf19b3dc5b75f4b1b3a77a2b850148ce6f30af6da788fd76e623e69e1be58942648e63d87986f458bbc3e709f21b85194d2fb8b6105c82757ccba4c52b4ede0695e7cc7bb2094786e26d80175221742b8ffaacaf309c0dbe7fc21d13cfeac19c2dcb02c56c9fbfdd2513fdb421d7f303c7af4be4229129088ffec30266a6a6d150591e7e1d2d700a3819ef2136ce438ee747af382367c1a7ee19f79df7816a3fca7a04d8303a499b29f9f2dae85a581a78e415587488bfbec93c2f4c4bd14b3ef1d2e6c5d0a1c3c0df3cab5db79a19b236e92ffaa4ef565e84cdde237db434a7ee10ba2b5abe0d55751ac812e14b6c2fbd0d937b0bf2a2d8d10a8a3be6a538258003813247124095b400aca55cb2c70955544cf8e4d41c8218571d27176b50a9984e1ae62decc933a38ed5ddf2f504f360f365a99de72bd4a925d51c69ae48ab02c52ade5c15cfb5e58696b59cfa61b9ed8763d450f29ab88480774ccb05e127ba974ef087dd88a9f470288992fabc1b559068e1b68eb684b1ef96f1fd9acecf7370c68328e56290e4c22eb77157f869b81108bd2bb827b49da92035adbbfa0f3847d9996182aaa3b4340927d7f1d18e39fc2e697849192f79fee1c8e580fe61e60ad9ee29599998ea47314e7e59a22a9230162ffc9573fc18313bc096b80fcb02bfb458f714120c471cdf8d3f631dcaea0ac789cb28824d43fecb30a5ab9b22e7317facc0a0c272a075fda5614b33e8608c33b40d93b3b1e076fc11b559dada64842c2212be0974a1da47b7e3370321c64f0e975a88850a7442b17728d391434236ef926b61689393fd65fee021bdc0569269416a4db7efad0a0c15abb7bcafacb486edad71954c771d2c794a0173b0150b97e0877aa6e89cd7cb4196297d4a4afff312341ef3fbed13b573030a4d04e85e9c890131754e6b8935b285f6fde5e8e58435ab5a643a4b8c69a40fdd8d90cfbc1c59c1b6ea9a6dad6a4a67289f0ec200d1ff94aec6ff1a998a632ff1d2865778427f5b3fa4194f83b46158bc261f6c83f22a04b43bd9e67f4db0ed4f5adb1b8b7f18b430670cb42fe85d27cb95c735b76d3c4eb042d68120df8a6a24c8424274e421bd9c28e6abde3c187f776405ae86be5854fb9aeed4736ccd3968a7352027092793096170cfee0faef59113ce3499d75bb8cde6e04a020e3f1ed60885f4984423de5697ce1e85e349691eead2bbbe75a099dd8b9d1011087317b90fdd4e50c91ad089b01fa30635b06bb21bf8a3b3f6d7b944c8659e5d5378049fd2a7cc34ae6ccf5552748f36f3691181df862d650ca2a1cc9568b901811a8977e0f6f5e713713b87f56cf11b52625f2223cd226e2d007cab685aa9ebc7cf4f4e6c79d868708f0e9f7869f0ae09116b0b6454d4b446303a7d04cda2a6062dcea44501d414fd2fd7625a9a7e85dbd405ad9912127993d9870e33ea76e2b604987ffedf0e14ebdc9666b964867f09752185bdf6651ee199cc54846c8aa66bef497b44737871a436beec27d8101071ff5b54e941f0e2b8151456702900554f77bd9ab5ab96eb57d98e8782c99e38d49e953ccf63b4766dea02058a91007d7fd48bf4f7efeb9d800e51fb87dbced2ff86d2e11d71c82cba09338e7300a65c4d78200d81b7955dca360e334950c821f631f4f2f27a632948e78e9cbd43b05af4711645c22d112307da6d63d6d178f3715316595f4aed36d6c81091486d4e7d9b59c847eb46c0fea4c025e9b7bebbf1c44d704cb29188936186db868a000e7763562278eb487ecfe2630f5bf11a69bce54d5bd3af64dbdff624fb1fa98a8ebd6bf2777cb56555e67113c2e3b5712c833d49670bd262b22b25072ce7e8f5f009a1a1500a09fc8670dda15ce24cae2a0686e807cc2b8319aaf348029c6397e3325c70f45624d438a2e76ece936c29565610a71a531fc92a48f3a9946c265bda457dbd4627ff498bf9f04e18b1b6bb90a57876463ad9cddbf6c839ef8d82a8b065c4b0a0864fc62ba961fafd7157f156494a0d7ac14d6ff828cdb27cb5bbee7cf8b083f397ce4ac20c1b64421df0a141077ac32c7e861eaca1c2235ad4e17676196a856f7f649ff5fd11a1c48cdc156bae8fe46467fbdbe21914c94730d2cdf4c87a763bfff4f87fe2e7288f6a3e537f04f6fa843cd05263864a1693d8ee8e51226b39552aa5314bb88a8ee03fee6bab9d1f1db581bbf3fdf347c91118941f712b68f400fd83e4a6ee7631a81bab1455f3e97ed4db85af3de4da81ee9d1d51b8a7ed1d9c59bd26c598d30b575b9509c22a48a6cda63d859d56c126055bb4ee78a28db89ddf34bb494e442830402bda72abf630b9c1ad07af59217dda3402d3bf36df6b957af7a39f178335196fea3ab682d07c58f29f59a2235411158c40644c22e70f18dc6627d776499e2464752491008e94932c274c685b4f3e0cb918bd62d1ce027cab44fd5a237d63e776fd833e7e0c9ba1e00c264bab8bd4ce8dd3ee441bdc0052298bf26d306a7fdcd7bf85fd5dda50c0bfc5cf58f3ab54ac4512d5370db1c17ac79de84a156bf174cd3bad5e1249e6632ea8344243c5f949fa9bd65e7ec7fca7a6d0c4693fe4480dc75b8dc8a48da2723a9b2d0baf4a7b3076185018706d3a57fcbd1b85b187c7e1460f49bddbc752e05267be83eac095124a210ce94888791a41591f5e0ed818d908afbbd97ea43252e766074d6a8aa4ecf934d8a8250831cea90ca5a33ea843e67bf3e23bca36e83414d021cb8bc009e55f372b1c95b7eba39018f4374b982b40f2a22477f60e35ee868428d8e3fe607a588bfd7dc515252f5cc30d162245c54c05861a1e9ef7d5bed87c72633a36d1a06d4c5fdfb23a5bc3600810693f9d1d3d0ab71752fd10b8029d72f8a469d42808b3c5033c300eaf53c62688997e2f7bc8541236ab184a8f6164106b8f428384e8e1e4ef7961b153e3385e7c06b5b5136e5016a6f8a5098b0fd9f5318a3181df5a24c0816dd1fd23bac8b8780de818c8afd57967d0ce4273fdf6895061760822db25a5a866b1116b51f76ff68cd4a757d8e14dbc486d8d7337caefbeb6cd67238da9aa8eaad1a549907b396d9e42b174d33bac895dd7f23612a2141cad85db25c7e850624a4b39c3877847dab79456c6993563c19b3448d835de2a08c374d077bdc704617bfad60539994b2a71d1b50d3302bbb4e7ba37f99fdef254ecf8427479cc8bd98d85d66befae7c1caa69eacaf9f79149dcde6d9e9e8a781d853dce55c5d68531bf3247b4236766a2ed1294feb5c0445a29e9986401876e8c0e1784432c2a685456d8c638a22e8aaa498f52c020b0c9673267c12dacd7498215dee0fa0358762fff7774584cd99513916381ef194e53be95cf394ebf5aa921a60cb7d31ba3523b35037e3d6be3709c9da5fd465bdfc2ef189f7ad953ec64001c6523a94ac250344ed2452e035f0e604fb22ccbcc507f551412a67605cb7bfecf05b5bb41d070cf3ae9c30330000b42fff92aea26f4d550688d3bdfdf06f0136144460b70689c0d2c79fa568c8b991b83fd7784b304678320fd44d8cfc1d2f67ad5bb1ba41666d230ee66db8b8b6ecb4cb504abe2c7e2d081f2782db498e85a996b31cd328198cf8593f9ea717d7a391201931d6419265b78c29d44e4534b0dd6b01ac60ba8268de65b9157dd1a9e9ff6f2ead738a46ec7728d364b5995e0433f6202c03df8589a7f7af5a75f966df176ebd25cb04c38c528f36712b94c3e35dd17156244fb41c83630bc2b292126817c92d33b90d9c00c56145611d86acb97c572e0a4eec4128ee4f3f40e4c1dc9b985d9f2894f9bb5cf096afc5069b08128a701b3b254ed07bedc507b65212d19b6dd6ebd154346717880a67fb0144b2be43e6563061bb109aae5f1e6f823f05e80214c0eb72e32bda954bd026d813db12a613bfaa3718299b3c9a32fdd60c03c4b40f0fbb9d7522d820599f2a78ffe351e0538548c18c8643b29c0ea998d7a36fa3d77113150363a32b28ca50cf6d98fd8afd8d2472213b84d2ae6ab9982c0c78b341dcb505c7482cae345521631406dfc6fb0369b2de76475a5123d25aef0b8ea8bf301fedb8cbd50696c17f90b6e4ab77870d1b7c432e356f0f2f3221561f63c701e6b0d581da50e507b6380a04f7ddcd4093989289e072726750259a0033ff89cc1a2e8c491f26cb622b55e5d1c8e29af713f55feec706ce3092f4f9ecfa999dbc065cb9f6329eef04215abd61c570870e6a2f052fd6ea8b8e2a0d1050d04fa3eae01c47c086804642b0ef2157ad979f4fbb2a685f3a83199159a5a94b57ec7eef1019c303421a099b086d2f5727e43df0b3b05b21a5b339eaca6e1b0be72866b09842ee523917c240154317e1d496566a8f9d4099a522a395bab32b642800040dde064ab2da2544757c1a48e867f34cec63d6b1182b0d2f3464fe41bb28cf83e29936f9bfc26cadb7c6694a36ca742e4a7632139f2e840516d3c725fffbef9effb4feedce09bc98748e4d64c3277ad553198cd80f1dc99e5393e2b9c5bbb6029c91caffa0cd9b8f41d463023f373f5997855e0c433025508b2166997b645be1c33f6b2aa61c09aeb189015628e83807fcdfd51438a885a3832c70494472fbc9721d799e081dcc7c4df9fd206eabd1ec66e41b115e7bdb28b34e99ed02802fd849058290639e9ce1db4787ca935e03810361993cc0f015b03120f52130f5065977903b28b53c9fbb513a2c3a7f2c19597d26c61ea0f630a4c8740e8e09537a0e7bdd96a0ad824fbae4385210af60e659f70952293c4a900dc4d002ab8045d86d065b704eda045a8bd7c5adc09ec6e38525efe645ef42ed98c82e1f78eaf81a62a019fd98c97a8c60aa34bd3145d9b580442e6bf73a7d08224d29de5a14ea8d50c35cee28df62cb1a749e63a9a2777124e34513658e426c9a0a49cf8e68ce43fb4404326afcd979a702bb5466803f24ddf00d6bfa561adf5c32c85e4200a707fc54ae1df6fc82d9d8c7b73081f59ee4f57af55d3c54202e99d24038d85749c2c82a5f040a304017eebc4b87ef81e9dc1ec1baebb363470dbb9cf0244a8d50cbe41263a3a64cdf0d7760ef860c45c349b78aa70c45ac419fe9f92b58f7db2fc805636d1fc068ddb857ea31579ab7c4e3edd7390de84cf8c65375cf72bd75282ee8f476a932fc6d619961524d39b3b7f12c660724dd148ff83cc354d63c036123d43163ebefb6ebfdbfc5c80894d38872c8005cfea322d68072d79378623dc9af580c811cfbcfa9f3f4f19109a339a995514b8f205889195b9a8da5b205d6139351dfc5da6b992440c7d67bd5c7b3dd27e15eacf9c39fb707b697ad59c0a730e9fda4586d19a2113b999c5ab65bdd4fa56c920b67993a2fcf673cc867d7c605d9ec80bc24d60128692d1878f996a89cdcc47dcbf73710b4caeefce80ff2650ca32b1f6a38a1dc26b05ff2f64ce3860e50e6c5b8822011ad3687d36e2542008fdf31e98a0e2657b581992febc3cccd0e8bdefba15dd2bfaa640b368e6f076124c2b3f14cc6108b789ffcd78a5a008b98a4eaaaf6a6ede6d4cb05dab4f115f83689f209ddfbb2154771d0842de50f63f0ef1ec6ca0e3f54c9da7c04b5032b288e12d050527131b8d588777e9998563dd1627a2c4acb85c1a4aa15dfe85c2e5ac568fe1708defed3277f72d74a75dbeb8d50cde25bce8361271b31d6113e5100e0f24e0c44971661ce8921b80942e5fecbf0848cf1304e1e86f854dc3f86a59e5448534b5447743de4c63bf68a2158972a417ecc69b5f1e53069b769a67890c1d7f7872e008f2e631473404005983d3eb5d979c431652e33bad7d3bb8c48903aaa48bc4e7fcb8cb96b4c283d1c81bc4264a9ac8e9f1a4f2dbff90a2020bf652aa07d6c135623fb837c37f8492bc76f3fcd5b912d43fa9cadf88b30b8c98664bb16935b08025d6831da3d2e171149905f2dd8c422acdb425f3ec804125f41a1bc194d83ac4525731e0f8c73a37677cdaf27a61931c74da9ea1d994b7317b8beefab1d5e3b0e71417afe18259dcded15cefc9e9ee46e86cdfeac4cf749bb4360fbdce22af14acd40cd53f0e2ac62b886cd08b895f29915d9b3a559b2d5586905bd6866564d04e1abdd0f67c5f4b0f86ac037d3590b18aef21f95b6ff02d74d06c90330197929743f7ec7370960c61991df346743c33f25a8ac3c3680fd1dbb67fcdbc7d5b600c1c5ea4ef018d05d0b2b81eaf3479d28978e9eb6685072133ece869682cd6a2c686f3f95c79f0b4f4084b3d9fa2afe266a41808795a26794a09f445d80c77df4255e388494cf8d544787ab2b7539a4cd8574e825f1d352f2a3c89c7922a24b4123bfa86e57240f3da928069db81c09cb1c4a7b47e8c6fc418b6c48e51f873d09b66f2fefcf3c9df4affae14e2379a40c20b13becbbb257eb17598d645c5e3c4478580b3e97cbe67a8d021a60286f46dfc0002cfe2234937204def042c8c33413b44e087133f3fd25caa70c3cc53af07f57b8a269c495dc9ecea48ce87413ae6c143b5b3faf7002fe361a3524f8814ad7f3d3cc2e0470321116da6101a7d060db37e356ff5f470fa67f5104b63291d91c20cc0a085140e3d7e7d04c3315e17876e95334c71dc279afa1b40937e0f2695bba3f53ae03aea628dfd6e04d8a47dfdd8fa31083b19e19552d73cb50be0dfd3a0e335a38d05f48bb934ae6d01801481f0f9edd9deee9b953d62cbfc4ad68944a7d6cd22fec900066df53652606523fa40cc95409e8d921b19dac13a5d5760596ba70164a4e5ae2d444d0ef28ff137fa3bfa724ab14ea3c3ac49e3759e9ed22e95ff885364bf196cf6fe66495c29492cf4a0b27283e3cac84f34a965ad760a2c96703fb61b738cd13d41276b4120c2a9be22b0476f62585de838f2ae77c2ae31d367c4eede62f1d504cc375eccdba968bed5c781d7f54c854ec1b5f5c6d9231f61d69c8d1ca1c7dbe894ea3eb31299737f42bae33eeeb79d6875a250b3b0c6491a0d48f01b3b9e9ab305d8f9d54e61712b35059903b9939588d688c65ae874504bd30c63571044d46673ce9ed46df796f3f378be1c0748e48fdf969ca4961b277686aeaed6a00a4c0eaa96f66c6891ffcf7c1afe16d6ccc76cf3fab74982632f0eec13196643528b99d28d8e18763e718e23020e1a8e6686dbd75a339d9044e518e049a8fe43d0a2e98c0c65fe7da789f55326875df65322f64558977976df3306b7f4e53df267906bb821097be9068775155f834519d8954be7c3c5f1cb8a9ff0bd6dcc864700f009e71f9b8852c052e9489e1d99a20ead0789feddf6f95f6a52b235f058323c00e331fa764389d311c7b9d24af7943b68a65388e06bab11db4427dd2d777cc58c323d35789a05eff619dfd88a9d02c6e8b58829efd47a424ec739855b73670e59d74ef53977bf324be8962ffb228b8fdea05e1562d5fd9e02e6927ab81657b92d09f1c190009a31702685616c1d5908612c2c1e715c2f59af771453740e11fba9f1b93724dd6d70fa2ff825fce34446227537520d8c8737db4354ffc5a5f5f99f54aca99f0e1490db6eea28a9f8726809b8cb021e55fd6e7b296db21112d18edf34a9951e232e3469d73722de5007e5cb648b21efd67ca24518d86577c797b6a5a3166d762525dcf7db369151235443f40629fbc5453b6356e1b78ec76af0108fcbe751e530f2b5a5f14b5f0250365c4802a7eaaa9f6e105887e62e23af843550533535041878cc89a886653aee1f20cf85b15b945d2e5fb2b47634da3cadb3ed0fd99cc238d15d2f508934b78cefe1ae18545e94a4809963fe3b66c1c27413f45b142a8e8a18c854e56a962a8c34093613fc44c0d116428c4cefdc8b16937e5129971ba79aa63686cc020882597dc5c3cb6422da4e283602cbe63993960f057a07d1f1924500b0d7bb9571344ff4a104329f41340b7928a8c91c0d6eaa35902057b60722b6701bead58b21455a366dafb18dcfd5e9864535291e31100e8552820fb2a28de7d546f118c53a388cad843a13816612f7113a9c153ecca7c1b930e5df793663a416078b015ae55b3837b099403c58e67306a6111818600ec2dded362699cb663804b00e9dd4668d7882d65b0f9fa7c918371bbafa216b3086af6b085a32a12005553e8ce414ae20125563e5ce1cff274f6500b87b27dcb71d0667c202344950be685032c6c653276565213c9f91c90de7ca4a9f287993f47b9a52c421489f3dc6e1253c5824e8d012739cd26b981e8c7ead61e168d20865c7319699f8073a424695fda243bd1d70dbd09732050185c2a8e5ac0e1d67aeee5b50711080123dad991a3ff171463905fbf16601afc873569821fd0e821a5b736d0320181948d820f914caaba5f5334c4483938b24f650835d4c2a1c605a255875bf4f9f9e10f0e27a2b8e6246122f8e10110fd91bbe028526bf703cceab8e9e23bfe24c9211263d2c348756e82999e8570f3435029da4888a2ad6e950a3a1170e207be2b12d3fcbb8946ce168ca07956ecc3c2c3d5c2491321ca592e650a12b193077d7b95f5f8f9e3ae1cb5a6a45c9f324b8cba0ee309aacc56237f276017444757c8994134be4779dfbc3f7102edf953e6155d2847353b8dffe68f337d62d4f918ae9b22cabf128b8b7df1f1e40afa0329a66c96af8b9a047a7f9f8cf192dd89bafb8c23cfc17abf3abe898fbca567f6df3d29b4a0094c4113aa79ac991008ebce15f72875aa302681ce4295ce09e887d1b1ef2012ca5f633d7b946d7cd51e0d0944a8946c20af13f7f572baba46eb8160a792b1ef796d204fc357d4aa2c14e0540ec282cccf35c515f092220725c13f05711516a2dc5f88a5ec3dbe8034bb9ce2f10a6b12cfbb0a4ed5da347bfeae97f9f23d2660380dc50d8a2f6b8b61615543bb07d8dcdfb33244279e0e7065cc0ba65c09501e9a1057fe466655d041ae264b05c1fa2ecc831c1d4d4a135cd3e981c2e9b040fee88966e06442c392fb82be3acb37f1a0452987638b8aa24589aa8727e4122b80e9c45d254a013371281769d2c9d6b600939200d1023c210e25983dd3729e194ca3ec769fffcab26cbd3f775b6ba901e3c129cb35db8f80ba139508970e83cbcc889fd458efd426bff4a6551fd7349ffb1c763f99b5421114b7018cebcc7f6810d78726f4e4b3d607d1c91c9ee5d8241eb20793ce2d80296ce00fa585f2b6def2dac7e67a66840f03002bffdfa6e9b0a46939ac49c557061d309694f124af88cbc928fb50a9da336848e29fc70e03579105746d49bda750ec2588dcf2fef98c9ef95ada64e4441ae536cd85804b50ef447368a2ceab34e5ca4f4217b5a32e9e8a463886d4f8db5edfe558f748762e1d2f62f95d0ab6462971fc57f6a4e4af283b63b90078f524ff9135a3c7e2137112c6b5d545015332d94c04d125ecfa906952bedccc3967fab18550a46eed75a849448a569e76212aa9b452b7777e95e541dea5ad209ecec71b57e206c548a42e63c504b6aeba243374d7c57bc3d5eda35bf6ef9103805212ae7343cb2d489bce6a7d79eeebd901fc8a284c98635fb968ad312a8d76ace036aa349164da8073f892ac649111ccd80dbc03740919b265a601057100a1a0c1d4e3017691d29e10e02b19bac33045713b4a2602f1a7c1263f21356e976ec09eb8798e96e60f7aa4969b1ee58c63c84983757d1755b6ea20895e504c0d1ff665ccffe50e57f46a5db4e5eb58d0d478eb27d094b41632631e779227a5d4b8ab97f953374388ff4f79e68e67fb4d3ed9a7666474ab905ce1a0e1c593a78a1a602b9198795baa9cc38e7450f1a27e548c6b21e9236daa74fd563f9d0f03a2e147127ff981de19befa5e5eed79d8d5a1447cf824d4c750ccf1f1b4fa55ae21c9141f8eb3c369e967b6b52704731a4b88eebda65d8154dfe34d3caedbd6ef326bb2288639024a573ec21c1b05f1caed3fd8455022f7dc686296e47b5481fca8b4022f6a3ae290e1a00215ff03bf9037bc4a2f3ecd43608cb2259296b8b76f59043933169f223f2040890d6329426ba8ea05061f29c974eb031281098f7a82a08bacccb177bee35d06e3cc63aaa50606794b044f357cd36227396ccbd07c3988053cc5ad02a0508b17f6724a55cc34a77d59ea6ced8851a0bee772e287236a35fb57cf662cb2ad3851cc299796432f32086fa76bfd4198ea990bfa79056d94403aea09fa34cd628587ecf942e8a1b11656e8117a532088875227e72b34c3fcbf0b24c27c5e9967571f619f0bbb7c010717dd4c42f74c045af1d2a84b463fe19c7fe3197d17ab25bac0d6094452ee8e26935950c110bd98c9a20fec618f446a19aa26808533d948edfe339838accb7c28fa371fffd3fb03f46217c02a7373b21c76af65f4670de5e1f31c1a8a2584c4e42dea937022a9de99c6195afa8672f37bfabdd1719fc3b4dc21965d29de6786d5d012fc1eb81207956537a129f354f1e438805817cfc81a059a5457020cd304304069aa6ff79353714059e4bbd7a04c1a0f4899714898260ffcf5930253b1f6f8e23e625b3cc30ae6e3ba0f524bc52a2fdd539a35cfb8495a5743cc17d4d0d44d2cdd04a35261b3e912fd2128e8a4c126d470e52545a5ef4a47498a2170dae4d7752d3ab370b2dbaec3ea04d419232c6cdd26e3dd3f4b06b29e97487ed09c62e29c7375d04f7efa841920c327bf3b23023fedc236ab48a1a1ce26466ca15741b210f8202a2758699a58aad8bdeb8d109fba46df3129425dcbb383c6c534b70ba3ce02db3926507673d4377a90c3ba2767daac47b5699cc709a7ccf7048bc5cae79750b72f9168af5064c31cdda636b1483c6c040e716846688c39d87610c2dd6555a26548f0ec8a597912815eaeeff90f27932c79920cc02511a849c06e7c6e04fd4e6782dc0a6e653986fe0980396530fc03ee93a065a56a450210fd322162496f71958cfaddf22844a74a26e87625d1a58e795424d3f226cafb82bfccc0e11d3559f370aabf18fa931c937a4e55e46d837cdd83299fe2ce0304dfbd3b74ba890e77731978743f91a26364e3857ca378199f32bf1e167381d6f11fb6a7ef7116317f1171ae473d66f46ec9b61fa75358ca7f02b7bad686e8d8754872ff862e33615f350a676f5ac006ad880b9e8f916961dfbe6b67027e5f05cbd121423f50f462aa34463bb345dcbddfc24da52a32fd268a2b01a7050d531423213d9fdc261621d6ca397536ff1db774c0f695ef9e83fffb7d258c85de9e68aee2fbe1b9f17a81f1d30dd968a99aa6767cae0a96f3d9b279a401d476fac828ab5121543966744a0458cfe3f786e545afaa5fc94dbefc990198e8cc07a2abd493fb490ce899e95b755f1a07f73dea56b08ecce71d529a419280c8eae73619ab1e048e8f36b7c91b22bfef43fcf857fced694561c33ff3e0d803d964ca55486a92a584cf166d1091478ce9fe30a78a011fc64fbdfcc8895a9c4272a68357ae4b78697d59d35f5ab47f82dc03b8b30ce38d277a56ae110a7d692116eeb0c0a2a462e135d32f2facd3ab011f1ef08089daab425977ac03107e95418c4c9058b0ffb957b1da4851236b7ae1530ab03eb2a5ea5a0f3a5c2061e6d6c30f4fd07ded1435a1a9d459dbbea25bda12241435af69eb82296e7ee3e6ecd2f9175ebcc44c2c23fe646155af7cc31a5766e02efedeb35a0d58c8437b7e4325722417da994e3fe20de5d277e5183733bea2cb43d19d567007dd188019ace68be9cff10881961186d8ecc55b4290fb696687cf5d00d47d3beeccd3f60c4753133485dad2a18b19d507cf362a1c2a87e70a5d6d82c6fc3a8127a26d4132dcde729137ea5305b6c4fbdd170d2597af9627893afa0ec1a28c20f4994a4e49d0abf1372fcbddcdee7493424842cb558ec69de0e9d04818214584b77b5d4e11d4be4aca75a06319cbfadc5064a796fe69ffa01babc0065f1b58b1f2371a6ca423cfe52020d2d2bbc0d51a1b590e2ca16028a1febc5e48a6d6cf6b89450763ac291ec056f1ef15d2ace8021804da0e8b3bd38ba15ecaeda959da16225740d5e7f69a77be6eeeeff8c605f76ca0877d7b246f1097bd6037b8d899a3e7b5a69c916963e732365e48333246097c2775ae4a4f80cd210024df39d614b3a2daf89e76ddd05707e67c3601f9423dcab55c175c4959879c92d9aac97d7db688c4250a377f27dfbc032b2aebbc6931af4bb87f776bb6e734e700bcb549db24f6208ff34c0fcacb2f8f999ddddad421715aa7b1bb06d8076cabf25c8749232b65b36b71d007b626d15d2c98d3d166c698ca95e4c3b20baba0d7c272eec3aaa43f33e4acdcb11628f80ac0b19a0b071aa64aa40187b470844248fed958565dd052573f776aeaf37faaab96baaa5f889636a577713182702f43385d190c8da79e6549d77a83abe64729558e2933567ca80a1b7798ad0d9fa111986a3e18e4cc7f0933e770d23bf1324ee474c54627e9e6fdb6e189e8e28422aa087cf672dca871d0459461e4ca98abfcdc560ff8de9bfab716a47cea87afbef5173ce9ff2dc84ade3b262900de65f9bb506b843a97f36ce18a81115aeefde291457dfbe896dea394a9701aa08f46bb8e2316c51b7b87b287c67f63ed8d121a9550251d313c4ec32148fd2d5f5f797e60abe03989aaf3ab606d5aefa9a1b481b2450c0470c05d5446ed7927c54f30a2647b27635154cb8f795641deebfb3b8e2f95a14cb710133f65759a2927215151ca45abd31e4634e3a1ac8645bd043c6e219425ebc5384d234eeeb4c91734a30041c94a1e06616f33965404af365186c158d9a12ee0719972b14c583d306503ec11b1fda95e89363dec88c3fe88141bb24e5411985c36290e7d029ef3c2e507c6e53a7966629ce1f2ec51be8ff3377b4dfd8a8d2734fb7f632bd9e948b8247ca68fb28b4286a909560cff0aa9df4f267cdddb45fda539097d5f33a779827e008917451693a48710ae257417418a932b62fbc1be217fef9de548ca011b895a0151c6f88ba3f12ae1a266fb05d4f516ed44388ead2ae9118f256e3a6fe1292f7399cf81361ab1956da2a90883cf11fc6243bdad35665093274922b9338101518d218f3a11204e02dfaa242eae9680af258b971d1c066c06e37a0fd9b57279f3f3b3189d9fe1543ae1876a9a89fdce9c5c403fb6bdce6e179e687c01cc1f520c4e5e548198ce25c13df30a338346eb149de6e075686777217e1dd4af79ac756b80916f330d16b1205a754138647246b7913eb6c681958a3f0c6d44cdef1e2e1735429dd3082cad838bd09e4aa9d485be959f0140a38b89efd5cd3189c39c29713e7e61cda9f132182ce843d157f22556803b4fcd59ebd4be5050a65c2adbf501dc82e71c68ade71e2770001d9897524f38e891a9dac468dfc2c8edd61cf26aaf7a8e75dac22664a261708a206ba903ec1f4e8fdc633be02043ceb15cd961fce418341f0c1f09e9e77ac700240218b4b2a54f6c443004b31800de8e7e095dc1c0f619dbe029d641ec7018304791114dde3b8d1fca6efdbae7382c6a6b6cb6070a30a270895ef6a4fbd6c31c256a9df072e54035b2d6f941547550f7b99c3e1d58c92ff5bb42b433c35a757fc784f22846fcd3de288cc60611c828770cdc0736b20ed2bd5f41be5461d8a3ab550395201c1a356d1f7917805e23cdec134f916fa06e29221d2036ceae6de5664451f504d46453d2953ba69dea629115fe16401802a2119b0cad71706db6ec85ee0f6020221c0758f4836dade0c9cfff0f4a8175383744082eb2abb7e8e362a2eb4c8957141a03c5448fc28862d9363e0ebfc5b54c490b47347130212369e0545f69e462053a090854378c7d811992562c46fcdd0e4c1a3986c17762d1ea00b7a23b4b6976e4af4f9c4d49b23e2ea28e33e96c26fb1285b6c4f7e22f360faf3ec7d48afa98fbe9b1367507f8af3945555c8ef8a89b1fcad2f7471af9d92096ffaa9f4a7218c83e8a4db2846572f1c0e28ea78a78c63a252521aa9cc8147153b24caec54425a829eeac75a17f43cb5d4aae8479d423ed9d8f4c446fd1c97a4a04fc5eab9f482803fe015347eb32e7baea589701bfe954b82eef2db9982b2444e7d4478a102357ec5361bd1b7d93b15f906d22ecef0040a21df069131341615426d4c2119d4d56e041e181352edac0bb273fe662f1c52b62f8ef2971d306a2c133af65a5bbec1e9732d003cbec21fd13dd19730d039deab0235b390471fa7ab35e0604ce6a0c734f47300ee5558a6fe4154c6afafc1771d6e69b855b7532229f6dc362f4470403913d6506454a764dd6072d9fdf9503e561ad4ebce18bb9ca94ee1fcdb9726615acdd5cd2bc37f62cdb6c953674334cfbc61479b572f0cfc223926795a868876eab5fc83dc55e333ba63658d2838d65f21fde1580de834a848d10cac3bf3ff6b554e43ba4870492ed8fa06c4531706e2350089a34f08d8b27ec54f49352f1d659486b2d28ea28a74eb38ea2178aa3e1d9c07f54752c8414a3307149849289d4ef961e5e5522c8284a7e8f219e18ec12aa2685d3eaf23fcf30e6d11482c5f5416cd5df15bc4f45ed3ad4b45e2b0d38d815cbffa230d6de69c60f7d4e317f934c1f0aeaaa95df37bf83723f406523c7501bf1d05b76b5cfce626301210b5234a31c82189631b9a3caab487014fd7c309ef94900c312b35459df12e8301856f756dd19c053b397077a9c5890785495744fd9f16ea54873bdcffa60172ed2b0c8df9b09d98dc129de0bb534329fc25bf8ff586f8f4e277b155abac9784dbcb083222daed8fe4db014312ba2b624f6476d13326e9ef9a6705905bbb154946f136a8b0722d89488841de8428a5288dd45b273ca550091d615114704dc5537cf5fd0a53fec0094c0c6a794d117b35016a7914b0a6e6953d14f7f7aa0261d35c4c668b9e6fc388a0cc6baae8db7214980f4f08dbe5adfbe99e50f8a5cc191c96cc2c55cbf855503fac18290bc385e50c652eaf24f530cc6192ec5fd5cac2f14349b32b477a759421ce4f19f803275e51a0b6a06481c734ed2f31445c86e763f13515969dddc1b47b919c3232c516ec11a65d87b7927e3004a42bf78fe19c88813a86dc506e336bcdda4aa53f2ae5c72ce11e3722190ee831e7d30fd3dece5465d89a910c3157feacaf04b3eb828df3d2cee55bcfdb760e86b84bfe0573a4f2c9507bcd58dbb3132ef65891a3db2faeeebad08a7804868df97590153d71ba6c12df8d099b19dc012d221a0551cf209f946511e069258c292eee07c779565aaf287f8f87c5d5c7e1cd858bf0d5e5153280f89e18265a6cbc30f527bebed0a71e04a14598a623b5f7e9ea774eaca8b23d459743f0f17989e4d9a227ca0f216cbe3757b990a661d5cfb1990a55ea2ce5a7f00c990749261879d3920009e4a084102c63cf3885ef42daac92f2bc04746e97b931607218dc019a9b0b6e9273f4fd3cc0e695a7e19aebd43d5299317d9d19bd242914391601e90fbc33570b620a46d71c5668587700562f39a2754798affd071bf2e91e33adab5be3cc78ad7bd7b9416fd595bdc19a5c760142136e6dc36a6cd5432f84e7fdb91cb5b4191089136e79a6ad5b826b9b787a8afc818f60dc72ad63e4e814df3f9b706b88ef0ea422c1fd4689b52b94d700c09d71b12410ab54c89c3b36395a7d09edb2ea019bb0bd4eba13429f939da82bc7bef56bf89800490178f3dbad3e5bcce067bfe5eb6a35cef783264b8b5a55a76e237fb059d8b2dd2e3d306a4991afaf684a8ce675b864640b61adc8455f7a88dc0f8c52d3263c1938e1935de78c8a45e2ef26e607f1352990a94aa575ac03a57eac6807d0b0e6a7db4d330b574fc48e64be71b2f9bec08ecc7c6025995a7383e40e638d3657226c650df12af3f91320b78e94504b4d17625dd094d21c23467858222b039b8b2aaf7d4ccfe7ca407e43a1266b4ea4bb3d2a60ce3adbceba09969b74c2ae6d6ee744a8eb538b363f70d078edd4eab67bba146de4f880c93a9f3caa591f8a16078119d4d3025a36e518a5f7f087fc8072f1ab647f2e2ff6c1b829523f444fab4df7c86d72ed1836e6dacd2f75fc002b47abbccf89c824233063b3e188ff80cdaff4f9bc3c1e30b22864d592d8291783c7884004388624722b2b7d4a7b4875c1f0d99b637a87b2e741c99b4cbf2553f9427d37b7042fee104181868bfd9327843127427d1a7701db74fe0332a3dde8dfcce94f6447df513300a8cfa0de24d5438f94b62ca023c6c5be21a472530ed1baa1995dcea22fe5c7c250d945bc894d93268d332f4ee3e7cf69de6aebc459aa2b32b405d939b6e8ab83efc0f367396cd6dc230c39b1b566a1a94b89cfe05d01536dd74b00d42d87b11c69120bab3b01c36aace171a337028dd6b3af48278b58c74b63606d9b14206e89218cf86bf676c84d89c3c469a28f0c48a7e915fba7dc9af5fddf252d5f3367b063ed7f8260a74f35f56134602fbf70f835c6cb18a5049dc19f1bf8f7d56d6a338c6bcd78c2685e10eafdd813b30d36ec2b067ee0438648dc838e6377c4c4847f46100fa32f456772dac17a09015391f6c53a04c94d55e446dbf02e129dbbb9bdad2a6f9318db1c1db9b0c1afe2bfc8c4a6a09d244270f1144b064144d13e4131bef791b8acf2392da807d2588f9655bc911268f8914aa9a136f71c161fc307763a8ddc7baf1f8802f84f9c32a75d3f32cc57b6405234669435b6b318ff3992756ee388e66146e4c9f6eb95246e00ec98fd197be3978e6606f90a05f8366c1c2a3747e3fd731c30c4de9a1860f90025439635603d3a0714a3e53e85a3f9ae07645e154431c041de24081e519c06925e104ca14297166a17c25ca6b727de3022e9614253370d78a88f23c15985030ee6822f87ba1cc873b2d2c04454fd05dbf4c01b46750b9a8656c3ca1e361e246a67a46df72971fc139518ec99cdf561d2bdbe3d301035a7d60cb58de7ba0ddda7a9e36a4c0cd76758a4a4b53200e2fd835f518996df2c72f5d93de5299037bcdd883b78040c7a9432a2b2fea03b60a0167333a07405c7d631067b0e20632841a9bb2909380dfee74969bbdfbdcb526e0f3bcc7780e47b620ec6ebab3240fb5c06401f375efee5f85b2f773a58730d857bf6ee30a96caf77557fdf04c34a456dc65a3464e18c7a70a4e13e5dc7da6a7e62d5bf0a0c4902daaabece5fd2720aaeacd81454e545f407c352e33d574b4298f218fa3e49fd8f100d6f31651b5464dc510790fb618b43894eb0020d0e213cca1a236868f35641ba1a4edd4f1878aa2a7e19584fc25f40ed42872a051594a5ef655e73a889191a9fdd858308df477170f1065e1d66326b806cdbe8f655671b8f94f9b98b49db200097d5cb9f2d81ac1dd5d4c9c49774bcff0bd6b2beb9f8c46405800a0137a4466f6c9029adfef0132f1bf422aef32d462bb75fb8e298de9c0ba8687806767355f707226bbe9cfd61bc8300c791577b9809276a31f7744cc3c1ab3d9e2f38d4a36ec431ea18fc36bbf652d7d0eb4c96e868ccca37babaeb35368adbb41d1f6f95b8d46bddc399030c08532afa89902ea0a2710786a518babb63629d051ef1ab08296ec0b3a3c7588c0dd2c12346b133579ac24bec01dc68de032b686575be2ec5a9f49c4062cebc08edd25d5c3f3c701a1b4f21900fa2c3cffd001a0442c1fa637cd3eb59528271c81e2619ea6aacd3fe13c849dffd95c4b530ad0205c9b5316c2c710144a5c48a276bc0e9c8e48c3f2fe39292ae892fc3a5fee923dd098ea3b2c3f35a023ca8c380304001e5298d0a87469c2d43c00a1bc1b68f3423bf11dd98653a78a8498e455eee4092e664d838addf60797563047d4c740a692df6f86f945ab3ae9a2f1531e7f6872879f99b2b37dd5cc84a636ee8985a36b38a204f7e226c7063514987a9df44538fc64d2931cb034ef0bbf3fc0cfc29c70f7460d37b3d4ac4c5ff01c6e42b98b2894d93edbd3508ef40bab5e4e65010302bebfe49c4fbb911b777f1ae24c5eefb238887b855bcb53bd4987f2380269a0e5489aaf8abc67ad63cedb5450ace4d993ac84d7b1cdc0dad095bab20a8ee5f2ebd5af0689411682f956897a4f96ff991a5caae110b336303954fd68bf664ad5f394baeead5361d32a0826e4f42fa84f8790f52400f4fb60529d8d8d73282e300102b980fa36e3afe9fcbb2dc134395988d4127752fcd396da040ac92ace34b6aabed063b606aca0299662d6dd30dac70f80ee75f3f4cb8558afca61bf31f166be2e6d2938aac56f716d962da10e076fa35200ac7789a8fd112a265615ede2f66cefdaaa8b0689134a4f7d360884eddf41f679f8c6c837a3c362dd2f32df7368119229169b42e916231a9aea550f5bd8844631ea0c1d06f2b4a2091488e6bd73ca7386d7a9d60ecea09ef8cc5a70a4165755f36a4f8db0bd829279eaad0cf44e6b8202782882970c5f3146d7d139d2a1f7e4d3a2b42b51ef8e759ef2f3c174642955e70338138b79d09c0475750f6476ab4d148401fc803a524745e7fd1bb22162b5038b34bbf80870a88f7d9d9aa04644b7553b4613849693710572217b76fd5381376b2591c5d279b8c94e44cf43d87d40cee1d7682f2c7fec0d1a6479761c6da551ef22e05ed94e76d6b9cac142397d99ed5dfa49a287e39c2a3ad4106ddd37b4b8941a33627b3002413b5912390e8df20659704f75f3ec0e3522fe274179639f286155eebfe9ec730daa2b4d1fa00a27a2bc8564648b7c432b3a7395c5383f747d239dd4d52bd8521098642a1ba99b69d33622f8f106745d69a9341e7efd674f7c24860b8f2fc82152e147dd0f3937af84a6d7d6a1345322197e4230800fc595c57992c1d01236aa1c3c81eaadb12eb939600a03cc1790bf4147fd766409f92ea961b0bf7202a73bf9f9636489c3608861994fc017176f2cfec042122b674c2cf2d028b8a5508730054ae99f414cd11a4ce8fbae2e9342e4f2ae57a23dcbf79a609f0cf6cc91d16a51a4dd43ccfab35d02727981292db9ad0c44dee93efb310b8571880a70b05b594fa26850e8d7f9e64b3ccb201fc5da3e7a5e312609188b26017e2cc1a5527f0ae511fb8df46ef4c8ca0bc7504bcc974f78c1aa0101e532eaba7eeb9227eda131b102322553322bdfaca2e59c45699720d981cbb47a79bceb867d08c8f3dffa818d3bbf9c0202233202a065d68b90898856d3761ea3bae11d0fcabaf8792d8efce685b53185c364a0ce6e43799458599e641805596a92d6b7257c4dd78e97c8be76b1c34838b28eb674434e1e876e5651865474f496313c59519a82fc8b5c915098f5b6f5ebbe7774db02cffb709fbef538099a0372e232fb227bc1fdcc0596844e151f23081ee8570c536374cc5ac586b02a7c355d6244b761f829efc59ce168ad5d947fdf6c6af9e13669fc3f0a956759c1e8951c8fbfea01fadd879dd319d2c538d318dd758e8a549b64ec68a00dc49226af7dab318cf27332892e247c582ab764d0663a132c2fd1ee8d072071ed33a12617a74dbc8e547d95ca3ef5becbb940e3107b35e9833be877a6eb0e0c1e4f92d03534a197f3ad11e0e1c590551098ca7846d777ce037fa4ff55457ddbcb57c654a5d6117e24534adb5c23b45d525b530091e8030add5c98027c5b5bc97eea89125a132a990bd2be1d103c7293cae5f44127b779dd70c10e2715630a1068e9c5af5a2f6a8290782d8fe08afcea65ec245e9ae39b7bef61027a96c14191646245121e303a1f27bc15e58b37247d0c2daef3f7dbc46f630513e65ab7849264305972e9d80840b09f857f0248d29084588908ded2dcdb0315f219354480590c527dd69a3ce42faf857786207e3e9eccbb12ba792767e349f5dd57ec01df07d7b557a7d1847b607015e7a803f586e4a829060c333e0545b1c033317b7c1beac2e4ce4c63524af617e09eee031dcf62d3afa04df0b20552074c0b730e77dcbe83996c478119b2e32e00207fb7ff2ffddd4046af5f21d52ff0ee588fbd802090765e044baad3a48ae94f7dfb6d0192546453fb6708b14a211eb96ac264a388ea15fa920e171aff572f7ea571ef3d8d2ece1ba586377eed7bc0cd738afafe92cf7fddec573c6c18075dc78d53c57a10504752ef035ad091199ed46bac00482fd4daccd5c0e91b893df572d8a027e6801ed7c9f1ed862fd92c53beaa05e0d8123f96a46f0cfcdf5f5beeb0de45accaf6ad9c02365604546805facaff99d66c34283c9861dbecffd6e507ef11292f9ae406242eb5e09c407c0b08719ef29eefb6918628e4acd2ca100f01e503936361ec4d81ad0164e17f250bbe586aa8723c188ef5172bee59643f944079f3d01717ccb8671c1d2f4a39c3adc3fe068557a11a1039a8cfcc88f344ac4e76ee6cfd9261eab373a08f23e693f123341ee46a6f180ee7156f769653ebb749a5d4ef1b634ffde454593cb2c8b7006b9c1c3a7928148a539aa2415578602772df4aa38fbcf27d428b55019a2fa3b7618acc6a13614183e5f3e2f4962900d8ead0fc7c8f8c5bd3c56aca9711774fbcfebb3549607f82705a3869e143bc6dead00ac5f4761984745ccc9c052eb7b55ab4df31242b8e919605e80dbc6db7079e6f7bef19a2c6b2f0ed75f1ddd1919c96a42b3c414da15ca5ada9489cf813854a8315db5ce419f011149bef35e98381fc398dcbcac389331486e049ab8c95929b7c9cef32dba7898e53adcbe31fb22239a99d547b1c580b33ad51d4e2cf2ad3ab6adcb1a990aaf53a6a90b62f972461417ed6805b700b1212b911d3c9f14823acc12dff526fc6a030825bef7f51357234995d6afdcc178beb1721216a3134aa767fe2f6a88436d19799c0f876d403cb2bcfff7d87106ab123b331f3138e7069bba3f6007af2b868777bf0d2c36317f19d22ca9a1256631634a2fe0a8b1304838a637541f579de23a43eab67cb6cc01f6110ceb220f0839c95aa16bab415c5a4d32e852f14139ff2a884aa99f8c315634ef28fa2c86dea8e68c8fee1304613de75fc55a61e503f7416d8c57276ec722e32cd46bd151014b3892cb52d4eea33b4d3defe26e983b52d8159b2c579d8383ab2f377506dd8204f22856e7768ce7bce37ad0122ec9dc3ece78b85dd7de9ac7bc69564490adc5cf24344fdf99d59561d86d58fc26a2438c6f2aab75013160efcf2a98209616348a2f155ee83b6f3d1ab529af3aaf9faa42fa3d17290ad9920c03356359a60816a852509c3f6be41f446873694f0f6f05837850d39b7568fdc471260c264df6bb64bb436af957ac704527a023309c42fe87b3d345dfefcc90f66b5f79bf1b079ee780264cdaa74efd1f08b51b5b95a4e14780119962ca2c7a6db9250668cc9681f78d551079297732cdb081ee471aa75e32522f33c87689f188e5e5da9cce89b8b2567144354f7d072ea13ff6fce40ca84d469a8ffe181efe8a34a9b18e7b514038abcd71fdb4eda133e145b211da19b654a8a22646782f1d8907a7e06a01564500c8cdf8ef0850d5d0a50f319a753bd3c30538db3df9637cf63f86034a653c1abb129c4b76bf61d9024c2b07565e05cbc6d73234461638179383c102bb185c17ab27a2b38548a102a7bd3d5980a56cdd6e106174a18f840247e62a0097a944a95d3a9996556a0267c17a2ff1dfb832a6f34b8b12b27ca588657f016c60e5f81da3d6830b9a910609562c0704927d96f30203e2490f40ba6f1101e137929b159aef7a7ce24fcd03c4cfa925c9fded1dcee888edd682daf65ad2175e008ddafe8ef39525729e91e173f19e2e6ef4a0f763eca1c9e14c077b45f7b2f691cffc75ebe801bbd59994dfe51fe1855c816cd459eb2e9bfdd7c44b20ff3147d2b82a2bac4cf4104a53abe5238804a4f52f4b29a82cb1906f9e52920e2eb449bcafe021778d1dd217fc6804c62389f074965763755502094fa20b19ed28ec887c68d8462e869396655dedd685ce8006f71f3c18f4534b4bdd8742cf652a19d436fd8c24601605a0da57d8d9de02e9364d8a311a392b53b61209023cc50ab203f1a33dd5328aea6da47a3c6f3a43ab629f80a9c5b8d0c4e69fb0bc1bb8c5370cc9fa0845098d4b93a1325cc81af1ef14beb3f29e391cbb5ca6eb2b937a1e44e0afbde1f9af2fdbd5fe7d75c317701bb74a69664a2f14089f7727f3a5704b38e34633f104118de853fdc790c632664429d9ed938c5120b4fdfbd3901d9246c1ba2eefa11a7d9687c5f56a665d0bc3d9b18ad46dd45900e7b41be67ea3b89c429fa9e312c39744a48b20d8fcec02cbc446c33006ed1b0e9831c710aa89797c46aaa7fd195f484e270d6775a74cf480177b4638ea947a3e30027359d7b77e301a6eecf6a727a8fae0904d7ce52f7931132d9d9489ef46f1ad8a39088d8668cb2d2204de2c089944975a16b0f043d319bee94936fe34a2901c36e08f5339c261725c1451a657212a021d9c425a3bd0db6cd7386de6567c2d89081f88dad717d1d27baad40506de717d7096baa9ea4c0b972710910616433b4e85440ae243450d8fec0bee4727d5a4d78374b3ccfefaee917bc79a8f8e0446ca52eb3d9f8d21222f214fae2fbc51624302068c391ff242e225776edd82791f162eefd5d4a6c309444c59c52192e4b43e450dbd64ea93e580072b77490bacdbef5357d5831056adaf899bce841133e8c4d4e98a27cfed8d1ac4f9379b8992c94e5694aee9e21f4055a174dda83cfbe750d1ccfb2c3f2f1e70530ba7c21bbe5d15fd54b71d2684c4fcfd8b564828286c5694cd0fe582d9f39dea2652e88e43007e9f3e570f8142fc449a6c934774c0389fdef69138ed7bf570b54e22c340c32b1c534497d06fbec1aae91183d1be58733ed64459bf330b54ae3797663c47c251503c387b5f9b80dc6cea31183f1f0fe025b3c700724ce2a2038330105c1625f520ced6e26bb9cbb694039141536a6c9d39c7eeeabefd89e238c5a81ce45cb8c82e57e37ece24c7503eae9533cc1a3cd309adcef06df35922c68da9cdcebd671ccb5bcf9585f0f828cc5411f84923df452ef4b11d3c49f181cbd788701235139131a61203595cf7fe171742ca8a868ed98436654609e41f45826dc7b9cd9b65a09e00a9bfefcb82a2a8c2e0b0fbecb826c4cdda8cf2d428ceb33e65ecca3f0c0db4fbab4e8b0f60d4764b9bf62e0b3a44b66a007405a1e0fdc19d7e958ffee773d0efeb86985eb7572c9e9e524e422fd83338ddec60337cc637010bbbb3b120020edafefabaaedfec3206d3f7a81d8ca7c2ae0c90d40abe3002525ba96615c091e86eb0adcec1ed7129068bc9f81d51ef0f7fc60594565ff69263a12cf61659605fb3eacdfa6ac717d8a0a6484895fd7db868dd5f8c2420d1a256510a83aae104a7619894e7bbb6df46603ec80651868ef7c1fc50eb8299cfd8f157faf335ac21cf7e2502a2b72e205f774b1024ab0a6072ce812d6c57329ca1b2364ffa6a65855e5a1ec949b27df453215b7c360ec25c09567172f37de3245fbc1784ead14a56859b1458259b33875fb4ae748c237e98e4c7d6a201b6e6b10e27869ae05d0f41f0e3bbaa7e2c864f4953105d74adcbafe5541e54d188afbfc8a00d1b41adfdd3b5aff7e75d8a53a186ea36a1c79cea018084324fc2bef5a9919becbf02a35aeb2e6e991381596db6d729b3f584d1f81f15e74f198faef85de934897511e40f62fe4656caaec114c67eb2cdb92b8acd28ce3f9170e2ed5dd6e9ac452901fde015f17891e83affc6f9b14c4e12f8b33ce4cfedd340d4b950fb3fcbaeb843e04dd9c2a472e0efab1f0d5d4a38f2f2d2978a954b55cf0219b0b588c061d465798944d91292e2852033cba71d560b7b44b1fd0b3987d703752dabc7d3cfaf17680eb6d083621566b703e69b00c2b39b8ad134638936af28b8a1c0d7792423ea34d613587f040195d2e2dd20cd62808c82f46d50e749b83fca71d7c8b2ae6d3ede8a2d496eced4870443b83f4c069ba590229188f0b698583cdbc0eef204327c35f23db34c7e9d8689a9b4f97109254b809266bb01059c5d6cd3b90950df49b31f274913b55dedf003fe55542db3c88a55ac98aee1aa4ee822448327ae244a1ea81a8bb2ba6bebe04c72eff9f3475a0eb9af40dcecec06c9266cf06ba21181bd38ebd3617ae21d9046d36abda7210f2240d13a2bf8d1c16fc86f1bf000ea58acc02e51b8b15afa1c1e52acb0576a028738555396d7a11ec4c2cfc74588e56a32b159808016fb76c7ca10c8daa51a1482b0f62da5b9a264b8024f153a48f3792ea8f4a272a082ee1e3a57802f1f1c312ef4bc77e6ea879bd6b4c61f730c6d04bc5510d11d83be7986c33bc15ac0c520630faaba81bc8cdcc9f464d9e6efef673cef14ae258e8465904f5583d6ca90439f2262d0bf418921fb320e013a19413f16d253f0bf0324ef72600c777cfa42df42434b7dc5000453e33aeedb9bb6e73f79c8e669ca7ceb409363bf0f06df1c39b0247fa86ef72252e95378a06a942ea58f3bdb7ef4ae870ef6a56afde811e39b8c2254c8214dab99beb78d3cad1c942a9e1629af57a054c7adc56699761e1408c98f9a5bebc82ea5afeecbf345f0e9017692b880e6370c9a498a7b9c2e8bb5ace5dd644cebb5ddcbee84baa7520003835dbc5f73056b7e1705254f5e9bde07c122426b8e94f585377481b16adf6a7c0a41977c72a9fb0d74c392106ea89129877f92209969c3fea8012721d04cd191e4b4284c2927bbb151fe970fe943d10bdb0c31b1e770bd89011f3d3aea9d3da5b25ff8da538d0875c67b9ce5a9246646a96ec8c2eb04527f8282b2d6c187a48c3fd671a129089043a928c3c8651c27482b40292a8653a25e55b3abfba71b177f27973f096e97be859101169a7a83f2514fa649a2d1edb4eb8ea6189c127755d391891b6e6fa618ec4c9b646fc8c9acfb8bd63de8ec5903201b7392f9c065e3ccdf8ededa22aaaaa89c58f62662a0a4f6f1e5bfdd489703001a68210a95f05e1409dac0720d4cd428ad4fe4a20c215f5ac10f901e52f38a308b5a1239107a915da66d498c997599fbee7c8b262aca280e1326baf2409b4fd493b8202bb4a46b447c6fec74cb4b55792a6aba46bc6c3d43540ecba3406509ff9689f526844e39efd0d3b1092f04df12a08083667deb8ab618423f86bcedc98e18c79d80242a5d63a3960d002b7ece7ff9bba44f53bfb095d13dc2a1e012f20adacd977aaf730b22183f9faa3cb7aad281ab9e55373ef29ac57ea709a6fa6b3435fe219d92b4e4ccf3017f6161b75f39e98a20afd23525197e4c49105e3518fd6d841a705bc782a259d59659358712d25582bcbca26e4cf2eb5ad17b28cfb03c787f687a52e5a9cee6e65dd56f3a70a6d82ddd1bdbaa6d22dc7fa41cea6dfdc9ce8b6a489fc1edfb52e694226138925910bb5e5712fafc677b145a74277e724eba0058b548ab716648a2d936a33ee84bbd6ab732881e0ffd82409d44ed8ff7c707d8d95c0224307ffe3e9d49d94201d39bf9ef36fc28d8d5bb89d76d73a403a8e1680a616b1652287c0d7972879f7db691a46c630384905daea4733c832fedf94111b188c46dcc00a9e9bfe50a4aa01a43b9a0dc4eaf8986f7fa542e42c7254996683051626058bf19342da1d67a60570e4d8e3057b706b943becce02c46e014c462da0764c71f202edfe86cc0d89c50d93b6e36155cc1e00c3edbd7f6d345d8ca5232ac797b3cda4ff51a01144952176f88b0ab1d3b4c3f15ea4059aab99ced3078492d3964068474fbb2fa86e58ace128e1d2458fbcd40ec4e7ad807f5540d7825dca9b4cbbf5951af799f65f8a475e60b75d74a411ae370b20f4c8e99074dd579bf74f2515f26076b4b7e3511974cebcd450150f68ebf5ada8899f209defdf5416b2af1d8cd0fba2c29366001713f857f57c4465aeae8f3f70a5922aa155ca0f64695e087978b766dfb4c1e3c4476d3290a98d2889d46ee052011ba1a85f9b30efca00a5301533326b750eec76b35e0ec1df5716b424327ac16cedfcc20c4d30206a0eb90a4e824964a281d50bbe6abdf20e74356f85258c1744cb1a5d13e82e5312ec1a94d6809684c79a3ff59e9bcf9fa58487fcde2ecca1eb125824094d2a916f9d349711f2fa5e478d98431ea94a70ac39758f77c139ad4b9f2542988f014a8e13978575940d0c92525647a179d0b4854581f16ac1ab2a951c6ce11e0185774988ce29bde9a72272644d1cd713a5a3ce8a3e60adc03883e8200975cb3cb22fd040cb2832a8fc849db37cb0a1e8518876ce1025fc56384e06e1fda929b8c3000f3d39ff491c2e4f615ca14b9dbf177dfc57033f1d243383b0b3dc1ba204bbf788391d30045a1749dbcef5fe354c68c6151fa92dd71a785f52600725babe0ac3fd841839d618671a9460c1484bddab86eac6217559886c1f97f885f19a4074e0bd850376b802a5499561aa602be815bbd8ffcadae8b1a85c4b601aa0d3e098723dcd96a09da7e7fbf7a7489d08e9ecc9c618dee95fe1fc2b3ee076691e9ab76d12b3ba77a54ca3e926dd78bdba45d88dafff1f3d3d064fc083f9c6b2a1693163ab1342253da976c9a798b1e07d36030e6f4da685e5e7bec16a17b2fceace4e6e84eca934e89e089d0b6128cc4e5bfcdb468735df2084b40639bd20e105d90ac5cb1e80961b789bd7c6e7a3da11a9f5b3cb8fbde70b323428c1cfa6959af011bb93b9aa09620a3e08018e22d08b249180ade5161b3132345fa3907d3b99e05b7c1257ef072442a10310bdf9344a8453a0edb2a42482ea2f972cb0b10e28053a8c85eddf2ca6866666d22c75ccdf9f8c4c95ad2b96111236047b9d206db81dfe83f6e54cd5befd0a44e76dbc37b3e57120315b1b62abbc4d34a5ff14c021ef0b2dbfa88acb7cfda6fb64ac77ca992d3e03b4ab5f61f4b1a28da031491c9d36bab70bc630f34d8be3392f6e99ddd00d3683ec050e5062cb1c7a0bc6a7ca79677aed1d4e0123964e5f4de64ac3d9eb522bf848e7b9130447b7d3edb33e01ea595b8786069f56cb1230164482db027020a1189a71ccd381e2c04185cb73cb74d25f83241198823b963c0f8fd295fd47e67202cfdd3f2bc1b75b598cad3c2ebe2a508d5fc5c2cb9b981b4beb0d107c2d72aea2f9b7af6735cb1cb20e4255eec6dfbad2eda12f47a1b08bbc418b82512508ba6c32a41b1a0ad8bb4564030cb9f33e9363c213ba2d7ce7e26ce55c74c15b1f1e381823e8163affafede2ee5ddd0b77b97c6e3e78a810ef9655eea29c531bce5a9936d71c6b95bbd12f3c09828e84d641afe6e7666c3ef6dad7e71446d525f3f223203d2687033934eb93e4f222611445ca24cb0d17a177acbffd320c90a1ff76b0cd10942d20d53bc27e2fb1343ffc66ebabbe319a74ab4ff5962fa47badb7918ceac6c105b61c779f6e9e7acbc3109005c29187ce12d7a337042e7d1c473978656b9dff066078e3b6665647ead464842eba97d1dfc232ea55d8722fe93d721700e16047ef759f136f5cbac0ca1b71b614f784517249184ffbf8f80e07c9a219cebb67371db0dabebd67d263ef56f74181242171b5ef3773db6be1aa65a5cdf3f26303a78daaf6fbb1a26d765732ad7c522054422e7184df67f6d879d2b2b29f6aa50f8983e984ce7bd636c6e288f6725fe3cfab55f4c8a3668d450cde8bc231125382a5cf8bdccc1c054a9792a41f272da3d75f52ed52587ba083d2de89213d3e9b82bce56c6589509d2900ba4407b9d5f2611ced248c1891d502f48bafdcef34e8d0f5d6c774b4be6df88cac818b4d83f2a8aa2e602083acc77794196bce4d8ce5995261505bb64cc918371128f3b2f145efdf169b23ddaed8ead163080ebf3d879a014127cc52c0979c2f15e80453bd8643aad4f4c79c2a62473d37dc1d7245ed820a52fd08822e842784b86265bb671b4ae834821eda56c22e7af0a806960c90c142f4c5a2a1345d28ae3643d781493ed06eb69603f8a36bde9a1ba5c311147572e6e923ce95e6b4061d5f5c4b1ed2c977a07509803d896e6679c25f400e4bc3eb998661a6eedc21dd2220040fbaa2cf39c8f8f58850151e990e06d90cc14213822ffb0906773ef4d76a882125be6020d7b041286c65bf4f7ac5497d7775f9f2c04704cf4e493ad3344b4649b46ab117269233e3fca1d9b781d35f88943dfbb81cc3ead3b747a4cd41855fe9aa4c2cdb43743ca197e8a83756bcc33f5b982dd60f761788cb0a6c0a9de3d172210fce8505b1c4960ca00e6711be9018184b11f3979dda1dfa122eb081dfb63b1e1964b0d0a032d720289208e9e64bd2e211d8078c040a230367328e4ecd6efbbf3dde1d629a31c89d75cf75d44b0057e95280c812c7d7fd4708154396c933567354c77b50e07d8940aee3d2ec3f5bae898843b21538ba3d1b79d68991a3d0280befe885b1467b4c30527a79b1bbc156e5799d78fbd775ed1be42e707079aee993dc5310cbfa60a163732a315a17f33974743803838fe96424e185dc75378480e99c28744a68600f577dd41f9c0a91681129904559ca63f1e37796372067609552497d96d821a3e50276430498f4a53afa45a416c4fcb2baa3bf41f86c6e7f10fbdf9e2fb7716a576fa0cd991520e7c1f8b261e7f4acbedef5fc85deff4feb2de1d49c1080c7fe1904072c03b50799b81e3821e4f7b3a5d613321c9a114758ece20fde97303d4221b39fcb8a148b27b8e8ebce7556a7ae1ee1e0af4230407e3f2bea330251cde645676be229f301e72ccd496917a3f8c04cd19d37d31b388a40b2f7bd465d07c025ffca4527fbff198558d8ae6ac2aa675c60e1eae7343b71b6bf33deefa136f3f92451142cc16e9c91996b962e374e39da8417e74af86fae672a77b560f966546b1f5658ff4e10b9883b5ab38279a4dd9d923dc8f7b6e7a3e953dda74006f6dab6a2fb8f70e0f60264387839b50ffb034887dc7b1a204933e967de1d68ce39ac12f1824bcc14c5c93b11358a9e5c89678f5f772cdb0faee5185e47ddada2b753fd728f7b6d37892dff1b474745b69a321de697a82a349e837a3621cd469b6ed5aeecfdc062e5c0e51016dfa061847c0d25bcd759f65867b3acc0533e163beaa9512065878c07297b704c8ffad66ac648890352cae94fa9daee83e54f929d337db7b063617e0a31ceb3de0c3049df4e37fabcc96ef61250950c95603b4244ede238072027ad76309c8a42d6032850d4376c87b25e2483b67824c50861d57b677b8c1a3413684ec6de7e549ea5cbbe3a46fa8ff8b36dfdda9ad26656f022d1570372f77e90af6f3f0a13b3bfbebd9f6ac3aed9a4afce9379d47c0557eedc4d336006ef941890c41a95146be64cea31c88f436bc0a7397a97ba3c736fd3f715fecdee85d14df6f407eba6144205bed4286a5928589ea3a80567107bead0b25b30ead4d72b3827681d59d566794a049de813d3ec1a28c70e2cf92baa3bf0e1e97f88645a7fe2932e837c09e94431fdc2d8d18f13f17111691d7e0dfdd1438361cb3f0e6299b60b986bed63e41d3d73fc59db9897c2d073969412976ad3fbe520675221cb78eccff976734b691fd4de5b11898f840cf7f633b19ef13b822756ef80a6a81120733dca3a1db661dc6d8bcd86784e3885681d0afb052eec728544271b05490dd58b92824c8eca3423a6d6b52f4fda90a082d5e8e9f479c0f8d131feddd39aa15636a9b0a128fedf654055aa21767d633677580b66ee7f903aa6b183d6640aff78ed10b05880d446bf82e0fe8d9cd27f9759453597ea3710d358646693164d388495b18826e7efc448a27f82ae737795ba30510345295c718a9257911db1a8230204a32fcd19364dc00c5b7aaf488f9f2c825cfa9810bd1a505f8031d2b8aaf195fbceb6cc110e4660d3da8adf561959bc8656d1b1133f635db297c2d55bf54fe83fde33a27b169b9cd687ad6f78c8814d5c99906dfc9d5f242385dd802112f982502f8579900382ce7dbe9f26f3c980203902cf02bbdd415a565697bf6c83d5b43077c4b514b95014dcbf7be523a20d343d37913ab642c03c561f009081e793009818b8b5cb3274674fd49caa29bc86dd89208fff05acd0ee6baefee507d3bf9f2ee6abe43e11fdae41961c11f045382bfdbcdd2d2418cdd776b35c00eb2db10152d494f72ebac3cdac42d61b00ee58d20ba2b9fadb3da09ad5c13a76d632c23b6db11990a282607f8cb31eb047cb9dcaee496ebdef9e9413717ad17c61b5de13aeef6ac44c1245ef8c0bb6c5f26682840fbe3baa46e39ffd8a09ef261add382ac802cbdcc21ef187e67a80ab84ba8df94f46cbd165ae6930a14ce17f95d44a8ac06a0114e929a25586a3b7cfa984f205094fedc47d508d2f1f410ff98a2616a171b929a2274de514329559d1f80749568903e8b8d8ace525e402b5d7549d969ce66daff5dc804e8ba1f69abe3cdb3d46368aec126bdcf026b933764aa0d6a7bb5257e491b0696772d9fe8ecf327dadaf6e631fd33fcc5667b80655700469c4461edc945b74201a43172a1e9d34050a18a6b037b99bc4b50df595c752ea062e443190e233a4fa9d8c11798ee70c0fc183e7db21537527a0f471962e839189cbbb55198d39866ad16663240d1139485ed0af926aa5967528e34900274464d1f0c6e8f843481ac80b33c93e1dfd67b5f5c6a404d42a55d7df85653dbe44ab5efd4fdd992f0b18294362dda124f6a3dbf649e9c9e863774e16ffc88f27c65f69e1873ab9b52c7e5ffc12d7296e6688968a88546f0e335efce38e03840263b3db7e446abea3f8a5fe51ab2d849c7489a1876319a159e44314fcc7bfbf0ed596ae72eb4fdf7041a2be5b02c23a636bdade1d206f14b9c3bb3fab050d0f399a1ae7103bad71145f7e15cca00a4afd1ee0042637654a50d4cd25fadc9f5a4f619665ddfb20a7eeccb35992f9495bb92358049574f055f03da40ff4a0d1a9a49948e5a5a2e5f502645d31869c9f399f65fd443374d1f3186a6f73ef24df37125226328e2baad612572fe46fe7f3dcd91e7c895fe4bb5a3d884ce1adb1a54e4569265fe12e755cb70080c0e812291d6d7b61e44c1f53039a30b51c187ef4f48b88e4308f940fa7c0924ad8992b3159eef5fa42ff1320d196431d429e9fa2653a557d5d829cafe3399bd8b8b576c415ccccb1df4dfb405a17f431be53a6fa8e5e0d53f22bc151de7eb795d7aa3e16cd0981e43924348e8bc888f1c4d47986cbe67ff0a8d8e4f80a5c5c07b9a6d53a7f2fea5fbea4e45a4de8f65be7a3b97064d201ca81cb708b4923514465af78bd3f1bfc749bf0d5d9e226305e02539f01dd840574ec6cb295229ccdeed13874d0698f43a7dd94f4f4f45a28c9182d0760cb891e8a79215d511af731d71eb10b67da6af59db8cb4018f9cecb0270ad4d41fb961f1e9581362cdd08de5c93bd660538e6f74543488db4162ae214c0a59045f5812893bcfd57f555b1b55639940a2f5ece64acb11b90d720defedeecf840de1b175100553bc4a33fd91206edd02468590853a58b60b026bc63c501526ee81a143dd69fdae7661227b662aae811c4b6f206f2f100e4079ea42d8ab50e8da390fccdc2539a78091c974a9d73d796ec426eee8b8c1ac80da17432ea75cbd7a0b2cfa402045a7e7136595a128866dd43b0d577058572927eacb5f0da23c055bc1e76d477522c563268ced4a3a7a3613d05bd5f1484fce7ddd1c925ed6544c2d8d9c30ad5c7075ddbfc47111dbf35456280f9d534d9887e1c6f1a15ef371b37d1e6cbda164409d8b263d2f0e11073278712fa03b5ea18038004d2ce4d7a09836eb648b3221650dbab0b829568cd1292f20743e652bf225a16dabc122f3a9ba5d3cc3b1bd937cebb0d76020f568f94a65c70e2cdb5a2672fc5ef7f2c5c244eaec4be0108e914bf8a366a3e3cfa2d20765f12a379d1307d5d927f2b7c49a5f33f6b1b5fe1452cba65d9db4a32656301b6c0d9612d97cc30919b313c58ca8e0c9055b5a3f37a2dcf912ff77d13f5d8e579599028906c462af8a9fbe65c0f99dbc5f6ac07eee6d3c3a7bc9f68f72617592fb6fe0c83d49bb98ea2aa079ba17200de6dd71443de29fa6d8b97e1ed2647713b71c285bf74a0ed45785f0357cc47965fccee29fd6733dd97cc99bd8e8b8f8db21782fbea9b845fff938050be4259876d72cd2c44714329035e25a95ab557367f97135bf6270d57486a6cd942decc15e46857aee5c847430674be0119980bc516f7c96dea4c3c128d3e2ae98bb6ebc74096d0400c35f3d6abd4f273ba2d4cc140d1a49eb74f380e386d53a4c999b1c0327722e0b87e5dd774f62aceca43677b007635a7489aa35cbf46bde40e1065ad014e1bc824229dbf99bce04f4b09964f57f738f59e3539fa622d95dee68136f55cc33ab92cb5136e4f2283d7ebf97862ce32b05cb1b85a6778b7cc6d60e335ae3e6792df28ab573263bbf4e24eeda3101ae13861e4dc0e23ee1bc2088d1e27d968c13aab4d21f6fd75992c466a9d339a0e9537d132b5bc52656489601558c83e975bacd63c12a4d739f1e390cb4cfe3a42a05cd8eef33a2eac834397ed26cd81effb3df3969cb77a538cb2d4b93062a339f11f5571dfe1b67d135db8093be3e4ffdde5e8c0b26c90841894ba4675bbba6f03dd6356cac53f338b3464e7c8b49e91a8fbf44be74a4775ca23e27281b8b03ff89ada6149c41b33dbb75a3d82e610b96b085eaafde49974598ff4e7064b6568f2886d8f35e6c9a4fd6c185bf2b40bbc0af8ba2c71f7a7d17585cda7501e83f176d6e7d9421f0a90c10af096cb0834a8625c5210fea5a02657952bf5aef1131d2c550564ca54852fe2a5e77f89e07b46969ca40a50b4e60ba30e9f89d4fae8366c047048300ed4fb0a234bd8c95c0b4b391a12767133dea7680f472b930ac8f1ce6a405d73e9c20adb1179cdfd8390d3bab189202045363a430f8f6c1c72bbad33e626ffa5af0d0c23ddb8d3dc1fbadbee60bb8871f9f4007b5de24f863a6ecb19806939c1791f4b75c5d11952136aac558fb6f82003d772f9f60df8849f48b3657d6df9b7e40f56056ceb9c9f12a8b49a4eeeece017ded6ddd98ddff70f210c137a710b6b3ff6504f9e44aaa4159f11aed1cb49f2dc8207c6e90369e1215f57d83927480ef2f6972d19bc7af96c5be3f9a43cc5bf40e5d8a3bd2a55bfbd342b058f838f713b559a5e9dcdc9a471c002b335d7d1946e3f453bb8b3fcee9bd0647c3d541156821ea302301a57d855354a77cb9acf5b7632d5de41ebebf434a8872bed3d0d03b9101fd645c6ac5a24711d8f3ca09d10e8cec902fbfb4a9080ded9bd0d912a1803f09f16084680cf1cf65e171db1b6ee97d1807ee599f37155e48ab6809417c3e7e03097b295e62240b1be0f3531acf86799d3e5e416a07f7bfa5eb99a94d4ae42ebd74ab43ac458430f691d275fb22fac5a8aee80c189f4fd67a3ca1c1fd6afbbd4592fb29478d92be29abde7ac122cd5344adf478f51ec025bff3c9f8180c757ca87894ccc270b24cfae5efa5b706645e135fee2d84e758115b3ec141fe64faf53a11441587ab8bd680dba96de96152243bea456c066639553a3ba1edd42c3e59245f667091d636739494f69ca635b8e233b6c78f59d137b6cc7467bd51dbdea1a5edd68f63ce77a75b80945c1609de8dcebc03ef306b42775959e04516a598546e8456851aadc41545ae110d81474c6b1d6c22a84f3bc272572635417370fdd2714118268cf44b13f52c89ffabfb0fca1c35d5942ddab22a4667d559dd54b01aa45c66dbce52c3ee5058a73f419be0eec9df6b9d4cb8b03563e0ac67e6a9f3c8bdf44beaa4d07783735bb8ffc5a0df9fcbe61c49c01fe8838a836e8fd48407d445f3e5446503a5b6552477455de022650acd1cbb247148e046a51ef29d90f1d9c05dbc6144819442a3851ae2c4fb7996d33353d0e55743dcce89d3f419b2a6d66fd5dfe5ca0fbd898fbbdf7877c1ea725898affb6ac4d9b4576a576d0aa8874a3ad7da322e551a9bb7b05fd032583dbdbac06df42eae37dcec84123b37cc1b133b6c1c747c3735f6280c34ef04756ceac52d425bc06cfd0f64645b313e216c6b58ef33bdfc70dd5e2a148d4df3c9fe9530ac3363996eeab42fa80d3d8fe0b967174ac5a65a82d65654b290587255a670de84e9420d2c303484ad15c8025a14fb651f11f758e7237c81d5ccd368966f8fc1e9c6690dcb8c53402f67f066521d376c6de30903b7ca2219e0c4b7148ef43fabbc206e98990f328bb9981969f7b82df04db9c7dcb3a1f5d67c6d5a730bb015c18071225e35fed3e2a15494d79afd962330d0eea12b50d3dcef1c4ecad10c1be0b88fc98c732f7b9e0b4b96202c7a6e240eaa5c8e19b13f6bc5e3f08a3c447ace79d0ecc9f0b0fbcdede1900b062193ddd9915bdf36b47255a3eb1977dde3ca5e6d36ba27093fbf16595d17e0ddf48bb514c47524292beac5766987fedd855039e2d5eb00784be17f2416c513db7c14a44ade0c7c5cef52200ecfa3ab29c6a8dd66bf7d1eb578cce63794ef7cb46fda71fd18444ce6e9a043896733e5e848153975fa1a0680be4b0252c76375a14b298e8e633101f8f1cb0694bec04fff9f86e4561a436a7af7917d5b6d4acd9887703d19db6bee8239ce210bb8b50ed6c946952393687114f2f05141ba574b9dec3dc0a5f1705e3565dc6a4b8dd2e4f8820b0c70bfea8e7cc4391db51b4cb18fde90917f9350a4b5dbae1d23340b712a99f3a6bebb57d3e8639d582efe4a3fef80f5703907b3f547fb251d5a0ec3a19639b77868e9801fd936ffa258afd2f879af8f30f8443ba6735615d329d4d933b9b9758e0136c71b751170d235b756d271beaa399827afe49c0c99f76ad1ab5e8fb9c49e480dbbe19e79f80d6abf5e74bac73aac5302fe42c7d122daf7093a47ed212341ff515544fca3ddfbe0b4b6dacfb313ece9242ff62443d5a88e22564c349e25bab38a5f3c31229ac6e1acf12fd565783d2bac3252bfa4d578e4ef10be396f77c09b95fe683f007c4bd95bd8a9fafdd66dcb8539ab2448bd2959661863ac2dff8031c98979e8fa01894f49bf218bada4432615518c0ef67f13f374b3de3420435d73362892a7729adb33330e6edc75786449d913bd41fa56e21bd4f1de134f3e486cfdcc7d0ceca6b7bdb57611469d80314a0314f70cd9b0c0bd261d34195296073a577669635e8757df6961150cf7e4e0f2bb718bb0ee1c1477b528aa84e36b2eaad080d4ad7688830b382e55290f0f0edcb90a1668f4734d4e5b38813aef747e29dc650d1a006aac50a06b68d8e512ad9b3cc3bac27360544c78534534efe90b6946a7735759d29e839f0f99f6e1e6440454ca2909afa3d0600ae2d5edd9325bcc881e19b71b278e8d6dcf5358144171ab328bfd5b977e52bb82dc4e7cdb531081342150f4833c18ec4727993fa8b33b03e6363eedb8f629a3d6f78e9fb6a1ee0a3b0ee68b028cd8d0add610098fb98cf8dc43d16829064d932c2f788be046620053c5c13027928e23605a4e141709c0c86341cda06842e8b55fe7282c94bfdd27e11ca13b0ecd808f10f2d2f48fdcaa29f4d0f68d0e9c44e472895e48edb5ff0bf0cf0334ef06772a45f9b23853f3edeba56a48bf5551bd58aa659bbbcc15f288097a400650088142b193b82a6e4d39be80c570564fc5fbac472719cf73b7bfa5fd7228e5e4ce725884863b8564b6f23e24a10c2df84dbead16f1166d65cc39868a080674321e79526bf768fc500f61fd03966918273912423bdefc24821562d40ba00b935f490905518453a71de75ca62f400d0efebd9d9e12f74f7d1b54c888885c26ca273a108d640a7c0184a0c3bc0b18dedb9becdf2c49d730eec163c11eb2aded3ec4e7a6ec7bb113426536ff8d1b048c0be0814b1e4268ef9b3b6b4fdc01abe5bb096b076f441906b8bb534c3e942852c3be4a97605916c840de29544995bd7b56c7ec0aa24175a0ff2d3f0f0287fe7ea0471debd9665f20b131729de419dbca64ecc58ba9b0cc0edf7b540ad880f1848129747ed54e248878f0dca778e3675a8a828c9f35ecda967b7acf586789af4b231fdc4df25f157a00c434dab77d6b7dd84c0590c242fa5cceaa03cffa65033d56e7242fd89fd51bf6f9f4cbf7d1aee044d82f217c0e9113f8fe3d865cd523cb693dd7d9c946c5015ca7fe79a256b30cfc9ca2f5b4a264bf92d4ea46f8a028bf54bcd00963526c8cea2b4d605f66d2b3e20441100281b2822999ed460940a855ab4dcbbb4237c2901542edb55db3b48c81c55d8e93f69d5b03292e2f4126008456a908c14ff811c9670669dedee3d7eab0b9509f1141977ce21c9b62c57678819744d36b983c185e61b8959d41cc4ce5c273e3e4e408d5f40282faf5f1ccde6b4daf33dacffaa1d7a2a783680b9ee03f2e2c87c11358aea8a3ca5e5263b10cb6450e1041d858bf0bc82730eacd1338b391b8d9bd49abd4fa653dbc08e1847f609680864b9d284e01fe2fb673f6e48e2a098228fc4825f6070dd6efb20b54cbf06ff1520efb2576b76e0487260047f5a473a12a0c0f8e501cb61a57bc27b73a38cf5e37db8b852041f0f91815940354c864904c6b69b99a2daefb00226eb12bd645d1ea4a9a725d953e9a2d43366c905805780e047741496449a7cc267c7fcb51d0d0ca9aa36f17778dd0caecf1a12b37e3c46afb8f1ca5a2cad9cc8e759b35fd60d0608575907807cd19c5bc61f4009386f2878345dd603da2815325d76d677dfe8e04a13d3707a14f5439caf5f1ce51c176496988777086d8bf5a280477b67b4dd5e6c3f3d7d353f00f2b3655687925e80bb1234039dad44ceb87c258a08cf279caa71f87378203b1b7793937f8605d30253d771ae5b28ed82b717b3c0f5a8a594325a197ebe752edb9d3a27358788cb2a063197204e8f52f1185e307fa62b29af6b493561c29c19faf56bc5223e0dc1dd38ce0a87cf9edde3266a11b5b9454e3181368a9b29688aee6542918e9b70539ce6c04d3b64cf7ba51b803d9934ad41570b20f8e787bcf6616b0af43efb09fc0ffd59a04df6c6f2550b72e2aa95f6a5f1dfd7b13a86d33e0f28c8d0d4c64982edb8d710292e42e33189ebe9785cbdb1422d9c462939ee24045fff6117779873756ea90bfeeb8f93488c27fb8ccdb5d61c2d5b260d4e4ee3d0c894de98a5f0aae446f401964602c367bdba67c6df7eac55cd55f8cdd6d9b53fec2ece9948f548fcc22ebb83cbbc23561d159235e69bbc13771abec6681ce3c9664d9896158179520999064c67ca61736f6f416724aa4686cbaac57e6a584a875729afd7c9dc35200808a1927ffd964d5da6b6868d59a232da4421b52ab25885e6564e1997c0fbedff87bcebc7ef1feeaeae2478ca8401770480a8e028be097bb2d70f3e0dc40d9fb8d7be2b2a81e2e6d7fc1607111384b35ab727ff7dec3bcd9fd350c335a6193d95bd9e7f382a4c206b22231ba5f18fa4b6c4380ab2d6f5cc52a29d9aeb12f3b56e936f33072a6639ad9a270c1307649e7f626ca0546a0bc1af743b8bf0420bb451c24f951cf2d0a6c21b4b01740e4c58943cdd641f9bbbdde4dec68ec04f877bb46573fa097b67c651e73ca9126e149c28447e934c1730e5341563ac636b8dcb0aa61f21a32ec97702bbf35108c025477e5440f74e8ec4b4c3a6dfaaf685114c4999c32e7fa11b2da73209768e8ede8f9d76847a535ea5c0d310d90e288ab76bf784f306cf09eb67a31d9745cb8b675ad52ec28f2415e99c9b4f8e4ded0bbf2d7ad1f6372bae84e0b58d0ef19eec0dc279d3beb26f1cf1e0d23cc438bf8bd5cff3fcad1f4d664f819430a56459fea548b4276319685504ec1926a8d3d32e64686dbb02529985c40ab10d0daa35c3ec123f391d39db13bc7babdd321e7fb9059d5ce415e73cec51004ebc47e06d523d3a797b26cdff40c6bbf9e1e1c91c3237bff1ddc681b483b1b51e4c4917c9e78835575cad5d0ccbb05f9c21bb59987951e18413b093e8b4a3f17ed07591680b76acc1571bc29d5ba1836a67ead00323da3f4b547c56354da29586f5cf78063edba37284cc0525be4d0dac445816e64f92efb1494d98f365772913f4c4ab78f97552a7f9c00d798d8777d083e92a9366524f5bb9763d15234cc327f0178474d8d08355fcdb905ee286d3bbc809566c52ced2a475ca853940f1cd348cbb073b313ef8d97e33d0b2f3826c33ad9ad391cbec7423ef4c244d5d5105dd39c78dcb6d1760a61ee340da1cc03060e9b952adaba076f904d9bbfab8576f7890619e9e94c8060c031ae0fc957051e81e9d1fb079cdb1327403626e38bdab9bd727036889485f7fcb4bb90841dae2db82425564ae3e949d687bcbc774c3f20cfe4c5d16738d56594f98a1d40d61042ab423bda07b4b235501aea54fc0f7e188e1d11bc4c75bd6727aff52bf0c6798eceb4ce27853420592bd5f1bf75fa7432b3249422f26d5565fa63d340498665e60048f02dce522ffbe424791487a03f0603b02d175be0ce20a78aebeca225804f7c9ae53d8cc418c342ecff9fe48303360c326821e93bdcfee16825ab29ec31c39d3ca391f2331e2e878b8be1fb000c386bd7afb0971a2b19efa137430df40cc6e233b1c4ed2808909b65ba4592c887943561c7428b16438e33dd9cbce6ac97899f7dea3ab41c80fea09e1ab4f2042cf5b68deea9f5877c6f27336730c050109e9de651920541c80b969d0aeba9c0e6f48a8ab783f930a1134af3cc5b12dbb57e8e7e3e1f815eaf95fd304c0004d977fa64f294cdbf9f96da18c189878debd932c99a8f56f71a4c1681f1ae9397c0bf1a624364177c1f3e4a17e779654f7086d2a376215d3fa99602be2192043953679a8c724c122e6fe98dfb20d87c525efc0e69a1825a995f4c68a277aa3e66eea23d88ccd35546e4dfb5999d53852c611ab579cd6c444b3e7fac62914020241a53d033ceb5ff5916c83ffb6cb9283748e83f1173778dfb4fd65e9ef6315e9f05925ed79349491174a44d4f6e5efc23d5420da6b34c3e6035fd11ff63ee798fa4c6820694239c9ba96ccbbc03d56edb94f2a700f21d61f71d3e98b939717697565f8603eb1581a56dcca94b69a53e3259da96c92e95f689fb1a75ee9bfbcaf95880f44ad06411ab50fa2dfeaf047e75779788d45866deb52ae0a06418022847c4b8b59d89a0a91501fc116cf664cc4e01799b4cefaa62cb235fb8b369371d562f34e8267d7892ea40035fd2cef66efb3cfa255cd693643dcaf6f3e15a91a35f8a2ca557ccdc81bbf9cfad89186649edcf8aa127b61c82880b0a822775cac1ca32d98c71afab19cc59aeae341da03ab081dbfe730852051c62ef7de1cf88fa6da004ed676454cb3b1c2a55babc4a43e43499b8b9a4c7a04afc73329bc9a33ca3dd456cb9531512ceb5f1d1ba47777a42ae95fadd0360c18c2129ec9c22a89cdb7339c0812bb2048e97da92cfc22f61d30037ece2d2a006c0baa21ea436f93b6160c0d3c79c54f3f23bf09513c556a0796baccf1e51263ca556e8fd9c1b299ba90e6663ac0d1e959e77a553f63aa9147d459ee2baaf0dc47a9dec6e57348119bbbfe3e34da3941909fdb0bfc012a291689800c9e998cfa064d41ee30338fabd175ab7a2c16086497055fa26626d45723aac0789df403d246642d331cb62a2edbfeed5b1743214ca0cabd4102d80b0d0e3f4e8d933bd2cd6e5b92d51cde0f719700eef0f1b54b3256a8724eabfd39ae2094b31e9b006a6be2ed180800b95af4ecc5da25d53876faffb0c3f6d40fed4248ed45ff158538fb0f63ad4fd16fc21a813e38a482cfb3f0c2304bb092a3408a79907c25d1486871ff0cc5d47a83f929bb5e5f793c90f918bf9462cf7dba6fc85955a2a107307448c7d685a84584e00a4a63090548d68becad57231abf79aa677d47b730fe884d811bee6c195f7a26d53659ea9f0511480a2652767811a48b6d90114efc1b3391aedefd9373d95ad80600008a7b5e8781951a7934805e6784bf6948010e44368a5520a28952c8439eea1a7f984aba36b23c27a6fcde7caecf1d62f52c0e94b3d3bdf202e82a2fa8c8e295dea0d79cc6a8d168719969181249f73574be5f0e3157a418f37233de49eae8cf3257361194bbef2613a1ac8a7bbebbadf10e3d3d5709a0a68588b7c74df48575e897ee791dc48404545c8cd128fb755b1e0bcd09c34cd2513ad827cfc3f20dbb8e5efd48901153d5622ff3815ed806e52badd644af0621451f418857d045660af1bd31b20882a3e3b3365ca54401c8e3561e97c57e434e58be1d453e2d3bcb375c76c636ff46576cf402ef6c71afa06148ad8a134780e0bcba5ffbf920a5f2104084094d27692550933f81b686c52691c094a33cdadcc4ab0da549a23d3be14c8fcfe986e18c11a5b22ddfcf6fff9d07726f1c3d3af89f41e605ae2534998841b5fcee5c76af61f31b125673667e28dbfde07cc0356f1435af875b7a8899fd22fcd7348fff004e1e1f3b8207160b377d7624ceb33ce8c3d5cbd153f9fb8c1b96083db93346e87411ff6f347b4eaff3fedfe3cd7c9bb82be2454c33f38d6ac11d6b8a9c5e7c66c220d5a5bba7d9684c19cc271ff98c86352e21f3078730338b56d14711d9414351f58d872003b34c78c427d4465d6125a31d2eaaf9cf6fa6c7ae9e761fe24b5ef3ba09f0fd82e269472436d48e97c2dcc85b3f795147df94fe73b52844e3bc01759fe5747042781875c5307739b36637e1a7b12808d5b0a4f9295726561dca6cc08d28b631051ed0358ec707dbdbd542216ac916f214540797dec3d995a8212858ac421a5ea99969bebc39101d5dfc55dc364bad1c05b51e79b7de651ae23467a32abcacaec8696273a52a139ced8ea6f92eaa9d8e066b67cacf22f32fac07168455be19879f50589a1d297178820d6ccd053e31f680a56c2c0d5a6daf883d42b61c71324b615a88ae7d65c04352fb60707764ae9831eff781630cfe2f4529ffcf6e14b61e43fa2a8b08e644e84cbd53e1d7f55e09ff467e5b56fb055935f2023e399785a1c186e70ecb000dfcf5bbf4f047a8b0bfc1edec546c75a40dbd6c431960ac69d7f804e06252a8d005051fc5dbe7ab75ee8332e6c25fa6a3715a03436567f38c09c75db760d9c62998775eaa70c3aa1e3c24551a180c4aa524b7d826d34611586b0a230584f44fa113a655d22b19107b992fc1c92a4538dcc2a434f48a28fafc3278b248359a3b05d7ddac7ac807e3813c68eb2b20430e0a5423d3396e75f7632d4f46e8cf2794f2401f5a607354cd1d1890b65355af85dadb5f2b1319fc6e61d3f351217ee69f91d42f0076f302df0c0130e03783441642f563e748d2b5ca7206d798ee01bebc06a70eae16ee8b927b4d02b7353945a170c3a8d973ffc2e0a2e5f43dac132315cf6b428434c7ca46f872c38ec1d593a33fbb27b3ec9e90890a86d19d045d6a0e97a2b06b32a1ab0c2f56a68abc05755595dce83f7a58b7f55df89fff79f229125ff9bc190a0d93fe9c0316fc0b48ada2020c7967966732bf343813dddae46db97b294a44546cdda3382ad85ebc7746dcac1f1284168325da933dccd101c0d7b6c39932acbb56c09c2b76a4a494acb7cfade8b16be443130bf72ee268490e9e137e3c913173d6bb254eed923c78ce6101ee17b214e0453c5ace715c16f97f3832c68f11ce5d69eee8059a17d1f7fffe45d7604cab5d609bebc0414d2ea2c7bcc4486d4eea250d1107cab58611fe67c273145ed72a9f33f326346cac64fd8aeb3c1f52b38779231d7133fe35b279187ea57720dea1c7c3232ae463eeb65acdff92b83c0154dbd7df78fe0fd00de6315fbca728c663f3dedbcd2b2e72fd04216acc25c9e4ca520299c704de9ea21c699d015ecb315effa8422084c60427e17a70d830eed670c12a58f63e3d9ccca9f202f6faab20757f62efdbd8a4810578e205d45d80facafd12965bedb8dc3dc380f76ac4d94bb731276cf8e3d6d2fbc3e38a94c583e4a24b6550b9020b23799b24e1068eab5787633af253858cf7d454cac7898a3c8c065eac8b23cf63dfe79ca8ac26f158c1df7b4a4f3b5a75716aa2afe0f6ac22e85e35fe7876e60daa158a8c5278889c650e53bc8bbb736bf72959bfc10d32b989451bbea7dac9dae3becb24c68322d1956398e931cc1c32d5864dd052ceb286531237c9b7fe4482e8defa08a3f52dbc386d993aa8c1bb03308793a2a13b45eeb6b5595e3e7f73d0d6711540c84080ec18085352394b134e588d98ae70030cbdc7cf31d535c253fc2cd3ad3554f0283d0a6485a6ec2ed5d1708a1588d16f7f843a2c79919cbb59be6ee94cf4f4c479406ca1ead0f1abc953cc172851e8bfd96e2f8231a8fcff21296cc9f67b01ff8ba4f894375b8e35be648872e3bbc17fd401dd4b3905c5b32c895363da487ced3202bb0a1baa6b3e789524f6f5a7e586a81e10f135169f8573c012033ece9020574c479c92e12c4518d40ef011193d12df6988b8059f760f2619c87ee0460186383f960b0d4e6f939e2752aa48db834b8100c20f5d4cce3e94074e198bc6e72d2538c165d96fe29ff23f2eab94fda95a2af2a753b4974645a2b961944051670c2a3cc34eda4df0285f6dc5f90c3bd4612fdf11eaa05c3129a9db691831bccd130f1c2727e0442c3bd83d205947bb66d47a295873f210ceb9c4b7ceed2867b87b0e9e56aed65ce804924a554c36579423a8a36fc6f8776a7b7a4c7d3e6b4dba0d9f17e1dc3d0728557ee92424b26e087ec71479bf862a28508953c45c8ed790ffe600836ac0aa9d56a0da03f6b02ff170d118a4a0c9db9fc1310fa428a197b41ed80554f19164d45aada71eedbd81009d4c603aea2eaf1d05ab5cde83d580bfd5cec0062b6c79030139041075e583dd530e0146c0665a0f06a58be65cd7e51f243e1f0a4f9c4b389b47b309d0c6e3b4a38a162904d3146c93dcdba1b4515b3421562072db47c4e7fd8a6fcea245485eebe947a1c275c86e1ec612e69432ebf332d4296184b0a22035ef235540952c369d8dc8281913ae7866793790ee559d7f457318ced575b87220b7a8afbbc1df1a78b13671ed22b6c0c714e002c4e7572bf9b84c4e23cd1cec3a60e53382ab31694a8eb4f1294c1a0a0d7711c3183262aa9af6e8409ebd442f0ad4d8a033783faab9e7597b29e52a163afd5dc15acfd326969961947f30f468832e5408259267d205567a15374dc98431cdfc07f8f4d40d54806f71aafc2ab6044b4d5818d3449af89d0d624a12c1b1b031c1b62cca17f44892132afb34332670187d0396fdebf34fefcce569866ee698192a60a25967ceba3490128abbd14e44f61f8723f30339f0cf03ad63e3ed65f907cd24f11a2fda248e62521226d15d78e3660068cdc3afe765d79de141c06b77cb03802992a16f58b7a32a96976bb6cb2dfacd488743acbb61f57e0ab1e254a797f79b7acf87386c20ac54be98ba24ddf5cbfe03246a53e691ab7c80742c386334d6f0004b519be85673f9fed68bdc7b89457f53ff8b01cc9b70b4832e6b7101abba305fb95d933b5ee11716d751773711ffe99e5c7fe39acef3ca5d1ae7e2c541816248a8d7625deabdbb284ceffa7d1a0240e73adef4f74ea0008fe5e8310f72139b642967e33d3671ce586a4890ed4f35637bbb5e0f02fe92d4e9977a131430a92ff1d186e09b8f69350fdf071fe9685a13e7cee31e14e8fdc9db0bc9121254b3ba4d481968a0fa60de96015143945063a3aa1ddf3343732a1c6d963d910b7dc61afa5cab5567c82731ae5fa4b0fe4ebe66575e2a56e9a4fa2df0f56619a46eddfff2c40f871060e7ca374847b62ea5b30687591fc1200566c2fd9d2266782ce4b178fb0afc51c94e0a6ecdfb9b371f6610324babde8341318c223390c9538877d3917690ffeadc0ff16d1e3531636d3e9c8d7df1d6a55df3cdf06b1c3b9c12ea378e06edc4f0522030333ad0dab6241e44449eccfa472b801c359252664296b5c800f272d95b23b1261a57549fb5d97e0c0c622931c132a58c4453dff814c0a223f495c223237f078c769d653dd9e3526f4900015f14ea23484a2a55ccb7371735ca4a0b46013bf9cb5397e132d1f39379c556f56bb6934f3aa42ab7914cc4fcc751d6ef9b22b34b87f1e2f5da7f08b4bbf12075714514f9894295473e8d5fd3b39d0c39a999c8517f1d94214fa3027897bdcff5908a1811dca95a486a2f4f02aa1d3108c9d00c06eb0ce91926cac032a5f2e7b9ff84f4709e767d5947c297b8d307ef0aab5c0fa8127b9daefbe77091128c5c9bffa58c09b7c6341b87dfddf34682f499f0364828972f45056019d8987c93061addafaac8c78a376741e38783ffa6ac31afec67520d04f008899f7f93a14bb7a6f662ed5241e111a3f440d50ecb9f2de396cdfddb55064b8a5b5eb889e904cedbefea7ee47c45fdabee122324dd7c15da36fe70e04c845e2f5c65d1ab9d54289cab51b52122937172ff7a11f8a56a275d74e89517e2c49bc14921154dc76e6770961057b165d8947981befff57b7e841b04e12e9cd6258e07f866c47e554693ef67e2cf6ddf85fc1623b1e0217062dbf29b12a36495b4c9842dc4187283eec7acf03a37b343048e418a97c66576bf6c24fde807c98fef177dd8c8f169eb1fbd8ec880864fea9f6d49279ab1af4b859f6232a6048fed66568dda9649e2564cb192f68b30697f40b9bb4642405cabebdd2ce7d258883ef2e722c0fe0d7e1089a55539e01080cd6a09616e6ccd967c8b58abf6dd91b9469bee3d3ff3809355381bd33f7d614722b2139f98ab0853b82c4ee45a9e2ede7a4c9dc55eb3f9d221a89c6729ebf6c3265cafe4219648e59f65bcbc99e02fd556aeb625195a7ddcfb7b5101d19898a6b007e63766718097565778a27b286002f0f3f733e0e5a16c06b2b70d0f6f083ac7c4d296c8c6fe0f50ca8a3c1f2200b670bb585f134880a96863e4d4116e37fa67d385ac246df818962ebd278db7569732faa856b75834eb500911753bc19accd603db2dedf94e46a9ddee0953be70136a66cc09445301678a2d99226233137fd6333f9120b14a4e50cfc25b96d2b2aea004e79f7b3cf9504034985ea291297107acc81b6b0bf35f22bfb17bc95ed6861187a4be6523d09d208b82f8f28cf55f102a291ec2549e4f1028b528c9315ffd7c5f3e750a2ac575269f4767c165bf807491a82b220efb3fb8efe9270d271153bdd5d06d0804e723335f66ba45d440a51a68ccc95f4613e47ee24dc3c6bfaf8e5efafdb93ca7856272f89b44773fd6bee156976016f2ff804f0d6c96f5649478fedbb80450179075bd26b208702ae54b08322449930f299f4eae82730b87202706da83ef947cfbfab2ed0162e659ce90ec8beaf5ac0207460718f3463a9e79812c040e6d8f6c4d22da35793f02dd7840ecc25a3def838bb85a5e41a51519881eb004d4ead1a3d81be43f738a62ac951e47d71fe213bbc0f90d8510d553ebb531353215b763bf50426295582a7201c93064bf5bd362f0a11c4ed95a1dd249735fa37a67a7ec448564cc733674b0708b1707a0440b7a6f4f1949f25697446e040ddf930914ea9696c7aa054be503d0ae83c20e0abcd10a202b7d412ec6cb09040d5fd61fd3c6c293e23952380b4a5c080d9dc41d34b1d72acb66b1b78758e9182ab9b7a5fdb33e040ac77db4d0a40ccb0a62d08364573767cb3524440692f4de08d1a357fba5e38035c48c3050c994c729da74ac3ed35451146ca7f5c42cc3fb313e8f299f1c67efed0ff9d23510b16de5feec9165ae2e9c5a4ba0d93257f8e742419e6aad97ce05753924dfd816e94bb621fdfa5bddc4a707287d47d328f8ff7d62bb1f98d4eb73f0b4393092e96b22434fe91ea263389a75912ea5b8ac79dd78c31b09dbdb1b173ccc5a8f2f29eff10dcffca5668b74621de02837ea41cd13b6b49523300d9f30bd7081f568f65f57fc6ebd6c0a6f6f8c5d702d493bb4d08851c829c04a7f869cba8b4f41671e513fa19a799842536a3f687b8b1624b65665e94172b350222501d9a72c2dc60d3d6eadb2bbb350d16bdfa92a36f599ab1f878b8964c752afe1ce9581310cd54530d7b0b1ad44c34d1dd225c031c38d43ee9fd8536512411e23a65e49c9aeda97aa65d04f74acc153a3a247c1ec48b33df3cec294c58f78df2f03d45c39ac12d065d2016c063153d6f872bf9ddbc24eaf146979765fa979836a56c07233d77149234eff43457be52c5f6ae9c02cb52dc359c981e461447cee3c8ac392f2696a292c539379e7c5853c6a7e2045f6056572d93204a789f82ffae47469c9e56a0f52133debd4297fda7397e8a29a5749da5507108294fcad4220fcf7ef7672be36447416fbfda6178bc6de234645fee4e86ca2fee4e134bf40921fd59485e3beea4bc5f4d5ba53e092a666d90ba4e0f910c6fc3a422fcb47d8f9ddf89e2a57501c0d0d9401e85e84dcb201f5ee449a3a0741bfe4ffe0349376263cef244397049665e94f27e4ccd3becf228a3f1fadfd573c94ef9f76af6856c16abd69a22289123966cf0d7412b2902563a463ec7e450163030be6cb68ed01cf37a1d9a06b5f11fda844d2c4df9bccf8c193f218674c41242ab868e7a9ba30ae645745d984eeb970d13a77a62e942fdbadea70dff24ab15a396605e5eaef712139dc4845351ccca54a9e924a0209e0a35b6b4a06125f2944f27659aafd5a9376cd76bdc8459deaa2fff3028a4261126544b38a929d3711c82715cfd68a48b9f8b6786a196ad33c7a1ebbc057199749557f39f78668731d8b420b41c2dc9fb3ff85b97ff1aab12771352ac6528f983d858b96222d20af005356bcdb47ff59b631d849d574c50d72de9fd26a69a31890e5521b38143d8f650ca12df93c82cd885409b4f9b6a938d3dac68b168d22e5f008a388f982231bd37fe361222ee3e13079ad71c85740726403a27c5b823ae5ffc21ef7e8f4210eb70d70389ac204ea7b37ac1026c7eb9d5bdf2b7381655d0ffc8edaedaa6a863ae9bc29d2df227f19681af37440991458b5e59180395bbef8bf00bd33c15d9df4e571af232f5b7eef41625a74adcb8e1c779480fb8d870f782ccb065450bb8c57b252576c58887b5bb04a5a62fc69344850f0a3f530aa5f1ab72186acb8527ed165bf040db6be109fa71afb0ded357ee55d1175278fe7c0db17919a9dcfe682155caaa03836d438ae97991170712465942072d5d21e9632195bca2e0fac456f797bac291f65f30c1f4a232d98248e1a37916fc59cf449fb9e7c9be25d80d70938d0890c6df6c541c328b7f5660bb2c098a8f820a05464b349501bedd074bba32b0f0d44ba4deeface99a9ad572436016bbe43547b98145ddd0171854ae9afef332a2c652ce681ad541e39cdc544848fdb76921422059123cea1f51ddbb8a6b999134f31f7e68a0d731fdb7070e4ba3426e2ed5e9edd84072db8e2e8b69f15a3a8da3487f4ab80920e1e776fc567fe30b0ff948d4a9c6fd26b6c26c69423001f0560b8173a0961c05fee47046d37a8a4584846c5a19f2c1f8a12fe117d39a5cd6789a995e5612ee285d182423ea080ffa50625ca58f5f623e6b0bd1ef30052afbf69b2c7ca6e0842055b8a3b80f032ef581ebb2961243afaf6e7a8cbac61f31c99f78a7718537565c1e07e88b58728c5dee14f71235399b945c3924a2b15fc3c80c80c7ed869fe037428e0751a856a8282240b3193721952f11fb41a5cf8a33f5d0a33c4af79b4d79c9c3c5b8883b4092918c8986829c189175875f247c6b9d9085d8ca6432903a6f494ae9e0dc071f26de60bbc54a121838c64eabac63d768f6b46a61984408c301ee3891108824af1dfd6f9f6bafb1d47f4a261c01c1a34464556f39f0338c5a0e7684a759ac3eefd4b21ba10c714d24e444b08774742bf7364b79b3439030b98d8560915a2639b2eeb6a8343338dc46ff66d36546d81b66c154d9d0ca70c9c8041b6a27d33e6c7cffc91accf56159a249f4da8519780723a4542c8718a8f9ee0e5be5e31225aa2b0d9b84bedc8f23eeca8bbad10518e06a00f13642dbd4fa842cea6e720cda9c925d86d9d116038000b375d3435468fa3cb754c31c0313947db7029d1355104dca142e1d00b46fe19ecdb507733d899b9e581e4c049eea90c5273d6a1bb3fa5ea4b99420a2f376e152c71c08cd53adfe110f7ea345a7819a9177c1e1efc92d11410c9cb8a13f763ec75decd50650885dd016d4735afcfeb3a0967ca452f047efd3b11d61c0ff26da5a314fc1c893b871cbea6082fc187d68554b5456475b53826f2164e74dab44167f97bf65712b856f26121e3ba9dbfaeab09ecdf70fd32c90bc2f828e33bda1887f7220108f356b1168ceb038e2cc4b82ae3ae3186a2bbeaeaa485ff4796e67fbfee0e9045b0c76af094061b71da2d74528e02a2e86f6c0d768588d87440e0b3bbad5b8f21d7f0ec128de6966007a586e42329c8c90ebcdc82846fe82b103701e3f9171f26d6216793f946703bd994031fa0eadf9d68f140bffe2b92c1f4e45cc518b56f162ba78c6e151064c473a2a4a4a132daebb176764428dcd0286f1a8f652a7563b03a7adc29c6539bad4f98f0c36a78af88c61c003fb57569c8e47c7f0cd663c958b4df8467b8bacbc990a0054811fc47a77f7dc1e89ec82c3bb4353e9ae7f71d88e84d73aa425595a8d6af957afee43a1a7b76783c4e163695d5e28c69b642d72454b5ea16992c17478a435df3462661a1c29137b60cd948fbf7807b6d338adeb348d694cfcf69e70b058838502e60610a5f22a2aa1e1c8efaab2191913a1844234cabfb3b11f11789c8c2301272e519d8649f1126702d02d56c23039b052dacdbd535939591779da38303bba2fa9a96da098f1a3ce263bee4bb5fcc6e5cbdd54ded7a037452e77f65dea5935696c4be72bf21dc4d09a2ea2a93eec6722c1e8154ad33b99b26ff1aa5408787af7debbd28bab8b0eb24965cbf2caea57b7826f1e06cff228becc672043cbbd13c8d897d464764732d7043999d8c5d677a4f374b1d8514d9baa525f93757a3388c1e3d5fcd0a7b96753fdb10d78ec9bf3d2c0e4c485a92da45e06468bcc1d507e4cd55892bb3b166c4518f5d8ddd178ac339caa75dca5ccfe0e217d4c263da22e30ccb05f1526a326794c7ba100c1d4c7ef8569d894300c94278439bc655514e075b2a91e9cae6e383dd1500b3014731dd50505cd7d570fdf4aed527a5589e02ac1849093b02707067da149727dd1792f26a2e7c4c3a776c5d8aac8be71d1b839c82d8093bf3a711d40310abc6c645e259ab079fa76c9dfa1e5b8f99d17f4415bd66fd415eadd6fe347181e2df6443f90d4371bd1e877f819d9c97628c9641759917c278738ba92de4600a41d6b020deee3ab00f409e12f7718fad035b11d59efeedc5c1f1971624e1d1c6b2ebf2c3ccdf4c11aa8df618e1339637a88ca3a3d3ee1ade493f58f6acade7af55bf62a9edae433e078275e45911c1d85efd176898d434fb1f604da174f858e4b4cd4f91a91c99d4bdf9398cc59af4a98048698022b8036ec46387640252d26f92da0f5ad82b2a199d0892334794af43b8ef73c840d1dbbc312f87529483cb43f1f3f871e0c5846aae9651bbe87892f3ff245a6dcc783dac3bc00b3416c36c6aec6338c1a1730751553fc42aabe4db4bf7990c0d3c984c9c20d07c21d2050784b6d07ac8db4295e9aedf658958b6e494b86ce0a4c4d321504d6ecec8a83ba3a927fb24d2344bd7d62a829f4ad029555b4120e7e34835df5adb0fa55ea43e676f19537d2452654604ac287d77814bda9dbb76cd38c39e80ce51095294e57d7413864490d99b4d011d4fd3ead69375a4f677052c8886bee669d6b61f21fbcaabdb36f7b5b749ab6d96288b2e946488e07987f850f0d69a8d31c0512d9e1c4a9ea3b39c3222ffbcbd8e8eab7d79ed16f74bbc848afa174dfe2d3e67d829addf351144679c8675789a93d3d0922c68c6a151a332029c0e464368bdf44be829638082165ca8df597ff0a26fc42ba901c1ae8c1f55ff283bc496af89362024237ee9c37fb865633363575d93d02bd522259c18cc552b653d5b3901fbf09d3f02098d0c22f9e488489c480d8d8b0e8524605ea8505f33c8ec7d3c9152492f7a47b469666a0fba9fe9d9567c955f335550632bdbb92ae02c3b29a653e3af8bef390a074d0c57ae80a9716c942f08b3d0582497bb7010239da2c47e4b2972ea6ecc28d1cb9601eea7dbdcc1ba7ccf283e0c503dc992dcd9bb02e9bf6ee15010c030da17ec93d053393db43a8d5bb6c2390ba9798760801d4282f0c900844e300b763b253b2ab30c5478917fdf418c111fdbc03c391bac7ca7a5d121fc7c8434aa11f3b2cf8f2d836e03ee948a3c4e4ac0a0a9da2385374762777ed87c485d943f0f1a4a004c07270e0d625526dc0113fff09fea32064b145057d1322478c2e3a55c76bdaca9839ac4510be4bca47116943e0302664c51f6ff4763f8e3ac8ac316152b2ab1cef3e63bd83287c8a82c2c6a0f6900413f828294636c72bfed6dec898e783f316cf1eb829073453122b6a798a0812bc799b640b8fe8f2fabf0409968bf9de52bbb3a581215ba6eca04d90bc4c9c87688bfa5c6d2fe244a0b503dbdd8629fdd9c7faf67b64bf27802fdaf1402e76437c0080702b4d669e6d17f7e4560cd090d7b4d0ba15013abe8ccb34af55a188ca8e050e235a0eff449458c97ab3f607a42679df3a0e01f4c6bc754f1a97fd14a1a09a0be9834b9e1440a1e48dfe178d11fb9c094eaae820d552b915bdb945852b5f32e45b5ab5286f58ada64c04a4c5ee8a30d461bbd9642985750dc453755266a5e54b1acbab0ef0c9c05e307579283569e40b11912bf703d83d17183effec478eb6d1037c1d642229655ce2dfa7344d47261afd2ceb8de6a8fc4851f6275196ef608cc0937c8c3311579fc3fd96d2557c07555344f2cca98023ee63c993697f57ddcea71ef2799f9b3c0408aed893c1ee690daaed6cbe08f70119a360b657964f102b2bd6e534393bbbb34d3e54a2da51219d5847ee9fc3aaa7b4f248d40f5e15243634e25ed00a8cf0a2b100b8e85792bb291244cedaf667a98884ce93f2e60716faf70a43234fd0cea70f3be7b35088b1bc211e5b50a1563b53f0f1d968951ed4de1f8483f34c3acf316f46005c415f3bf9a14ba1757826748ab80b4a4108c1ac54664e40a3be49e6ddf534d1544efd0a76dd18a9de00ed7b8fb89c40e44f6e977fad5e050a3171ba32bee68551f00df77a35004594b8de586a7aae8ad62c6a38a96f674aa96804e56d7d2c16b42c404843405939acc6c87da51984377d479360f11377ced417b72cc9cb729819e83c55290561ad650857dbdf82a68b19cacfaecfce217adbd9eb7408519fec30de30bcf6166c7431262d0c024b98db9f704943abefed39a6d82c72a614474abd199f891c475b4a95b6b988001eecb134c55479b786aa124689760d888503bba07cd24d205bcfd2b3e803a122504f1a5f826d83d325203710880d59102ef615abba8cb0b347e24124890f4d98d9f59947e331b8c9f5f6fb367b3728178d1df4febebfadcde639e8e2dfedb4bdadc893293b0b0b59aa97797271b50c46374c113d2be797633c33a708b2f438a0323df7a9eb8629da87ef4aa0cc987a0a3687860018d755998f3dd565391ee309abc4ec66ae7a3134921d08c49894abf1c2aa616e01d7816f8040025fb803df375188e720bbcbf53bf91d1bcf699022caa60742e4dc959d7558d3f70fde6e6183d097b4b00e2b465e3a1c65e3ef048005aed01deb7ef5ef1fa8279bf665009ec548ba5cc10bac93de677b2af878d75f6d40934c419b02409d06a154335cd21770c4c2150b5bd6085fe195519ff83d5e6c1b22cd71fa0a1f51861769cc799f0959415cfff63df054bca3177e63d069af8d0e0bf943cf6985c07f8d79fb0967d23d5bdcef4fd0ad8a0de2968213dca4c52e6f365d7f071b281192bd396ea66e1a7e7f09841769b7fe18fb0caed7e36a74b59b47c8ada93f31f101e5490445bb42274372208b90702cb450ad3c8edd6715a05969887da8011fa3acd4b4d2648eab8ed3d70d9c9d5214bac63f949a19ce189e4542bb7b71c1b541dfb0b40527a8f254609d6d35c2ad449bbcefbde00230868fdc2f68b2c9a9e45089ef9e3c8ea4ed8cf1bf9ca3b54003e8b162d5f11a5db840f13392f8318e12e9d4494ed5636015b6f0c6448db6b4e010437cdfbc60f8c45fca27f7db694de86aa474855cbb7acc67feb36b6eea7729949c24c5f90cbcecd59e6152c621490f29fb92af9bd5bfe67ba46a2fd88513dfbd3ab5d697d4f1bfb7e770e8cad4a1a41c6885d191e68fcc16239a84c1ef40f8e5cf4ac00133effefd26a30e0327306d939253829687667bcce5741576922c874a78a551b7846810db2318897d4c67073a26350dbca07badd999ffd83ed0fe7428d1a006d89ba30e0d2836aa9a74c2ac6b68149e1f90280d83549b53263fe1b74a2af4ea2ce589aa0ecd435f79d0fc422270e509990a92819198d8120234e4ee36a378b451e72e6aa26460486811a56019fa8db4facb2b930d4bb6dd982ebf07f91d2803b8fcb022b299bc62ed33c22e6487a59c129a6651ad99f52732dcf47b6eed3c1543fe9b37a6e86dc179f465dc3e7b72a4829a07cd0fed12f71fb0960e018e826ae50d16246c2ddaf50da12a45c2904ba2e9f54cbb183f86a126133247a72f242c3c355e7ce73295262dabf9e7b06fe4c71aa58552309ca774e2c58d1c0e866237a09683e9c9c53aaaa906cb546a1f06724ccf0feae3aa19c0350fbd87409d7713c7520abd69e7bef54a44e1a3f740b625342b9d645fab095b7123a04f2078093b2f17dbf50647de6d7c6834bf9d1482d2efb21d838f9419c7af5a872b5995afe836a0193fd846a3734863c9e4cf6482138f0403e7bd2dcb273580c6716195764eba65ceff294888d02f6d704e09a1b440e4595188fef54003697e6d7eeba9426d15a7c402a26be7a38c2add915e21cf90e79f5527ea106032f65d6d05e808d4db8ef8af3fe5babecb32d8746f8afed23a50d2431013163e2f18f34490f215720a969ca10ccfe1d447a9d0bb5c2a0b45b8b8235154ddb764cb36606dc6f112d8a5d3b94a8d417957d12db4e59367a7b3bad5090a05375a77d724568732e0c821f7920bb2777a680817276aeadadb1e9914cb22c458cdbbe9cec0d0db81b485cd7f8d551cccdde13b493314e72f0b57d89ced1e80ccca35118bf4ad7e263355f4e0527abdf7b496d0a2d920ade4ac34e7519200423a0ec000d90c1a4f13b72a63b635be6ffedf265c23d0bc728973db132715b2498927697c082dd8525e51b20b5a75ffc56415456754923fa67bab5c51099b8a52cb4905fa0c929b270dd59553f46fa48cae1854a6e93012ee2f17c084b7b388114645ce73301be5cc732cdb55d9f2273b17d7de2ebcf27b1ef2deb089cef1ddb00e403e6d6c217cb39e9ff172ce98c962c87c903162c2b5efc31ddd05eada1016a157b3abebb01c526faac3abb4e87d203bed7bc11964aee693107b4721f9adf8aea53844f98a6ed18d46525ea8a6b7fbe40af36d6a4b1c4a37ae467d40845a6286d6ce4ab45bd438dce1abf15c0c99e10d5916dce8c4810d33542a9915246c88b21847c70deb768355c318c8d921d28a9c389bb37f95d2a5e23df630d36c12354b8e3d37c303715555fd4396136fa4fdf0cd29d9540a20b9efa0608f13d9c7932b2e00e34432fdcf29a71d9e3cb46e516c7bd9da781a539e84dfc22e169340e4781c1f5d4148a143e5b6db0c813ae9d364c3ae39f1e6acd3ac2eb379a5169c4af455923a9a82998da63d05fe889b64c40fa1ce4fed5b4a442f9bf9444f4dcaa7167556940a3a0a684e29816437f2e4d7baac1856d9d5500f014fc6ae499f30e2d9f48b8df3412c8aa8addd8ab4ac2162876588da291e9eb53a17c0f1420d26e2eec6e2f00941e347b882a030e703582d4d4f89afdb2f78cde1144c516b69ce59459579b31b84840f62d6b41d9a3a9634003eb9d7dd5f7d96b26dc9c0294746afcee3e35861743f86fc11c7a93e91391ae0fcd573dcbb269b49ea4739d1cf9e9c0da12c1e4a46c1ebc2610f806b38d3ddd979f09804eb637e612fc18eff6b6535675a2d467b0b87e930061445a74672e8ddda473d91bd2a9d4d47cb967239e9e4590591f21920199d63f7a69e8ce8611a18c5a2b7ab77f448dd748fcd21973cc3773d71f45f01441f2da7d89489e624b376506414e635045a90dd2a9e50834dc9db73e07b26f79c5c8ad674b412c61027f754e7f27acc1cdfbfd4c18401a5c6ee817088aff0abbb5c76b0e7360fcd726c85d52e4a3c71872e52d79026b0a74222e0f449915b20c5692ee5597d4e7be392556ddffb22a429930b1d4d3a70f73c34ff400fec4d0e9bc99a7051b0f80a0e6b46fe37ab758d45ff14da30b23092b0bbdf2b9015dff15cddb3ee1f2c3d8f61c941b51b4ede055a2ea94a13fed6b725b94ae6cedf8b570ba9c2c9486409e54c91dbdb2eb78bbfacc9327528075f53f6800b21cbcc197cdf3bba92e2ee6f32a4479f85ad845c66a7c267ec5997d99dda2466c336e9eb277f2fc1d04a83d6a5958ccbdd2635509de5f7ecec9227a85ee1da21b57a0e6fe5ea74044798a80b6b93c7c4e5e4a4cf2c495de7f14237d9fafb12133e97d8b729f56fdfba946751dff7210ca5408536ff6d10f37c77ba119db9e3e714e5bd99d7322e310479d023b4bb65939c9de88a2e828812d88e76010a4761b25dcb9c5b4169f2130dc2f1c29f902304baa5629b4510975b5ec11ecfd75536f307ca7cdf97450305bf832a83a45b76b6d94e9acf7107eb8d1afed9648822cc810887ea2dc5b2e153dded09fdd2bb6e68fadd1607b7d88523552944768e5b296bac440e92b8bc31314f833cf83dd255a46b5fb85abe3efbadd222fa1be012ee6701d9bc1d9dd1bada6d8a3de414f698d76468cdf0a4311905ee2516df1beb88b432cf566965fb9052b7088562daccd5f698446c2c68596553df58234c1fa2d0d8dd14e6c5cbbb0fdf7867c8b6c0922c26a27e223453ab621a2b589020f02bd10a1387682136a5205ee8e37b732e5345232f30e5188d6b8b50d4063c04dab6473a81224e454d3cdf55c3ef75442865fbb4a1e80ffcb0d127f640f12068becd2a3164b7fcd8fef47d659db49ceebcd9d92f19eec8530ae930a241903566d6157553fa5eda76fa6c3fc86b8d1aed055b332889ba399c952566db9b7734e7bb4d18e28dcfaebaae06ee5edd60edbdcb6f8ad93fc1d947d93c47968f597542d52f4f4d6b12f871c6a8354a5b34eb258bbc200f2b57fd5ddc7ac940c6d426044a52037719a05c8bf50544c1dbf4f28ea430e4ca530a88af5a760ffd26b5a7a1ed9c0913d429a5bd518ffb04f609a3c331405001744be47e64bf591607592b8337602d6e45e32599bbd9dd97626f66e5e551180af81a7287b14e25f712f4be51745dd19bd89ab1948cb1e92e9c7e3967b90b7d7e4e44e18463acc7ffe2498d5d3949f81da634f9b1e4a3b5c9d20c63e6283b9b9607be9e7b6263e2c4af5f80b371142b7be980cbf60c96998a23766ac333a3039c6425b26a191f40caa6622cdff213711bf59dd4af87b93286c444a7c0bde7aa6274f86aeb2e59165fdf402452b74dc7008c8f06edc5d1c3d4aa66e760c421e12c836e0d109628c63cc328c5d8071753a2487ebd287ec6aa89f2d69f64891c3f9f62c6d0180c7fe298e8ba3278f53be67fed57b089d189475dbdd03310cf567bd74b14171ce31df04b61e458dd002dc26e5d3abf747fd91052cfa82f963c3e5a352c5ecfea8841a5f13f0ab95e34f27f7abc4d9902927d616c2c32c18e070e3a47152e9dc1d0f9a822cb7fb67c13672e36230a636f1f7d7957db69c58f516280fa76f3c616db0059c68e10a2d38b9144765bb518c291609b201ace6a0cf1f0135037d871664cd12a8a46b02c4945d34326f2be0a7f75100fe1ddfca395268ec04abe93e4acfdb68ea72c5f8a3b8ecb7ac37b94ab1b68620f7f3c17b956d0be22e0b44097efa2a73de359820b86e6379d38e17d950a1afa9e45cd811ef6bb7293495e80dde79b0fef3024f3b237ed944883a3c556f705d45208da619b29ceb513682425ee1af1d5524fcac6c1a609ea091d88a86d28e57160b4981e51eb53a1249b2eea34acc18502f882b70968a96c8d480927011a66f5e6959b198cf37dab6d08336373b7692b6c89a4dadf136c207d7cc1d3277c799e717d67b2a5efe4857b915f81c2074d1cbf1517ffa38fad07fd11d8cee8a54f2e4f4f36059cf246d7024ad9ce502bf30a5e7ad9184480c48cf0f56dd032e50bf4475c9d8fd70d7f2753d7099cccabd0a8958cd903d0cad93838d8238572014c56ab09c26181b95a639a289801b01def184719615fba802b0b169e43b52d822a1f95e2bc54e854732582d8def7f6cc2b3052985c0c213e8bf1e3440ae94c2c21a881ccedfb7be0a0a75cb498bab7c2b106dee12fab479d84a4a1171dd81d9109b3bc02eda2fc511d2bc1e4d78900ec3b4a342821899ab4245c4f04fab1023a7b35bbd5ea21402d0144a0735a57b7c6b3980e68dc1ef59f266de0f4206f1072ab97b40df5ef8404afc25c712c960f6beb3994134c647d1baee2bfff930d1cae3123f0218815e78a409169728150f2a90db1fb98b60cae98f013e76092db0b16b080d8d6b69de07c6063e091881f4ebd8654da4f92cdad493652f9f69c43548cd18cc5880eca93f88c5c17c2a838ae9848361be6612626512d6daeb8308e96f214a0dc93ef242264ea86a7c53b04b756923e952730d8e5971da134f9da5da2b35bb97754cd28777369a736b151b90f7a523edcafb0eb1461335e09a339971111a7a19865d66950eb61077b89fd148da06704d019ebbb19febd552ab0db866d14026524b68261a1b9ea3973ef56bea61d15421912ed15d7b6bf8beec98563e0439a17e784013e98894a9eac8d17b61292f3ef7f6d10fda19987cea7a1fc30924ac4dd6c3399de1a2307300f85bf85cd5d96526dea14102924b0bfe0f5d2571a09ed95a88d88d6574fb438efa68de66a2f63b527afdaa3f67b251c72c3bb6cda3d2b4ddec3c72938f2b30983371958f23dfde494e8e74c6583dbd57765397f6377ba65a13eefeaef7821fbe1187e2406758ab9c1559edda7c42ffb63980a10812b8e534a53925063fbe546a3e927a51c82c87d27e3c0f4ed60a92c68053e91c85bad068de38a77d34cd7f15df3337df18d7b8ee6583726ae98b916f3805686a7b9ba02e3c21584cc17434858c90af57577d5de4585c835f64942aabd911da3335907b152655f18a0ebafc1983199fd159ec353a45615c9bd556f64e984b56aefd76e0647aaaa4fd1409f8055f5e0cf35bad58e29a03697cb8bbbef7c8ecace298c91a0538a119b1bab8b43443f79f7a01e53beb3352f4515926c8e70c0ccc6ef790f0ca7bce1f99768c11267d2cd2c6ae367fbb3322fecae4da0d19e87e876ab599110ed79786b31a142fe363aa775b23c1b5de1eff93eb57f53ad4e511efdd47c02364aa705a19caec15264b9537dcda933f89b31e5f9cb611982ea023a62c6e88453d6d6546d8a0a03c2117caa0bca5931f39dca325a70882d833224e134535d4d25f1a330a54c5d825054fac9f6428cd1137ba7dc1ff09954e7f242bf0043ae4694af2ec7eed178a529b356e4031f2ca9adcfc687581f97844e1d731a803924b76c7213b0b2f6ec098f18e1fc279d4d5d3b7e8c812ca2e273e218e0ce5eebdd4eeb468d1f148edd95669f6ee8f1df389da7daa5d6b2182392f08e9aa24dd2380efb6898753125cef8e4eae3f77795232486d039b8ed8b806c5c094860e579266132dee70793be3f6618c7a037a9fadb5424ee8c9854f141a710fac2b8ae87736cf20f6f0e73fd99a30d5d8b18d08c5d44072cde299b9609b858b799fba448f4d0041120f181cb2c0e6b6f98463eef91b6de8269d98a6d816cb403497cd66032723bac49c97592dc2db9e25357e5e8040618991a751a7fd18ed567dcc32356c1f1afeb94d3d282c6716fb3447873a13703f91307cdfc6311bbd22e8322fb5975d464d071a686e0587618e9d43de9871e87bc24ccc96ec5510d3b61df1af22cdc8dfc6863f700b16fc6bf6662006e169908c0b25662a7810de9a00dd2f479029f101df4aed2c4492a7b347bbaa5cc035d43410b23cbc904ef763f0f0354a78abd178c91e66cee3f8654ca63a115bb53a33230210680a27a421c94b1b333a7a1f2d34881b6d00333dd927095a7ca063016e8d6c79829f7e9d6162e4b1ebddc93b27b4a850542b0c7a3383fadc147567df8f759e4494b176082bf40d87a897362b29ca32fa1be1c0e7318ce6e60147c46d5f241f830b08b149ba5f0dfbfb4ccb2429bccf0a2ae445ba0e114d1dfc62b53cd976a64e5113efb696f6fe651cc2ef4b7cfa1a61c2f18f909a56e093d495f7a40a6cdeb597af2b67f81a55f235a5a5b0f8def8e8426b11feb9d6c65784b639ece13dbc9b432fc925d84656fc255b637e1c9cf3553818767179e1e4e73862e370dc12347429d7a4d01c9806315704f2acd2165772b95e03fcfcfa7d7cff05cda2380974732fed6f0ed9c1ec4f4d35d953ee9bbd62eb2777c03ba9ae242ece67d6b6f7ff2165dea0511eb73f3c1255db30872c7df7800f7d882e2a38758f0d97cdf2f414da51c6de14a02bcf272ed7253fbbf886c81654b12fa14935fb0bc5f5ae9ca5ad923118277dd0ec7f8c49e6bc2afc613937ffdf50331d1f3d025890af58ad1c55a935923dd61fd9a6e8a42b8d18047729291e548832bd52d42f29e72f25de02ada0085ec23d17f11e798d6acc3fcc313ed92884830b1b90d064bc2fad6f2e00fe4f02b68cf053e9b224be6b0f36efffee248efab87007c1a217477a515093269451877b5a30bfc7daa86562c4d45961c8ba9523ab20457d5d7555f489533131fc24e01696387a89f5c223f7434359c2f6c40fa5c6253dadec2e82bd9a170d90f855eb831305b788d27341b39176d61f7b32d0ecad9d4cb0ac6a49c059a492b649b086cf9d79c3dc118b4a31b151e5e150b537355d14fc05ce12d54f416c46120f017aae7c614672b4a90287b2e8910f1a25ac5394c6691e4dfdaa6a8e9b1b9acf2672c320108d0ea87b2505f40f1d55dfeaa709c78efbeb9f077b2e207ab35539ef53183ef2434c90a6adb19e887707174f043372324c6eede36ee7b49a8424a1cab7af1ca3e37677e0e162b37e94bbff2bf632b3853f2cc832af198e35092255c2762d2ba97217b14ee8fefc6e150bfcf7b092d17810bfb0f80b865454056587f7b3ed66318d6933c168b4f3a4b2b02302bc5d96d8ada5c98170c72fc1a66ae54b6cb7102c5b23184932b6e653c1e88532e6d17f31b3ac6a161aa3fc05c67d099617fe17ea106e452b56e9dbea745c6c54368218c7e84658bd83acc46d1f172fbd34dd1ec0ed0e66fed038b69b695f7c6f686485252cb8d1753a91320b7c790a8c5a368781dc1b569f20cb473b27e535984cbd7520323c1a1bb30cac3dbce870adb8c9ad8282d85490804ac9663a3ee1f8b26b4c4b0058f396bf1e7132c9615d4f3f77dd8a1e4ffaa85fcf5f987676679a6ffc531c850e2adfc9e830be141fba99f82b18bc9fc51cf24266efa39a281f118fafb1abbd57b5b3051262522513e89afa8d3bf4581a2298610112352458366961a532744adf30dd511ac40567d39456fb5867e28ff1d0b23ace9d9d9aa2c6d3f1f8b7035a1176f2693594499b1a6de4f3133b1813af1b5c54a2f0ada87eccee5d39b41cc6964715ec2544b5c34f6bde780d0c6b6a2bf655f58ecb36635992382cf02ed21115b150c2e48ce454f99b0cdf892aec6dea38ccbbad74ec59e0259bc8d21f6244d79b7226ad061aee8b8c5c3a6f99c9ef6bca7d0abf3a1b6fed03786c3bc36d36ca5a303fc23270c98abf6c407410915629a2ccc7f86175403a9ace3213aef982b63f56fefc8c5e47d38a75dd33dd044e3c6ec4dc580eceb1ea72c681a6e231ce78a56ec38a050eb533238964b87a6deceb783101afb28e0bdfb24cd53a15b5a4d8adb85a944e261948bc9e9685f0814a7a9d9bcc7c412a69737aed9487257de35fcfee98a1a7b28b3ad75449f0c766aac59f75b8a52d679dd78b88bc0f97c458f2676493b99de917f9ccb0f8667b8d8a5850b5f2b946a476f9a6197f9cb061870a79c53135cda32cfd4246f2482667ce08deb6d2a6146066d7e270f71ece63872a9e10d2dbc3f044f20919cbb33ace57e90842dff265200b82dad15f71b13c028689026af23837368ea64a13ab9d0956e7ddce166e5c72626814c0fe911fd51a18ed2be7e9865b8c38e3bb5518a847c4b4bc798fd93891a6dca21c2b2fda4d07f9dd9819c6107665d73ee597eef7c1dd59b867ed6fe643a8ad2420a9783112b2cdb0c0c592a7703903252f42294cd7935061c84faa5e6afba1094a2b2db31c01ffac0d781d955c104a9becbefe14462a9600820259207169344656b83da9b2b4aff856fd1f3e178c0f898900dcfb58a89425f9c3870dbae8f8e5cec762480e2a05720c468404a1d8ba2271a56fb01d64dacf96474d439d0204f02646781bc1c7ab76df115f014e137dd5586bf4246a700e4c24d5be6dc25334809386b8d0809dfc5896f185d267e4a13b7d61f174453f5f6a6b66d7c3a2ba9c5d0c9022b76b77bb168065bd70c6729c011df36ae05db81c843d55bdb04706b67ff2f379f129cdd846e7089f884c1e87843e43bd60497488a0d4e948cf09a6bdbbc43d0fc07476473d0687df3d129d16b9bacd265a43e4d14ff306a5cb1c5d8d20d3f21b0eb423c878d77cf1a67847473fdc2a70edb8e20a733b54662c49e93ff27e55ca70dbfc73670e0849b957efab56e25a9d4cc29fbae3233873b8d79a5b90e36c079727f3555705d98c619868bd283c8faeb7e1e359211a1674b354559dd81aaaadb6f5a336f76e3980a7743e4c72b82a28cbf7de55a89ab23d7dd936f200feaa2baef9200643a4ae085af337b50c9eea0972ad80849687c2619f98ca450b5265fba1da18304b2552e80be3d0a980afe14b1d6f121e27d181c37b0764ef2097eb8c01f658d0580b6ce4098d474a45513216dc7c591699688b7a39448419060c483f8421b6bca8bb0a2b5435b3ee2ff2ba6ad7ec81d4e53319d70df1b69d226807182ef7b75dc8f512c126d08cfcb525ed3f35cdf89764b259e4c79179ea845cefa322ac09879e0653a6622df398e9bb474bebefa57dce4a2cf00535c8650f06100944ad09148ee04f4fb92dd3fb50a2096dfe19ae73b1fe837dfb9e7206f373529d8313c76fc80703a90ee93932d84ba0c7481f3148f2ad205e291b01d44b6df76d7f43976484be7c90a8527ce7617517526bf6006b6ecd3f12fcf6a91642296227c743538b4d40fe694630b355342d5ba1b1956100f83d087186940d23decf80f29d14e31e5cbb90250da5c93e58705cab0259a354ffded395a321687e11f18cc58c2ef7193b9fcdd1c799d0aea3ef21a33e797d238ced03e807d7f6e2e649be74fd96b7f4b240018f784de3a214ba4446ce414378e404df675fe3490de68beebaeddf9c15c4692935974d097fce56e9fd39b97fe291eb13f6dca874aed69c384e2354ba62ce2ddb60d06aac861564d484d8ebf52ccd2ab51519dea198acd62e4187b2d97aecc98f23a089caec501a0ac783ef582a2ed0f93ea48d2d683f12123cac21598caf9abded75a5a61ab5b8f688c3de318a913ead79193ea4739593e445adda6e04e94bc1b177af62e073f05bd6036a432c4ec92e00a5dabbd15ba0dff7893beb9958f8d3890486d8b8a792f7d31997aca12c9d85a67e3501e174ca0b733f2a8fc458e3a4981a78894002091858c34164cd4ab6b51d9854b6aece69b3759f1571796c0a96fb80e0b1e2e764d4f78b0044b97106da1e6dc3b52a3c102b167aec4b26fed1626bf3798f30a5e415175829291a3841423fa547259939994922933b0a80f1a72254e28918f0e01bd1ca1b9bf899877c1e7ac2c795f8475fdda6777d0b9308dcd5471d974321a3d4220d1901676dfd23483c5ccfe53ede49633f38c79dd470db93324365bccc86c8a7f68db4b90475724e70a7d2c4d9dc4ee250b50ba53fea0b9265b84032f2782cd5e1f12d4e17c722952480acf9f4d0be48e1d5baa6709968090220d1e98539831dafd54cc538590609b3117d91c74a5f44ff0ec386b8a4bf834760da46baa5351980e0547d9eff8ec1fbb254f032cf6cdfafa3507fff58da527e8b99e409543a9c355523e16f0d2f351cddc8dbcb888f389eb05e96883093eb4c1c7c9b5ea6446fc42920bb1f52121686a343c9c20c11696bd16f46d6b3ab8887141576052dc401cab28ec10cab39542f66c8a31c701eb76f49d0be90b73a049597e28cad144f4ff9341d068735c23d2c1631f489985460d8656801a11d16d924f715f4247af728c22722e74316f75322e3cf36c43be9360220ad4e595357b044c33062f741f0a85b8d5995f52f432662e31faa48d208129ce7dd6f9ee61b55d47f3d1eaddfdbc9ee0ab05e4e1e7ba37acf2f0066c08ba4807d788d59bac258033bbb1550e422d0dcb3287c869eadc52163ed6e619c6b3d605e295c590be9da8e181dd833d8163e54b022e132750f0538f874ec1d31249dad95ebf78d323a4b5264995aa1c9bbf31dff87bb85735515a983af5375c35c92749f125b2e4c058e6ee3ccfbbf5833f373d7d4d39b8ad94f2de5bbfceb82e59f53582ed02110e1d07a65e562118d9409e5978359bb8731314302316a9dd8afb2706e8d08d6fab67861c951a4c5c2b1debd0de1111801424425b23ae1a24ba0af9fd24b662200135ed850450936de39eb8975e78c0680381cda69746fc72612ebe085560fd2179112f2504653bd9eb15d243682380643ea80cbb9e6042bb6b33aacb39640c8fec1275e4b8362de43541eaaae0d62678ad647eff7431869178651495b8cbf420b15839784d0fc26c9469d9bf5e3902fb69ff31b73ff510912aad8ed6ddca69f1af7cbd36a57c778364cb2041143472ae02b9c3dd736d1026aa085743833819ba40a0c0c2af70bef36316310955e8cfeedf8db60637b2f954c9ca2c67e8c2986c8e5c6c842fd73a7401cfe54e80e706a17629146e4d7c323dda688198e8fa1079724d84ef24049430cf6392e4381b7af6d54422ec6d77e904157d529d764265fdfec98196a81eeb4586966581367f489b77267619c53f2c0fe34b8b24daf7a8f0dc38bed9903c58493b6425c1040f09ce63c9392b096f98657104d82b7259fd820de7ae6bc07c8d5736ffa32c549669d661cf9173b7df38e25bdb80daa73c8e3cf557fa83873cce37a3cafca076dab4168811d3f8495e26228de7effdbbd9e483c27d1e0f2fe39e79b39b7c92638e86ec7703b7a742734d11a81fe0eb5ed4090e708a5396d4d0b8cd3701266c1ee9e6f2f24dcd901f0b05b5ddb39148ff25adf935ea9049597982fb38f4ba2253c97a2c17ecb029b1cefb4f2a23a9eac0f5338dc62b3f89f70b7b90d4171a85f8f762dcb1dd630c161e56249f4960e5651446d8e42155c6ad947bc6775ab0289db19e18ac0e4daa81f664c5d50ee702d5a50f2070c516935b1b0a45c8d1fb27973176266ffc13308aa17fca774ae0ec1844488f31df1c175a777265c7760d4d74b6679f105a1ef078b5be41f7a5c388bf3ab326b197160e307b1300e373fdbdf9740dd4495aeb375f6f0d67ea57ada9a35908d50b24d2983dc815a16a7c31661b33e9383fb3920c42f6c587c4641740ce5931df31394f409295468dfb56b1f8920418cbc4c057fcd5d3b34c6edd06d83e615ac931e461b38337e3ed54e789fabdc4fad12d016458b3bb4817f45ad16e1a7821efa60d052bf6d672598cf1dd2048b6c05a3c06f415a70db68944b8b09ddf40fc881940fa21a9cd5bd005b1c35ee691e2804f80b0136ffd76a6d56180568c057ec8db18aecb1c41d075200e09b50bdd09f1fc19bb442149fb7c59e107cf33c108dd35f7482e75628db45042678613a7b9b973b4fd4ad180304b8252d4bd3065360e9436540d50c0cbbfc118943b8a09590a5eb55779f54f9226e0e96ec5297eeae097dd70a9f0d190b8e87a031a839868821336d712fd90b242fd9ca0ffa805a294794526ce528d771dc0301ffdc9bafd97552f19b05844d9dde9083c2ae9e536ab30e07a8f325deb38e4b3eae71bf9aad406cbe1389ae978e1291f38c342767436c88724730aebdee54d510d0c7cb711b9377e8cd79184f7e9e2ef2ad0650052e5e5257ac73ce04172637eebc9df2d050b39428f83d1ff861686758977d96640404f81fa607562fabf8c12ca723d07840ccc922d0fcbea5649286b4cf033eaceea7a48aa3370c24f011f66004c6543e092bac3e1be1db809747b153e19098024bfc676c97ab62202018695a82ec66efda1e87e8594d776221616a7bd04b34308a10b2775594f5159aac2135ced2d87c67a96d2302dc20dc79343542081451e6bd0d73fa23c7023343b72fa82a473069ccfa646f12bc557cc251016021390096598ac0a840fdb35826b3452aead23e1157d26cda438a079a9401f80e8423131152c9e4d45e4f9034e844e18236549eea68e091a90ed2e48ce6d0ddff129d35c4d7df3d5e07747e3eed9135a0bb2e708bb1c42276e2762ab8201b0632105b0aa0a936fc58f678e0ecd406a5f2852e3d40369cc5e65d15285d6f68dc9c3f41705c94514a8c56bb2039a80d19aab640f5c1e0e1e24e23b2216e642aad74147f582cb1f0dfc6f4d05d22397aca4226c9796d7c05b455388d55cea90213fcdf38cdf352ca71d1598db0c0b23e64a1361e0efcdd7a5b0964bb9ad2fa702a649d5dac7486e188b910ea5e62267d61a0a8ad12546272a08093867a483ac006860ce3ce08f5f63359f250e739030af47752e70f58c15700f5077869f86dae70c7eabab15d0d2c0a15e74f8e48ce0e5869550d41570226dda87e44830034e445f7ea2d6e53d16a4bcf0b66698b163bddd22a55da5e20b9e10b540abacf864c9af82dfc54b3fa7e4e6c4e81d7a184b36f37680292aeeff9b34fe0d72685e199f62c4f37366315bb29ac014960a3c6c2673cf9e50cff6fadeb956d0e294ac1a6ec6952de976521b7a62d2a16c7b43e1f0590cedc695527cecd9c4510caf7dc9b845edca94766c0a40f0e0ad438f2bb6cbac5c0b8a1a65151b115ae1c9de7593dac3d82f903efca95ec014d64c656449c93dcb82b2eab318b135397d449d6261e5aeeb5ac0b7c25be7848b5a15dc847294da3de0b331e48f653ba0b5a3f8dbf2df8031f82b757b62edd3aac6b7292b4885398251a54939f827fe6a660d4cafe751e60146a12879256e3124a18e54ba1e410b08af4332bbfdab111ffcd48907a8fa3df6789e7645a229cd84591b74907c84d4dd50452fccbc286b9406496a351ae1a82dd8155b60d7621ded5769983a0461fcce5a1b2afd715029dcdc21c0b3793999b35ff9431e60ae6de047b00b43d26ff6bd36535f63087b9ed2cf27100e1e1e7952d866416cd380490d44ffe13704c3a810755b28b03eea266cb869dd76927783fccdc50553c83bcf3a67a0c8784377436ca4994ae20bbdd7011cc7b2d0c7dc9a4f48536df74654933215120e1afc49a0dbf48d9571daae553173b7de10f1c8741de9dff4a387206e22f985a542c67c661039bba8bea1d18975adcdd851e697d1b121585bc817f877ce3c68b0ea5ce9fc07fe26487e84e51588c3a9833c71bc21d8411b7e92403526848cc0cd3b77cc64d76f724d672738eb62078d2615de4e3d8d5a4e8eab9d6b78f38ac1ee4713f11afffe51f791744e91f2e15e58ed4d6b317f9f245e3205f0a24cf1662c2d208b8dc50a39a2a8650e9abd25768318463fcb2cad3906e55457bcd4d064d34e73f2fa5bffc7a08fadba28cdf364fe1859e08020667c1f0ab3463e218850840a183d7f07b23638df44984e0f0257603edbe460ff20b7df0cddd7afc243ef767a21b30b304a26c3589ab9e55c26929e69f3731515650b488b907b1758936a61a91e5775062243238d65aa3cd8965b247f7bdbef0155548467cdcc0c7ec0598720f16dff0ce8da1832069977fc611134ab8a53e8cd9e29394db7ddeb07731d5522507e66214e8045f716fc7d47148d25a3a0c2ccc4dfad31c1d22f9e7ae1ea9eee9a211a766390aa9e5fe549d55bb21017c5f3f6070b8dfb73ef943fa345fb98a442951f45bb963cf643a5868a944e7a272adcc67f8c516c8a7225c633231a95bce06f6c574f867425d45b42437d93fdecce3c44ae5ae13770659b0389f11a8ca6323141cbb797adc3b0f8e5b98c054f38b14e8b8f2226a3c332c9c579cfbe74188728c8b16cc34781d7859a9221625ea3ad812e9ec3e8b6791f1a6b08f57720584b9213a2cc8a065231261a6fe97e4d68b3391b018998b0e67b293b87e920ade35e54c0e3e87d4e5c90243862a7559e7d3b5dca40dca72e6f13375d47ee9aab286a0fe7dcb225eab1021dc7a6633467af37c497ab8eeedf1ac0ce246487f3193225b4cc13409fad8c5ff4182c039830d888cfde2667de8d463ae770b96c0ffb5182a275b67684a3524e362e2921dbe209aee5b4cb5013bb9f78c241afcdbc5d9f63c4e0f69b0b0e8048476fa5bd2c0ceac48945c8cb9c5197986e404bd73dfc33316232ba6181faf254fe68831db0b7ed09b7f85359d47f8372b7da5d181e8fadf83910ef4bd287095a8baaa2570bc5756a30b06fff50c6c055ade3bbc3ab1132c5a16c9d02e9f1f902aacf9741b082ef569af47ce61c28cebc3f7c5985968f6b8d3858d8e3e4a56385ca5ac974655fccb8600cf1f9517358244019456d6fb9e1f61d626acb48e8dc82039a22eb63ed6d9526b709e63acb6e8a0632685059c9b992db10eda98bc511f3aec576dd33ff094abebf8bbd44846f22a4e8f22e30cf7af7571005406292344ab6ca9b391c4df2b9b02f48d9f0fadbc1dded0a875f9841edbff514213da0dddbd44bfe12302e7f718450866304309c22e4b492693de9049add254f4af9a5ee098e8af758d9914653effb80a8a4494eb0fd46dacda81d880061c9d42e10e6c5f8a6e48c788101b78d0a5e50157b7e072a958260bd07de9bc50d09a48d7bef92410b2129ac0467c8d97f9c6225fb7cfa8de2b5afd82f1428b0027ebf64936a1b5f2ea756f8cdcaaf76542d1b376d19d61395bab63df56571c276bf4a81cb2d00574abc35db0875d0cfc6476b9db447d65fc70da461f86083eae095287ee23148934cb35841f6111e22188a4eeeefa22929b007f4fb94d9f99c98276481c11865bdcdbb46aee6310ba163798bb9a043edd7448d8f845a4623c91c8e4c583f2a9c31dd3310d9ce90c6b2339c894d971a6778a24d720b13c3519275762f3a415c9b26d884b18c259869e12316e2982da6f63683c5ebb91a7c959afeef248a587f2d9042b16c1189ef48792643217f4550e9d2dba4cf5cf2c4c36da8479faa46312784402994e261ca5871dfc5847722d44f15f5e3575e43a374d6a4f3929025bccac911d3091de20eda6fd649c65727abf78c05182a03d9ce21d9810c86d8f4b03331a919215ebe8e90e7df1ae4530a013fa17f901c79f13d206dc84cd74f23d3b918e88e4c6b25a2b161ef62638f60daf986b89f56b5042dda6803c1ff7881d878a8df9bbde30e336b9139d661b872d1c6783a30de6b30d3bfd3b1334517853fc8c2bc06fb36bb775d54af7f1c283153d2525ec402f5fe028dfa93be2d1892b3ad5ce211ddc5457d00a1d7faf3d589cfc5e85e94097a6e3c255edec7bff8372365356ec3ba4d16dc02f6eea7f9446514f551212f783cd8eb02a9ceb9647d35a64deaffea3bf753c7c34e37105999c15ac145ca5ab01bfd470c4dbfacf6c1d9ee155e444e3830fb7a7beafee9bc022de2c2adc79c704c9b063373ca9f529f69ab46943d92557d30a4d3d27adb432fd33a201062721b233537bb37f9abcfc7e439e45ce65885bb372220ae07d05e80caaecd5851b94e388df531877837bcd11e6d79a8f333617fa7dc6f401d6f6d335dc64e1c551ecbe0d9f55ec8150ff22c7260f3ad9c27871d979e7d12abc4e623154e204ed72f4727061764919f269acbe789b9e12b4b694c87a72a8b5542f18cd3bc725b12d97c6c63731bbf279b55c3a4c917bfe17dfdcde2daa6de6cd95167c519c12a775e013b272cc84ad8af987ab8b0f50ad493d0635b97dc4b7aa3d90e186ce550a5d44f2f1297cde79ec27037810937c2163f292bcf6a20a3337f4db6f555b433c9b5adefb38112f06feb3ff2d1c41a46558972a66be1bcd65b64bfc2c251e73b57c1b2574d969a93787c807645822ea600759b5185d42c829a534552a062302c873fb3afbe6673331daf72360eaa5b9acfb3894280b6d9d03d15a0318c051b387f54ebe61bfb70e3890c271978857ab47feb6157ffa7ec870028261772b5260eff32aa2015655193c2154f488dff936a41bbcf6a0b000e78ea21ce6ffac277aa40a005efb3207999ccc168a64e44e033a64b62e5296f0c8042ddb659222d0561d27e091a14f383cc931234b8f5591d8770e344acbb1e7dc4e83ab3223cc8099b677736904c17e6d21ea62134bbcf975dafe1f345683b752c34766098eb94fc4654be8a163c71eb0e8ae58f191deb88add0b5eee56416f04f64af0839bcd4fda74a6d592ecf539f49943115f1e76ed2a7e7041b6aa5b1f0532ac487060f43141664bba56be3d2411e83cc7083704e94555128330e1dbcbc949a91c371517da142faf335b95d7dc1190c7bcad0e2ffd8bc3955259f16d38556fe7f4a1728c47e136f0dabd09a5c5accb0038296b03d35453176e1d4b9981064ef4f229a6098ba51cc15622340537cdfda88c816b3c0e9d48d5b67a6bd651e5893d76d94bc18fc25400c17f7a1a2dc9716b6a3edbf5bda860ed47d0619b5fcfb9e6405156efa0a060d2e8a533ae20fd086f650bf41cca637c0d18c071bfcac7194be665d3480d3a7f15e6e93c592bef1be02fedb0b173ba44637b0360bb0873ae869f3f2515784e718cdec3b084430ea1d8f34220efd849005f78ad7a5c69da8c6e2144be869c8c0755ce2a7b16bc1c2b0c7a496fbaa1bbfea8ad486ef68619f9506adad361b8efb556c04bc460766c77ee4a12073265cecf2cdb9d41b6315bffa6281f006527132d2b7ef6531e7655449cb862f8b10a33649c2b6da37a59dcf8eb2dedd9938dfe976a5281b5e0722d8901424bf6f4b98c39300309156dac4b1ed53b06ba542c889a27747d182598a23f266642d601751332dbfa6c3810bc9a5cd5154e6ed3997de797ec5219a4dc764d929397f5bca6ce7f14157274178f581a501f56e94a233bf76c5e5a63c52f8e571b7a99a429ebbc9f3a44ffe0fd49e9cd0c58fb9539b8434f8bb260fcff5df0b72d2c6b5ee2ca40e48fbd640caf56c3d60199c4d396681d5191ea9f0eefbc1141a8701aef6afb270283ca49b6cf5aabaa278e734f9005cced40082bbdf30b32ab53cb3d7eff6575af947f61fa0f5b377ff73a018710688b5ee28a9b3a965b0dc7d3ec74a22d9152c7bc7007b4f3cd903eec2a651946631641e407d97226c9db8f6d098566f5da55acfbbb8cad297383bf1aa7153dccabedb729e878464d4bd1db29098e000157307f725e21902077fa0d1e412986abd774a2a07dc0e208248bba95a787055e751ebbc546317ccbfde235cfd8f636db99bc8ed46196ab41a2ac8302e66122e02c3b25ba5ffc90d4a2cb4f6fdb758ab67157f71d44392107e63fe728f541fa15dc837cfcfa53607aeea632c055fd821e8d509d960ac5b804709040eccbf50c77889009798c4e72cd2771bfb38e864c504621b8853fa1d2cda31e9ba2576cab972100e716429465511d677f9af4c13b90c12ddd7048a63de310151fc2d82fd2d7befd13584e259799f9729b64676faa52451adfeadd603772f1d31b4fbc66790556b1f7c2e0e9d2317874a34e5c0d4fba9161cb74444d55c453a53c6195206419384d74ff8fbd4c5d6f03ca805ce54ccadeb484245fadc405ec9e7ea9093f45da0fdec89d219c190b52affbbead2746fbeb78e62a9f173141df037b35e98686d9d61862ec53127beba8846213958c297600b76eb6442281b02b8100160f246bb88e790973b4ba5497616f550658daec75398dc6dec3460296744a3fef474529b159394b8bceba000476ed81aea671b146fc54d21956176a2c11893bf54464cf9cdf046aaad2a1c8400e6cf348407fe79fd5bb9ceb960c865779137a667a1a8d539a6f966cc2b652356f19308a7789f2d1ed03fbda1ae870322b980cd13b37b22f21ec24592c6efa859ca03cd82e9cfc408797219f1e9c769edc2a09c6533c98c4df7a4bd575bc923710e10033a924443514ba060d2dc72eadd4399227baf18a837ca8da521cb4ae0316873a9e187394b0744ac80fd7fe82f5d59e0ad63592e85999bb3a15a35fae21fc6351c46768c65cb4fe861f5237701ad40bb48a56f82d8604d546e389ad34c890c7fa9b70cc612c046addb31722c16f303724c1fc59a55969c7932f9ea33fdc774b9d2e31f2e4d1975b415f8f64221513c535849aa8802e17dc7d1e4c8885a16289e9a1b5366a079c0dce832ef48c853f2c4ea680b03da7e963c3c442d7b9215168f67eeb22d901c6b5e6e9295992c326d38ad45782ad84175bc23a1bafca04d138fd47d927e505f4a70a55dbb970f5dc815a08ba58fef978af08b36e61a018945fdbf7911a4f22cb8b4a31fba09a6b6989b39699324d3e83cb446f70e58c5dff9af62b79548c09fc62ac9d5a9cd1e782c04280cf8aa995867f994fb64724a1dfa694087002c31468c4a6c9ea7d56cf84b164cc7d56964fb6020d08af8f78a1bdac883cb4ca35033618da55245d87919221eb08409a2cbb46409d740f4eca5f42cd5ab0b8f38c90615aa871d037a51f2649c91812b1bf91e1957ba0a5b9fb706273a337be918203ecf11bb8b802196a1d7475351f9d19a8c31d393689a382f4b1a8232932a4d52db318550062850170783aa7e990e1ef86a831d296d85b612fbad239d27e0110ef0b1ca6cf6b0ee4d3ac59462130096c6fdab1867f6ca05e892457467d5e4dc3f5d42de602fbe44409e40b69cee76e6be273e1e7f0dca6db711400cab984bb8241f0a192b4dd71282a1d6544ad321e19baef5a6abb74725c39b918488efe969ec52928704731bb0c8ff12e2ce9bb3a21f3bb34199accb784140b649eb458049ed22599f2ac040c1dd4d753912477dec31d2f433b73b31270abd666f2aa38732fe3d8b079f48e8bcf22431ca5000e00adb30048f47be43d1b119dd83960ae93d217f8b1e9db6c10b387f1d9d92aad9fc238bb70700196f0a4888bdd8ca6aca36f67fa6ece0f29a2143ed0cd580929870343b6a183bf689c051ce79fc63d4ff237fee4be3756354e79350bbcc46ef501b6bed0bdc85b64431a5492bb83c7e83c041a41e52dc8c05a4a89d45c57b7172dda2e33731664fead430ab2149e9c401fb9ef54cd08476c6073ac5f52fc3edf98404bdac1f87be69cd092e2ef18166aaaf8cbf6f52a372fccd551c818b8eb7c1dcb158aa29c7bd3eaabef4e7a514bfb93f4e102f29de81f07507d375ed1f47a669c9a939972b32cc97973af4ec39bb5719638c1caebc613ed333afd396c88585e068e6aaf58939a96e0fd542161070cdf6bc361b86d72875664512c8972750d04149d8d3335aa47bcd4c1018cb47b15d32e8ae15f7bb7e846e918de916468cc143395211dddb9eb04d001ac893727cafd1dd3e02168602b6e67912b325761e310dc4bc514af12dc5e2a8782bd7a51255fb8e16d3ac8dbf87d5f1467f7688a04888dfdd208adf475fc65e4bfd683f080bd152f08bab4dba192337daffd4bc10fe07fae0fe5bf7a3490e4d29c59b03ce1627c1b02a694901335d3aa8588433921479b147a478b2b76cd26842a761dceb7909742a211c18d72e807061d9a4141546fbb6d7b8b6327c24054ce072a71689db1eefa914e0d190c7fc8f3474cfa9700015232db10cad65625da796fb2156cb7e4119b47a90f5d71ba7a6744b99df14d2376131c6e73838c18543e78f38b9c0e37e1edd376ee2df3a23da2e8730bffe27aa6cfa2cbdb4d47a5eada347fb0cf1193f36fd07a15d9ebe846233f52e8be9bea0310d3e711c90610aeb3b8000b611b2340c970a9db5abf3448836b17ecb4eda1468b444e1f4f426ae739314901886d716e904d0def6ed540878cc20028c3d41613e5aac37cf8037fa74b068e3c19a6ac2e7f606028901fe8f930af126c092036e64d6fd3148166ff2be447b46d2bc8ad05aeb3333a5fd0b016794842782ca490ceae89302ea5ed788ea03ecbebae692783744f5a27cc85ca8f3dded77a5ec7d23b5137d4273c72344a68115d319299ac12558db33ea0194eff14d2f81395d5781e19fabca8910e026caf2a77d594a199b7cc046091891f6ff0d07c15fa0f5c86a89a02f090f6f0c444673552884b614d6c342ca9391c8eede776f31d63ec3af9a4c227e1565aefaa566964f2988b418d6605b5e87eff67bf4fb972722a7562603e59478202327418cf891adc14c6a0ea03c3f8a678809a6e079c7ff06bdba5a56b34ae78dc3bf9ceec92e080b634d9a9ef496b58ba0ab12589348e8f9dec4f2dea2e1ae77f5fe5516e96cd11dd7aed37f74e9e4f716a7f688cdb7b0215148a6d63022aec9cbc880f0925cc85fd253b35533f9adacdf4a9a989068b3af60ddaf10594a84eeb5996bbc55887e3b66ae2588e8101c63a47cf5c2a4ac531f28a4f8937112319cf7b72f72f8cadb84375792b7855b7f2b9f67c3027a33d83bd11cb0d71b2bc96376eee4efc0f78f88a9548448654ae7479c049f29509d71d352a26230c1a52c456d48bc712975b47c3ddcf6f23a7f14dbc51df23b8d68c4a7b9914c88f2829ce8a2ca1d22d65fd52160b929d14a2b651f43deee7ef7d812c7bbbc8bfe11fbb8b64c081b44b9b7106bbce77d231fd2f5cb4b1336ab86213df663c9b8a5524684229e6b00815ead1943cb1ed4297c342e1641345caba86d3dd0816aec53ae448e06918e7b233bcefe83e12745db801d443410051a4d13416001c83f89b496c7129c23647aa2105905e38266cb549d0453d2a79a2781225501d74255f5102c13ba75b630b68eecffd92b83fc470c6cfe7cebae3998c9c1e9f0cf6451ecd89ba59f826f5ac6257ffcf93e87829b0556d8969640cbb3bc6cc019d96bc3809df0561a8a2aa4e8f51c86345d9253fa70077c8293569f7dfc36ed6093bcac8c54b48fbb3bcf6235470a0485f6b648f4a1d4258f2fce7a08614ae5e6f91f7c273a10da6b435acc920235be453a2453102ed53d31ca076115c68ac4feb1918fc060a1b4beb68e8ae179fd163a59610ad402bf435eafd867acdbf9dc828df4a8c6e23c5ece11cf33042d4dd142fc42b76bb5edb33c9afe84b88a5855ce8415c1cb7af707374453a51caf881cbfafd5c1337cda7a3e75f8d19f6b6822fbe4c6fc1247fa9544a8420750ae63dd7b3302b0ceb7ee78fe2926deeb7584c30ec8e358587bac77ce974d6e6736ad86c6d20232ffab7b740f62304accb353c0bfa3846d577ba24697c4f14d7d4471c35cceb147784b2f2f36d3b69a8314bc16157503b5e7393d1f84f33220e1e301b504af1a3a3d98e74e5d685199152722ba45ed443c4ee71f1a3f869f1f358fdfc524a6cf0174803b811e8b65f5dc22b7198694718cfbae0aef62918aa5f41b632b4346983b33512a558349281ad88960faf1c22a955d7515ecc9bc47768780a2b71dba7db8903a7320904ff047cd85c8bda22178d639b138ffc6caed4cc2d006e8d2137c2b5b66fbdcffa59824a50bbae4fd1e40234b54d2f93d9e60f42ee15ea383e060fed31d5fe8ce4e09f0feb9c0849369de30f2af59bdf1b68087e4d6e23b9ef0c5a5381dd927d8755d95b19b25b137e9434edde5f242183ca9c5e159d64b848fda22ebcd6d6739a18917b0603dbdfdf8b48371e6732bc2b21c14e21cf7714f7a1af07b7d6f777cc0dcddb2e770092f70c5ebf4afd2402fc0d81a92e1140283c2307ba4e87aa950b803db812b43c0feafc00d0b6410c66d95ee2e539a25d9241613c6c1ac88636cec66ec0f37701d074b71ea661a4916e3c8cbe6075e2e5629489e5597d04bd6cc42932049a9cbb6e79831660d4cb38418cbc110d1a9d72e7b7a38fff6b40253412a92b510a4d0e50e39cd6bf81677ef4a9dce132d9428ae8e4c2a72f86ec1d9f8561a718c0325e3dd15803955d2c7bbb89bd7bf1a81ff32e4d0c2c5940129223b189c00015cb223b101e48d1b7e9b57f346f59d2c7e9bf20b0607955fa5fca9a15d7fbc8a7490a04dadbe99f7d5157beb1378b98f5eeb82f1213d9c8d1586a4ae443c6714673c7456edc8dbb7b780c5db1bac0186ccf6026ddca9d54f57981fa1d117ca9fcb5bafe20ab54b39c7a67c8ff22c8c4c7a0a97001698b20e37ec9f89cdb9e99319133ef779d5deec39838f957001b14d0317fd7aea9f1df8f7b83242317934c908e0b5ad8af8880926219a5918ddf184026d311ab1ae6cb68deb9c59d221ceb4c93bba2b88bf5c5e73b5d7ef2f7cbf1f2b6fcf3a9b070a0f52c8a9151257af68171606082953f19d2f602d5dfc28dd45ae0db636f9503be6edee0e61b3849606eb3c6803fe4211eefb660a43155cef70afa60958a5c9b61096aff685b35d48736f323af7cb83e8e941265b5738c87b4ee4590eed33397d4f2c021712e62422290d5ae0f65ea6ef84aed40e2bfebf35ff63a8ec7a4ace1bcced9293d3cbc612448f9b9d5cdf7c830d1eb252161961b0e81e238f9ae64b21b6de1334e3bc20e9bb668713d538b0e155f578bf64a43f18df499d2e1e643209f0ce77edf45c804a635ab8408c7127dbd138a55e47cfae790693e4dedff1b2854b6c8390cf67ec42fe66d3ac594ce0ccfdea964a6d9a68ea367cdb54a39d2e020ce5672f6d8e9431c431d36b0dfcc79d7f5257d9097fb0101a8190a5e3ecdfce61195cb8cb25e59d697c4591d83fd6d8a3736e05238b76f24b054027c6b6374af7256aad6d6551a353ab9e877823687ad81cb902aa43f376d89346a22d661c4b0d6282783bea0022b5757ec501188812b74c76df7f92e2520b285cb5d545cc083c8ab3f79b12917b10aab09fe99d37ea591f98a2eabe87d5f4546f5286e3ee99b31b2723842fa29144ae8292aba01b3b737a6212f359c141be9d4539eb0503fadfb75adb564af1f994a4eed0220ed857d8264aece605522432f0af20c5f6d7f94593fdd61eaed1e8fff2fc6b54d020e9aec6d18c12ed51dcdd1a8386ef83af4abc2addd9d2e24b885b4a6d7d75e6f6e9db074d3174d403cef78cbb36e7b83837ba02656a6072399ba69793dd335abd55225949e1c6f52326f2af5509063d59d0499222563c2d901b0a02d4c6e3eb49d18fefa8967cc83b88eb1ceedd75852e008d5d1f59fc29731a2d8c8628d80b6274d7036da24569509d3d496a2309fcba35551fccc8777b41869750c4e6ba1a7d2e0f18983f8d42191576d808606405ebc59e1a4d9d8aede326c3e1e6e9a8aed389cd0984f243caab2a298e52e28bc6d489666b15affe8ca220e687426b046cde4d0005554bd98145c56392ab57e549ee38f29034196651fd9cdfad897dea92d08e5ea896c9f534c5612bed19db54c34b1105ad9508c36860c2877864df186192be9af92922d2fb2afa06060d863b431699979525e7f87e514329278f0a25480787b22b76b87e920ccba87d6e3f2f1bc3481097075601286cdf7342e58debb01b2a80142608ead48115adebae4740eb4dea119c05cc3660274de42f5b505d28752e113cb80daca65270dd97c9a07495a72300713903541383f558dc6d1d52b759d6be10761d359ecf3343601ae27dc15742a49bb67ad979d92b0b7ca2196f99d21422f97f28e799c03d627a40824e8cf96d7eb487a03d17fb2cf30fad127e405cb05dcbd3fdec3f3f1c7edaabb6d957f6875fa7284445980bd946d162bfb3ac4f4f5378ab50db178bba70be9e7bce237a1763a1fe5eebdc1e904c27c654f7508c92e02bfcd613990cb31d969ba9dd5fb715f2c17f07e2602f9c0e7ed1d0e1fbc32e9e4f9e523d2123f5fff8f4437becb9db2fce1fa26d3f0d271d068f1378a75f4f4a2b2027bf47d6639ff68a066bfc5f0765341f21cc758073a18469a059a896f8160f73c3d9f0e75be4c357c19e287283e76c33082de12a67638c2d277e49f1885f827f4926a0d0d6b08d8f13c6481ac945965acc903de5fd79f305f13cfb4a64f9057baeeac314211bf4acd532e6421d3186256a97929cb3aaf886095ce57c713a591b92f566846596634bdd89ed4c69d91221d7c9e95bb34e87d059cd97f5f5215fb55588cc1b6946981459b4efcff684c8f16b17e575abe3138a703f2e526242a51de907c465e8931e0a8dcf895f0f00e08b17c9a447d589d534da86dd7eac737d47452689add921265e8f906a8db7d6d5b9723f12437cd3bb9103c6e370dc3535d90b9ed94b12e3f64e9d614ff8f5fce04c525a0bc39f460c92c3e9bf418ddb5f48aa7a050c6d790c1d82467c1b5b0223a982a722b7e8b32f4185b9f59f466d2713225f04dab3483c328a4c4f003d35b4db894f4a2a9333ae92bbef74cf453cefcdfef27bfa334fca5fe475d35b4296256d5bda5f58f670cdb1de6c54119d677184a5db3fd24eafdd86827b59cbd996dabb2de519e9e46d52a41774d599da1a0d69823f1bcf3f0818b2b86f36baac077ceb675876273693de6dc68db4340e6a74dbad8aa0f27347f19e8490f1d974c2e9dea322e5476a9ddf578bb1bfb94f6d9292158ed9bea6fb531b0798353b716021b97e9e4f8a5965dd7e332169915bfa8fd159fa284da1a3a2720fbd5abc1e64e5030acc2b83d950d916ceb873215dab26ff958f26bce5af442ed6d2375717b6e7fe729fc222a3a530beb50146628b2028b3f008eaf97a3fa9e4942b606f315f36303d6a384014559b202cc85d85feecd9205ec06bf7854e964e64a9b3993589ff96bd042f7fdb55dfba6a58e25f6e6fd14fa37e69cfefb21d90860c7f45073184050cbbe81ab15cbf8b152b392c260d8fbe4aac1f7b947ef1b103d2e37a609ca6d080f2bcfb1c24a9a08832084d74d8b67cee0771dc869096cfceccef16b443cab4fc9c4c00a6479230205d0462a27c80bbe5211b19cc4e8b032146c03727c9501cb6a3a80384877e59118b9d00961546ed3161682ea5b7cead9c70e89072172c29001f6e7c55fdc3c3e9bf08061b0cd0f054af161dd2c666b56d120ba9e288bc63dbe9cabdabe61f3ffb7d3c4235a1ebf292f5840d8d0b11f9ba0f518da8cd9f8b8c18c2dc02a7376bb51ae285802831ef8eac616ca6775f23ddf0c58ce54f60d44c925b638ce0954831c0921e313c59f928081b9e9eb4d232927fda34974fbad62cf6e9798f82ada73e821d459ca82211dc77cd8968181bcab2adc4992ca6d96d24ab43519a2fc63a4353f631ab0ae0a697536f0148fc81d80e466c4601d6e80705be0f0d2df58de1f0d2827aa64aeef757d26d83b474942f1787820d38181dd388791645d43cfc93ac1aea471227d78975e0cdc7a98c22f5758f5b54ae42efcd0ee50e56547332042ebd0dee2d06ced1f1942ef6dfc3817e62808b4a244b01b1aaf625f1575cfd65b2b3141fec3b4f698abc2fe8b25f68e65bcde5ff1b5a3c655c147a5ba7ce115fe7ceb3daf3f414328d8723cf4e080caadefa21081b4c9ecfe0d3aca22ad24a88d48f3d25ae95f9ea49cb9ae5932111a449a832ec4fe9fbaa7df03da7f893df9294d21629b96e1869ba32628e1541c4c37a9a8b49161f39f07fb4aa29d7baaacb64c74f977711b9b1e25b6162fed5cddb2dc5a0aa760adf6c86fc6e6bd9708096422ffca9a2df879ba7c68fa22d755941f678f5561b7a8324f8d5c7a9f2650097f97b52555086455fa112053ac4d4ede391af31cee36200210c910aa595ab9423984715cce84a355046cb57491bde62e2bef903631a6359227aedd2218c4e4e851b2a36ebcf8427ceb701dc7603efc39fa8e0ae4fa6f7616d122df9322ba007ab5fc9209c53b356e2d92afcd31690cd03ee9422aa4cfa081f38e81788b56ac5aba058a10cb255636fcc4b2f13bc2f02f9d3a5a02cc0f3d1efe5db5b93c063eb430f0c7fa6626b139e7296f6e2dd07406b512a000d368664681ba77d00bbfb34f696410f0864075d673416f977c14a012db818787e7e81b90b3135f3c0269ce9cd7ca3ae15533cddc5ae0a0733e059e7ff3739842b0eb5e69fd646e76686f259ae77f7051801a7f4f09eef3cbcb78286c74a970db2f3037818843d53e889d2b247683f00bbda264aaaeadd57089046bd5dbf0bd2850a5bbaa91ee3714015da5c95f1cd071bb3bb95d80bf4c00cd37724c00cafe7fc22ee5c565a6cf105411d2b8ecabde793dabe01174de13f44ae894f2776fdec802018f30144c43707df85c7f25d290e2d934cc3f67fc3c9acee20281f30d94a7f8544cd705efc375e63d0a27bf1b61a9e0c2c47ee3e8aeb36bb7407fa2f05c77dfeded26e66429729194c3d48d62de4e823575519980f16240ab42843a8dfb875cb8a00b1411949aa09e3bf722b20872d61f11fce09edcdeedff4aa884145943231661b52f8e8f3fbe85cc4581efc09a8583a50dad4769149ea8c0ca551eebaa6a6d968a43eb9e602f51902bd742d3cddf3ac5341b91bbf6dfe064512dd5a4806a9c6137500ec5040c42a6ba40c5308050ec6598011259b791fca58d8a104ae2766c432092cc4543ad72efa03f76bc0c1b287254baff76c5670f771c9bd738457d9e65793b6847ab69cd86c276e2eeb4ccadd21c0e4d2421b7682ff6710e885e9fe382e8a2a4ee05efd32da7939d42906869ea2ae422f91c054badb751e5d3cfbd8d1cef46626a5921375f73c1b61ceec67aacbc89b5885187c1f77da5ce87bd61c9f91e36cea703b00c28593549f67236684b2e9a1817adc9118e85beb706d5cd1f37a6ef78484fc491ac2769d9862c3250b92ef17fead160e9e1f0e7b5c5aece17d33122ba53ca1568fd6d22bcd83728fa41afe6cef45cb61b21573dcc8239aa94a8985fe51a69f9f5a5203b875a9305f509d2929cd980153a406071caf55d548057525713d37edbda26041baa8599e75e5c55c56e9bd500d82f8e3d9374dd98739ed5f1080618761464885196b419994d4ffe41b5b2c8d67d79d2398fb173b2e869187fb8288cf3ea90e5769fb5a91cf7256f180c7f84ae6ff73dcdcb61f46039fc2726fe21746abb3d51fd719c42be873c0f5a9f8b82d1b951c78430463dec0096ef096c5027c7195625552766fe55fa6f62b9985a489d441273fc75c46826ee57b4e221b8108af44fd1dcfd08e8e0427eca086a72edec70d8e1642594fe702606e7c376039198497aa4ff2d5de0124e4fe10fc1180a4a7c9bb549f3261b964ae2129d7cfd0c1ba5677c2e82e5e7ea7e125b32b8d5687105027d5839b94bc6ca17d3ac025650394488bade10b6242dc3880622ac0fdb32751a5fe90407e421ed2e8e1dd2f29213e0a9512a44b0bfa60fb81ceedc71653b4daac3cae2a56a7d89423a2359bff86fb4a5592fcbf9ec3e569238b27666e7d717fde6a20a4eca9595498f492d3093eca8cd312631d20387cd6fd6ab526179106ee6a6ca1e87fa952fbc64ed7903e4a2208214b2928d83a6a5fe4af1cb017e580a8ae81caae0fd05651716d4004a9432395813f9090564770e4f82b6b61313113267879bd54f88aa1d7f83fa5d32a22845342323df3494b7520269b69b8bfb2644b209ba55cfc68425ec9705132bce2ef7a177f4f57dfc71f3e4f223b6c5d14a97ed2ec51817bc8393237e400575be423089646eb4a28326e05b804fe3bfd3bbbefec9d8717f99add179c76e7e55f7ae80dabb70c1c1abf4a9e7dd3b773ba37a4abca99d58ad28f81cb1a83e5996f67c4378f5f2a5e01b99fc723d271bfefb2633f8c7d40e13277bf9b9a6f68351eba362acbd12742556567d092ef10ad37ae850e642ae137003d5d71cd7cefd0a3234b3df31ce887a960987c5dc4e3c6f3d79326f1fc661942aaaf24ae9ec252350d6150e47ff6498e31bc6eac414de55ddc7e71074b47eb21d0e0d95402432fe424c337a3a9d7e3d629eb6c6b77d2300134fa9eb3a2281b388e87f3764d2f0023eebbe1c35d98375e229f65c45f66462adc62e3836ad832ed05aeff92e3f31a569f7357a7455492c99d0adfa73eb07a17469b7eb9f6d92772ce0557f8befc0ad4da58760cca7386fe9f5cf2dba2a504912ad88ef8eec49298aa01b9f45c744ad92421ab8794358a57bdcbf960885d1a7e939bf69b139e1294bbef7c51a5b5b703a8695fdb7ab932944ed553e140b56b970e0f91107e7154abe5939e0c2fa9609e572817dc4a28ba3c2760682b54127891dfea47cc219c74c7feff38ba4d614bd0fee1dec81bf8c907175f9e99aae371115532fc613b12928ac98e5e5fbd6e4873f7615f701a7f2683069d7b4ed129a1f73004389e5a65de623ed465bd379ef3013128813a848af63462f49caa6c0983ae0bb3193b10ad6c731b5e526cc9a5111fab8edae097836ad9c7188cd085bc699877e278e6cca8704ae7b0801ee94583b04e99b8f5edc8fb520a4d2fb395f28b1d7addbc913dd3d85402bf41422b05628d05a7e7feafe42d81b2c00df1c61f1344e1486c068779d01c9b7aeecffde90ce203b4b7f9fc78175addd6397da2decbc27ddb39bbe4e6291b24975d77cc16bf92b80d7976e33c91f7502e9ba20866a8b2b624d0c359789eb2295c59c45ab8db6892481c342e433ab3849323882fa9a5b6f48b5ab31247063b580d9761aa42ba3a69c529acc4b3609061e943974e9e4ae27085d04411111ad36adfe5a55747b63ada3076fe3db449c7cdb867de7371fbc97b3a29c64c044bec3d79a8c5d6f631862f22341401546a467d6ce5cfcf93515ea2fec539e8672ffacc09d5db0d63b9109708869917fcf0d13dfddf7de11efbda2c86e26d64a1d2b742b69a8b395d9adf7433df0ee9300475b003cd19beede3edd69863c543e2621234269a44640d20ae2b127a42b0d6b9e7921288edefabb82a5aeb41d799351189f0b6f1e90fdc5ab3833403172ecd127ac905e2e6f922892a414056767795fb985d38c01d188e9076ab6a247c870a3fe6ec959ddafa44d420f784aee90fd679a88ba69eeed650882b03b94562d1f200f65830696d30f60e364b98ed80491a5b6f404675f350a0af7ac30044ec3584cc01c2239070c7b7dd64b885a580a5ed382322cd44b069f67d2fbe4bf6d12f5247b8eaa1b301172f2ad9124db2337c95d50a94827c1774e64967e0b6fb14fe6b6321b609d6fd53f372d67dd8fca36bbbb59c1cbd4391f2e3bb5356582da89d287f1d5362bf9280e13c177b8cb46bdc6f8c706cfcd1397c3fbff800290c86f04a84053798d7f078a90efe53b686905f2516219457cc97293f1db91ec3780df15564ccff0e6372524a4e2146599acb48ca61f7c4cd601a2c67b01846a0dba1cb3ad6ec6658c6b5493ab738b0744d7d964e3e285b7fe3bf837e0ee185da59aee1356e88a98bf576215c452d45de31ecd902f9297b2e864d87c4fac97431c30a52eafc319cf00f46bbaafe9324ca4537f2146cd5dfc0a290b8d3ed3a3ca096615111285fa2a33aa868687cb6375b53c72cfe43e45c0df76b54340c7eaebc2488025a37786dc58d9fa4c3e6174c0ef08d0de6160fe24f38a201c7578be3d32620fd807a4d5fdf864f5efb7cfea237c80c84f694a0e80ccdd697d82a159d2a3467c582887c4456ae03b3f267138e4d4d8812a3c28eae088ea93a847a6fecc818387658605eab0aed8a3c935f568602e3df8838fa6d4505898e1bae64f206e7f5ef3565ab35012ca23bf4adef63c1eb14fbd910ee8cc3c89f19bd8693a895eb3088b56fd7b3260e165c64e12d954a3d68fff3b06c29ce786d3d4e846e7e16fcf777122aa8a1f033ab88dac4664550de1471e390aaac4d4924aaccf4815fa9e3e5cfb75cda4d66eafa44bcdd54eeb416396a198db4c779f32a944f8f0318aaf14781edab4b23aca54413a7cb5b5e741190044e3eaff5bb2ac82622974e2296eaf5a27eb9d68d3cde492445090f694728e506ca81a3a0df1d63def76174b08e951038b17235a7b1cf554ac245e321b3933c6a9790da119a01304e5c2da0ba0f1a3734efdb674bcdfb3d5c188db2b900f087bc6520a0fcf9e4ccbcb7d6ca47e4cff5fe69bbeded840f3115277e614e137dd784a5440b2bec83eb87709f7e4e0fada3e860517167166322cd8244490bc6540b789fb10211f08a79c7eaf4ba3d38f21f68a10d5f7cfcf01b08afda7739fd4a3399a0572801e810925de5dd5c5d502e9fe23daf191f5663a834398748d0789ebd7e9759f3aa414ef10d6604264c2fc1f7f225bc960a5f68f09c9246f06b3852f13ea76fed796ebad345d2af38058daa5245daaf349e9b3927aa11011c900b7cb14bce8eb4019b4b564550148f4d179432048e569fa86d9fa428317b9acbcce1b6b76999526c72244d58e5a63456ef2eddcb24f0679b49ae90a0930397cb3b4072ef6dfb53128a3ac7aafd16c8205ba234bf809e355cc7ffc771a97c019211c24efec73b3cb49ea1958250712365d6af66cdd69445848b911a905c4d7a716b969bc6aeb75530dadcd79d50b437320fb3e9957e87a3180d73a21693704db4a0969c2bf19499fdd30a65c080d56081987d410ea98342d8bc3f3ce5ff3ab524267215051fda796e7b7bfbb46cff5110c9d286044ac24e76cbc9f49907a9b0a5ee5eb2d2a356d4d8d46fea7401b6520fc8a4a0c89e9b1642f54b1cb168489e193ebdefc204ae3cfa4ab97a174d0ea9f8e90d6deed6d9eab18f8f5b3a356feaf622a794fab0ff01fce7324733e21f232e2e99a26f33ee91dc7c696470c506e7529350214c0d924ff6bf014988c8fac3cdd2e3a3b4709f58ef179edbcec7ab6a49b8921c8b54c16831a9123cd4cf6259740399246617c28de5129e86a11e66eac1435e89a6b91fb6d6578a9ed84f2d446a30836dd5a336c573778475faf615fe78cbd367ac467648fcfdbf747871eda18a41c79beea64485835727b47776ec2119309b0b0b62bb388ad50580e656e82bb3152be5768b65422383fcfa0b4905397e5cff9b5aa70f9b5cea8705cf57da6a41895efe18ca765eba135dabb72934b7b49af601299e9176cbe0985c508ae9c91ba1eb8aa6b52a716f618002144f701fa9c70de448945bfc0ba9ed766f3c23a221f58394c8d104b9af4a70e8e32bea82ea992d1357bd0866be381a1295b26d448bd404011e1e0a888ed719db0cbad9ddaa648ac5fa9e622b463a8e6d4c6c99ef750318f6c45b6e8884526268a094e64e589183f00a2b5c89d39ff9c1b6e882c5daa2e374f94155a8c05133a0c1c31fbffe2ddaec7d3a63888c0960f6132c21b6e94cf1f6a3d7a369155520825a60ba38063908b75ad692428d031d4dbdf74152d052030052648cd408cb25fec5fd6e75518a1be8a07b9ab98a12bd5cf0f9d728886232066fec741c1607d183447f71864b2e15dee2d51851a30d40ec8d4202fdcef9c03a9ff904785177fa8b7812d00849ae8cec87c29a49875050fdd3dec08678506ba3663eb4203bb632f8684c44518e775c2bdbc3edf32f1e0483ca2a3dbfd065749418560f5aaeb4f34e54293316f8ea4f8c4a23a045524ae4ef91e46c469dd82e3171e3ac7a52c51f2d81aa25e062bf4586bde47cb210457d6556e159004c3a8881f7cc35d58a0e846548550ad4a4fee79d1150175e3ca8dd14fb2332e4ddab7697405a279c596f950f41ab6fd9ab2f04e8ac5e1e4927a3a62db0d0540ada3c3a8f174301c5fff74256d52bbb3718d16b41aafac360598aa1009d9db37029c1e3f5e3b5aff80b6f2d4781f63ef1a24f3847bdd9146ef7a1f0eb936373eba1cf7e291d3bfd4dad168c7e9c8f6debad20f5c3a744a86e6f6ed5a303cf97310111fa079d94c9c6f4d814174eb56d05ad5fc3a5ac6928a2f3e895e2912533ce0e3f4dfd21f9d47db75957e518a28fdb431371e54955667a3a9009abeef541180ae69a09a212cc50682a7ebcf74a678d10e132f5b91702811c5731acd798dc7e6f187012ad12baaf79e4cb0692e58a9d2b1b416b134a5d197169a087bfa6a4b7ef5cec728a9d188ad84980c3f2b2e8fd8697a955548b8d101eb1c5bd69e5e8f51b1d2f1d7aa933b829e9297d6366de68bbc1fbfedf6e1edd3239c6035cfad7f814cf62b68f0e1363139cd6318a1e9c25531f2254332e43d15863b61b278aeab6be024b6d0e3e9112e9c8dd124a7414547f79c9fa913457cc7303c17f9fc5b28fbfff37080ba29c43e7d23df1b86b8ff688225b288f9ebc6012e6c2c1a30eeed606aa6e1016ab703e04c0923e6ee5f6308381c6a9b9420d663548b5557a3e84231650cf2b6f7be7dd35295ca601c33ceb2c5511eee33a25eb2ae92c1834e209a91540a41c8969c55f9596600511d7819e0f8a2c1d2fa93dc0eb54bc40af934f19b4b347e8767a1c96805720fa8b755aff4585a586760d5881deaa2fe16176a90992dd585e197465c6a8e9150f8dec9e187ccbc9f78dfa2677dc15ead70d787913974495aadfdd8b6b69329050136c61193e6915598fce511010203afc112e2e0f74041ea7acd87e5507ed783c1bd86173f36f01324099e80ca0db6c021231e70da783858f1c545865256aff01b3a29f08f13190e41b7a37a0c11e7c28e3a10f184ce773101f64d317187f52ac997ddedb23b110b442a9e587ff15ca6aba36d1173ff8aabb7287bf5ece3329b4082e153804019b0316a9b74eccea894231985dd208a7114e03e35ad9c9f6f1b1ff72a99cbb4ba389942c22b8396ed62d70cdf0861ffd2c77ed7a9cddfc7b48baa9ca933f30f752c901aeec29d5c18d1c38a53ec32da7ffd53f4827f7f93474f31be4b018902b85b1f8701ea789c139c08a18a28d13deb5cee9edda0fa9d2c022452ac389d99e8062680f2e49561d00f67884de86696596a84c8212a3b85bc1f432e88e7bd64142327854dda1aaafb7ac2b3cc3fed80efdfb973e0f91ee5bcde7e3063905e768574bedaade535f3efcfd598fc4ed54fac439a70ada91a1f3d27de848b0a9794e00e3e0cac631b3353e6caa588ac41a2635eb581a87e1e952d8e4e36dfbae7f68e957442fe26015eb514d99a53a73f7ba01b2f5a114dc38624bcf114af5cb8c210c3c97b0f5d6b3673f6b3da63cb3eb6bdda160a302106c004df085f19db48fc8c4ae639674c1aab5df0936fbf7d227b8f2aca0c5dda88d2f537e7ccb5a73b01bd76399d4cb3d00dbf8ece9302304038a3ae9fdea6d1a9b8b382189103ddae6a1b02426e48a4e1970fd9508d4b3e3b445574fb4dd392850f48eee5c9671fdad16882c8abd5795432ee6d60deb3f0bf8821436b9fccb9a7514138f4a590b68f3a60b509ab2f5f46f2550be54f73269ceb3b2ebd425ccb0c34b7eb2ace0379eb57e5e49f76da76601be410d603fc067c7e9a1b795f1a48550fc6a97f46706727e8e822a3e95edac725b9b077611bd6c2e94209d1ca387ceb115d3156bccbd57ee428ef9fe070b7aa84f14b267c2115d29a750d2afeae02d2e73d6f4a9168231a4fa3d1830052c691e9707d18d7569fe416a4b8932859d7eab221d8ae7e5b57b7396782fe3c9ff899ba8a802dffac71ca6d2d751a63fda280ee0a4556751f1dc71d8831405378feabed698ac3772dcb2be325ba974983f803646fe97875e69637e1b73dfb4a4ddfb90cb5ad9d08b7400e96ade404def99f1a6a3e9bb62a08525812bce242812fdffe215d67ceb87b708b1e7c5bfaae90b16e227d00485bce3f42f8d1ef2770e710beb69671b63b887a5a209474ab49251acf858af63fa127cdbb2ab766ca902896cfb50bfc97c29cb6ba567d327b54a5b57011f44d9049f1d7164a3d97eca9b41f7aa78b6f254597d76ada1e6cd81852fcecf47862058d19dbbf58a9413b67f328bc71d4c3267c051f550fc5212fda5e9d30d1a6df814fa313d7db2922fc721dbb5ace497227a738ecb5c313fea42da6e1358cf6fc92decc85dd6b55e6f392af1efa9f8a3b262a87a5495aaddaccccfa3df05ec35e1b41cefde6bd2c506adfd3c9215b9dfb1387d7d7f7612c1f773306cca0d85f8819a487e8a62f3611d8386abb55b1c487785abc87b757581ddd82b2d4d863458544e83bbda4040f5bca2bad925c83cfeacbdc89f283e81a014dd3fa7ae8fe944ba20b4ac8596dddc02fef07807edac2ac46874fa2abddcfc37621c93c223971e1e037c6a12d42a39c1f45a4a211f982ceb9b00f747fb7254cf47c9ed55f6f434211dc80041bfd200bbf6c9b3842db69a49012648bd188a751dbe2bfbf609d7c475a195424a07c125dd5e79c89d96af3b7ba0e0649e5ec674adad0889f9c7090a4c5a5e1b7ef71a2b25f34d3fe47eda61b6c91db97d08e69af06914878ade7b0af00e3324ea44b6e908b32fc08e28dacb2d1c970e8da38b61e79bd4f3a540f9f9f9902e8fdd42c3bd8fc8d64124373b06d66c02d5773fa5615cc218f621f39a81be989fefb02e0c8dd17d9e31737f844f9f73a941883c29bdd7c691a270b54a0fb006b528b52c8e7c00534205de7cac87c6f7133fd3c43ea368d0bd10c569fc8def5358b45b7a78d394748dda30a86fea83685a76f4261e83a0a46c85c27961438a03b80a7c3848413cbbb048de6feeb255619a48a57e0e7068fd3c74c36e79ceea6ff02091ed09a245b567d88bf4b058317329363f2619c58b96277090e82ce04e9ffebf8d85ae7884fe9348e6093cefd56a3f03c5d75885f8efcda9083f65a86a57e9c0f0b4abdc4a0585d3ff8674eb72285184e857b948bc01dcf39c412ce06d9d7cbbeb02e30b3c226ed508547ff100688ce9febd619e848df2b427e37177ee48fada16e1bd97851c91da409cfb207e20b8e20f9347dd45a1e5a68024a34ea93db5c10acfca81345a60056976dfbd51ff267fac22970006d1f2063da7e9eebd03f3df8c359d29eb8abd01148effab812bae49f34dc4842cd9ddc959fbf3934de6a9ce08287ba9af1d4f710011c18cd2cdd6d271cdbdf12b9d9ca9c33c8f018fc6fd830fa7abb3e8f36cd64c390f8723e1d00544d81cb6226c50602cf489ceb1a61a8b73bf0da23474be4b651d49eb661b39a0b3257cc991de2246dc408769466552cbc2efbc63642bbac73b0482fbbdb280f0fff2996bd7ae6ed943d2d096bb068c3a333808fe675300d78f6d8cc8dc332053600e2e8ada174d68a1afe16221f63717c535ec11b523954c6eab780b04b12b2ccf3c244946fe4187a9b9336024087e6f9aadd2768c4e07744d6d75e6e2486893ee1bf1b3f017bf0c0d8ce5d633ea92911730a2c402165d2f39bace506e41a383dd9a00a3e70d95237b5b7ae4ac178e70a620c429fb4c65fe3938759aa7a70e2cc3a1cc13496fe707ae3fa98d6dc11699fcc9a073c8bd5d564fb6216083bbb7ab6c61510f7cf3a3c2ec4c04d3b896fd541a0ac6ea2684e174e20f19eca10a87b39323d498f3c1ab5a8e91d9985c63732ad61487f228228a3b75b942e1f9e6974241812c019745259dd6501eabb5336681c838890ab967345edc5f03d4c4db48a1dee5215d424f6a61d6b6db6db915e87f943cc40ca2beb02452b24de3daa8ca38bc5d220f4d49fb2ef0d46938214c401b8f78ad6c4e2abd1a2d752bc3f058aedca621984fa1860573f426b7e3476cb213c007bb80addf318b3602ffd4c4499be6c6819e95c64895b0325acddf17a9739aa7a68f436dfa2a71304bd6b04c39864884c7260e7e0d7adaeca85d53ff98bfb52d858bd2492219826b0d51490c646bc73923f0e366b74f1578737b3b9b09e8289326a9f41d053935f043730ad35be567b0bcd467d8979127b917690e388a60d326b3e5b6f22b40743790306b0b94b90d3b6de4324088eb32f81c1875cb716795ae4f91925c898761d02f68da513d1e83094687ef0db318ae377cec834c10a18837076e28110c8d35eb69d386cfe43639f972e7a710394c5059e219fe9f9c77ef0ecb4e4d86bf16a81ad37228363b5576efeaa824a23381534283333c4ab3576fc82ead9dc1fc4c24735093731ca88556ef79e45327c540cc5f6c81b9f2cd08a1e94424e82cfa07f366db71d236a00861dbbc6cabeb4aa35580a4a76219b0507f188a7956dcde30a063ef59cbe0a889580ea41f9ffd51ab22909b7915ed9d74afb9eeb25f112605ba6a58c53d6d5a9b744c8c49da5a4ade5d3af7c2e0d35c09eb68fcd77fb45311ebda2e28425e6afcefaf46d7a777d949c76a491e73c02372999df66878842b9ea18b095a3cd4ebd55f81f04073d13ef6623e970c0d52fb6d1ff09a651feea39b037eb55b96f218431de4c7e4f31aabf285abbc7f9972269a8a05c7537e7f11684908b683e3436501384877068099cb4bd6d8bd4204a09f3f71a93fd491d8039594970a202543f5c31ec43c38fecac6421c0b733918fbeb9b23b129b68b3918f6ac393170b6f21c2430c1501b2258b158cae3e9905d3bd1ce21161fc9776a7475b7be3352c4d5237919465d16899894037ce9437e429c780b2d536238535c2be2260dfa9ad2ab8b9d144044a5b06af67f52270e59c093dda3edf9480f9bff8326ff8aa68e5d78101e72360f86b992c92a9026c0ddc164609e23ebf753c0f81cd5ac3f3257ea2a239eae0c73f3edddb872c89a1a16be1f64232df80c82b997026f93f0b8186d443500ea55cc9a9a47c56634f96342bb595e7b697fa8245bda1f8ca1addf332626077e81ccdc18dd4d7affcd5c27977787cc2e50dea51dbdcb1513d84b1f4f5c293cae1ad3e406754e09a79b898403ff5c16862e8cc1557ba3388768b8cf74b19fa74bf53f7c506de4ef5399507455861c0a32b872612366b1d660b3908f94b1c1d709482731fedaf024342fd83c20fd4b5458f5d91700596bc06a5b1c39031347f2d4610f91d92e1fa0299d34018a75d27fd609e05d71e407939eabf5f71fa247ecdae0911b3f15e3b34713200bcbc76820682d6c30ee7d2403a71a966199eab8277fa911bea0b378da746d6b04b5d37dd4086c8a997b1e4ff19951650abc8dc58ae1089a8ce699266b1b53540d744aaf74f9304842618cb74876d424780c6526578b056fcd1578311ccdbd8f89abb54b064c62886ceedd24ca7efc1e74526e16b6e7a54be37984f0311f05594a07f0f739dc5533e250629188e177e897b5c89fb3798ac415021e4bb3744d28c77a4bfcca622ebd6f3aa2454d81c797cff213466fec7594b4489a85f8b59e56ae75bff619bdf3db839f143001420368d6087a8f8626a41975d2da658b60b3707734673681e07d2ce8a04104c191e6757a26b95eaeb36af9e06e2d363d956b026545a025d2948fe11d037c93084bce5116cb91d3d66b6cd8aefdd855cd94429677d547798b58965943e1fac41f32a694206cb0a85b1eeb2d264b8ce5002419267639daa1f054cd5a7fe951a8358115deaaae8fb71606b5395d35def124e7dcb95ad5fe2cadf247d3ecde708e6af8789021766b52fcfdbaaafab1c68c54d35251a08336d2a6de2f646d968d5bad0d6ffc4ec8aa89b5c026fdae625f1ec9f60518f571114df2f3a9fb69dee0011fe512f8749892908755d1f5522f351765bcfb4f7bbf62563c9bc43b71d6655c3b357a396847df986c156579e4675d5184154d869426017a1e64aa4f5bd4336b532cb94233f00065b25508ace524fa4f5431a1a224b71279a64d02ac6b90d355090d7cdbaa2903100d189fec486ca4f98187e889c506f8a58217fdbd62b2529917c39237560986d7847a4f30ed393de366598551988b38b2050a7d3fe43d253b8c459faccb7133bddf5ce9ad8d1a7c0db3ca114f5697797f2823c0663d00a14e273f6dd12d42968b30ccef808b8bdec3a6f8f8b8e1ec40760b38cbed814c58e728c73b7a5dd8123cf50e917bc08f8f70a051f4e530bc85fe0da0a5077bda4f46234267e0efd5d2a47481c1368ebc2087d04b3276bd7c438f3cbad014b520c0b7c25fc278b40396c4fc9ed41db6634350112560bc3a1ffb3e061d4793c41097c0f1cf951526891ee589c570fcfecbbe6bbae8ed14a1841da1b665a67993cebd27d318f4023666f8515b5bc195af6a2a3a2df275d4ea03bb4514ca460e4fe8e6808d1496ff6d732ba85a466cd69ace0a0bc31013f54e1def77b86806835c686ccb31506e945199ade7c6db71dda99f35ae050298e2dd87ac431120c17960651db45290ed442026ec9599e9a7f5ca52ab659cfe3231f31ba79d5be77ff895b5de85c67abba20fa2e23e1761f1b069e788335118096da253109b2ab5768eb0e9b600a42b5cf0442f325799a6a2211e891a106287c865b1ee3f89d838a6099e4487b81703f39829e58288f9fc727f39bbc303ee7e9bb630d4145e7ba769c023c89159efec534fd576bccf310573ccaec379fd70ba956cf000083ac9d34fefc202e307d7103232679e1bfef17b3faf17eb5b8f0571a73afc755372ad8259a55293f1e8bd5a7142aa092675996b9ee7810336cd73fe194f5f30a552ad1ecaa436f42f3e284f06d05f60f18bf99959a80a835d7c58ac1d209424b4737c0f0fdfcfdb6bd941d11a007b40708b6dd0e52f6978dcfb46b7a0218d2a3c3b0b5a40facdd18d1ca053952c60d2299292bd8143eb05d1f5261f205b461ef206a99ede7121870754a0b07ccb200496075bc6b004368e87f57fff9774c7abcd6ad953ceb8baf1a35623f836175d9c0c962db2560110822133d0423a887331bdd03d4856f949f6d49d2c99aae1460725654434dac0606bfef7d35179aba02a5da8ff5a5175fc8c04e05917dd6f01027158a96671098c2304098c0f93f09aac856135ffd3dda7d799fe4acf4434203a0f6c1c89e5db8b6ab5e83b0ca3e8203c2420c520550c66671097f705ef66b63af1a4928e711ce50d1facba08c5d4fbfe0732e502a8119e8ec8e31232625f77ca6a2cb57a5db8626fe0e1a26baf4c97df05b448c9f5f00e4bbdd6dcdacb509d111c1414e688872a834caf23369ffd4adc8aeb20f2f20b6f19425501b90faa6d485419b15f72380ddc9186a7753a7c407e3b65c886491f5bc1f2f5953f13b215385b3695e445961a061dada5321e16c94b3abd5c6f9ce1ab59aa25906674adbf4d5d2d2664211fc3bed8cee5765fb5882fd1cc76b5fbf0a277fc1c631d4437cbcf097993888c64f49525e478abbec8eca579b13c6f48760ba230bc432ee8f7035920d5357ce3a9feec0aff0c59b043195a8d689d1a9db0269d0061f1fa83c01f660219e0f5a186b951e437f4d2e82ea88e366b568e7a468722dd07bc9db9ad4f65aedc354b52f0f3f8b4a66cd3cb2099c7f9e858a102deabf37578a99f336bbe88de3d8953fc81c8ca7dfdbfcc630e678dccf62a3b74fc27b2ffc85ccca6d7a31f8b64fa6e36883392e2678ea79632a8a50ab7fe5ef238227c0235fa9d68147b512e8fdedc6e173f5ccfaa97e6e2eb7d726b97aaa5856e60aac9f8d9f68e39af9502cfb03285636e2a89c11ea3da88287f7320db515b2617743c0afe9928f1801fbb45c5fb99613521c86f27d8999786d48b24d4895b11602025e4ad532d244fa0a620fafdd65df5264477e4c8000f14e4d5d8c253e82a0ecc12a124b38fc54007b3c059483c7d2c3962bd365e3e734143929901f9a5205398fdeb5c136b38ab8d293b8ccfb17c7e0a669867843b3819de6349d99a291cbc5f0a77162f587e814c48c1cc3d700917b0257642e7baf680555df8fede76fc2eeef27f017cad28e82ae0521229493f5f1f7809e07964f37d43ef7f8b1c69e1f1f8e4249a3c8e6df45f4d70025fa3903dc4396796048d8bb7e65fc577f9bb75e053cac685321a6beb5174745c002d98a468bbbabbbe08e4f6ba90c0d42543b615137eebdd1eb54863067525339f1da9bee3991cc4b527b1991578c62d4de5bcf6f93ccbfc46f3ddc4b2a461f11708de5afdd787ea074eba23951416fc193acdda088ad1380e3447008adce50576c0cfe1edecf72e8c010b7ff8c7c3b88b6c7e6fa10dced9c3baa080945a995563d77a7b8f47297cdd59f9bec86e413522dce4acce93c8e9568a3ea2b6035680f757c1c7cae27205b32559e6e34d1e68fd913294ce16288a00a34d93c2ea8d33592b05d3f05a79af454e69e89e74ab3ff0d3217b83a9c806891ed5122e5f3b0108572f11fd420a70fa889c30cb91ae499fb1c84ac9cbb50ff1d9af1b25cd5d4a3a5cd890b9a0ed363cb9611d6661e58f1984e3de0eb4258c4f135938bd69538b6d1dbba9d0382c1c937658cee38b2d7684d33309d168015247930dcc21b8078d4de2f305df4dbf4845a556febc29a690b656bee3a99b60cff21dcdf95f400b49fe9832fb22447032b8b51ce3d18f56c33914b378a11109cc83321add7d3eaad65fe8931a415a920de5b0605e4ec650a96791dde575e50b76ec592cd8e92c97fe19ad2101eda4312739754535129d2f563a19b2c627cc2ef414253dce31348ad667d7b6edd90507e56b268898438a783fb31e78a10bacf87928af2eac0ac510dd3c8bd3df36b500ce7b7e1b640269e683a47e25c93cc5b6f891b6506bfd2a7703476499aff3408b3e57a50e736cde022f23f879b266c321ceed08643531c4fe7adf55a0c0e0d394eec8e1d2de61c6032338f9cd10913d66eb774d9415e5cf4099a6a75b1c91e60ffccb1423ecfad5cb534e415e24baf44bc923d7d08704d77c96e949366a69e257c8e92137a8a40c09b7cce3f7c6bb823ee0c7124217856b896851660dfc795a6aacaf3dcee2a32d4031a01c5f2b7dc2e154fb0958a9693c66c6db82460d94942cda519e40ca37edc2741003dc349e2b1e0c226daf9189c8dded192b17ff89417210b7c17fd61f5243611ecf37d2a8054bca8a6e86720918c864ebf515dc8b23f6fedf2883c4b796a5942f967ddec698321670e4a760051fe5461446469f7a45ab5b6306c1e12cfb7fe9acdc6295d1020253a1f0729cc926331b5782275d39a93fc96a3b920d1639eb5753d1bee5c8baa353335c3c33c8369be8fc12c630a13fc395f504c6bacf021e1240be7d99d06814c5c3e54406b621f2747e861544db6d17b45891f0872414e3418688a4fb6a536f6a4f2ab47d3d6f890cd6aa4731d1963e2c38194681648d66b1ceb56da5ea4657e92db76afbed88cd760c9972b695a98a9fa54d59bb82377550ad6e5b6a9b21cb424a902f9ef56b8042d2c1aa9b3b99bbb5220c30de85791a7318000c194ad18f32843d5d32b41f98f65e692db8565f9efb5c8aa1c2d2f87408cad03e1c558a576d80048807cf6a890bb5fcc1fad65ecc95743339f574e212f4503e5b72fb59da16099b5281a75c177443945a6ddbd0210cde4ab6e74167ed47498596ddcc3d3139167999d62e4117c349d322a7abfc71fd5cac4ab06137aa3f9c5eea27cb2ed403b09c6a8c0c8bd1cfc6c0e141989945a9e7fd547ba89bf270ce1003fa66e602b5e96eef2fd791ad0a3e6caaed4fc577671cc7674c1b07bb6af086af4568ed242b4cdf70c0284fee11bc5d9801c823d3c2556e26f978781181eb222f746590a7cb13826c1550bd24fa1bad39d3682df84cb5a3fd45a9ae17a99237f994f1389be1ed80cff882882871e1797dbe219e3b01db8ef07bd76d7f61e0e61763ae18da7c4555c1eb47d89de410876f269faf78c6e7d1666157d921a33202e790ee3cfd7f0ebbc05a85cce075b7dbd9c7729c05c1cf357949090983243cc3a2b0eded6d4a2ecff2b1e5bb88cd404259546953e23a1b5c76ae6d88f12754b6c66b5ac3189358661759fb8b3545b0dbeb24780d4cb3bacff36630c534a8bb8672417a2c1f92a2e94149b811510bafbf934fb2e582c90d1230adb591e3c02e346848ca8ac273da792165dfcfdb2a8b889f3d5f15a1ceec4bd8de0ae7ca31ad9224534e9108323b48254be45b133b61130526cf53dc3d71060d1c4eada99e7caa3a20c9aae58fdeeda34c0a1e420d6a99f8a91037c9ab601da43a4771fc2bb785db5ee50d4663d9d5b8c155f75cf15d423bf0ed676d1042676b90877a636e307935b9f0433c5b13a761b193df7cd6b3a42a60d33998a4ca5d500e24e3dce1d8cf6f6d4c88e0f35d3b9eb0fd44297880573c8b4b30af29741f988e03ecb35a88c5a9891897b97006166352f6c5543c982d0c6cc8b6a4eeb5fd56f7da1121b71f3b52c1d6c6fe7cda34ca1f255b305e81570a41092b31fc0ce57b5fc913c21ab09b778bd8be8f79fca7cdd9aa268417b7722eab5c8918b67601c1b0773a188c49d64d84830e3ca5a1a6ff674938ff20523b40fc6a1cf36b1146e7a292375b4db2d1fb388ddbd566212f2e4771932e6f943cc446c259d8c43abdec3f1e08054eebec62ea3f94a9acaa3dc03e9d984e8354713080b89de3e071b5d10d5cedeb2b1ec903fb3a3d15cec0ece5dee2700cd0040ecd82962a6a73d107de75f3cb835e31bb06eefc7bb0ceb609625242d971a60b4e00b45be30fd5851fce4f9c996f6a4f7cd3447d667a1587fbc0d76db4beb79dfc9d7ed13b570bf5799b4ae7c8f0692b88b985506d3d58db098bb61572bbe42b7df75af29b5f317a904d036985b33f973fe11c1463d9e6ad8ae666029cac9411015b85bde40f747c7605d9cfefcc5865136259d8ccaceb15536d1eb715ddc49956477333c5ef93d1065b4a546f49418a26e385e58bdf92e3c733ca937a515c72c8fb1916be9ef0dc6fe380df3cd1e5964445124e39932148596faf9b49d27879598c2cd00ee1db461f7f59de6548dd0fe178048e5571e2d7c6930012465280b141a033a30347295d1372c7f1fda633d434371dfbf3517389f38f99821bd2e984723277b4fd4994b63af4aa3c5efb0d297c864681c3b10d9d61d48417af606b2400d08759e6c1c3ec6230a6cc0a999ffd0787cedfd243d5b70e43e4b65635f5e95cfc73aba5bc9f109a5de9ab4bb27e665ba2dd1190e65bc88e09d96e86c620427497b3165c41fd82df73357d5b9cfaed9f841e98565df9dc7135ecc5de7b4d22569eca8834c0b0c629b35827f9629c7eb4cc29f6da42bcda58d59093133990a24851ac00e593c4307ba414ed523a1fef95cb9233aa476190fe9d9b260c3e9650460d509e243d8d880c6814fcc11be39d528cc2e377bcd4beaca246faaff9eb9961495e98e231a1820b6ed2149d03476b44587d1da3e1ae0731dfa28946553c0b7cd9d3495370a912534521085faee5b97b80995b31fcbafe138e194db33aed5627e27bab40303e7b4b311297d73b40daca8bed65938d90772a6fe8c8e7edce9eaad04ec9ee82f34ed41f64aa7b0f1ade7e529df598bfa515d1c25690497882783223b6adf794a4fc498b6081c196b8676b1eb1c25b6a9d5bca8a5b17ddcc8ed1cac63f891c73d3b8d79b556c7aae1aeb2f88237674ef52448704a8630cef1e5cec9c2d8a709d086732b4d9f9b755acf0109ae16fadce727c2b2a9a865ebea70fb2ea9ea0c9bc96b0d6c59011d83762f7f357f20ede86ee98171ca4bfe9981102dec5df0b8a6361f4652a8a848479c3d125ee76bc412bb06b29c9e73813e8219bb42bd9125205ebbd7abe82c99cc39fcf0953fa39f7e186ebf79e3f42326ec5a066b487bbbaf62c301b5c28b31d72d248b0e4ffb95de18c01123fadb0f9e6edcd37979babd5f6a0b89e6214b4ee0ceba34fbc34829f2d03a7e836ba90198ef70c0df88301bac15dce3aa3f187aa5eb580e06f57dd8d2248ba6ad9356f88cfd9d0e3acf49af71013e9f23e882e006db7644ac8158951c819a95a1a6f177e432a137f061934ac07a120e7538ca3c931ce286ff1d5a767b6d7f17ecffa20cc6bfef48bc8367130b8b9441f285044119b63db5df244d29181005ee1bd0d5c5a96756ccbbea11a4ec701a25097ec564884d80afc50878828a773f2e279afa39070304267baca6f132a7b4d25f624e16c9369c5379af468d4411bc5533142feed3a3f536e98b582a1166f196e9c7cb3abbfaad19aa45e9e4277f2bfb5bfb019ec07a7a2a7bec876bc156ce71663a381e5f49928f86e745151059ca52f04792e564536048774241a554cbdfc739ef2f1c9caeef7cce2e28e5f2f2126bd86f3285fc37085a547ad957fecca7a1348734c50472d2d110820aa2e11023f87b536357e6f5af19056f6a24d4791e7e530dd1e433b0c070285d9aafeff7b9310948f6a8718d1b6cd1fb69984cc4ca8054f2a03ddd6822d9f3117db2ca08f26db0be94fc0efb62a38e785f7687cb397d15664eb8caf84cf8b03c17f8a7821910c3759d5ab881a1b317c7923a318a0726e3cc1c5acd335fb496ff4ac137d09f9f84cf986ec2c39849c0f09fa91553786cdf587ff53c8c7cafe4b369c0575de18eab9459a24b42b16d79a9ae16604ba1d11b337d1409810e52d5a9934a33897a4a9f34f10eabc4f32ae6157a7acbaeb937796077c3642f0b1ede7184162e20f49d5b0d08ff3a0c3163c8f4af3649afed27cacf66ff0bb2ea21a166f83774bfd9d9edd95780d63fadb6804a88019fdd040eb8994ca779c9938c96f143851e0f4f0c9e1d14411e9ad6b98ed5bcf8b2dbe555d113a10f8b26e86afd7b2e64bfb2cb5ecc755225fa13d9f76eb73ee239ddfb7664a299bd2025b5d0ea363f9c5b0a65947ae668be71b32caf6a6c4c74257e4eec9f13873e35a506ecc098b57e3c281890f3718c438dbd09443bbf9add98722cd5f177b324e1baafc044841f64b89b6bc68948978fbb1828ccc29a1aaebe7f95b50cc1c1bbd2990589662518e7960ec206148837c137fed69f826f888ac61abaef625a040e787262fcfc475300d5586e074b79358cdcef385ffb7bf32e16f66d8132092a9f35387d697bd88b2fa7fbf317a6a2839aec2363979a69dc12726049d95663aececf049c649f4f089386609f19e0df19d920d1eb4b8b58a10e71322f96dedc7e4ffbed7ea87e65557ca73615a452f144bc182ac954a987303fd2510bb3d18f6cc08ef56def2a2ff1b278ce3ba5950eb348cad2ce785eb909798d8c20221a51e123e04f19ca2bbe9604189e0d7636548de0fbfc2ce43b25bfc44810a9a2a6dc29ef5809d66d88c4c27f6ec65eb561c0b82b82fbb1c2da16b9aaca4f5b5bd5e9637e78cfe40ec4619c75fd044d59a2bed8f134a890cb7e406a54a9ed25b55dafdba2bc9302dab664ced73530ab6ca116c796343d07280d42da3bf4e24d420bf68bf2937bc20579da1b836aedb96abbfafd093089321b807a60e4a759579830896e5be7de79d2479a7f03288c1fd4759556e63c8c72d377d5818086553a17b96f5c508ea3dfa9798c924fea7eab59e91b5e624fdbd56c51e841017610ddffc5d962f2c6a4e7425a5ac0b6201cf017915142a0d5adb85ee16d0c0cb8fd6b7547f46c3f0a4bf8fa3c36bda06f91decd822761fa098bc30c668b91f7bd262c81a0e9daec95950ddf9b6ada6bbc43f23c0e67475c3ed3cdedf584a0376fcdc7db202146d0b0f98cafdbbf8821b9aee8d44d490129ea6acf113eece113973c2606cb64a6b0b6b5606da75b591905b9f55d0f3b7de5a5aba47bd49d7c9280ba211005176e938f3f28db8cd80451ec257ee6a645991bf2b42033b0f2e0244355b0dcfb9125051b22b15cb3bd5def12093773eabb7c1dc8fb5aaa6f590891635c6d96a5f67620ff667477cdf1ad9f0d735620cf005ff648b674f434a50a421990069e67d09119591e5f794d922bb26ec18698ed1c9304a4ecea699e39dfb6231025fed6bf646476f458280afb5da2b2b1ec91cbf41245e7b255086e1daaeea7c831b70b73ae6f2c950792c3f44352b62c3d3c7b2a37eb43fda8e2ba6ac2535ee16b00479b98b453d8520fb4d6d202282e320152ff84a7d40cddf88b04c2f484e223329835faf1398c88231a4b990d26ad927d6e800a8f8053b6ec63478e9d00bd5982a538cec19635317e2bdf725a3d0f4cbcedbeaae3581d44e5a3212670dea67d124127e326ff6053641cba5f1e01dbfe8354f0370dcc263470a1946b66d878cc72c70ea8b43dc4786ed5b9c1340e3a5ca302fb598ec48c7096b8b86893066498485ccb29eb9a4e40060521a1e25cf44750b3a8286a8ec6e796e9869436af58e2271b138cea12f1c61a315559bc95ae5489fbb81352415cfa42ad62efc02593a0e44266d3bde5da8f00e118791a7074c606e605cfbd91dda3a1ce16fed15c0a3b84284f410352526783ceddf623d23c22ae5aaad495f75bb4bbef27db03425965f7b1d102298c47fd504616c114a6e43813cae3b3f2d2e94d5bcbc21cba24a78b6317e38c2053f88aa52d0c27060efa246eb45b83ae313ac06003ba7117e067b0ac59d6ef12a66fc8eeb20160afe5343c210d6e7c1a480c653d0110c804a8675c346074493817e652eef7e2508d9638f936ee66e5e1d26875a423aa9bc0129fffbb8baefab5be955f78a658d2414eff53b913ab290e756e7e5a00dfa603332957180120976517e7a318393b92f22d2e229ff7dedfcd494587e73d204ad75003617bf796ffb2cf7d3223aa51e2800bcbf116a6e8c16f4d9c1fe5c406a02d87c1248ff862eeee8864190678b7fd7ddff5abfe689749b7d6d8d6975b0d7ed866140834e7f56221b5a5bcf6789002f5cb79c09c323589a6851cdd79f6db646a7460f45759c0e60332af1ee6f634ed3b58932d8fdf1d7012783a644790dcd078c00d722f4385a89618f3b26e6b11eb908e1a7401185b2177120c1079b7c33b4fb0a8587c4620d8ad24a1b18442623838babcb6441952a9570a9cc22888b670af5cda2569c5ecb65df48430f003fe2ccd78c1cdf4c7542157929b5813f8a05d5a4cc84b6cd767fa642e1b4c779bc43612d470b74c66fd849fe38d83dab8ff2a47d4b9f923cb5260919966e2ef0fe11ac6d324364836decbe6b24dd12a0332b74c4689553a74fed04f4eb1e197ba7aafa8bbd4af40e0f6ea4d12b063d11e32371d6d993f08537c792e164b3afaaf00bfbaf9e5d8ba26f1bf5fbaa70e3b3f19e7b7e35ffd57f36bfee39e03079fdb56abddc85e8ef381e139d8279b9941b905e0ce874b121d5a205b08f61780dfe7acb9d69050eafe4dcea27f9eebfb0906e03ef73431087f7d84e5b0d9247929da88d454740a83cefe8ec9acd56081438352d9ba24f0927cdbbcc6e0adb595b19c790efbdace0aa658807bae3e7254ca78092919616be2722ae41aa923100f17ffd3c928c192905a011c0d57c607cda4449009f0c1bbe3d24fa9f6c08a974065842bc1e768ed865d1ed9268e81814fc994653d119b9e5efd250f2396658ed5370648b8248fc5b72fc9e888dcbc0ec158be29eb47405de2d959f0cf98533c914268d1eeed366d8b2e2a5db54102412813cf00ccebbd3bbcc2c7d5c54723ee7dccd6f5a7e36fa199bb30bff11028b2dce3aa7c7735a018bc96f2d2b0260f947990db135b6c2260aaa0f882d1ad0c9e94a1bf66b415506e46bb9b6f4cd1401464d84c2526c0accd4a6c8a7c48c0d377e6980eff72ce76823366bc36b5de7ae3c5cba20e52c9675c011cfcbd2e32d3be6b6f59987f11f3c0577735c90862fc23a5c0740c75aedf0db7bd8d4642aff316f0856478edd8205061042aeb461e4f17586ea9854e569c7bddcb3ed3b08f426f5e49861ba594d014e64f93ec940fb199bce6d6238b5ac20d018ac2a243e418083a51faa69cbe2a7fd57aae77323ed0fec54f12a0c01fecef26bdd19114efe00afc433bdf47eee8ca4b1e7ff19a186c4d81ac4c35a5ec06108e21e8ae7fe5e58714148b46dfde11a9c71baccfb3433d68b548b09b01013d6edb1e5224e3ab3903442f337bdb454e28c389c7fadeac36be6c1a3fc71cf75969d425d9a8de739d0fbebaa8f54fc7e0c58890878ad260ebf149f9dab486a3043af3deea2c50302c6638d32241e03ce5710520ca9a1cba922207f80adc72f2e73b24eaab66e91fa9f7b90eba36a3e5060f1281dfb752f9ee98e05d7e2df5f014ae6e36468adb45ee730e8a56e08fe397c552cd07ad4e866aa95b08b000a638cad322b9d6598adf2d59d770b168f15d0abf3dfb5a5b937bfb911f552f9eacd573492dfee04b516dfc2553297dcf2095dcfe106f4d3c3d95608616502d6f1914b17708e47ea66a50cc13f2c901109f6fb3c8721b5093b12d79838b338a5e9eb3b60ea777081fb7a2a0a733cf1ecccce06a06ac016c955af6b3f011d5a4a448babbd7f1531e83edd84ad15c255370d7aeef20258b297cc7e901c0936e1284718cd80b1ae7d9f692d998cbbebd8073762c1b70b089625713ca39586602aed6c7bea273cc0b1a4e6f66137e3ec7006f6828d17415a13b36e54fb40cf27b816b073648ca274cf9cc457fa1d1bff81214e6b189920b4ecbb15a8392365ad26a88f2a531e7ae9d5b616f015bd77a0f1050f9f67e380edc9419b4edca6a78b397fcfdf59952196f80c199eeb11b865213a6f1df8061075df5e061b861a2c9b0108d117d4ea5eba7cff3128c6abd73fe9b77632e0e18ba6157aa9e62ed07594d698afa9ee8fab79b9b9bd8998c482d13f11726ea183b68f96bfffce5639121ae3e9a2807335ce7fed3bb4c86eb3f56ca10bbdb108c4b8296d5fddbf99060b75180c6e9975b8ed54c5c2c67ffe9fcc0e824334301a4d4c5ba6cbdd32397d81bc9ebbe2014329b930436155b9ba6ba301a1612628e0d08ef893fd704a3ef9516414890cbaeda128461148ec207b0cc144be0ab998a4cb2edd9186fe9a9a411f2d42db85b792863a7f3383e4cc2d736c3428d15c8241f86371d33a1dcc07579dd575f7d1d4e54b08b4c38182392340911f5b8f399ddc4a7122c390a44277bac16a95e986e49e3575aa5d630e862f6f5c4e76e2a1de8d05f4b4b983500b1f2378140709fdaac307e0df53fb186db4c563efd18a61992030f3c4e6657b8b3e9e82f8c7f2430f72cb5ff542a275163ab213c35881750e536d367c10a961a55c7168c3817e5e4cb8494736f35d62766856b7aa2794e8b21c4b256d8d72adcc6fe6694d2e741d4fa031bf01c55d879dfe37e7603c14392e22c4375e05fd9ec11a70986636e93ff724288d73ca966db8193bc1a1d89a6dd846bc2397586b5034ed71e78cc43ed3fd3c36fc14d843c6d961acd2671825daf0b6ebdc4e1c31357231786230af36053a41c8fe9625bcb8a0413a4cb8a528ab13a21fcf606f1421a7b593c16f9c2cc54d02231d66e1f2ad1ebb981eff0a6a1d5d238243a6cbf9ebd86bb863beeff70234a5f1f1d89955262b46822dc742319088a179f2df7ca6c5ee8f2fbb553570ff6dc7068f72ece87c25d242305744e2a94565e6deeff3ae655a26a867b85556fdb2a09c4df9656c7a661f83c2f183a4b955e5963255261ad0c58d5ed77c0105d6f312db054e9b4279db81fe41daafacafc7b482293f354b00ddfe9ca63e5906f3e08c9ba82b001b0836db1476b3dc87348fd56b8a6cd13be3681cb085fd4424a463ec1943cb24c10c725ea1f635382807a0118f7d7a0e9d210a91b0f291f86288b07dc05d3566b4fa7d992cb8211d7e5d2e6c40f4306776378ec6ed8822953b8b904120ee3c190ed03cc3260fb97a9bf5e1d423922114abd3bf0f3bd1833c4d256dc7b3717d81423213b3e7bd0525d9c791ae9c6a99fe58aca6e8f3f6ed5902d5e92a1fe6640716c9f8f391c0ead868a996c5f02b4c43d8cd83764cbf2855052cac71c4229f90f4191857bc7474eb323ccbc683dec1891435db3de4f578528dcc516babf100ae47ee4a4db855edc7e24bde683e20a4824ed7460320f38d0087446be58a6d4f8f223bc4284b29bf7756cdc1b5ddc1b560fee0c87b719c2aa6d8862434bd64ddf95ac3af6f6a0beafd542b1af88e9eaf8df401de9794942d93f331543d7db34e350827ab0298fb6dd28fde26694ab3f035f9178354373a1c54cb0bd9cb0772002f535986403b88854baae41d90d90836c620c9b37b00a8c406cb9b72791894451816ef43e28ad854235bfa6a9ed634b81127829449bde9c86069a9de6f8c8931500a08c5a165a434c39a9e86a105a296ea0f3f323f3d3a761288b0b9eed4218b79db864abf2f8ab1029844efaebea09efd11691d9bf5f36639085194521959d1e14004523c734c420cb4b6d23e86977dbcc2730229f108a2bab762851361ce3ebae9c3d3b556181bb6409e8a7ee88645467c190777836ceee80174ebada34864eb945927a03161535dbca9d43ed72bd2f65eb36e1aef6b954b3803cd9f20fcce1646c0097fa5ca4ca4705928abcabd26bc9063b1298a52cf0047a35ad12e5d886f4ce17af1adc6d85a83d45ba2520670731a519f0ee0b6578a49744b878149e25b4560c94ed23deeecb3eceb6cbe903dd3b31bece63119f9c8107fe45325cb16497694d89a78ac9d7f1470110000249829827898436047beb7f1b7622da769405c1a16c6d3368a50cab392a13164d7d8c8b85b77a5bd03a6c35fa1ee4ef02662b2fa92caf88b93e5bfaca033f26c9a06f83def07ecb9e7ec23aee9afb52518c412fa67d5e8b501ba3c70017f1579b88649604bd1e33dabd52f9313f4a13093f5aede6e8e29a1a9cd3a74f8f203e9b8ad6b9fac1c08902f1261d77f47960786305a142b64c705e170a17aa475ab66869e1ca1b2d0541df8ff174e2d72cfeec3926d771309889e12e89c699ad4cfd4a84730f3729cb029ffea0d5b9a7ba19c655de6d8ddf4c98baa52807ca713258045b7a91f21ea91e5a26e2adab95eb53a284a1ee15954b6186e6aa4790ab49ce4fde3f97fb6f08b7c2e936dd0c606faf93e22665db9b0c40e5afdbd8260bbd240e63e7930590cd2538bf001e753bd1c199ccfacbe8e6ca91ac7bf07e4c15c904582e75c15ccb96f5f88e9f0f423e98c2f369ce528ba53ebb9032acef6cfe3e9990e9a1854863a1bdd1a2c081ad3b19eb7321e05ddf25300ba7bb40abb46ecc7695b3f871d614e7216c78ecf01698442af1f5bfb81e18b8b6d94b32a32dd8dd1f2d02bc1f1197bcb0633cd914914d347b38f02f4a18339150f15fe4036da39f9245aee4fb435d595717c308d702bca7f9e131ea033a52ab73270a36d3d3dbca27901bad94dd26bad79bbdc19678c025342240a18f44803207922ce1a12ea0558a738b6cbddb66c3ad7566435193c49d582bf5daacddcc3a2f48d8fad40b52ae6f7aed0425a2ead9afecce26455d1c854eeaf1225d8eb0258031bed58bc97bd863a59c606b46e29bb24eba9e4603f4102db08c2619299c02054b3383b3489eda98ceb4dbca06f424d06a059e74d35b77b26b017bf7aafffe9a964b2809bfa0a342a739246134d71a3ca6d42be1c5296aee4a1be30b92517ea66fd2b4d3b932f9a5a15b93cf26bf712ed1dcf0123a14e36bb62630748453c8d53b62812572cf700a0219d7aaa28200793141f5cbbac10276c42094ad80db2d3becfec5282ca5d521c7e703759f2fc0d78820a87085c9c71c9061e24a75d9f16c0a3a72f007f1f36c6161261eef96137aa70714539d111222739c797aa6a74e998072be424f91c7d9c3b379803cda82d11682666282e87158133cf2680e9150f9e1811163f9e96b0e1edf05cd36ac58628a0c64c7d3196974f68a879536511b0438dd9061e456dca95bf8120d72e43301e7a7786232489227b4bb4ca8b87807f1a2fc94da835661c1be048893b8452c9397b0ddd6e18e026548ac40e9c1080094faf0a161b2c326bc44ab0d7bb1de78a956fee34848b4f88a837737fe6149335302968b25bd5332aacbb4e940d26e706aac4ea20274138d12a6041bf0229e3c997204003dfddce3cf54a3bab648ce66a3b6efff246001a121f0136d05a54d60e04ad366c86cfdf274557a1cc3587e1cabdbffdfd7fe11a4dc0d44ecd309e942c88f79e38b1cd9f5c3e6035966734a1ec77b2afbe223a58c3ef85eb9e314d6e5177c42a9a9420bfeba21712ce032544f098f1c579f610ab065d976f3b897ec800c2fc323053e90c0bb5a06fd85acdd3efe9122cd2ac137a258a99ac47ac83e5a66a4e5ba1c9531257480d6f94e73ccd0792beedcd4e6261e678e17b4dc06a2382bba40c7de9d31d2289163418939253ec68cc07cee041f479f98b50f6bca92413f1a5a6d7fb8746dfc3293777b07495dff5435e8ecebf4da7766b1e0aabd7e6ac2ef73f2ce0676f232d42844dbb45b66f37fac393f70871bda74357c79ab99dc3ab977d23a1a0427e21b9dff9472a0ead2a35133d911d059f8fa567534a76d90e5f647a0f91ea2623489609c11c9bae555985ddf2d47fc9d230458998d6b676a69215162800c389b871d4338ca7f3c853bf32b9c54fb3a64a0022afc84247e0b1abdb6eeebdaf8804662bdab2e1fc1c61d988b19bd0b0ed802876738ad1b01ee1e57600b1bc364134b4f0ca1563ae1756b54ca1788e78d4182918af74bb9b53b7bbeb3a96d0978b47b204ab7ba83bf4cbeb7627a887cb54ddf9e76e29af2ca5ab531ae6350b6ed3fbdeb9f81952e422db5b392c4877a9186076c076f9b36c66e18b8df3f4bae424aae3fce426bba58ecb062b64f2e7d66e88b23ce832b52750a6b05e7a6099de6ec390ee77da21d7d1243dd1af3f2bbe9d735ec6be70fe722aa4bf49bda46d96454ec3cf3c3141bac93757cbf1de5d49f1e9dd8874e9d8a90ec9960aeb4cafcfc501c128e0b99810b524fab88e7eb81e2147c07afe83bac8ec3505fef332fbf7afc05c9cbb66bffb972f06299b097c51143f483bfdf83d41fe40cf5e045e24a0ab2caf763190cbbb6de224b7a6e4222be90ff144ba0cff59e157cd2282cd28329584c5557ecbdd5dd814de3e57406dbc868a6af9f7d18ed4c69c8ef5d0679a70f6b6c5591aa40e15134b671c63ffe91e75746bedde63a2a0af1adc2408a18fb4e627686b0c6882774a92e2838b1b6509208dca7bcc3d46a92b12923d03319131037313a493e64997e66b16bc6ff2ca04061317e810adbccee22d6f3673587ac08313a6d14583f040708194e832caaf346d7b980f28a86e2108241553273db953cae10c638c3a30c887c05db141cba4caa515a16773774e5811377d6a8091262f0f627c721668cb406750d5d4cdc086ff5a4859660dd383160b286471ccbea0f5334a9394abae8d541d8875cea1d8c5475b9683f8e2a5aaa9451af3cf8a68d71078f0cd61b7e41590b0d0cb3cbc1c1c5a83793f5c93f5a31c6b30bd78f7d58d1540f10e5fc24496cb999f36a12e2a5b47f3d1c81b9fe5fe5cf474145923fda88f1834c3b93428e2ae6eae7b1c62d7aba52d19ceed18d593c6e3b4aa414b119e64748487c0ee93d1a310999a54bc80d16da8bed222b771e87e7415b840cd565f9015aa5ddc48735c8e01a3fd6516146978ed79e48a1a607090c782198683e974e05ece5116ff666a414dfa57cd0edf26ab009b3d5b10e07229a85bcb7e442d20cd8e6c1639e593d012dad4c40fcfeecc418a1db65c0818efbd0910b6d3ca93c2c0671b58796d5fd5ae8eb74aa2260df1a6115d02283d4e87e9d13c3ad99b4de36e4a238c8fbb6feba16d9b7590440ae2d755782814ff2e32374b115f3b68a78b0feccf7c55309a55265b76b48aad5866f49606b3999f8df9f8338865c8e0e14c11b4f498ac7502f97fa9f64ca3d71df67a3f30838873c2a89bf38a0c996a6d435fe217f03f44622eeb0861bb7bba8880cdbed137c34ba3f9b9d55dc148bb930dbd5666915bafffcd672c247319ee7a806bda2cffcf0748c3afe425b5d8771215242f1181a7acc16748c056eb68f8d6f8383d6f609877d74c3b98dea00dd79374df161a2151a45c545ed593778dc2df3e498bb7f0cb04a3bc97e51ec92f001bc96bc16fe5d03491b4b453d6faf484d277aa5c467d7d2d6343688305cc439f256b0fcfbbc821839bb3b04e8979422cd9417fd3e79dca9bf53d44272f1facf51a34c5a4ac0ee0ebf1eaa0397185062128494b13c91b4fcad756fa7eb540269041dc40d0a254e626f58bc79a4a9cf19bf1a682ff499cf7cea8d6ec71c91a136d4e8a08072ca9c06f6a1b09873a95f08a424595e04f4279e3c106820444b755dd4f6f7dfce218da067158026ffb9bdc3cf826177447c51070246b8363efcd735e8966773ae43cbd2bb8334407f5bf6f11e485130a80ec1aa669aff6842cbb9dd05193c559e84b310f0a5f8d4f6a54dc1ea7286c167c0292377fdafa6b875378563767483dc412615f2f6d89e3db5207ef8366d8ec2c627118b4b6f644bfc883d400ee9faea129233771b9a1d824b200e877b228bc31d11fa7facb843122d5ba84e8d4b4c79901ea9a4a7b05dee55682fa7e136c6cf1fae021b7886e765550a8f9d4feb6c21af6d4cf33d5a26a40f3e8cf8deab5218bdba39fa7cbc7a28f6223bb90e7ab4cafdbd53fea40c66c81684e7061c46fad27fdc1e9d0b917de574b2d6e3071840ed2a9fbe80a40488031bb2689ec57c3869e6efbcc26104b5188b56cf9b1799ff8d9a98d10d97975985cb82d18ad2de77a4f476ba24c41e45e08229b9c204c6341650a5859a513ea96fa34d5df5fa7fe5a984af858fefedfcf8435a2ea9f81bf2276a7349783b1cc3932a69b6921da1642401a812d071eb40147ce7af222a8b45562aa2cb1d150bd197ca16bdcd4848eed9f4f3a11fc752aa82cae4fddc0b5391815a34b7121b1ea07e6ae9047b8b4aadba2e35868698ac330c96178e65bba9a5865651532a193497114846a70c99d6d730de12699d81f5cf992645ad877a1a1a02d4e67b5d4fcfaef248a0244d0252cb556e84baab82080131700a17f0494ae2f5e0620021c83af73e02ca929d092f203d190b3d451a4bfc4bef7b98791f9be8bd946ad59fa56073914c77deb0111eb9e5b316f9da16070e08fe97ffaa92c3e314c949df4ed39ceda8111f56e9f55c7c389eef829e3c620c6848cbf4cc96e0d65b8493bf53565364dc4894f8d2501209d543037017d37ca0d4572aa71fe70f418685e9efd43cd54d7060ba7f147f7f9fe7d60769b423624ac77b3106bac42fe378392145fe604736083746cff4b0d8654e37bf3a76243e034e156762fcb1c3797162627ef551b54ea4a52a2bcdb0fd75240961c3fb94930013986630532e8e924428778e26c6789ea7d1737577afcc317ae60cac5ade3da73853888aaec4925d3b3abc0d7d2caba4646c93e32e5339fc39ed7e5be36be28223c2c6185ae28d9fe2878057337873f9032acec6dfd6343ace3eb73bdb4ffbb207409f52d3f409a316553141c2d234d18bc4da29405c07e3122571300f1813d795e98f13df916900ad15ebec96fb034e9a210ca62033895a8a49cd32abc5c827a3468e967309c0ef45c1fa5546222f1410127c0f486e0be8eba156346b53d34b08eb6de947b145f5b74171b4dcebc807a38d6a58abff8101e5a0792f16cd5147f65ddfca1eecb43ebceec639ccea789abe59ec940df432523676b87c0a3a60ab5c1229c463c0f96da56242b7d9bb55e9d40c820b553b8e9e6e256db7c06a0a8a9014a2c217c8c68e65c1e525770db955d41cbeafe54bc37f41b5bfc0d9c5bd30d6c38cc13d3ff0cbfdd2399c13a45f69a09a847b5a96a7bc3a723c412a7b79169e4541f60b31c4941428ff316e9d34f48bdaa0ef5657236dac0557d3a4c7c16a168674fbd10f3b0bcb699c398cae36e2fb5aac9e821ec22b762888ba7ef46cb26af688ed2c01b60dfe7aecbc3eaabd032173732cb3181f339943b08520efbc1e724d78ac2a4ba1b6a375c48b7030f2e2b5e3c358180ebcdeaf2a78cb0778b980a8948dc971f95ef50bf48174269e9d0b2f91918e3f1d7c7b08a7642d8691532c28e97b1fdf8318cbe7a247c4eb9cbd9bda38905e06954675982a1304a39afac1f841f95adf3538648dc110f958054a87404bd667e37eb2fcb1a4059de4de1d943f7302bc670b9f5dff868dc8a4a6b08c311fc6c86dc3e2c2b42cdc94dbdcda4b7862612d19041fa98aaf2f586bdf8c97d05d062c70efb7e5597a48e1e184e69836981f9c5d8c00c0b326c4e0e4e3af790e2368f6220668f76ea70491e389f19f88a11f548fddb3d8c846bbe51dc613ce2493e9cccbef901a8658387d6c8f9b0df6ea4bd26ef26bfbea25a33e6a1d0073464c2ae164f3ddd3543acfdba944c2b14d3fe8c9b428ecbc7d6aab12e1a7e3d4e698cf504da96adf500431f3d7bdbf0ce12908220e35b6a6a6af3e52d897ab70383d91dc2b4ddf8800bec9848367885b00f667921d7876282d173cf0c8380594ad788be0326164f53b4d043cad1c372ba70dbb43ff3803a207994306edb3c2738ef26c7247bce6f7f272c0e6878faccd52464e5f930f9bfb63b6451ea3558630886542eb42e96fc2a147b2b26a6783da23f99b911fee843656759bd8af6295edaad4c516b65426c76c3123dabc780de0904ccd8d371aa44ec8b75321127ddd83ec41efeb22a51cc8ce2d4caf66e3fcf8d655a926a54c9fd60e06a5e53ae1357c2f8162d012626e9fbacd09c0fe0c28c4548eb7191c2dfd6b2ec8906814c83e5877b5493cef8b7b6875b750092601f8bf915fdb5a37800c12b194076a506fd83a4fec0afac0cced4f795ed887bbceb8cb3b17a099aff28fc5cafd7d9c9762296a8ac2fd05435e0fac45eabf9635d224a669a34ed5b8d9cd246492a91d7cb53863f1c60097c26a838a3db2255291173c86281eff0457c0146afb5728f575561acb53c15cdc79939f03424322bcd9c8edafe7d403ab6aa3c905928f98b39a8d98a908f282395387212432528aec50af6a3d774e35b4931f7082d0dbeff5b8ffa99873c1ebff15127178f538b1a4b66fd5019cc9f0d0349b086fbdddbb1bba2ff58cd45d8491e1cc5a9f4b0e890c2d5d27c69d08fb038c3aad7033b27faae03f62b23eee5ae6e273ab616e5de422f5199e2ca64420c05dfabcbe80504073d56b73429c1ce74a30bd7ba78412d31d76a917fe2b4de0f38a48c8c350d3200a1f8d8bc6a4e01d179416f7cb434d34d8bf827e577ee50c10b3efc90df46fc6d85a9f4d1d00fea4c8b7394aee3f1d6db1520341ad334c0b64e7407401d562053b8916921873c4025b6df4dfce2ce682ad09e134c609e273a5b74ff652c6ec3a6420b16e61288c2fd2aa0edd853da65e2b5641569cc9a047696c86aa054b48c8459f885e61f47b079df3a07684c088912bbf7089c464ef345b3ab863e5714f12af5676b3a8336dd66ea458f36bcd56b81992823c80d68fd4bc170a03881aa2962aabb225d1e5a7d6ce84510b3195756e6c3eb4ff84dc9b137de90c3f67163e3b01683352c0e853b421e4d75ec8214c0cb9bbce2e74a71bd507121326f119bead96f895b6591a900f4c471545454edf5bcf279a4570ed5d90240f9fae9cdc3c746c1e6b11b96d9788d2b9b896451de29a0f18d22b77d114d062e047298656d6f773c2427aaf6bb097d1e94db73256e9f73683aa8321415bf4c55f8d56eb904b8d1b4034f5f907d8ae774ce43221a3d2dae46f0300d72787282277008f94754976e83d4daca4b8d5048c323ceaeefeb733edd109c7ca117746ddc774d8993c24652b726dcb592ce422afe80039c7fa32435119b6bf37d55e63cf0d2ba83a7a20cc3911adbd58bca5226419fd803585a186d56d8fe1511ee61ca8235e98b059c11a6944167c282c94259eb055c3b64622df19ba9e461793475b0ff760731d6c0444d52519a8d82b69a707a20056f009ffbd36fa042ca1a335368133398ed4a0e3282313cd6e57dd7570caf4d25d184f245c65be75a7033505ed5ad5499865b86d684fcc0c58d91d85fc6c6eda61d22e5988c3f6066b2c8a809e770c7dc053415b735404e4df7ffe479b3dbe95fbe137340bae7c77d2f160e201923c606df5f9173ce89198b2ec031fb09b9967273137cc1d2c6579fab54d5265961254eaa1325f0db87f04ea6b61fb3d6414de0148093bbe8934dfdb6922396f1c9a746e42297f707a7c9f946b013dc8849d470ddc6b98e1cad8af00418a4623486db7698f2ebb38ba818589f68e35e1d140be1a5c45975e6a672a0bfa765f683c6f6e0cf0281ec4a99b883f9c04e6628abb2733e507887e5a9c037ed92b431ca26faa0870341f3dbac75cf983812f82c790a1a1677ab419d6343aa1efc8a3cd157ba28523389581a5d8a38a5896de698b9de8f0b336360d344710af808598b2ef3becf87db34446ed08b2dc66a9c516aa558b73e6d2a498f75db4c32652a794df615da1973d46a4d187174bbea8aee8e03cbd7e1ff4c4c0cb008829a32bf8db220d6029871958911d16bc65ce4f6dbbd37af189e1b6b51af6421dea67e3162e089b041e181c1a9dc73c7aeebcc669dd5ba4f04f11dd830454e2013e8b320eadfff748d071b46f05df3895e29f359485b144aa4cbb84b28c1851eda8d062b64f7d01f39fa9d37798c71f7f77c785fbc7008cd365f579fdf5881831f7d9aec8a7cd385352860d421cabfb7b5f2fc6b5aca0b8898935d04170c66b8809fd2702b21f53ef2dd0bba57d509fb7f43f4f19301b16f58bf0acea6460a1198e578755f353f15c05bce6940477595b6bee123c5da7d2b2b388ce7c1f3c9c796eb3c1183a099a78bc5c5d8f729df9ae773a12a3c92472acbee376f88d991fcef898bdee78446ab06f114e817acd1d7119af1e39a792bced0421f6ca49e935ec40580cd9d86bf7fed47f6aa2106c7ff4f6226fb2a69e37d43c8f7f46abe763f9fc5bdd6f3f9fad62afdbe3b4f0efefd2bd8dd366d3625f7947e480d873f40fb1ae95a37cbaa7555116413d8831c006767307e73900ea70880056467497edd0b95207d4583031e54aca6dafb4cfbbb1f285d15306f7751b284dbba4bb09933df32c83ffc8a3fe86d5d65a3869418e1a477b9aa63e704c20fe4e84d05bd5875e66ca42f42e0e9eb3c53bb5e51fd4189f3f6de41ca32185c00f1e4dd81c753c0cae31fd42076216c4af64c80fd3f939edeb65ec3abb2b6f426be1739d86ecca8bbd9a65ad2beebaf202623451de5f038c9d8da88c0b8aaf2abd8f592b5d91d685a30a689c089ddbb72cda0f721d9f2ffccac9ac1585dacde549cf5a01c66462f8ec6e9af320079f2d864a02c1fc049b1342b6043cb84e50725802884fe996f33799bd057b1e95415c30ec1b94ede919720e4537046f7939338a950ed6d6f407b2bc2133ed2943d51f165283bb88a168bcc60c487fd49b2f6a53c1e0d6b62d0df07036562081861b70b96b6384ea54c165ef55bc8968af586f8a3a7e868126bf839251440473b46d7be076669810298d9d7881c5b2b41c996982c1d228c4e77f36a8adb211cfbf011be4ec7fecfd2d762ef78f453de7d8092ba1e2bde4a91a19efcca8d2ee1d45bb0bb436d470d8253b8c3bd1d6b67c0c2d6018085bf9bd1c0fa48a9fc0be0b0f4ec723a240f656240b7e19bcca514f8dd4a81744298ce415820a6d259c82926ac123283bd7772ad5703a133c5d8f203647653093bf95e34dd22caf45e7494e75413c69fa602fcd57c39dce1c62d52186a453fd3d99e3291760a726dd9e78d7e5026a6344e10946103546efddaa15712b786d3af079961f149960809f773bdfae450296b5de3d2addff3704e16fefb7d0cc10881282ab4561e69dfb99d50cf9e4600a53da2869a43037d6f46429a43cba56142ae7f71007736dcb3dc2b58e3f19ee8ba25385bb039953652e63a7dc9796d0b4222b3d857bd716c4104ae7c6fbc7bcfb406f542cfc2e39a13ab14179e693ed7b192d9d8293493b0043654f00ae1c4bcb651ad615277e68211b5b39c37aa4e1a3f04e9460d1b9252e9c962038021f4b1149b69997e78b6d5d979183e91c181f17ca375092902b542e4ea39d9852b6134f86844e2d412b95043f49d4ab638d35f3b323d4838e71bbaf3a27ac263aee4fa0bf88e0f33c5da0ee91e41e38623e2c83067d2b0b39a901122f85693e60690bfdf7f12f9da4da6d8408cc7b49bad23f9bd896abb2cd2a6d373ec61773da103a825f72f40141105246a9ce404ee3a14535c1b63e6e85bb4f2adedd42447881f07d758bef0a740363f363b6de038a0dbb9ad45c0fe93c17b319a5e33bc6602ef8d925025685c2e0a890455247e5f71a5357d00ac317ec746de5523614b80658496243b03ec26f21681b4e517a12f6a466294c5cb5b9c6733ea3baccbf4b9b96d2f9e46ca7e10924727e96dea4872280ba4cc3c548e0b23877a0e2e009f11209ba08e776add16e1e5ac9c833a3096ce9e34bacc482575baf0790d919e48a9b78a678fbe4d52cd2b261a28eb94df76788646305d7b6e8cab963010cd75b761d99e8e403afb6adafc14fb0076268fa252c612e70e9e8b471a62f8510a3c4c55f36e4f2045de496d9d4da40a62249bab65368b3656860c7e8e464f784c86640ca99fa4e0d65aa5069aac440e50c92732461d13954ffe6c8d2ec0e77e54db05a2ef9da3791d8f307f70431a655d95d2c024048e00307cd8e5d96797438e8ec3c7d5a0deab63abd6322ca694bf1f7c8d7a1515ee1f06afc8c575135d672a34f432406bfb7558c4598108a93f60f152d5432bdb36753734518cb3382976cbf40203c6f6b90c752316d7686c619db82e98832e02485a417380e58e795b3b879c4504c0551195b3627cd646c877eb95f65d91f1fe5f4cc611d1b290d1116f9742f854ae6bc2a557cd906336ad3be7ccd9efecd8c119756b8e184706e02fe7688ac640b2e6e31a61fa562e80566a61088b814310ca4109124993385d4681289fab4229d916b5e8dc3058507823fbe9f157463304d2fda068144035593509de06f04a2dca93be90cbc541136ea19d0edf93093ea84d624a36b08b1611db0b8a3d75af2b46590b8c0c3ed6ffad4ce9ff885231aa9222babf10292d735aac0524f1e729cd82aa62372be04322e1ca894d0b6777ca361ba68be78e223a6e8e7f653bde29a86fc2df14edc6130b22f9323811119073aa4e65ba2d2477d2af2bb015ed9607250ea46d2f325b1eac15b826ce65844e087fb6549aae06ed58d8bcd607b55e2c9856663688f4f04c5a6c2d7e5d989059f679b3cd664a47bd637ea830cda36a6bbb3c0b9b6576eed4e078dae2bf65a4b9b131be9162f4cec39bf497a00e8745b44f112f129032cd43adde2ec61c1cf2674e3ce3368a6b320311fb385725605fad1d7e8d2ea144d82bb9d5274a9072007a6a8f940327e07c2b8ab81991be801b021d7f0bf16b8fc187477fdda9fbb6bb8279af35191f8804148bc2e42c51199f8414e5b54dbbbba9fc762ccb3687884f284d001969890914a7a94287c1d0025ea0a461736e79f177c7c7e62c8e660680e3ff51db323154c7e1baa692390f49f05925d21665c1a507ae1c89ebb06fa53b6a875fb0bd2d74fe3fd220581ca022614ae42b71cab2d5e518aa20f6a7e25a37216e52a9d6a7d0547b444b10d2a974de1b0c5f771d32596afcc80d2eff59c2294dfe79b9114fae0c1eeb1fdfa10b405348166b5563adef6daa0edb9df2e1a72b248cae668ed726d0980b613ad25c156e360f927e9d02c16ff3b16bc5e403cae1f97474f7dd335b7f917369d819f380d58218b6a8bb3bca5295ec80bf2c57bc2f5268ce9f037a02a2d86c39a72d250618aa516f8083a9464c2ab930e34dc51f0fcd4c8d5326ebbc04bb170d15c513b104a2771ba830bce0ee8ea3cf15af5c27f24599c95c26ea7d86d7020bef9ba1c925117ba6737e53e4570cc0ab71de90d9084e85ea511006f3f63c5ef374473c7900c1cb066a7f01a3b8a25918bbf75978393aa269a96fb9f99afc02478c3b928aaeb824c06a1382b66bff8b4da9b10e628cd8f5c19aa7355e34d30f0d23686cb6c6933e0afbd62e2369b8e24feba5c0938f47e2098a95238ac0c68d38f8463ec48987b4e8cd597119b333bfa4ebf0f8a034d30d88b2a4c99bc49548f615e5344f2119d23e3b3754aa8d0058ca10acd6c0eeb2a80a0cd6a5188fcdcf5152b1b8423e545feca773b929b35af2af82f01e6cd30a3cf8d5b1e3241d5268effee6fd2990b268b5ede6078047985a92ee61be1053accdc87abf9e68c66d8c5e38ca9baad18cedfc5971efd95c1bd04df0b0d80ede3457e4d363fb17262855677277e8ed45b7a143a90c745f37b53f2e81503e8d16ad8b812824aa712b2a8fe484a6cc04de6495e9d0114e1bb160c15103698c1f29601364331db74439d6edfc3de8d879392f8749373a8e009beda13bb919abef41eb41ccdb742ab9997d3f5bd03efceeb6418ef7822185aa8dea06dfad36ab6201e6f67417814cafb82bd14d449ecac0403dd0b56057149741a91df4d05d70dd896ea2b3a150571a6497c76bfd53723353cc9e700800fa4d692a27be70a675515858c0a2740138730c3abc9ff86efea16a50aed00078cb59c557b9098e7089a611d29b7b6fd32272ef2981838cf9212fbe6289c299cda598f442b0865ba2a2c11bdf6ed469b65dae41606aca802f21c09d0b72938657b1b4727443c08c00b8630ff43c5c77794bf0b34696cc4b7ca2c4eac11c6ea45ab3ea72cfe21e3084e36a626da6c76ecd0b584c81081005c3fce940487012f12435da5359e6e3af21d3f256dfb0c6c9e68c056652be7498eac39ff2003e4413f86610d552a875d2a868fa73bd058ca54b5fe92af5e97d33ed641f64c2d401f6138faf608905320f8305eb8da4fc7d9ba6db7fed39590163a68f740e69aea5b9fd34f39b86a8412cb3d75377bb3b28d7aff48f8c7271a7aed1ae705c07197c816f991124578f388607111d87a2a813b1e72b10566d307740cb7c58cf03ae242baa6d25dafdb1fe8e1a75d53b166a0b819ed5fa4336889d269d2c29813bc9f644a3c33e803ab15a835d54f37d88a74985989efc9d814c0da7852fc6b4310e5310d94b74cc641fe3906f89ec907ee1d217c8b9d54e305e2b5132bdd1791f8dce788dbe48469798092f27bdfea52bde7757e06f06739c8537204e2e52a7629e8edb86b37fdb33b00378e689cb2c5d61faf79ca0408f9b71787ec24a6d8cdcb29afcd6162b3f5b2eaf0ec77a62f4e07c3acdf6d6070bdd4376c3b7ae46215630018873eea7c45f54b58b8bbb5182b8ee603d8a9d6323d63cc9f805d308982d16135e14abf332267daf0f943203ec4aa53b7728c35b0448e6c300339857275166063e9300a98b2df713374ff18f975060055cec935e066ed1ae0876a433ca97ec8e27142d576b14f4d30ff91951c45eeb08997374e3c201b28258181bd747c0e2a73d8def79c1569970208c1c2ff461006cda3ee52209b8b372972e6bbd88b02a7ed635af3af6a91e308d31e30d799a3d36991c10a66a68634c32be31108377bb7cf41cd5f6de583f647aafeebb7db00fa43bd846fddf56e60d519d856019daf2885a73a109d4941f17a0b980319070e0601ec044cc06463b17ba27a574e72dbcc1fef681e299fd9cc3bd183466ebe3cb204f99291a3e5f90d84aeedc13bc2904607e0a46d19d768987a4525be269d3478a0b5d0bb8a90d5683741ff9a9a0a137dfd8f46f220dcf7675cbe473ea01614b95e46f46e328973ce7ed9fb2427467c7a4f4c0a36272f9d6c2a581bb36d8e720d0e2911988a38ac7ef3784bcc875235543dc9e997eace21b681b5cbe1707fc25a81b2a4b98a13652ff357dfe8a963b2e7a1879fd78ce20497d2615bbf8a5098af0a2cb0b9e409be9c5ece4674f88071d7e096685119dfa8b07ebb5000d9fa08e1f69c1513e75d0324d2e3b4d7998f01ad7618ad78f2dd283be537be717fedc5f3014123e61493c995c0fee9e13dae4dfde04c70f8067e9eaef36eddd22a0297fee6ac0237e7ad1759a3d70ef27c897af43d18c7467c778603ea1d2c7bef617c3a5e408b292ab2dbc06f6448f204edcac06ca746f110c32c002d8507ef2df0c33707415a5fd346806b22ca95c7fd98c88cc821b578f777f3b4a5f1b02ef6d1fccf65b48875937fa1560f2e537fb6c95553b2af13b608333339c55d3be4147aa4d1771b5ae85647a64932c1599e68dab4e734bf0ca68340fa2672d81350c044747fd74c92a1d22623ebc006d4bd182efc07ddebaf270d7f3bcafa7e1e70949fb33fbec07f742b37e9d7d677676f48cc2e562773aee5a8e5414caeacdcd0ec16d216b84ad062ed29176d6d4a8624556ee41e5062bc354100578ab40ddc6c4d793ac561a20addba6df66bd60163a3af55ed205ce7efaa45c55c9465efbb8f0028e2ec2de4fe6460ee9a04851e7b3eeaacf04c708fee2316c61807d46bb4328512987cd78b5c8010561db5632b79de021b4a108c95b62b9a31329e5d4946274d3610596cee1340d9fad818fc8f9db398f4b5f9946b3036fad6ec3dc0d8a78e4c12a52a2ebabf9ba1d5ce355a90aaec6c24fd272c60764a8490f1f921c53ab6bb67269a1e2b56848d1bc7acdec32acf6374b789f33e412d74399f96f5d3a2b7e85aa2b4c1e29b1b529920acc0debc7a1bad2c47be269bfa8f3879344b14e1622052cd8ada77de05881811710ac9ec6d5bf875978c4444b2384858302431d776757fa53d122caa2262cecce4227e823d0248932ac1243091d3881036c2a87579bb4d017fffef8c33b5cdbecb73945c70603bb123b4e659b46004ad6b090832b9bfce9eef991bb5a9725e5a9722c7831a2fcd2194fa9669fdf622d81bfbaca50e0cddcc5a6b31772280acf183426cc1630f2f100c88a25fdf7f18689880d720fa515a9c157b12fc9f71c21549f33b318eb8e8dd3e2e6f6541355106b866edc26885241674034b3ad2ae3c0ac793165ca70b0f10c4147c7312ac4ec55027916c10a5be28cad53d1fff4e7684d46b4a3544b9be81bed4750346a7a3c03ffca4cf2453fbf5808e1c86ca7f67c5044e6e2812cec3447a66b44fad6c29ab3f44c7a869ff934208014a926f5c2eb81b629eb9e4853eade41e0174af8f17b7fedcbdc1468217d3d63f178d7e7ee4ed5c84a7a240356281b634c16c2f3fd19a7b6c643b48a80712fc6c05426fccc318350c161f5231e94f956e15ae551a451f2d2b037ace78e72e0184d28404a826864ac9107d0bed72592b7e81922eb43873c9743894abebd6c79a22a860d896feec873bbfc52914c1c15cf7f7ff1fecd8b50fd18c724a07ce23e29ff5f68edaed75c88a12008fb3ddd80897f439d50ff16b85795b83ce812e99087edd5df4862a4e668c284051bcc0ad1f56bd0a87b34a177632447fc7be744ef6c12aefd29a6beaa6e39359c8d0837a81bd5f13eb36a29a2840d8cfdb76da77cd4e638b4e6bc16788579d8dda5b42327e4ad2db3bc76c03a7f2eb1d8e93cd0db7f9bc52bf17946cd6fa1143a78900b4b15db79e0bb807eb23e7fd3a0e766713207f9fcaee2f7126b2f3225eb127852d36d340a5168002f200dd4cc472f8ecff3d5f3ed7a94534cb8f5709b4c291e944e1917291af28c8bac94b568793375775b687861093a04cbea398ba940aab402017a2d670a7ff3ef029744cd53ef995d0ab1c59dea059b1ce29b986e1ee9d8e0cb5bb314ea719c81be8fef8d918e0ab04cc466f8441373c982bac95912d9fb30758fee3805b9d6accb52ab3cc9a84b59e39bfaedfdba37a34ba507cd68f190e4d54a30f6034278e39b0e29168e5ac93f11a9a38860f97ebc813be1dfd062cde78a125727a383ceeaaf0209bb7b5dd9861cec0f448fd69357201b458cd05aa2ae51eb2a2aeb2a87bb6012c58e161469702c30527d286ed4a4dac0263b968b8e1896e6b644e40ede7f83b5c95e4105e8fe4bcc65ce24742e0470bf15aa8c00fad3dde6533e11a6fb81b8330448e795f6ad4f7ea1872121c13a1d77951a8b34b5e037fa6f22989f581290681967aca7c318d02106cb5225c6cdaf7a598d60c0306243439772ee8fcc9ab4cb3598e9e6628f18ddb9df165b9d2936863150e740feb3df89acd4cb5642a1f3439f6a8aed845d35d0fe8ab957ebb346098768fec9cdbc384ae3a6c2bec7be95c0b6e2e997f761b3d832616c19129d2a23d268941da49b1fd54dd2795e5cac26cce47eb255f774b7b3a94974e928af2d1e4a08499636a73b51a58e422b32f4091e04e281039836aae2c5170ba099df2cf0a17a3201211a2446ef0caf8e80dfc2a6db5dbba1697cc1315878d05dad58081caec3c1421ba2d7085050670ee7673f78c66a2d8d6eef4cb783bfb4a359ed7ad420ca0cac8a94dda686540be47fdeff3739521b5dffb723bb1afe3c054f52deb873dee032e4afa2664f9c109e97af57640ffb04f5ebcfd8aaa1516b87ed3fb10d26fde084dd5215225d5010f5336eaaa6ae73edf1909c6c38127d28eb1e317a1036626d25cd9844d1f9372e90065d0630bc95677888fdf95b7b237d12f71e8e51edc978de920938cc95f2d32f738786da0716e2ef02b124b21876e458485ee6d232d5fac37dff3676444950c3dcb7a103da71cc423a1757580318347e1968b8dd5fc9d249e84d1a8e1e32a066e99a109575ac97a8d74aecdfb2f8bfe0bab9437c16c26ae3d4a071b9a10a4f31f9a03b5c6575d123db21a02d511396f028b2f743ffc991e37ff92fcddace9ed5fc6cadd99aacc8bad52ee132e9d1d6e4d0d05a71daa32ed096a77c2525f0f35b818d9cd4bc05a9c4858965096bb7c586e79fc04741a3f1ca203d6615bf04784dc18c5c8d02fa21e661d09b3a392a9d788690dad72c8bb8045bd91051e3d55c7a500144610264ebda047c397b69facdde660e7d4982757b6efa0b029979e0c05ce83827aedab99b147b7b3e30270a1b85ed7a11cef921d4c1025be1c74365d4a23e95cd1cc4a0f97d8cc46373fb53df81691c9cd10745933537101bd8e66a87728ad37469129fcce44622c0e4ce35e4f1eb0f9ee734d14e1812c6e78710bd6f88e0721b09743175059f0770c6a30bd1614eb320e205ed1504204ccc5b20d8026590ff21bf25cd34b51da210a195b38501bee2bc0b6e16e4953ceda5ccbe8983db24286804091731e5ac59c302f7a05f09eec3dbe79afa73b50dbc0ea6a9d77f51beea2a26026831a260c940ac4b3d82a3b49cdee2cad7c0f3e9104a8fa0fa2fceae090859b14bb67fd1d53462f3206d75e556ac2819dff8346163f7aa984f11914a27e8aa6b383082c698f72e3070015048c91193157fda4ea307755c1a639b095392d0487012c5929cfc21c2a7f0a22203852cff8d33746edd12e252010bd485135c9e2ac846e4906deef9c7ea2e47a4ba55b28b302906b2aac41d569c90d054e619281b9c2cf8d42c5e7de463c2f2b5df374b53a74338c196d6047542b76e91333fff75e70431949e2c9f99322f6c3e596c3e0794a108361eb64607c21821dadac6f0e878a42dfb77fad1aa74b1a0a9588b992a79cdaa68a931e40927b68fea2d0fee670c91a685443c5da6d248f5455b920584ae0ff5d45e8e77a7d33539105f439f647d3caabc243f0227c2fdcc7e3dacc827f86030a23d9463d0302cddfcc08faae9149de0afe9134adb8e300d1e564570408d1979751d8b4118ca098ccce411cce8f434f07be7dab87f1738f88d12d1fa11cdf10c1b192b4c0455ded4e107ec98171b1e5d7b137d75b6da0da50b5ed860cfd5f67f96b8641f366f8c5c2ed48b3df38160e005c5e5d4251c2e76f0e107a2216aa0dec73ea8dd414abf25a3c57f1e6c100132518fe0e04cda4422d177e3eb46f21f7d55d8d21c75d620aadec7900a48f44e3c1e64977da41759bf9f58dd7a9cc439a886fb3f4bac44aaec81e89b8cf200020cb55dd4eff1b88190b8927866766726717b3ce4e19fe3ada1d6cdc39cffafe85f934c440a70971e5253d290078135109ee521f3413a87057cfc31960575ba170388948c2c51a290de3803cba0b12dbfd1e5e7495ef0203f000c9e526001bbe5d240e2d9744b122970dacd505709181f82ff5056e42bf66e21915e5426154b29acfa6e13360be3419d0e61f4e585505708bbbb263c35ca8460c3551d1031017639ee12507cb3ae7d8d5f2a5a01bc038e179f72115668b83486fe5684427f635e78778e7c44ffdf7f1c31451a4b6de87f1a3a66526922e359e99576fab2ea235da0c6cf9438d6d640efb74d917f12c77671a1a9550524f35e7d144d512a4ce9a92b93cdaa43b9557fa408f683294117a3bc9d8e52d118feac0af7d00acb40a2ee17f7221c1fcb9553800d3f75e981e2456d1e49490a0b8c2cb460e0d67a28aca181ddac164f358b3e7d706b568b2a5d52fbd028d11627bc6750602440dfbdd78894c0e0b666bbb4ae53900862e61eff3b553d9a503f75af4a9689232d021a508dd3903743650c8b37cb954fac3a6033d9383ce9fe93db7904f6656b1484d67d0b79dbb70a137a7aa353debca2d5cf2c0b91c162449d18168643b1a97f389c718650ccbd21d44e3917bce13a20feed6231831645acb4739790ebf791756527b66452b647baccd77ff93d8249263c8d1a2de4002b4da41e2ea04a29ea24cc5b77cfa8135b3e11474208c888a42a7bcc8b2c0988ad96efa6565b140c724cf5e63ef8d04d246c7935c0e027fa8bb579679522e129f241eb803856e3774e9ee8fbdfc6e4d3c5a055f208c0753b61c6dcb27fb3279c3892999e2e7e02ec06f363d49f001065315e7b7ceffc05766d7b8cc2324b3fa8c8d6dc073956f167a43073cd29783abada8240b97b6ba78e17c1409ccff9a62ffa55a3de7b3e07a094ec7106de535146287e05f7fc69281de802e3059a139a4bf4f7066db31a0423fbdd01be0159e81cea6a5b96679b03221ce7c5a6e42da967625525f816bcf6eee28dbf402f97835c8be3b72382c30c941b898f045a5fc0d1aaf59e09689977ce064eebf9bb8743e5e0ac24f201cea4e8bb715732af1c7f7f340cb98936595d252d2ecef0261af7a94438e526c027eac56de6486c9aa393694c6b8c0da5b295d109027b0bf2ada2f5bbda7944bc576436895b9ac71e9b4679457d6c52a002492373bf482cc6548fe8e3f3c68950f18d42b87573105cc61e948b8f741229227ae528cd216cef23e03bf8360dc1d0df17d4da8f243c4aa616dc92fb162e116cfff4e47a81cb62cebb7bde1b8966d2409ef83a29645a4befe346a9324b0ccef98691df9042a7da58b7a7b60a94f6a56758c8a749f0361f5649a18dc8e5effdd3371d7773a75112279e9c64e9a34167bdce0aaf9121178a45a68697b37f2f57191ceb3ce0df299a09357d4a7b612acd6f599e55cd0d8ca6ee3c831eff79421423c7f01a5e8bbae4480d75097d9b881e139643f667dd46ac20154a4969e12dc2f01181a63adba7aa22ad17e35f266bf511762240d1cd79c81ec6c835dd5a885cb729373b5e5dbdac1b7ce59b8e5bb89c9b21974848b3ed2b7a69c2bdb2a35f3b096fcc4e7275ba70c68e5183b37049b6232f4f5313c3a90856badc078eedb8af9e423745651ca9a8f94278970da166b07cff37d69aaff6d0056eba6054505b6f71ebd2737ea1a49f0190c141adfbf6ddb514ef34364d6227b6ffdc9f91ba5dfe35bfdf240aebce595be5ac8fd338de475f4abe142110b8e2bf2205e2df8eb3abe41f240a5198359ee2a2c0bf920f3af42accd096040d22855ecdb311fd8aea4e9a6dd85fc06e61c194301d2ef16622a44e2928c329161627fa41cfac8d67d7210504682d08091c126407bc1b4a2641012d85b674f651e42662ac4843c7fdc7566684f0cdff0024d4164f2d88dbe3fd44abef4323ccfbfe1e93e34a3a6c912ee61b6c7d369d411efbbe3f04d8d8ea7d479fc75f643a845d97cea3d7c170600195045acb41eb6b5aa4375b6dd6737856dbbc66cc405b2c11c678c188e1810482899ab6faeed7c07ea6ad389b056d6da395185d02bfc660f2ebe2d2d36d18c37a5e404c41a43afbd7ecf75e1c67f90d598c3369f6dc31fcbbebcfc70b3a1be170e558c355f78043570dbb8df6fdeafa6d14c0e89b6aca94ddcdf5ac3cfbfe2069360c91fc81e9f1d041a00bd1108906907439d57eafc2aaf29ff34b2f0e6b7e92a3d17aacc26573dfe77ad85895a574d8c43074a9ba64cb9d2e43f44b0e8bcec9375b3256ea538597f21947ab8074dea94335e37370012266ede7cb89251ac132bd0e7965ef20938c6f3dc96bf5ba7aba787d32f931eca7a3584e8a761b3a53ace5300e5ed621585d10c36dae925bc35c5fefff24e2684df3da4e14b31e8cb40787c84d3efeb72920c064738ba310db3dbdc364e90f5f9e40658490a3710ee47ddfb02f6090c80a618c86217da10c3f82bf49ffe3c619aca42337cd400560bd4cf7ef52a29ef5a952d9e135bd6e33a10ca990379e9fbd44134568efb6ae17076387eccce2acc6a5713f90b19ab5232f9864508f834a1ef18268de1c4ab19fa410105ecd2b5b2829b057a703c4c5e11e2e455033f93992f292553dd14d5205fee0510e674914a44c859c7a626af684008f8579a20a670e991f2aadae38a540a841824cf2005e6185ded95df0d07de8772adc91b1a7aac27e5de9c0f8678f0f67465b2932c6501843b53d9c01101414715a30b2435d02eea7afc1776c70e8ca9b3102b60ba782008fa443abaf01c75076a066fe8e141f295b17618fab33bb3620e3b869d438881f9cd53a32b31215d0c983472a9fd6e7b25697b761770c1c9ca8b523a52c0fdcab2cf99db3fe3ed107f7247a08361d5bb93098c7e58aade2ac99293f6155e86a9d1d8802b4689ee4f52834febbe83f2f92835fd9752ea96139bc5e7abb3d238d43f02083e55a86efc559745579c6f280abfe4610ca0c72f35811478356423aa4a0a1999b2b7f44169f4157c9e6e99584229baabe9096737e481f737b993922ef661ca1f782e3e01958668d5a43d70135c09480b7a033249d9679569112e86465652778ac9806dc11b6ee9dc6a42b6b9d7e7b76668275995fe4c74d2c255046d0fe7e80cbeac4930c7d59fc238bde3b34830ad8620c42d383194346fee646e587b2204e89661c1b5007f6ccf386609bcdf541c82f631af4bb0cafd408c666c627764a98e270b2e5828bd6737ddd4180d9e4d468335d49beca4ef297542929171a5b753ecaea847f2f95ebebfee5fda40e9bbc894a806f940e1537d38eaef50714c7ea2bf4dfc48adfd55c077a1a50bab2e38b55065faa37358f01d0bab0729b1f3c3894aa3f4a4f3809838a53c3414c1132f07230af569924813411ecbc6b49cf9bde9e79493d8f5ac4a1fc5e67991df746f42a6a78fcb50f958b29a0121efcf5dd8f5959874a99bade6e88675c764d02a0f2ef1adc62c6e7a748b8a857531b00d10da2d29d8922da915e64876644d2a947a39c3a6d3b3a01c3e78f5d43b06fa72e906021e3ade826813248da3beb012b96be0db6b618735f7f96d4cc6df2962d6b2257fb4ce35f7b106ad7c8c000ba4fee44c143a763ced4977920f654d7225a091b0099f87151159182fea139768bd03b7193f3c33b24d5c11372f9e460a0b78cba85142807a9036dbd03a32a14b52dfd755c929936718629aabf20d00ddfbafd03e9da3339221b6b0363a7550b79cb6dee664774d194b78a224b83e53c009e1c6abec0f00db1d8ac7f176dd231ff1110637b5ccec1d0ec691c8eb6c383de6a2619f0c13927f35747e8b8f527218e4fa942d3ee86768804119a4f745361041c4ec44b2ec6a8b56537c3e8efd0e8de5d7508bba0a6f00a9d43191ca90420cca70749c8167b5f009f23e0b76594fb354850d672ff819e850dd4db3663b29a8b3219af4f4d1273fce13335634b116989a85fae6a3bf414b2051e84cbe2e0597bd92840fd120c7de66600a84dc77a56775d067f809f6bee48b6882a6e9ef34a0dede9ac7e855ca821deec154868817f6b4af1c5042b74946c57d4a7f0f30fcc56367ba87cb0735d32f25551c451ada2ef26e15ede70a6df38f778a1a42899cc9182097e15a75933f5d71e422f45aad8e416d57e55fa5705e618541cfe82ca99ce78e47e5af1dc66e37edecf9766ae37f6e87ae7b1bce7f5118db74e5b8179915998c240af71695b9b472c509f14f0de0e6b5f87cd9a9e8a43f4db24ee9776527fe1bcc3f3d2f6c8bc4e7087872c37a6518d152ce1114e38450e4f4c3756e6b8e99b306c435fcfb41a6aecca01a8a2b2f31bae54606fc2008781eb3de203827d918762e6ef69102287a94e1490be686b4d778e65d4885d659a87a359bbbe48d4ad0d84d91a683bb3bc34509cc8fac87bda3bcd0cd910110cdb6018b764a97eaf511a9278a1ebc0a329849a61ce079661b0219e27a94523af2b2408ee275f07202fe5a668ec69d621e08112ab1686eae77e020b3b0126807d7862bb8064ea9adf971d19214365923e4c38ce2cec9f07188365b746d5f7a18f74fdfcc2e62fc48dc819d6be648b8ed451c6f8beb067d80ba36e1f7273dc54aa3df676d79cda4001fbfde0718516903a04075860299a24e2834c9ebf1d3b8a4cacf1bc8029721a09233425a3b668e5478223214e1eccf105c1f34962578f5c42fa623aa0679955356dad3f8be8fed2b68e4dd49749167c18f5849f24adbf00076e3f503a67415bf14b30cbcff63d9981ab2c15d98113733f0d57876d8b2f3eb9e94574280da67840182d7da401fcb5dfb8c4b6cc1c470287b03e03dd5083fa966933e4b6a5a69b9fa382ea73ce865477b9b38ac15b3dab7e43dc16b29001c23413cca1e459a9c7522ee31395f31ea58d5d8392b6768f94b3d1f1f9ffb0fc4f9af31d57473bfef3083c19befd4f0c0efc2baea19c3fae0a5a1a86935fbb0ee4a635abf5f2560dbfae952031be5833b07dd45801885444d0ff58638b1c42c94e617e89136b3612611c1f0561a7d881159a3263c785696c06ed1f49d850771017d18aedbddd8c7d5718dad3b5791540afd3dce5f0e49ce7f01f08971e6ac26d3e725c5497a58e7566baf6a38804036b2bbf930005687823871ade067f730b9146be8e991663479826367c9a317429738036417c7fd82a235527f2c43d3c00676e356c4f526d53f5116b460be4f19c3f43d9e73e9beabc1c6ba4f77997a0a88fd8ffa5401e1038cef6da78500805cb9f96e0d572c2593945d244408b24a799f1aae65e7974d3661d55e643cc480c5411d69f25c1bc98746b963ebca05d57db50f72320bba54a78810e9e1c02f3deb55a16472d44b30e753beede74499ad081406ea8a6258cd2d08d9bfe5b6c49343acb3089c5dd62dda585e29e34669915b6d699be4d06f16f3be1b1af7ee12f24a0838bc83f8bb82223df17673470c9c8f5f517ba82dc54f902bd3a21716ce1cc80de0cca7408220816184006b8c11b500d5f9d87b39f86137220a45189d590e63d9a2c7257b3428106bd30708ce1f00805765fcb54b9e8656d81efc6d0be66fa067769f2b80af28661681265ffc6e50b175d2d18f1b9a14abaa70b662715484e9527176c444b250dc4eb9bad68153ceda778fc8cd5238f65baa9e3bd1c36af87d719f675e339d63f2ebb55b57a2052f5167503df1147c29218fe5e4d5cdcaa4c6a1af94b8575593b78c9242c87f2e05bb294a197372a28a4243f667c132f587ec5774bd09d4cfd82e4d4c1432c15aaf2102e5d538f369e343465881182c64c768615aa6ee55e373b30504d52eac318bf91191bd9d110cf956f309147bca7b81fa7a72e1e989105ec47b75d54cd89e260529a9d9c45d7914fa39a0d2aaac293b35d894bede7e4a1935f6b1c70b38fbd095939575e8470206a8c64b32feafd5b8b653b453c08410c5929d1a79b83eedf924c515f54b372ad2f4ba6b1594decec2ec5bd9d0ab9061b8df08236340ec8ab7859cf670d20459a5d1c6e97fea9da4ad09d9d8e28a07cfd06c9c5ab1e6b339ba359c2ea917ca76568008aa02b6bcf430afe755cfcca623c56ac60aca1570432353d2acb158df5220457daded6d52f771379e0eb443de9cc0448426a0b7ae9b07c6e481853164403d7e8c65f4c05a055ab92cc5d7fa65e19c86f43122dfe3216741fc9981f8b7c6a6753a0686f4b8c0686ba377d01f23007df6d60de17872a13087968dbbe23fbfbe1d7efc2b76c4667645f54ed92434ac4bf4223cbdf02bd39bf846e1489f0681d8c6e3012b0a3282ef8fa71c2189a41eb79e33ece42e3c51cc63c3cede9c1741334906b05ef2c216d67fa6aeb5a8beb22dd505da1c4370e6649abaa447ec4a5f80417fe4ba359d0b7f251e7f63bf2d69ef13a0759ea2ee83f29e303fa1d1873eae17983302c5c08c59e62d463da54c009099ea8b23b5b336129841838494e1ce6afb34467f26a3228d81769375fa08095914c10d5e053739e9d4a82ce03c18007b88b6feac263cbc0889523dfc1235ce214077064dbc3046404d8a5eecabc33499253969b793e2cb1963397a347fc456eedc27bdefaf748e10338fd52099401d6f9e15775f728d26d9a2aa010a208b475120770b14038ded975fc33af9a7269a1be13df46e5f6b0641e250e725e66ab5fdf233fc9e5ae5195aa1a86092c51ad04e87b61b3f1187b39fccaba35594a086897b0ce9dfeda905d99c710dea7e1ca527303adc57d605ba9e41d4e2f2c89913e7af8a5ed67481797d4da98216e687ebe7f4a5a67e52a1187298876889f7cbf44db1df08b207e9c7c9a06ec0aa906bd2f79f2a51224d04ae0afa9454b152d7b29812eacc48e4a1626ebab8ef8e35edbcd5afb4e462f364258215f5df1bd5dd530cd086430b20afb034408bed70794463d0ad7af2798e3a9aa69e090354b57457b16b7c1f2ded707e2f89c43fbaae0e9833a302ce6d3196978e03afdac00f91a9d68404ee55569ea0211c1cc0fa48ce6b6704df778c8f8f59d4e8e9ebc3048da2845545b0aee3885410cccd4993ae3e16199fc58f7975835f2d2c522482c5a5f911110c490017dec49f2d9b73d079697052328cbae2d7fbb0cff08065e92b2f1e814570847ddaac278625496fd98de592c12bf414fe23b055b271190a6c455787f8198965020abf947b313507478e5fb53cf47585b82842c4a1a93a8b126f959aa511551356bbabcd66b2da7e90ee3db0ff25ccba15f715961e29e4787348e4b17e957c05884c2f60a23c4a707fa5661c472d1b5c6ba7462ce96e26426e0f453cd7eacc22c94fdb8bacb667e875258c38bfe8a5106f18ac94210a56be7dd56f3aed2a39d581d80af98d11b1e5fec4b70541e2e6ce7d37f4d2202ea3a29eda0d8c59e453dd5e7b836b3ae586eb9459764db2eb482df4347ee522bc8d5b037509612e50297f043a9319644d69c225f9933eba7888a74c8620d00b3542c2dc2c215aee11188ee6be2bc072c62d1071423351cfc099c808b0558665bf75cb04f8e1e59cc8c2a6411a28b715a85e87e6e7ad82a72bd8d555b7fcef6bf8fcadeff7a6a5828414aac35c631faba2e8c2d7db5f38c02e51d44df768f26b262c5fca9bc2c7a11511fc7057b35978343ea3c6f6503cfe0dc3ddc7247e38eb510c9c99034143e177d87effce1b02c41fa3c4df1aa39d857e63d2751a1b077abb5e44d5a91819cebc42ba8c977dcb3aee8587c0e617d62eaecdc17ab9d495799879a5cba3ad46021c65eb617bf56ebe560d8ee6204e7cfd28638ae8af5fb23a46b2c265e342f28a563c2130f0d606612741208d6d910dd08cb0ef5016df17beaeb90136854b7840b19ee1bdca85dbe907077927e814bf8a6f0a4d880a0cc2c409daddcf6a65c50e09634ddeb696b093972dd0677f68f6a3258b92e5fe6fdc2c5c9330b71a383ede88e9285782263ce4ba18c780609683c27b37df7cbb0add87aa031e7e08d72e9eba65115c70b532a7d10185238e65532992fba01a3b789fcc38e5d1d4f57f55d6e3bbde0a039695d3b95855546a828531e65d81326ae6de3834b5deb9a9b01d84e5bb0835b897db42d071da136ec236d5410b89a43eb4afe9af0f66721b64ecb61160f9e37e1cf0e54b8f4883d07c6b825957e1f1cf8f5ae665353f9b83446c1912b5204f8daf3cc77699787415032feed8454b77bb0ed22195a19195a0fa22e5c9ab73f05799d06c6f2932a276782dcb2d30d2266610ada06cc779caafffa22727138c1045aa09f6cb8b6cb118da67a5571cede6194f17532cd4c2cc04b6bbc7e040a81a2d3373864286d1ffaf1076ce36719425caf01297e8ed2a3fb8c35fa24a5a5e62eefc3b0b19c9197b175d459a7c80ede50e279f40d5c39fc39c1fe4d7ce2ca4a5017abc53efff591d647555c4599d601c2d58970b7d2429b0d0535b635759380b8c6359a2600f24f183dc3e4497b0eabf7eda08e0d646c4c815b170596b97acbb7b4addf41bfbd5d22c60714ebf25b31937d906d452f2886a5ebf7deed887bf7eda70f6a7f52c6edbe9e2cd786e40a190d891fd2c460d1f1558a20626b1cae65fd352d204ba659752260facefd3f406391722ed787057a4337d6a5f7ac31c7e902c4bffa9ff577c6ceb16e6f0b0068f6f5a25169bfaa20884a27e1d87283526388f3b93c1350b2beb6396598013f5c15a376612d3f9012cf3466a404f99f40d05130ec0611fb44bec6516a7afcb17e61875caf4df0b8fdeba2a50a8b0dbd2d8c708ff770135ef165e2c116cde3a13a19690fc380156d25f61c52c032ea7a078465215acc7193ec77ef963bf655d5204cc463c80df427b79aca718852c8b7fd2f0409701d10e11941b177b17c32585caa3d888c52c2f083f00f0bfb1c8cf179a2d69d6a193571e0d40f5884814423b3db21c5a90e6f7e7220ab3c9b2b2d1363b081839ae9385c5daa357709ca12943f6a0307b2f319dd0a3334833c6d01727fb8c8faa7905105f56238bfe8e0c59a24e57a6982a601dfe2e0dbcb62eea3fa4a89bd04f409d4c5392c0db9c24f635c69a247f7dedef93214d4f63dfca092257f4be689a634ba096ff06d3ec7ad1123c660ae3197e9e3926de201bd9baa1a4ecbab66ddba408071c0206d00e9ded02e7915fd697d55cf4fbcf5d3ad9dc54a02a6778cca49d1ac7417bb11fe1973503a3dc995b13ffbc76cbc8297a75711ed5bf129b4fd9a84ffca1df5a0fbdc279354b6ad90aaf6c287212800e0ef406f89a004c9b3b001a28682639ae99ad1c8ef71919d80cf321d46165a2f1b3fe5a53865929cb080510753be14887bb04c06e89e036f99680710252360b73b2a29ad81682700a8c1a9eb6cd8cae3baa1c1d07e42fa0ad0723a85892c9610f95ce04ab4a6069e12a2f2e143b76356ab67ffcb7b7de6757499ee3ee0339f3b662adbd251553965e1ba079bbb55662334f4d2121073d749f8effb015b05ea0542536f9ba89df708afcfaa8fbc22c85def7ed867d04233ce7fbe44f8c7f6e1e76fab4dc08e68124e05c874b5f9bd1b6e2070ff49c4de05216ae279a056d72106037b3a99bed3275c0f11ff3d05f1bdd6a552d30fc1e6bbaf802e25531fe9a7ae203529e9116c7a6581aa206473bcd3f907e0f2c51006994cf6859981c8cbf8cd3af3f38c014932731fd7d109ab7f0fd95b0510aaeaaa1a4c1d4fe437fa8d1f6aaceb94a4d3c5e53d106de2f34ee5b7bdf7239922bf189c6a66b14459878fc70fbdcf861db286aa8b912ab9c0d11e44c2ff1381dffa5fee36ae50ebee5e231348931bca1bb178b51a9d29c91704d186b34cc1fc56a520893497d83ecc0459f6e89c6c036b89e61bfdd1b1bc0c99482e82d093c8d8bdc2d1d9d9318ed8c2c4711383ef8a8b87848961a496d56bc17ea94f21d1eca4562e49d2f073f873043b6f74ca88223d391f0bc5c3ac0db84bf03496449fb29a2a0cc99d92e6c69277452816a5bb52f6c26799874d5b97bc8aafb219d99cf65908712d3bfb5b362a34b000e18cd647232fda9f80a854a6c3e21119e1eb88b546369dab46cad63b3d4d79df984365d3a6f1a76610f6254dd3f89e36c51d7484fc08f4ff6660ed33f53e7d9842035277ab35dad0decdb94c65827b105b5e36b9a5e1445eac8509b22a7285a9ac5d4b9e6384659175d33e86b27c476ee3a26bf4149af82b42209347172618cae8da6fa1d244b90d4a95768da0b13d8d2da86ee92c10d9b9cffed1851c47ae7ba0cad8c38e29cbfd12084222b741fc9de518fba485c79801cb1f4c8c3ded8f943ce863ccf68a535d4e4eca20fcde808fff45498d085bbebbc63026acdbba9133217d235e6ada6f660dddbd46b06cca7964f47cbeab0f33765a2fb412a9ec5496e192eb9fdee48b937aac5bd72da3eab4618af8317faaaddef50949737b06fe319edaf7b1a0cc394c29aadcc11e0537d0d041e850e630f298711f5b14e821ff7682af6035ea25f0b6e1220a4d84c43dfe4a4b107716e520a2352e4ad10a02c7db6839429c39638bfd7fc060686fd026d0abf278b0e63ab2602f52e52b02468921e3e996fb2bf9063fd6f05c62ef0a8723b68a011851b916b4922e356e9cbb3b7f6e9fb9eb0c21e416ce596d68b6ff074295395db9553bc6eb784661e55321a6d46c4586fbded450c98a33e82f26ed12799d20307157dae963e46bb3364cad9e253dd2c9ee4570dbd8ec94570af4daf42b3dbbf28c7f587235511643e25d53aee9137c8b8a77714dfbc4bf1ed961b3d79d8efecc933ba3ae070f15b36b16624b7f09d8c45ed1549ae4f60409ddbc3fe9d2fcdabccdcb93fe5bb11bc2db840843cd36d5526695a4cfa208f268d1ef4593e12db038b1d40cd5efbf584e3023ab8ce6ddce27b7d41a38c1e04b40a2a0e39ad632d4b97ba358bf14d3c176eb9a5ec8c00bed9d1f63bd70c7b272ac0ea6ba55469061ac6c45d75b8ae8b289229885a7b10e0225872140a44c0d31511a813b25452b34689c8ca1036787d64dc01456cf4918cf4652ab29b3fb20d66e9d127abab138482020646ab3d16e5d2c40c15346b565e959996194a81536d79a848f05aac5c6d49583ccfe539e24d641716a85706f23fd27144ae3ac735325758915f2725026f4aa3e907fd8f2638de68756a630c4886ef3fd3aea914afde9fff53b2b0cb9d906fcdbf6e20a62054abd132d583b49854b2571b6ce0c8248333179e18b24da2263792bee9f981102dab28dd5357d1fa59df76876d4c4ccf4e66e77571dca9aa4ae3e8b88bb855f9198acb0a63a9f19b6fbc011cd26af3b49db2ff1ebca3f3dc66037d481f763d247274d43bdd92fc320494d6839980890cdcca5d59ec0ec89053a2d53b1d799867ec1c8264f6d9d157e6453d1551999fef8460d59a7507beb013e6e98d7f5b61bb4468130b847d5ff0008a7eca6a58875b70afe6e4d2826f244be9d28a4577a36ae942ec452b4b0b29b65df9aa582d0e85c55091f3bd9d4a280fb569db7c64a9063b65acc92695b67d2dff14845e97f8ae4fd1f8332a2eab97806745691bb8b649c4ebb263478d4684f125bba8e0c9372c15e31cc82ad5c6b227eae1c656bb1e15ea228ec8a9ed27b6838b01dbb177966c1a62b39cb9d74c2c218e75675dc2c6f006641a842bd955cace750385396d41b6be56c958d95480f176253b39977ce4c7b6c73b5fd568fe84634d47f7a95ede9d2801ec748e488154c554777316593e823eabb8cd016f6b24248b7bc596436b14271a729f57e24a3b83ca4b90bc3a477f1842a63c1554b0025799f0a88c6015d02158ac1e6821337c2ee1fbd304cb5099c34cf683ceb7b9d780ce2a42ab0feda74393c1809a2b7a0595968edfadca235341f09d5c61a625eda6bd6a1488c893f1a3cbee60afc7617de7f4c757fade78f1f76324d0fb07a6821a508fa19af64e6035d13f578ae5bf1521b1024b7a66f700429e258a6451ad98e456f27a64909455c991bf6be287acbd33a0ddc0ddd377097863eb3ce5142bfcac48cb8fbd9c499212daeae77e4e9bc6976aa29814a5270240f1e4d2731a87e17a872a7677f1ec178f5ea084f57b6e67710c597c9b887bed73e12c0d5586873049906c09a67a688bbc578e9ff03c01d763d5f229ccbd84890cb11237bac2784f21a43db26112f791ccacad754922591736b389919994df16ca26a3275add7267e3cedae7ded4712bfc606973d99cd6e6f9670543164a54a7a3a0afc09194ec50206d3a197d3f1595fecfb4b86aee150f6f2740092f17a9d20077beb661b98a69c3eeaffe75ca467a3fff6d78e0e2fc754a2ecbb5ab98aef6da7a9fcea20502a2a55fb54d4b9b87541475ac63b8dbb326dd57082d4dac67f25e7573abce8f9dcf735a667113802788ad6857df08e907db7dfc3b20f1a06ce24c5fde9b8818a547aeb75983318594679432f34c2aed764d6fc3a1cb0f7752531179007e7f992699215cb367b430cc94e9d1f3f09b916508a7ea29e1d1527a1df94035de6ad60ea46f65b156d4a161b47d74522af4c4d220e1bdb85b3d5357b7359dad5e5ef969f75d02af36d69a47e4449a5a43c7a376ec1c5f3114d6ab5a06276a9319f96ae5dd775694ac62050c0f3cc6f9bc5e4deaa4d628ad0d2d51dd83c5739d2eab360d36b129235eef076d969d8b95ccf6a32fb00a8735aeafab6b4c417b1c21a4d9a951252572d19cc61958b529652edd4cb1bcb6b1124dc3275afb64a2c7862f84b86e751c47b527c107c243cbba17878e5395e8df0e782bf5172449cb4462356b8ef9720ed503cb4a45f820e214071f1e664bdf9cbac64b0cb54a1c533034ced768b209a9a806b226355adf72786163261d306d486aa6f4e1c7246d7b2369eab021f44cefee6d2b3890f3516dfaf3c941b59fd64838939b0d521e96fbcef9b02c8eb36c02cfaf115e187fe98c0f4abb20d98b767b04872118d7628e04e93f73e7b0574bf48b4083fb5a6bae25cefe027da95c3a9cb6636154539adedeeb85e421ccd7fa307a7d7da5f63e0c620e54e43d10dcb156578790b48b7c83f5bb7bb882574af78f1e01d7359dee36ab77390eafa008fc63b72b8d57ce2d04bb1da1291feb45d79a186e1eef5b23d3ea728addfbb09740757422749c63142158a3dcbb276b7270f8c87d0c37919c72143d51ba8906d03ee29be5729af5d57d678abd2c7649ec900cdfab3ae7e8b5544cb3f4068d0f231bb84b025278f929280dbac48bd8d00fe30449d9cfab7ed58ea302eadcbd6661830c7f2611f717f8975bc2c3d9d463c92cff78ee8f0e9a5ec4405cc3117ffdad38ba92a720db7ef56129b4bce8634dd68e727148df0818c27dfbddaf454b7fedb136eb06a144d86d045cbe0076647b7123fbd8a744b72fa67011a7cf78ae6a95cbc467913477f12459e9f742964698dbcbb5f3857369f7cf4639d028968e6a49e227cf4521f5e3d7b4346bd4eb88e5ebe42edfaffba8c7189e62af020d34f685900618833de949cec9488ec46e74dc06471e87331177a3ce8fd809d9d2930e64f9796376ebc2b81a097ed2d07490bd4b8f323ceee9b595dbca2ccda5d532c615651e2f041f27f94eb930f9a38fcccb2b452eec36cfc7a878069a2f3ae8fd629d15af3a5b98847b8695b22813485dacabf030b34e9e537165a854135add0235e2eb832f34f8cc444cfd19c47e7ee09348da7328610c3405ffeb947a1efa0beed91df0aadc63694fe8c3db2a75b4fe12163b74b3c2144bfa8ab4d69adf02967c8de64fac1fea95c2ecd9814f910922ae1023d7c308058124629301dc2151704dd2288e72079aaee9df8a8a292b5e11d357a757fe09e540383829b6c77e1e7ff4779db7ece713e5b85749049a622139d41c6a4905e5e0d44cb981b0c82e71638e1a3f95d4c1382e59406d77b11bc02d7f4fce76a1c1fb2fa15fb29fc4fee0220acc168c4f42a57957c2475e1bd67fd155baf5616402736979421d289e8407dd942f68dcc3eea8f3695d5f1f1e8423f4065b7103d7bac2c45aed667ef424f38c3d744e1d1ffb5af3888117b32a0a47226e7f06a5c8ee8dcec4abf54f1bcf55c418d7cd2e09552d34551ff013fe0624de8190e860eb79dff7bf4ce3a7cef88559d9274e2a6745a833bc15455baf9e4fb728e1ccf46bfc2a2b0a82453ad515a8a826a1a00929a93491d0a8fc3066fba2fd45f00759db7ebcb7d93687fb47c90f0f81ba5625048855b6cb514889ba2d5c9b71dfe1e2cdc5cca55ac4dd12046e54e855d22bffbc695ab52d8aabc273ebfe8994a2ecb14e6bf1d8203c50aa1c4f6805a4b13e2050afd339f2231f0478837f5480b4b71e08bd86aec3d56b827e3cdbf7d6f6f8bc43c6b77a4847e7c21903bd0a377f14cbae310e546066459f9f0a75317e4d5e37303baef211cacbc70019e419b61389bc6648668d001296b9665ff8bfe6a07afec6de06e9385c19d701c434609e8eac7c8a502fa3f14f122684de1b9c57516fe1aba9784f62929a1494fc3c420e83e45f356af56ed49c3776f051fed38e0377e2b541f9d7cddfa66741570a29933172d3400fa19405946984e146d1deb55b5d2c4925c5c1d67bfe313c6ab02c7ce3e7a4e3a2721a228527d510d9d2c2b22aad89d17ff3131470d0dae066eb758ae4e9359bb36573dc42125fa4ea99abb96ff8341ab543306a5f2decdcc7efd91f0e785d023c6ead0d5a8656bb21b89b6e6869a0d989f0e28243e3248eadaac5d45d00e2152b7301f3640bd75eba37f7ef1a810f7916668ffd9a10b3eb606c1a6345d9e2fbcf41f0aa523b4739770bdb90e65f5140746fd1db2386510a4a6622c36984c55cd52ef04087ddc2c54d7cd57f87538375eabaebef7ac5034ec92525770d13b445cf26c3391de16eeed9f90f00c9358c5696835ebb493573c51b5d58a708bae9256d8002814735c6a5a830e9128d6a8797a9d8ebdf920e0b34b9547d1119cc043a197ddfc9a517240532e9e24c9c156ef50fbbf558b9fe75f36d312e028dfba57c1ca5fbc91611163684f7ebdd34b39d87a106964137070a5fc86abb24b45895a0823d3fa46f69d707a820fad13c31b1ffc7188bb74c100c75184f24cfc71856b9e5c7d5e232c11bb121d70e4846efc2ce11611836f7a4da17f3c1f77d73c0b3c0cc6eb5926748dcf8c521d4858de09ba324da6e09ebb1ce343bfe375f18c5cde5e965de8f85c1d3867778ee8a9bec6314a00f33a207a1db0832bce840550b5f71b368d68e957d1451ec2c94cbd1ea41f7c3a6a52372a8bf1c01d0056126e827b9ce7cc474fe2b447127a7da1171cf9f206385b8385b359f783e91ce0167c56d7899a9c90d313f201dd4649dffadae26f74de4bfed043bd06a88833ce7b6fd071ae6ccbabe5f79256577e3ddabd3c7a75eecc43741cc9832cbc8257f7fde6ae293318103ea8bb6cfe6374585a8ebd294e02b9d58a8d8a762e8290df7a94274d356896c2ab65f1957b290d69e033dd6a1da931fe968d5c6b2ada7236841a93d335c9dfd0558fb323a75f983b40a729a69291d9f4630e9d0e16fde0f6e772be9b2ee3659f4544a0a08c9826636137c843bb3f2cdd3ab2e688b6a37e636eed6cf3cab5e3e36a7f6c3ab59ca2421c6b4f000c0488d26e88064954b467f2bff5dca488d34a06c576509da90f82c65546cafd839cfcde2bc7744dd61b5f5fe0433749aefe296746e65382bf2389e6518f31948555976e00b0cd0e2193ab6b6292484ec5811817e8755ac31462a5a33efae9193d28da3731a33f91593257ddd71ab446cadd0f8b882089e24cabaaa3f6976d02f03ae0fd469c983badb661de05e6435893b95960ce0544644985d1a3c6332ade28038708182b243b5645aff6ed9cb387de5de257489d3031dd2c93f7247db85c289f142b92f6c95fe0912d5d3b91516b5a924610bb692c90b6d2307a666b546415b7a65eae42cd3920ec005af4e7c3e10e0776ccdcc4921ebefc875ecbe0f0c7bb36b42c432e6a660e86058493b8efec030d808aa8f94547735674be60709c054977a4dc8f6353855f75ab193f134fc4761f378704ec13ac8cea6fe74c614a87405c0536480fa4ca879d88b0a9f3fafccd3d74b0956189bae36bc4443fd4a6efbfd74de8b6b536c4746e026515b100710516188c303e3bc647c24dc9e71acd3baa7f12ee40a847b9a6615ed562d4d5155dbb6f5c3edc7c2ae98a1050a2d9d56c84ce6f712aec9c6074a408ecc6d813a0f3c0042588edc67ac1899cd8133ae4846dde8c6f10f026a69fe56f447f99c33a90e8ee38d13da10c3041188d1822f14a351aafc88db826ec337947e44b9bcdce0bb8d1a97d76a4e6d8341cd426acec261e522a0bd48f53554179d9712f6b8b2caf2b678b1181a04f2d86d036042d29898614652a4065586fde43a31b8fa9e07cb0eb4ae0dcac75cf740a66555ffafacd297edaa886d1207595602ae6064548c4aff84da2cc7c85b216825f852216045350bd82e2da48a7047d49a9c7f664322f7076d499bf1b7217bcc594ef07f8bcb0d8a075d977f6c5d540276503156921d0f767a303a2976e436f2e58191e8240102a0131de2983da67f5bda83dc520f1e9b6fdf11f521c4c90e4143bface7003498df7c3965e486288fbb308daa168aced3db673a611b304345b0905ff6c71b6f61a2748e47727767d300440a8f635409772e669967207fe15c82e2bc8540e06b7a1c9fd5fed99c3f64250bcc4e146eabf579610b41aac03931692fe1efcd9733607880ab154097c5ee33092897b79a82aeb6ff16020fc7c3dd20876f60cb81ceac3341f95839de2fd34a2816707fa48e1a35fed6a7ac9fd9956aa9cea838264d763c624104f99ad8647182238e375c23c248689943f3cb84f21180f68dbee7f27bd8c6376f982a1e03fd734a08132f96ffd92dfea88a046e5982eb8a19969a0e3eb5b39f273c7933c638d3c2d45008b42b60392ce609279bdb6666e248cdd4fce59ab91e9f74222be0fb4cc8f755463ec734498ed341eda5e435425ebfdc1be4922c4fa264d567d08ae44664aeb5ed73841c3b68c8a565ae33abd71332bb8a489eca26d68ceec0ab6752eee989c3f233acdee041fdee32c9dd60034620c536b5d751751e358a1eb1944d4ce11a460b6a5333351978efacf1bd0f0fd1659719113cc83aa75838e8fea7367b3dca8d4644a5dbb7f46c681518f26989fa86931dd795fd5e6cb57407bf45c83a14b48fee846dff4ede4d60ec6718b69d1c331772da4a7e722f093c859083472cb68278d53fc211099e575833179e2bf13e3d580f67987a7e4d8b4bf31c797a013ac9b65d9be0608a706e8e8f36dc0a67d53cf9df6e7ac8c418e7f1b95683faacd4b156b65a5cb294fba88c5928e8b7b238c7c93885e0234ae7106fc61cab97dd99c525db96ce8dc3c19cb224e57277eb8577fdafc1ec8dd73f01bd3a76876ee45113a54dd0e5c76c6b1d63a194ee49e69c5bd9bbb2a0846fd8e83e6d4d314b43790b4f102f7e7f72fcc39165d7505e07df057b4a562428a923135403a665aae248456764c7b203052cdeeb7b6949e8faa6e78664e2f3ca1d04e78fa1c2b12cec0e8a660bbfd94d4d1d0e664e6ec539d5ffaf488ea40c72f59de30359ebfa2185c076fe91997e276150488a2605eb27235deb501ff608bb132204f9bf1545bdbf4e8ee7d574bac270d51e2abfd01b1186337797fb69ad0c5f534c79e37c104b650b600ba196cf98612cdf6c572ba5f1fdb0cf30343056e18e13c9c11fc740b5182a976e58df6d6f51ed5aaf9dca50d0ccf52658c966217fdd563de279488c7701259be6b4a5ff4982b6f3811f51f4d3621c73cf861986ef0b49a3c03176e6612599babf9c9d9ede06909fb1c793f1ed13219f73a00c085b3f8f70ff393c32980afd5233303ec0cf0646482d4b485a3e19c58cce11d76a764488ee7d73cf470b9c4c7598f41616d90bf09f17874a1f5acde7726ac536405909ebe89019610055cdf2cf83bfe05f1a4f49a7c57eed4d17481cc62221d0477a183b690330f10b968fb9ad1914d8233e0bfc21f661cceb7fd02eac0435068e12e1798c5c641a010dde2f678fa66fc0549cede790fbb2b633c90207502fb1e24ef3fd21c455cce0a4a1bc41e594309d6ba1721427f6cdd9da01ea811e0338f2fb2cdc8160ae1df8925bf7e9a2d5263f4928e32ed040defed2b41ae5762490a40b06a27537c95009679cf456552a3d0a9673f3483963616519d2c9e1f03c6779586a717e82dde47cc7979b6168930fc9303e9fb5a53b9d64948f88eb1454396cc159bc6cf5459be84222f697bb661d31df4860fa77b7fcacf6e3e047e8fef3ad67ce4d1aad04e75a2d3d46e00eba5080484ab3083f21c4845d0ecc07a382edbaed1d3b1cdc252009b380da19594dff35e78c321d22fae80477b1ed5e29ffddbb1812c818204f17362fc2094ae75fde0541accc14511a35c283145ddb922dd6d32f7c6413d5195953150c09968b2b3481e1d2d58b3e2f1197eac23f952ebf0e83925d066e34b6bfb62ea511ef9f9de175876f3815fefe094acb53e2d0194e153819ec56e70f7d90524be0973fffce45d010c6e1fcd415921103ff4365ff1c6ca949ae196723a91775ba4883a100af7bf570132302d903470363f8d9928552986c3d591563fde515e7b646db9d7f5f0869371aa65dde5b024dca12a5ca5f73ec3c14e601fca68fbe512f758026f26710b3f0813ff91c2a80c2e38758ea910b82867b7637961c969b8cdd14805cc9fdf024c55f286e2084fee3f80fc700a29b63347dfcd84a48fd0d404435dda557b51af5983786959275975b7a9892197045475106777b9606fe5998bb2ad4200e06a20bb8fdfe96ecdc0c4d7cf9e225807fc4ca0de4ff5e9b48c980b459a3e122d7fa3fc9e9eb15a39f88dcdbe21a0e835bc2d73050fcb43ef8e4533dee45c6fbe42023f6b9ad1fd16eb449698623ba9894ca1324beb0f8f39f417e7b2b7a2b3e1298cb192af7f954ed570e0d8e6193b90a316f2fd9f15f7b9a46038b1180434658ace6a5236848d1193f983f0a19531ab2d339c6fa68d1c0dd185d18494f04c3dd963be21b6c5abfaee7d9bbc18d3a13f01f13f36a360d72306b8d08c7347e12fbfdacbb102a2869eff03ca06779a15fa8df96ac19412fad0e89af645f5b8f6314f5520d8dd1ba7c4b896a1297c27a2ee8bc616ca2da83453c2074caa0179448ce099132c48165f435c24b9fec96edd27b83c42ff69ada77d3c3c12a73b1bef9204ec8bc052bd1264419f3164a11c4362bbc9c024d744142d8ca1b6e0da0297cd3a48c4a87a1035de2499a8da48e19faaeee7331556f1655845810d3f114b5e396d151db2f402d9005ba9f15afa06dbd6f86f1a4f84c229a5e677d84bec34937a2f4cee90a9678b46968116e57ea8bb9bd30b46addffebc809991c17b46944e3284c5930bf519860cdf8605b3e7b1b07351957585ea198a0677759d9d260680a32c71da8ac86c64f0fa41754f504b886d1910288eba0d21643d81d1864c09e50c577fdd4529792098337a4bf34407f04dacfb474e75134e22b0e658852a8a9640a73b964b5f03655b74b29e2b93a5b4d85ecb1e130c8825e3f2c112ab67ed747095482c39983d5248f2148d25fcbd8e181365794b735bafe82cab4621735930be44c8c2240247e6c479a27a980735f1c54ccecfe14cb80377b320addf20024dd2920885adf241c5e69ddfe9082f334639d44988e84994a99701e14f00a17cd2ac4ba9feeedd160ad1bb0c3575bf7ca4300c910189a5fe4e4d2e6d740ce802e8b8f4bc311fffabb5ef0cc7f139dd05713d713e64be7f3bda5c79857f3817c9a1bcaa301ee558b4d5b1dc88665ab19ea57f97e678a40eea6d7867d8559c0f5f50d63eaa079c2ca0378cb410a3242311661d9e9017f23c8ca8ee397f7734f9bf91cd5e28ebce31b52d638f7a51f01faeba156d4b73be3c75e6c01e3f819bae9c7fe42a9851365383fb12d25bf155a0e7f1e9b0f969f7b45d11425e3c8a069c4373762890c486eec0a4b0352e780061b81c97b36b7ad0edad302e3c96f1a11949a3edb9c8a358c1ff9d23cb66ebf284d77b4f9a85da26056f278145e0cfb826dec292b92ee5481d34cb8337ffb488ec2f715b16db8d24a09fc5b964cf813a63c75c72b324a0ad2805b9bc1f9d22dc42e271c265b95b89e1d0d9810ddd6714b09b84b98490f4fb62d26831a9ad2f658e0293d3dc97fee6832fa4e5d4cb3b773dfb36a0c43858775054f3a4b1df593ff4c1e236b96b018694b697c637dcbaf9e8de4843ce9ff212fbd6f5b07f939f601ed5be645958d67f9fda3dd80043c6b78894c5cb39ba8c276e4f47d04a2362228060bc0f5f951a70baa591a002d8ad5b69e01997ed58667630c5b2f180051d826c9c6b1e26efeb21d063778fb7f27507ffb5c03c32ad2491632d821c7134de3d6f5dbdd667aeffb923d755504ab1d3521a5936bf0e40a58d681910e0e073977c3c1edee808e12a0c6b3d4e0de36bbe129777644cfbac18b5964d2f8c684a847ff93c25fd935a1d21b23c0a4795cb808cf2ba90caa7d0cec68a899dfda03a389466eee7e6ad28ea04bab6136075a177a024d99762d57ff4e06ad4758744490fe0dad7b7b864632bc38338e4dac42c6645320bee22d8b49b0b9fb77bf57dc241aa24baa6b2ea2c86fcf6032a760e5b0af2a5f24db6d650769d2333c2e6e3691352434ae0690c673afa507c7035e8ffcf68477d1492c052404a60e2205afcda60db320991e5f5fbebaa13e930ecf2ad494f1921f9c9f757f4b3b93e09b115b864f563d0a8b6ce10889b4f977645aff37510453c2d68b8667055af239ba272aa109e20ae88139644bee857c58a3309250639b04c899915058c6bc35da9892c9677cf2f97ecbde992160176c5e8f7001bd90ab97243b462101934f9aa5e4817baf96f75da67390e7b485551b0d988ff28227e2263b91f15adf12c189d2c22898ad2725aa4ddfff6b2f4fd77f0ac8797e404e254aaa5a39188963ba6eb57c73e41c5dc16081477ffd59882060e6f1b906e7c1a73439e4168b622f8347f5ea1d76f8f0fffa8bc76bf6971ec3a1a3b2edfc2ce76dcec84eaf7fefadf83f9210eb4ffa047db48b38ef3619aecab41462b88cd59c9f3f238a1fba7d4860f859e57cc552dce90975df3c87ca152e8cd518b70d1b22d2453b786f8d0db360758de163bd5dcac197d08a7d65e4f184b2dac5d5624efab534f041d6371cfd984f87c236ada9ba65a4404f22a73fc616a8bfd3176af86050d4bd3529850244bf392864ceb45ba9baa443f2deed7a23e01d12683dbe35e1397d481d86ba9a070fe18d4da3a8cb2bd72b640a6701e9aa3cd012512bfbacef07d50edad1b67665db814963c32fac4439707b39a069c1044504f6ee1882906aa73f7d321c4bb9ae3b5b68b3ba93f9820be39e2477ed4d7baa478580160b60531e98a085c1d6d4d34e93af537bf4176db7a9c6cfe03799f41360ad479366251580777584e3733def30a6b9d459bf49f41c400daaf3c1b5eee622012d8ab833cc902679b44659404b7ecb36ac1c04897df5883c404a4451ef486c2c0f8effc0857f279f79e085c9d2bd9458c247aad30f45b928159d90e6cd25125215058e0fcaa19fdd789c2110f480c084813a44e71a06998c9b3eddc0a7edb1b797911beaba88c876e8600204906b308130f2c0045c1cfd02cffd7b4b0bc73354b8aa9d38e16cd8a7f2ca0bd5e6c2cabc716ed63d53524eaa09940409dd2a8f8a35f36fa57199119002feff158b8d861e99d3748e0c664af7be8e56005c72b6f41709aa1bd95e28d8ac24cebab0e8b86e1f4938315c95c95fb8cb8bd83f3ab9516045329eb8354ea2aa51b5d183afb4211e91548168b3434dabd425cb3768db95b0bf00b1d1c080e9ac9fd2d4e3901267fce96ddde3969e3dac0e7f0476a73b3d11349d5f2bbadd0fba3775fb811160f95ece367c8b0fa4c094ed8d92abcdd7e68924573b4d71b5cdfbe2f6a78df3455d8a56cda0dc86e4831434516a844b4509bc4442c4a62268184b67ad4f08f409d274b824d999da8344df7d90681c88256391bd214ee335678a0ab3f8ffaab7c459e8a985c515050c6b42c5405d9b51f828b4d5e8d942e9044c12c613669e699218ff02470873fdb8133d2a3f45e89d11078ad6e3832a6edfd9f85bf4eb068856f4b1ae5efdfcca33f16808a757dd4de64e2b6eb22ecbb42b04472f6225803da3fcb57a66ae1b62137409436be94e8533a61c36d230c28344d94855ad7fd7b1d2ebe8f8b2b7b4dd317458f55e6ab46a02598b312f2973a58139b5b8b6c68f692b776482434b775655c005144c1fe78974992f29947ad87f0eba8a6fc6adf2c3904b0868206e8f626fad372c3c9949c15d3d77ceebe4bb9ea43bdfb4d604d090bc0944c0aeb755edfcf32096aee22e5b5f1409fb1cf5b0c196633672d78251c4156ed8584f446724631d6b2ff88d2e88c5eefd5a2a151ac1290ccfe34c8f34b1f2ae8d88ce2ea73ef5c10515ed4bc8a4d78fe13892ee52cf303b55a2f15dc359dfcfe09cdd4fe7aaecc8fc6d8b1e33a1e93cf8e1f0fdc46fbbe38b38ba2db33f4b6868188a4a02122cfda0428b18229626f1d2e1325547d6f86a9995ef1daa728864095fc40ca49e01c0b8df82a702d5ead7c7f1b4235293fb2d1d5ea40cdc5d3effda3263915ce82566a3589bd587c13a0dbac9e09011d0ad6aac3a53cecc2dbdd53a9dd7096c42044df9dcbf3ebcec82fa53ffe98b6dd4d40fd653e7f287a4eacffeebc11831d8d652508b02fe5a4f284dd146f4c69a6fa581823ea4bf5c7038f31167a286a294361b14445d27d6afa2d845d1afd5a176d7027ad50d5e4f03ee8aa4d2db8afd15528ad57caaa65046bfa2ef3d38d76bd1e14f0ab80dd558d7d652ad66bdce3e9dd78802480db3851b54a495b60b5245045df6a2033b199188f2536ea57e081f61ac49147c3d7d98cdc48312ac2d89cd35e75c4a7b2376b5c6843982e00203219e7f755cb4805df3523b398985c9ef5d5dd772a6c40b77beefba584c58090408fc4b8446dcd2bcc6dd219662e90f0cc93cc2d00ebb4bf7f55fd73f742486c74f64696626c1fb3086665a8422c3fc9d17a642c93ef88f4b6cbe51177a4aab1914f3adf5669d847d11b75559466e60c338d9190694c666a9cae421a949413256db805c1aa7c27cf0a43365875ad1ac48808743ee9a24a5ebe91ef213d0b7761e941d474f8cd20b5f1a25a6754ea96c76233ff339143af5150f3a5c4da73d3aa3a9a62aa8fceb9542455be159417bb1594d1f5ffadbc3d3a3f6e7287a21549dc0b814c8046fcd9025cde8afef40384db5c244262222ffe8021bd1822dc53a90b0c4ee8953c2304c1f2016087fd3846fc811f36e3a8887e76ce8c7ef4de45c3d1e73d63e270d773e7892c85ee9faf4c919c17a5ccb607286e4e34b444689338c236d2c60811bf23cc5da0d84b9db93e71dc141e77ac05da2ebef92ab62c82ffe47fc497dbcf008e8b077c6f582e65eb341a4b5f233ba1e841470ca11a309b19f161a1aeeaa82ffff69f658d84d309e065c22b06baf66241717a1ee97c9a56706caf27d65f31352cad26534db7e2bc5ac39789eba58e51307593b9302cc60d9096b5021e5589ce87116b36a18c9c681f81ae2f93046aba7704d3a5c3b5911af861205c7755ff4e4cb41165b2ec1bd9e64e1be2b13d0906ef97352c9d70920c3efc88fc8100c5b6d1cd05ded3e35d94e8d2e1f10c9824821ff35e6d429c7284d5d0d0c197921160c94ffd7fe73836d6d355761cde3815651984aea31fcb30f50b156436c38ec52b34d854f1ffc1342e772260bd6a2e3e1617ad312bd1b0d35888db7b801fc68902f387d2c0873dc995eeb6f4a1f44265e20eb0aacce5d7c41a4410ed12005aaea33bb3fdafbbfbf03ca7f189b235af72ecc17c27f0ccc10f5c61def3a8f3d72433444db699a3146cc3cc36bd62eeeb8c155ce498cf098563aa8802f95cba9a9dad86928e1d7be561905487b3c785e3eaaa2a03947b0354d22a143d9f77cebc4e8384324df31e170d37790dadbe3c585cc9fb673463b5ea3c31d188e3b6bcbe8b24d2e77c19d7bf3b7dc296983219bbe66755f1434fdf8e4b9fb4b31fc2b3a3b8c33e6892a749c72136e16c6567f9708caac5cdfba2f28f48defd86b4790d2df7db10fb99dddcced71c58ed2db01aa6d764f157dc1d6be0a7d52929131acf08bb14c2e56d83a12c413102f60d5fe79586a498bbd46649ac24bf7a0e89df248d5d06aef226dc77f5a024e4c80331e5d9884ebe5454163d3bd7c92f0ddd245898083005288683cfb5778834f141d41854a369841f3201fac47d14de52e668a1075325e90d6ac1428d18a3ef0d5b0d0b867eccb9b2ed487c9791903b825d8ab96702ab9611ecb018f5b499e2dc6744761117941a643d3e46738cd853fc57dbdec98b7de46e31b3423e8c443b1532b20c5bf327ee0d83f550e127a3c1ee0f7c46b5b4b8a48b03dc0fb92bad355b0429be527f2a7b48ff8274e86ad2cf9f9dfddab78ef1c41d49ebf089402bc7507475f8fe4b4d4c305cb3be05b93918d8c8542961bc0555348792c4c4c63fe72acaa20a623ec9f2c84787c4c3fe3f9365c2b983e38631b55737be86c421c2afb897ce4a98f537dd9b9def3ae4d471351c765539af94e7fec3152dbae002c11fe33b8ce696f5d3963e76acb6773da166c7f98571b5d7129f6e70fd9cdf449e74f6a211d6d9c07d47bd9a74babcff407d2584bbc1e20c06b1f2b9e818e30e66d7e8645bd2201d88eb248236c0722b9aa5d548d2d62f1af61437af7cff0f7c7b3bd9a28035f4665d8f61af154d8120a6e4cd7b03161dd1a3d2cbc92e953f27f080ff053d0903a42842d6c6da6f56593aae10313966a4e49eee262cfcee3d10b6e434ff92b2d125004e4c209c23c100c5d13a0b7b7bf2b130d9d6fc305b2c4b1a0efa2e57400c6d9e4b2d67084fe0fd1f87bf98062683c782e80190c890f739c5748c144c1245c1c2554f276ec21ec9255c43399df92b2f53b99f438d82cb6496d2a57211a81989e513a2183f82f24d46f88a24d9f10f4826388c614166896b4e6a23e9f8e4bfca08d074933f8c9900607152a5e49e246bdb0c59ee74bba4d350ad87ff2b43f53c5b7791b36a12d8413365663ac0bcc2c8762f41345d250977126264711b78c1735dbc35c525aa11df1cc64956ebf770841ceea75fbe9f98c8336a636e81abf3ee0ae1592f0cc49797ada3ea718dc79ac75dcc4552e4301936a45fde972235528705cd65d89d92eb3557534c1ee01428a38f713e4284055ac346d2e2d042c765db8a71c16253fa1d86dd714b3f90bfe445f68ed4a154def63636791c21c4402a37b9658a2ee41d295d83070eabaeb4c21d8621a1ac22ed80f4b64c1eeb28a9c514a93d66f8300a8b9deddf4193c8198426c18d226a733d84df2321fc165ea2757fc14092dc5b345892ae332654b286cd9b056ac0fa8d26d34e0b54c153e91db17f5184c91cb10d9a7459d6afae127d6b74539604d87bc7bd4d9d762bb9a5bf5ec6dfa45a160f4f7f5e6d41282ea07a477a32e12dce4b1132ad0243d67d3834612f185f2835fbd4c93b91e0f6e3ef30b3099809c7e08bcd4e2f4aec79c6cdc516d842503d6ecbd502e68d5d07b25ba73861a1173c44b898c5540dd433f7e6badee09813839cf094430712c34c7589dcb7bb4d89d50df174e3443bb8618ca8535356c6948d536872fb6ff024bd968a636bdbc583f86eea7c44e64d37a6dfbe96ee3250fcb02a03d7396b7458b90062a32ac7289e2ec4a17bcf80173736d477173c2e7b3fe54a45d07656bf75828d941e0e2add0aa2148b581b4cd62de5ca69f9f6d1ff641ee3279b8fc331b14f10b40daf797f0a5e6e9934e14eed4ddc3eada3d24d548277dd6290eeee5820caaf1db8d84fd403995a1d4236378459a38d15613085f0e274c53f255f6a624028ddb19f2493996218bafea70fdd7b3beb77e8b95c22d8be59a0c11184f3bd75eec8621325e06499cf731ce23ddeed6350e3784d1f78dc75f638023fe94d02c62f4c2fb02a234ecb0bf5fb8847b226fbee022be99a62194641bcb6f6586f7feb6b69b6940019ec98eca348db659606af1bddfa1722135ee4f5cb9d19b3a58e70662ff4bd439475aa9fe1ebcb9db32d3df0544d2a010e753ce491d1b1455328f2b545652add7031410cda664290a92715c89787bc1d5802319aef634921e4a4235462a785f567272ef5a04f3961890aeff5d1541c1d6181cac6e1688f1b5b7d9739beaa580e24f8a8752c63445c2bd731ddac0cae8afad87cafcf1de8619a88e68eee848d5f50db167f63f69bfe4df56fce2c8e6cae176d194ca189315b91480cdd366fb994ed63b3f49c0592adb46785cf23bb00f5dd6e2641ade31722afb45e3f92ee74a694e6f87ba202232e118c0aa2e38ffa82fd73eece31d2f16e86cc0c926445e731e94b3e0d654150f63042eba8904b0ba62cd301ad555389354228086b71c21424e709925704fa71f49df449fd91678f8d41579a626cdd2121896ded39521857b3ac976a3952c0cd47fcdb8a75ad752d4ee5301e3f911b0d5b32b4b45387941ca6104aff052c53a4cd43fb1fec3e2cc6c38b6af8797acd889193ecc76e13e5a2b9a663756edda6c1d6f460c4c0ac1ad90ead0fa5b8226331945051bb3b0d83f0942f251bb12e7c4dbfb94e891b0d6e4856888ac849e4eba2daadf2719d1e0962ca3490f592d343c4dd0bc3c83e3815ee6d2a41e01567fe60a6af1bfb391bc14631e1a5f8627b0346263363d43c58b038a21033e918303df89d27492980edcc2639c22ed63affd5d33afa65c4218a9de0b2d93770ad50e3813c0bce4c0bfb289fb9587f035c91ce9713ae0e9367c74e86c2c2da01bbab4c9afa5fe93c4b717eb81b3ce4dbc1160bf45d2f928cfde5df556edfe7be53511613acb0de273077dd903e9fe6ccfc1db6aa1044a700dcde9c0bd4f193f2ebca5a4b991f880e28800a30ec2841e61b7e1eb597809c4242f7c5d6cff04dc0815d6ee92f0f30cec5657b7d8fdc77c49da0612643201bc93e7d6d77bbaca654d4404f20c3aabc2ebf8c9e33de7bcde0d05e5c8c13658a24c01cc45dec73cbef948e82f3c5b5c2bada685dce252d13f71aea8f22384f2a74ac5288df4571b01032e2af39a81b1685e69ba4b542af828b34c1e365fb10dc6c83e570ac676c30729bd3d84f9caaa71b359af303e3b16e45e49a072fe4631076917cfb7ecae2865859fa38a0b1644cd37487d956e45e2fc40a5c4126b5b86672f744935c35272faf86ff7e599a081dc07c575d0cfefb55e1c850a62531855f69a31cce72701c436e03c5a67e6e5c4d439aff47a830a24ef0b7c99ab838cf7fa4b0df3ef08d01065056f95afa8516fabda40d2d29ae6931cea98fa80444501826cae71036554c76ff4e9e97a74daa4b48fb2a49a0bb15c9e175c3a86d8b2573bbe19ae22b6b452a10eda5d500bb3753be0fc6a5de001cbda64b8842d88ba6a810ccef7a60af224867151e61f2c63783991889e2d710ea1c786814c062fa2f3dfb518ddab52ceb543b1cbd919999b5a49b03158b0b2b24451b441a5386ad4fae8330bdf22ef22b9a4989651e738ea61885f10425420a1cac18e2fd8ac609831fe4f87aca19abae32378302c527906874bdf3ed3f9540863af6450e49bcd4d195dbef2214c2f0a7fc854a929e1c342e70e8f54d0c91f83e1b1fa5e8dce258f5f525e49d211c7960b7d23b594345a0164c3dad243ff773d6a6448f3c83a3936d77a9e80682d5fd7e51e194d79eec7c93d25ef92001f5cd6205eb6b36a844a315877f4378e62b99b24188b13901a0a1f54eacd64c3d44ff4c7039a4a7cd9174015768ba3657ba7d9090c3d8d960fe05fa9672a69c829416a2c5b23c4ade38fff955fc97b4308262781f4ce7c6baad470e18fd250112416708b25bc8965eb470c9b1eeefd2fba9946fcf9c4084b7f160e4dc98d4b03079ee4f333e1eeea367d91e6acf433669999d6bdcc5dc941812c9858957c78fabdaf286e80056f0c651a0b6b84283ed25837ea66a323f8ba5ad60683079d16e2a10a4a788aae0e1afa8a1791153491d3ced0eddc07f7d0cbc71bc19c092d646166a7f2b2ac97246ffff9bafe608d8080e42d20ff6d6bc4c7b1fd7d005ec67da1a6bdf27e958629e55d3a7786e5194a3834c1876768dd1fe6abf14db5b094c72cb1e5d33aa8ea4e45adb1aafc8b5ae6281e6c8924fb3296c3b2e22e943a22ca02125b574030089fe40609141eecf8650ae7255db46fa9f9235025e2b7168d8701c58d37267e0befb594b0feb473b5f0af10088d99852132498968f9dcb444556f29db80b3dd8aee82c75cf7756221574176f2fb12415069c150b990fe8184bb5573f08984f99dc233e424c6f1baf04911c25fe57fcaf9030e10cb627eeac233962e89b5fba8c270780406d5b2e21f636fedc984f129a2598a12e62187898b92752f044e09d358755cf0869a99c2b68091a3d04a4a15202689047ea01e8c490720ba1036fc313385f1150e73206d0367fc3e264f5475b0fe42918cda40e19fbe946a6a7cb4d4d4cc7478b023e51cfc9691d3908d7e74506efaeb2bec380f8a9acbe4a934e2b25526f28aabc1091fec4f584de2e51258b9b056a8b82f60dffdaea313579ecd30df229a5cea18bcedc31ce50dfad36e989bcd5eb8919ded5acf69ec84b79d857e69bd1233fdff23ae5218d955a4fd19b4a70546a209224c73f7e406113d0614a116d6aa574c100189b635f72fddd39cf10c886956648e38fe4133164f0014a19d87918f5a30da6112c568b342c4d46f428be81bd2846376fc47afc1b0b2373f68b1b17459bea1d5552972e002281492043088383dcad277028f62ef2c0fd26f44719d9c843fd14cff217c1956b9c63d045c4ae36046865f7ac7c547353e315ebe3e4addd138988b03cc8af8a6d29cfd4aa844561a53a3a8ff05f466e6a61b8512e4e56052c5b79d0f2dc523d795c25d40894109d485d0630593f398d10c0a82236542ad71a4792da9dd9c06d8e3049e74739461484f6c231e69aba76d1d3e6e112d1910bc139c3ecf92812a890e80ab361c38d6037e0ea18328c7555d75a4e475cba76a07a8b8e9bc64c073281fd66743496e3915c0c91f18d87a51edc98cf536bd8ed66f8f96dc6555e4ecb2580df35365cd3305ccc2b2e87204d96c4e570fd5e07e0fc45bbae39b0e03c5c20fd6d688984aa53737ca16ab3426206c13b8c2fe7e973217876ec397032b8e3c412a51946840dd4c59a6621af04eed84f0c6b67faf1daf3b575f32f39816f4b7ce76677d7780aaad0ec4e03037093106b4397399fecb2291f6067bc4dfa559106f03834a214a548e77da3cd7a87fe9fa3c7a9127a3f018976fd4f34997a19b59c152b7f3a44b91b4d675e02c8db5a9ffd75581d2958414a8dbe3c1007e212604340befb4993748515f0e64ee291480e4f5f3517cb95a5bcecd5e6f576fbc1d24500a26d5e0edf073c39edcb091636eca8fbe35dc81cccfe81537eb471b72e2d02e68a3f249f840c8525796b2d768f2ac308c6eb5f806102980f9559011fb6c81e3dd179642d7e6c89aa0c297fcd359f68eafe5b0d79bec879f42795ab80236db2fad9826247182560518d61b44678a08f9490ab53468f2f672253f0bb0825a37c945f7831b6e5a644aca7e829e94da4526a32924d9bab3a8be54e4e80605df22c1e2949a8baa1c92e9ecaba3a351991bad4416cf7a074997fba38e7e8227c14e686a0850806629d3f20661b32de3d8d5ea0cf10bb6f9ac708cf923d7b53cb7ca38cd23f35e68ce459361936aa299582de3114188bdf50147dbb4b869b4a3d6dbd1d28781a96711a612ac9331acb4c1f58ba9ac19590ba403dbd0be2dad166d2ce7a447bfcd659f9edbe21d31c0293093bf62495c1c10f7ad9125f39dd83a60d4e52bd73356e48a8be452a2ff2117e4271a1ab19864e45eb9c4dbf607c13cd97458d11ac6031801e7959ea14a903b81962821617be2e001a0d09a5f9eeb499f91e95ccd3c7ccad08237fa8c044c4b8e95905f0c48d8bfb25072c13814c6bfcb60b6a9b2199e54c5a7b46c71a0bb327da4845980e9f08abdc67ade6317405cd3c4dfbaaafbef7dc9c7affd0aef8008e33c2ccf0890701f6478251503105d90c53e12b85b53d7ee4e58b0a61440f98cf98e3191e71e8148f66035734f06df1dc02fc9d80f80356d7b7abb1de7653af9cf483290b977e432ccf6a01bed7681f2bda220341d42ad4b834621c3e7bf1691b956148116e3e9b8c415c046718e8545dc4d392b07164e9feda5a6fe560f9b36602dabff870fda8b7ec675c9e0e9b8b41726e7e0efdd1da9cb4f00a88b9d51e1e02a5c3b2d7de336ca42b45dff076d01f0d9d52a555c4caed570c9df603acf7f6229df3297e12266386bd378bbd901897f3c0b0863e86528be7b4198ffa08177f01148c045951f2dd6ff0cd001c82e7841c0ecfd3ccb1724c849e488c882a7eef292c26e0112fdfeee6f8ea974bf7dd46bae44147e1310175b0a4fb990acb36305121064a5a1efe4fe18f7565828bd6dcac574f5a6301563f9a614b9a87c55d957617814b5949a27b158dd66c97b983c59e9f726760cd51bdeccffc4086a2e17c227e05412dcf34cce6265c1c2c542d5c5af75584b51346584440a9c7ee8ff3ae315f80bc95400096e5482bc658e962d8619de011038db62bf244f5677626a888b7de5a9d5d284b656d1d6783dc5309913e19c291e5016dabd1632500c1a23025e7ab7e01f572e38e27785b93e5cb757d0fa0eb036ae0578db63d7156b761257924667aaba6d3a7f68cf78e3c3cd488e62f0bf4311e4ecfd17edcd722e14ce04d0ba1c4b96b02f0b85fbf7628e5ade4f0ba1bcc8d4e32acab090f695ab2ee7892ea203335d3febd4eb9664a3b025decdc425f470bdc9e0ea56aa188115f2e15e7ddabc9bc13437c7c33a95076d8f9cb7ea8a9da93496b60733be50426e1f8d0ea52268d01782ec3821e832a6890450b0806b994f7cbbec15be0fa8874a1b3c8beabcfbe0228859a698c3aae3ce121cd31d89aec6bf18da7073827b75f10b7e7a8c3de8e3c58e19da463ec19654adb958f5a2a44db31c59990aeda9b8cdb8b4374138d259bca27250d7ef811b4f9280210c44a306cb71a698136ddfafe3762ca8154c9b3a82ba03fbc1d9020556fbe79a8dbda9c70ed75a7b3ab70410174da674505237dd42845f31d7b93635027153e129a87af45d565e4fa0d974d767abe158943ee73032a26ce4d9b3350660934f1ca25ebc92cef589926380e99109685913a7e15de64a8a8b239fadd3c336a6929278f7c9a48f3bd079bb26c4abef32f66ded47ee9d06298ea927844a939f7760adcabeeac484d33c4ebc96d67f9b24d6b5c375c3a1c30452cfde1041ed8f35bad33fce5cce9fa107e4fad21fdf95e9a5cb6ca99add621abf8a34530be9dd28c0d849bba81d0f09bf41d2e2990298957e49bd4d22b93570e76c88159326fcb207cf369f8f6fa016fb7e9c68b9007dae3f30655e0c97652d6602997ed21267ed7c366abcb913b8075dcf0ee1bd106f625f7522062230d7837a1b5d556b6c4bce9407fdf5b1821ba97e6dbae8648408b06d78ecc1010dcc5240d3b5f3627963c3ae622a0b3c64c2b5bd3ef49123586ec9cf6e38dbb937946dcea8109a15800042c550a648016bad187fd498e4112f52ff0cee288da7f7242a26bcdaf80d34a7051d0d28101190220393bd788fd84454a8999d7a4b1ed17c940808b1f9adaa170f4a44af2a7c9094a640307430158e5ad65893cdec9591bd5674240a46d49f548a5ddb861e9f3d1732df28c466436408935aa70df880f79d8fec61a27f58e78cc0463a60f4c1909a692a8b98a547842a67aae4255d2e2372237bb1794d7690eee0e526c3c73de12a1de8dcfcbcc3af3496aa67b4c70c999a2334268da71fdc9e62acee7dd1a8e891be8ecccb5f934f7d68b5caa58159817bdceea620d8597016e6d8a674bd343a890ae5a89a130dfe63ca4f2c13a4d29ad56d25a153447e8ea269dd3b1dcb735d178218865c242b15f1e824969b09555203e9e9252b8be4c8e86038ef1a75ee2f65a4fb7f821286d72b78861ffe5826b1292575012c03aa91b4fa8bd48bcba2828579edd235d525413c25ca2840d9d50d456d48b37912b3e21ffa3f914397f2da577d3f71033da3f59c90045250846a5734eadd48d95d36bcd3254dc7da9317c6af4511dd88a13d9061afcfe3fa05753306b0d0a427d01b287766d2bb9e8d9ea2ee84448a1905540301c9011ef2cd9e3435e612ada632b3cae29f3ccef248d417aac60199c5d585b215ce05c5da15b2518765c623c9c8d935ca095a4d8b120a052d29854334cbc3f8b59c5922c6090f93f93a76aa18e5487b2b505251b8fbc7c063fed4d779e1287d6969b614851f4343a70bdc21efe570071bf16584ee5574bf1dca90fc2a56621dc3f78f8263bc0a4dc1b7e05cb89fb7733597e752877b9d058eaff7ae4ae72b697098a698f54fdebcd8da7c29028057e3f6a3501aa69a3438a47bcc1c3e9e3b8f12a896938aa2cb868836a28c3f8f45bf10f56b07f8cfdd1ce91900acf9816e45bb50535f8a17b192e9c3393f933f5eabca0a39ff56726e9cd2039a5ed15d53be6ebe57b37dc2316f116ce566e81018238a2e648c8cd6f9d23db8bab22bea2133fa6b6e7e566b57dbc8c2efe904059a9912141a3af5637b1e11e99d76db0f8a965c235e6e941c378a5761d4a659ef8b5aaf1547966a8b6c59715ec8838c0d77bf486fe6112d3992526d3280b9c5722f340b2e5096bcace61340d3016ef9144e0feb3a67ec0762c529f575b8a9fde6c2de35bfeec05ab39078f5900b1aed1b5b7287dda9887ac166f20cfa0946384b27e95be58515c6202f7620ada1cbed47dfb4c4fab26a705cc8818bfc2b03804f849b6e18d6f453e6369562217fc8108d0091e33dc99497591ca746a55c89d86649763100a06de39892ddcff6e0cced76b27737d61c36fd4b47188db5b6837c617a7cdd0a0cfe7f0299fe0e4e46f66f5912ec4278902f471527925b6ae8879c004bcef457a6caa4b19357086ea72b8082fa4f4fd7d7656619bfdd670815db227afc99ddd7b305f0d0bbae185047f15ca3e02a26c55fa403e4a080fef33ad9fe082ac2e4770cdd37a376640b164c8057df2d9ddceb3de123c1a97c2b6fc378353546aa44974e6c693338a4d086e5dcf8cbb4cda652750e5321581fe5cbe9720e4aab9cbb2075945cf6266f65b6bd4229b0939fecc724791902448c9ef4b9c5aa994abf04f284a0cdc7832a3b942730cf38a016b0640191495430e2b63e8a1798b92155b0ea70515e2716a210f1fb35b1817a467b10105e58b70caa3b5bd907a94392a6bf88d9648cb9f504ad903742e1086c4231cf881022a9bc9f4336241da4e0cb662eb7974347dc5434bdb0792d3647049a715016d04662b12ae0d6393c5541f9a3c8f222e483032bda0e2a5f9dcc6120f504e62071dc9443de9654a5a481d114a41720d26d95554c278ef92c5f8600da43c5feab41b701dbe863c65e55b7ede63a2b021f8603f14a96c6f86e002c85d5329f3fc860df788107b527b9c042cabecf02857ccb7ef8e1a3fe0a8f6a135831dd36826ce0afbe30d9c8be6a0b0e0c1d4b2fd144e0d1104b0e742746f38321c3f75ea726af7d04757fcfe1d9e48df995eabd821248dc4e9cf6de2a5894636e3564ec1c88b61fc10ab4314319b6e74a8b4520f9a395f2a83fbceded750912f28fa855f2b3f91b0e661e7b20ff8495cb60f480aa684419df209612d667c2cc14bb6ea388c6d0f1f9709319592fc353f1f4d43ba6393dd9b3dba56056a7504ab4762900e0c27e9a0404499abe6da3126c68c9313f11ba398e4559b28ed3b4774f47955b715ae7a493120259d04ab38d61def9f4e86199158b4ea3697becdc90cc43a8c937e3fbcf7c1fd723af69d71f785ff35f697c281ec86472f8dc907b7ce575f383d7c5e354dff51f392785309e562cdbcc963e462f28afeb85a43af6862976552d450eb0f056e7d896828ea5245499c949fbebbc4f2391a8d5b40112cb3d1b08a0867de6a2aee4be6640a1ce41407c4525575e260e1657d6c4466a0339f2f4b835d0f2e3ffbc2300acadaba36e0c85455520e3a2c5f8135cf3d44e17c7a24d77ecdeb2451cf9003b5233dcf7a1b088143e60e957169029f71b97402af4ffd28d3f14f6278a4c009949b2d242ab49ea9d615896ba9512af323885b2d019374ebf148ec82e07e7dfbc445b2817d92f7d1664fb57db89f9ac2df7b6a9ebd2c3003e96d0e61b3759ba5b156826789fac1d226f8295482cd9f2b7224d923c06e6fd188b108f87d0cffeaa6eefac86df54ae39d09c664d52ec0c19a92851338f5c9b63c6fe1514bba1a0017c54e51812c1a5d89c29da9cb10ce3b96033d855363ad1caa897109fee17219d43d8bb037bd96f8ee9ee9cba126caf6fbfe43648a4568e121c2c549b6bd80732a7fe722317f51fc24f1f7af76bf63d4187f2965f0a8a9f6f9c82f322ce3214e4de10bec4a7c4375d7af2dab4ca226f471f3711bac2e5e815408110fc50bceb51f6ed0ccc1638ae1564173fc2696a7f1a809d7a5d244094a695be1b0ad82b8280750e5b0657055c78e75bdb659c1fcb32569ef15f3499c7e314f6712a5a2d75bc408f580d7088e3935848ef80428d161f5f055b93b47b9de2d21daf9d960dc83233876ef42e486b0c6e5700d47b560105ae535364b65f48d6a26d90feeaad7c192d4d626ce3b197683195410a3bba06b2992f6e04d5c202c781aa46927e4750889204e764b85276e84ba156a00568bc419eedf8b9276b24b95f096a2504d1f443c17c313899103cb5f5d09f86c652e9f3a3cef01c7a6f87f1818720d288210b46fa380322caad4f780cbf50b00901308dd241c25cce8d657e9b2636e3d20fd8b0934084e0f8da3e5b38eed466a9869656c9ed7f10c5bf5eedbc35fe58cf23de73702985d7475c22e8c24bc5c65c88df0a70912767b3880a7e1a6e1d1d60fa64dfbff61aafa9f1255c1ad42c4acf69504a06c8112d12ed6ae79ddc7afe2a27e47eba08cfda50106a658c517f37f037a9b60935e2a669ca70ef0f0e51f32a366970e45b3a9862b460a5ab5c0ebe6324db0a6f5e583edd77be74796715c553cb083968912cf9cd009e6f89cefcd034be3b53eba747df00d79c3a6e222a6788901e5dcf4c5ba3b4a7502962871e8b7ad0c931db32e422ecbb0b2814c90263dd2e689bdca3631d4eda813759919fe7d6868ad4b5944aa667835e1ac324a7f08f6d59ba8e6085b6c5659853d0dd40f31b56bb2d88c5821b78b9a9ece035a7523d8e9e5ed6894f44278b0ea9138598a4f6b73c577e7b070f0fe1177ff2d76a7000b2e109b1590f7cd05d493b1fef756815bc9003918ab9305f1b9799c62082c19630044a4b179b754692cc9e658d9c8b26af7dfe6439ee676205c1e2bafb27450af8aa477aaf062ad2dc29190f6e6f871cf0b33177aedb6f467288b4203769833acb6cc12cbf3a4e8fb1cb2b6f21249ad1fed706e25eafdbd8cb5a10aa54639e5666e58fec34691c447830523216a5d00383ae1184a061cdbacb88c28790bd9026355c64f0621b59a592cd02efcc6e3d1e1cf6e9fbff1d6883377f7aeb07fdb0874eb5582f074abd34de87abcee86c842e1eca614b2b835a47b30c1a209e7a410c306e6de1a384798bd7bd6bffdbb1e04fde8cb0418eacc28ef80b1457c7028d0f80fbfee4d3f18f8c94d18569ed3fe086b10579802785a252db7f051276d998f72bd59c33fc84ffe65144e689355dbb4a13fde0270fcbb2cdd70998fdfcb20b86db3f87ca38b4f5e784a77f61e16ba1108e9da2448c68d4e07cff1bfd3a5d2cf44fd3b203d7d7da006e15321fee20c2c8f1e465b024bfabc6c8b8015592f5d3ec135f79cd43dd7358b93f59c440b22283045e90fc1f9c58b842c11815b9d3f105974d601d8ecd3c1c8ac38c9d22755654d7c58ed5002a47403b359904ec5679af43c425ff36f92461f099e7ed296547fadecf7a1495e3dfe14eec78d038fe63cc48e15b3c12096f2a9c8e5d40f43a9cc92f35cd083d9ef1df3cb5d887855d206a5bbcf6bba0035b5511d72a0e840ae943433f07e90abc81671fc8a365f925b3bb667539612807033eecd2409063ed3a798baa587e205fb2b1c04da4ae6073dc69214060e43ec88e99156a43d6c1259bbd4f33d87e6b922c6592d34007c72efde011663834e767ebee4eae94e26878fdc34c3d996e25615495f15f67c269a010edc1e22470f9f54cc688e2f4c918570a97f8a5822c7dd9d0be199385cb7ac77173dc82d7b5162b4e71d4726be9609656c45be9fabfe67dbbecc82d9a27e084a5334b8aa24e7c495e829bfab579d282b5125fb6ec6de7a6850d7a38a0a9d5fd3a9c2dd743ac77859b1f42cdb717ca05aa47f6f4aa52d7779dc773c8e979265c1a9954f47b5b943ae984769fa6c0c4e792d51424eb76139f7c665001f3770806a8a1d8def1786d65c3c153c9bb84603087c671de9a22ae4ea2eb1962f441e9f3d7d34578bfea3b827dce91acec6e885792a11c24ec328e4607a2ea4e7866ffc01a5c736a5bd1ad79a42841614b218108a991f3ad02f8b08967356a23d6d95f248777209ada94d52d89a0fb1f8ca6bbde7673979bfec932e30ba4ffeca5544300c0fca02bd2570be42907d6293aa0e7fa1f3e8feda134ce84e015f8bdb0415ef0ff77fcd9959410f2a55b14ee005024e5f3c724f6b07b6034482a1644d52b2e9d2e847d80bfe2f5d44333e636a2a1e1217cd87dc68046a4e4e743e271cb3572eb34e750459b2ccdc72ac85d1780f7c296a09557459a835a7d78347fe1c6516fa9be5af5c0646a3adc8b1d993aae40104f1e724d5f6568bb5d2155fa9d6bd63cf11e6ca1199e65bcaf846e452f1ceeb5fd1f69e22c340a0816ab5e07e13851df2a8e3340f06b1e267ed4b12b9e9661d66d9aef028ef01ae295438a80625c14787683bf6b71cc698f66944d5d1ebffb9bf31035299b31760ffe72695874053227a5170e793b2ca5f5e38963a36d39c1a0897d23419a18d25d873a67ef771fe9f8c78e56311b18c603523c8cbfbff070eedb3226fc570de00f1975b584b816a7ba5ec22557bf1305290917cdf9fbd4a62cf31a492900671eece9e8aa54e1f64d785619b9c09ff4209012504a2773310b185a0dd443b09bd3673c16e01c46327ad09fb739156c0f0d2710e211322ed2941fd0b620c3e19cd85f4e9848dd0194c9ac018d6007490374678264fd731dba771686bd9c2432f7fed9eb5d34ecd5496f538442af9171f2b1f50dd645d3b44d9d985ccfc170e294c00ab1eaff74464644c0d29e54ef0a1f9f2a96da9cede9b5eb0f89f2cbf95a8fecb1374b228d4428217c7f4cf9e0433e3b32a260f517e87272cda0f3930965dd063c901a79d7d9cbfefeac2b03f8416c897e9be97912caaf2f3d63cf0a53c7a3938e5ddf1e9a8a9406c9d12bc23adf02f46774e51e826bfb31af3b9242d0d693b3f5bef6eccf4770278e3df08233ae9bbdeb783149c88e2a4e19a553be1aa63eef9adf01274d95746bafc9f732f9463bc704bd2266c81ba8e7b0ed116e5c1709074c6c2c51c677bd43947b69824bcd1ef807ff98253440c576261a5bf910dcaab9b5197316ad612a318b1a4cc0f239b0d2da6c5cf3aa54bc84a8e84f9cc737685392e7737e98f7a687649244b98ad96c68a7b274bcb2d0421a93d4cfb604ef283f3a2128f5c8c9b0566a2247cf4218747555ef71524c2fc55ca655e13bfd00c105027000be585b5d1fcad74ba35ef57360e057d43bf0a97674dceee1f54e72def927613338dd4832677147b62542424f74b476fdd705eda40bad213bf216650ec7221dddc6993f9b6c1328695fd4a2969b0ef4103e946e0fe978a04c5eeec52568ff9f10254cf11fdd964c14cfaa7782bd9eac155ebcacc186a8487b8abcd36dc8ebbec9100583b27087d9bc83540d3d4a5a3da4bbe6786a229cf4c48b6c1ee4c42b8f8a7533db5b5e319f6e580f72257ce8158a9e41a0db0362594438393eccf0f5e2bc62b968aad29d31308a061796da0d69df116c4c378bb606534883cc8dc40e120ad7aa8d615a8dfd9bbc4a943335dfd3ea3dfa1684ad6b4b98403e4ea276e84c62c4aa593d5faa5e74a291bd3abfbde577bc107e1b1eaf0cb55d70f76f4d7071a7e0023aa3d0567e64eb8057e404aa195af843c9849feef67c4d315e8ee7bade8de8f7f9a3faf3db637bfaa469a8619e14ecc7f77190b7f1873dc0de09c69377dfa11db2f9776fffb62e49cb8eb66ca5e9a0946e8d903af4cf1e7be7f81f300de8cc3bc963526a0205099f006c441570ace3c183d125a7836e2c4da0e694616b4c04196c1a392e860564f3acf7b7d0ef89ff24f7af1719dbc9afb858de27a156d9cffd02a22d0ca12d40dd654250bc74e1e57cc5d5a18310d5c429cf2572471c87bc2880fc9263fe699c77e2b53d9b71c27f9aff3c5f4d9b9313a08f00288b15895a3a284e1107cb288b2c11ba0379e807b4168c8128764b778e12e3318e1d5bddf985c9e2ce3d86163ad61112285b5bd5cb7489c794a948860effa6b097004cf0a9bdfd4ce5e2ab97f2bf0282056185dede89b512cd4faa0c0d1d0c1332f787839f5f3c5bdfddd377aac762dc87c89c49605d9890858547b1780b0628f0a77921777aec09fec22cf77db2618cca266b6f363ac99ce16c8b4953793d007744c030a0d9a398b58f3ab9e0720b6e5036d15b9f60ea06bcac2b1727ee64574f8d55a70fdb4f1adeeb697bbfc2148a0df5a3e47030388a64db5e75fcf7fe54959fda0abf5bd62347bfee58c64a9294bb995d493e1dd77f59445c5f3e5707525158f115acf2c5d2a9a35b2a33154ec874761cbbaaf33eed2e9b93f496454b43c0418bda29dd18200a855796f0a300c467d132be11bcf696264dd2bf07cea7df5701c384ade877263f3c514fe5135915ae1d54a87982b8990ca16dbe0c0ac809bf0505149ef17568091b3ae1cfefd5ff091c2d4c36b1ddd074d27042d98036b47014d5db92376ff13b23f2b2127894cff9c71f5ebef5bdab4b434df5bd81d6bee5cd5287c06f2a89e2e30d5efc16a342711f5404bfb550347b0e8b6a95ffc3c2bfadf66e74b7633c6073bb9b587c715e7b92a504e685c49126a3572236794468cf88649c8e82a25563011425768ae0151a7548917a3a9af764f78a07c75cd847f96b355a9e77b51bfe7547428c6ef8c051ba94c16a18f4b3551e059235c81b40c18e563f666f4037a0860e87e3f0132646b032372a34511842303a8bbd41f8089aab6d4884e47d41abf6ffd23f743ec997b08c4c5e48abb05f3d7a127ca778e2154bb48f0a0a12df37cba55e2ec73bb45330082b548a9733a4f8d6ad2392b92d2ed26386a483c11df54516d088d054f05f1911992d4eb88aa3dd529f2e94d787b9367eb24d8448664c3172e2b40a90df79a9f933b2027fe5635162f41491033eb6dfb82648d1aec08f5070e4530a008a14738ba4bd23a7e454c928f30a9c011542cc273db66c407783d539bb173ed9c7a340b69a076b9809eea4830f47f8bea5ef1e79a50aa0ce2d786b68df81bed141f1e22dc7b51d1d2a75589c427e4750f528cb95fab1cbc020fa524ae0a7260c42653ec5af235b40d7ebeb037479aacc1af2877f9d23b96823c2f76276c87fe9b5a8563ac96409a35ec4d91c0498e1712fce421b188b99848c7112f1a602b19f8d977b32dd6591edecd49ef734134c5e66b6a3b9e415143342a45c0d7eaa5c5deeda6a9ba75f60718650f5f93c5937c23cd9225e39e76f5a57ac8c45adbb868b95fd7c33d6c7f6401725739d6822d286a6615d8964193cfe78e9d39cf6e1f63b267da60813577bbb1287201d3464764cd48ced0009205b4f64213070ef368b5dd26f466ef73d26b807f892cca10c2110688dee6e8c17a0ba57552658df2c885fc192fecaf4fe2120221f3bb142bb15aa3fd7bc2a2c148013759ea710fd1ccbc7fee6e24ddbf2aa68d26effb133b8f40964d920e1c0060370e789379dd4733a8d1d1669f87e12a71cbcec12f97a46c0d2b1385846ca4228af6c0f048da869e33f149784ffa3caa665060356f0d90a40dedcd5f841359eea713f40ec833adaf044f9e63cf08476c2e2e40715175908459ddb9e3dddceffb4da9a9543948cd059e00b8e995d2c430c41e9e4459dd4a13f8b5d07d620f54779b4dab20ad1fc7ef8a4049435f41047663faaff006e98b104bb4d3a97d82554d24d851ec13035022751fbede7b58c14a7876501d345bc0f7d7a51f610173a7527a6b3852a4848047aff448e1b386caeb1924e2f4d02c3557449a615554a32164fad34d67af559e5da3a7f7c6f83e9af05087849449d48ca7962cfbf25a1b574ca7f5e9bda230cd41cb7603cb256414117fa257b2ea16e10a79e1af104ced02cc3a31b11bca866d7972b27d7c997a94a155dd5150f3507954e75aaf66f618dfd3d5930178829db4ca2bf84937eed3f63b7e5ce9a86574acceaaf64fd22d6e050d33828bfa6a7ba07ef4aadfcd70fe1f7691bb4ddd11a6377f2901fcc9c94430348739ec7a2f185db706f235c0d95cda8b44c1c8ba4fccbe613e2922f5bdcb7f4b027efa894235062dfd1c4f1188610a4f3bca4430675579a6471a0d14c0655a8393bb1f646e4388fa0032e894eb428473902760b2aac5a9bafb19438c1d444197a654fd3483e20ec15f8f53cb31db595195327e5b6bb1ceca12411f77e3e45572d2c19602b833ff774e889e21b3d4119d520d919333c28bd2c4abc5725672fab0ff57fb4445747fb89ade94bd8aadf2b2bb10788674fe4d2fbb4f1070af6ab0ed09188f0b3a7e86de58c3180244738a903718073b26e6be735566731ab601a108a8ff007e4dd48ca77c9822ed166c4015fe16031d6fa01832e07657556ba22e49f1f1d21b747c1401197acc35a11db9d29a4fefdafddc5fd57e985420e5683d3e4fc1ce9a44c3794e629b395ccca493815119119cc451b889d928e136fe43e898655aec79c8137b57f10ae66b93df7e6c889c60c94e3219abcdf2ebf516300955440684b366440ce27dfbd5837e47ba3133912565419369c346a15af26bd1d854fc4da090ffc4940dff3069279f60cd9c2466be3be91e59b17fbb335afe75e1db3eb56e574b2b98ac764441a0674f95ca11bc0f4fa305765c2d52b42bea903b8b4ab609c93f2472b8f997a9b43830cd02f570a6e137c57da41a3ec63919cae3ae6d583bbc4b755415003ba0ccb52f5cb0ec09128a25cfb1d96e49f94ee91290cacd5466b3210f3698271403de48a6964624b147d3afa1ded90533c22a3ca921368903801c48761b33f91777c0f3f628ad379929dce538f4670c80770751421cda9f50c3f3d66f12e485eef1f538ea27ce650bd4e96eb556d681bfb1a762a9e10ab9d1305eb0fd83f03af203d9dd30029dd9d00f63cbb771ea9018a7e5ed98a1a807a98f4e995eab6ae05d8e527f239527aa91b8447b6710df83149456628c5befcfe6c11e2baceb1fcb2fa97dc6e91c90bfccc1b87a4ca5f9439cfc51d8dbedd5ea811d73c5a3661e33706adda820bcbb37c913255a54bd90036424a87a8815231d4e22f30679c5e7a656ac5cb7c695327840d565f721813d0a0c47d2eb8f0f513493254821891736e29859cbe3e80e75cbe499e39bdb9cf9ded02f35e05f0520ffd9595fb92b07a9f0eb8e99ae655cae35eded7e54ccea17dbb324c65cb3309adbd47efec318fda7568c0c7a88a49abfea16b2a63933ccbb90d52a29e35911654c5a629d7e818cac940cde97ef8bd8ca2677381ec6d4d4d0d95a49345192f0b3b833a42bd37a48273d814b4866fc4784a4457044afc0a311dee79c7bf975d603f4427053ee65cfab6c0f0a692d5a4d2e7305bab6392e5c0182448d98fa27bde968b3064fa684fb0b3179f9c127636886978a39d13952e390cf1fc4d1283b623a5223412a0abbbe26d30642ea83a05ee242e446b36e22c51a0a43268bd22080c4866ffae2b53ce005e57630336556d4eb81aec84c80d95923bb7670f5a32546073b8a588c985152ad7d32bee8b01338082d84ea08fb8e1baeb1080106f3d690f3306fc630d0d2aaec31702e577acb6ed590b03a65ef17e08c1544cc1d7b7e6ec0fcc08fb2adc22ad6a0df10d71d9265282d152e873ab3ce9f7adab6a1c9993ae9e0b61ddba8adebcde668461ffbd52cc1a4572bbf2a05e8290544d892bee54c5aa47a95dfab35362a19641f17fea30b79e9bc995951c2bd4e09a3402b1f60402cbb3f843d6e9185b399415ad4918d0d2131168aba83bae244b85585bae8331ae4b11050070e5410ca886643d040645d27986e215ab31477237c00f9ffb19009728504c45c5eb95e74f0e8494093451909b9f9aff35ed9782d89c34f53fa304627e56d3e1dc04e45d80e930f8098771ec34a035c6b6881536eaea8edf1da66886f65465bedd709f1194ab367f5b4fe9fa94e892a97078b3b032d86014efd0efc3d273f9d2c1b907c5ef7ca6821b25e90301bfc68c7117c38abf942fdfe9c38e89fa962d139f5cff4323a745c80a0265c4ab56c62e5aed1d37e5b1000a64a2ae90296d2586e0249d7dd64189b5770fab089ee675f736837dfc2025c11c56b85ed0f600f51a8f61ad6e51592fb185bbe6d5b746d16eda50bd5ce05ac60e7a832bdff2901b7721e851575b8c01b8bcb3037c58fd594be96c256c8b9d21859d730d2ebe8ad630a01b6d33780372a23e2d0e8758d30ce6b0ecbc63f55323dae707d83b31d8bbf53961884babcfad1766d9b139bef0627e42e3f47c58ea5ccbbf348f149af685c30f48708d4244168b76f9583cef8820fe149161b06078eeb7131eb28d38d7e7dbbe381bf84f92f9b713ced70536b018f0ba0241c9ade75955be2913dd85b9523c40be16f8e5ec339de6d88291393f69d93a41cee33d5ed3df5e5b85430288a8712f33f544b1afb96f054fe8b608a76b93712997fae69c439b3e583553f81d569b45183ab15b4c505b3232299c4f88b0c6648d8a8109c00c6484a64b373a653d189481eb88f412e04ab7598629f5d2e872d982aa6009d1d5f41099b80a10dd38a4ebf7b49256d528ef4b63e211baa2f169a33813184e0eb26fbb55b5bba5d2606fc5acf5a696a6ae3c5d7079335e05ea09136d3cf62a3fd68470c01c6a7be4e78237e48d417fd4085a8c443e38fa6f2a9d0a601621f735fc121c52f7b2eca1f0cc3bd53c7f8c956f79e02afbd4f2cee744393308a73e7deec0eb3061c09c53972d4e06dbe680a9efc1a3533dcd281d2d6717d75e89d1c8705861c379007d87f57056c0703ffccfb1b3182c5497c8b797b8ea811c37f0fca3ab9d5d2cbf33fe21c738aabe7e8f7eccca3f26c15c508d591099dc27fb53694fb79c23d9d8a69c305bc9f11e7c4c276cc38c3e6ef2923e755cae496a39eb7beedfb04657ebf9fb7b17ce2d3d2a1b8454fd4cf7e2091655b118fb9ea14d77ef04d7d3e249acdeb4bcac40ad59aa28824b4b5dc407de8d7ea494c6beba8ea67a482ebbd754ee038d521ea4e197e7898e0fa0e9f2b3500310e72bffd206268ce683244912da340d5b7b7c103e31c0e0567f3135a19ba84421f8846fcf163d744bd1a7640a3378c80d2afd67ab5018a2a39ce874cdfaf4e3a9f937d919d51acdf1f73ed55dc759cc834dc5378249fcc429b10258a4ca9d5de13c311484ce35fd4a87208512c124b90fc402de6176ee29fb82a4d5e07deb15beec7ee6adf061b996129555c6270c95db6ac1174b400a54713e44828967010702f5cb9948495e947603ba052e4adb0c4f94c7d0970cdcd204a39c560f4825c5e394ad9173dd818bd89373c85c58822a4cef817f6f6874a392acfbf264aa854c037433681d2e6e8931d4363b519626c6a6c37ab699fcf63bbc93918cf9201dbf3b80b10e8473692d711fce3527104b26e40e798876615d0e838e9f9c711f3e9d2e578d0717d84adfd6ab8c360a79100f39ba3cd108bb80d2d91544752aba109c0c3353cf77a62eb1bc96e49962926db149ad0668bb9ec57b1582d7bd00826f374c2523fce6f938fb697e314079eb871bdea8ccd4d9b0d33a4fd1cd074c2f2501df7c5d0bc9e3ae83eea7f05a5cc20126c2cf85ffd78c881edc069880e16b0f7ae050a780750e513e541a9f0d11f7f5baa1b7765063e9db83fe96f9f095bd88eed1f68ef9f29131249cfa7c72408cc6b3a2c5acecb304bc7698e98dca8d1723be4cb00dac823ee5ed32c327ba8fb44808354e2664f079978333c9c1f6139d202066a4f3a06839968cee2306509d6b7b2563992f3b5c360c73daa27e99b6aa8105b059dee7111b7b50b609a286a8533d4ac8cc57d895eb5b18fd5dc799bb35f96df590e51a2881bf531860eb63cd44b14e2af64be94363e574d15e4914626c60621e55e55cfd10dc5c02388b89433fe236ed30abe3cf9c85445db4b0f93a5a8e6386ba7620bad9b3235bb226f7a1c810751ae4e30991b313d214486f35d027cfb6e4851e509b9c3482c6e77901f308edb24ed3873ab89dcef5ade170b73e6011a26ad1ef33f1069651f533a980def91d086831aa2de3f7a9962c72b4a9a859d264aa27f6ef35981e32aed577d7f0117b9583475778d74a91ec487f700ae0a6a16dc7e0e0f3ece40b3040fa7012fd5b71702838adbc2bba078601e99ff88e2965acf08389ea74f95e562d975e724cbe2c7686632f9939b32c26e766b11d3ddc554a933631ea6171e749c8875a5bc5527956505cdcfcfb137e9ea60891b3698740284d7e210da4aa8723571e10024c3c8b1646abe112b5034c5d0c12a7c110a5f71c1c0690314461772d1722f47d1499a7257ca06fc924957dfe9b83fac85c500547ab546415ab9b591c83260db2f7b9c279d2b94b62af7cc3acfb165d45faed3fc68772dd2a6c2ffc3f5f8ac4117f1df32393063abeb0a0ed8e1be883a73fe75b6de40c3b09464250b0fc1bf2341c2dbd14fb9a7a4ae91593478a55e3824ec1c6477462e91f01cb3584d025ac00c4bd106d7df07fd65effde0678904e0cfc7a693e98710b2995122eaafe0cb896d456a51d39d1380c9c454552ebea067692b07432c98e792f4df48d20a1d0c97423eb78f1103c811f290e2d9307deade1571c4687ba05a78ade6bc11f765945bdd373ef1eb3a8ed9234909d362aba66de675b5b7649f93ce06cdf70aed9b2295240e8b548412e7db45d05d68522501350ef5c74ef2f802dc5cf32743407634018202d404d930de629b505ba5f140dd7f584eb68d8988c40f0ccab97b6aed8ab466913080dc08e30b42ecb4acd5c992fe2500dde9e72562958aa3bda248d02fac7f97077ea2295db2d9e93b174cef9dc9eecb343b259b6214eff54bfb446f6849c8838009aa062bbbd5732bf089dbf5a33920ef823c64b73ed140734975dfd934f2878fb846f4a0f95c93f010d47e5b00af7680897d5237435eb4fc625b0250a0fe76171e17bbeadd1ae6922c5d844429ea9fcd52003f60725edd21493b643cb461daf8351829aef6643bab00a83564d637264a064e26a2dc6d69946572e75ec265096bec3e5bdf5cdcc238c16a2312b3d172d720b01ddcb55a41e762307aa7f67ca8feb9259aafdda5aab6b74467a783ec28d4c759721cd691edd2cf267c7ecf53224bc47e9627f62bdb346a61bd1d57ab7536148f03f15d74f9cec0a7488801a554edce2c94d8de931f5d85b40c00ee586d3894a15861d84c0c9338030d49f2582ce5d264834fbff02b5b73003b15e77f17399b5d91494d9bd013daf3bc71b8cdfdd97fdb0a17ae472075f52f5318f5bf5ea65dedfe13f83bb8bda7bd9c40c8fac4ea34ef6e4dd2f97bbdcccd1b9c9c806e7b821b8b8aec74615cddbbb3618498476b6c50ec181fda3380f0848d3b952c00957fd6abf8f7257085e09489be5b26461785b8e7e9add39610e152195529086ea2ec09a4bea4e4ddc76d844f9b745279f21301e80748f86ecafd8c8dc7de8d51540a93793a753cfe0b0f3d0944369fe0337b18a442ee34a119e9dab0d62ead27635e6616c1f67ffdfd542f4f4e5e5467aa84fc58a6710d8c868efbbd1f7124a4f5ff4396c7012dfbc92d06fb925648dbaa23376a9618a5c6675e8b3c183bf01597eecfe548889f15fd9252dab6924e7678b79ca9a0c570b0c9484468576f6f1ea43ce6e90d9d45004d7831b8c6f00f4c5add971956c336deb039c6f5061d2d5e7a6b74be0774844ef4091aca15b61965e6fd996619922d0a083cb6cacb50061ceee21d44bb1b57af96b4509e5a3d20245d01ca6941e1f4956df041b9d6ca93ad9399ba78ac3f76455b237bca4e6d93e1187cf1ac298cf5e12e644cb4870ee347dcc45c4370b5d1107501959ee069b9454f6a9cd17d03e0db62036b66f8247253aeaa072822933d2a9a49a40ff3399128d47f51f345b3e54ed94223b661f5cb6acbcb50a9f6ef453ae2f6c42736d40120b6735c69ef206fa6b433f0efd8873ac28818c169b589e0901ec73123272ba5e4de09a34f651370211775e5f90e6b4fac1c635efcc0d74860e7fc6f754babd6bb205eb461a360441e304a2d85747b8596ae9308fbbe6c12e49105c8777b0a922393f651e6d338b299303d54ea2d363bdccee3a1b1dedf610dda550ff453820c6979b4eaa606f1ca34473d5f9afa4a4d2961695f78c0e87e54df130c0afec07dd2565bb80373ca9ffa202512cbe98d7aaa5ed2cc2523e9992f6f25cd78d87371ca4876f56714b83c3db3fe13113efbe1620879091c2bc674867f5eac3c62b804b8244e50f3095d4ab6ae7d6455fcb4d963bb85c1273c896e8263ebdf929e054dd2b8069fbda04fa1a60f0240facd4bc82ab783940812ecd315811dd29e5efb328b75e1c276929983477951d20da87b565d1491afd6dc01a324b6c1b48f65fee2f2be375e5dfd4df1f23be0e3de6a1502ca1898eaff3b5a0f29f8213cb129708cb76dfd2191971d1e4c115ca55a2adf491b07b63b151ec74c87ae6a698c062a23c83c2fe49f6fb1bbcae1ba9c0d80bc4f180db3bad991c53468957b2cb7339ce2b435b5a757ebe107ea3e6cabafe144bd7d0cb366e575268fa2f6c8329edcff17d5bd6490300aa6b1767afb3a39e841eac127e0d81988664212c956fc4e913190333900fb71d253f66062a3d3c01c824afb29b6ada092cdb993df9304a43e4923e8f25600299699076949c1e8c1fec6ab1dbd8574b073ee2e47b5a87b6130fd0cab8bf11613574668f13a93ee6c70a02eca980699c0834f33ec53bdd97197a0207763e719b0f146d88322f18050c7bc3b2b1775ebda75c391ea06daabca0018b67398f23ee7e013daa306ee804dcaaedcec70bff55a413a79908118882b650cf13261e323b660e796f6fba63110d74fe67bf6ef368cdda3e8d3468bf9685ed75451cb6900feabf2a0d1946deae75ce033e2cf444b8b6ef1b0fed7d988daf6602da2b7f3ea51e0c7a7588f169cab61d3a04fc59cb3655d1d7a232fc3372fae2245a006c11ce35eddc5e9b585dc0e74a26fe09d4d567ec8d2c38c165b255f6a5569e3ddb5edea106db4308a4f38e16a3e06c92a9b53e233e016308ba25f9ff3975d05725c1d763079fa4700c4f2e11b4e6e1db287fa6e9ecfc9b5ff6dd44c2214b80c1c6588a460ecce65e7ffe6bab86d68b8b226d08da20e609567578ebf2dbbaa9261af64f715d705b89aa446f75263bf51ad5cba4558c4a251096d80bb361cb53fc1170830c9e3311ba1334e398f0b147939cf58474de2effa093fbb44fcf63687e11399263f5a01bfb4e88b8d6b56bbe84656d4046830ee3128fb743a05d2983ddeac18e15b27b30051ead2172430dec80f5d917c0a3209eaa543298a5cae60eb3dbc152d30ac7335c04edba0f80037525931adfe545124df76ef3b1adf4f6039411c95a3f9d0e386b67067420c510bf0eab479e695ac052876d460541ad5730dd4ef163c31283bc41ec1a091734f25a594b15ca8b3b72173119f1054bd851e870b159e26ea86fb991c560e5fceda799ffe45f52f1ced37cdea954f0afe5ed203b8056778b61a29a79a23e413ffdda542b92e3ad218055ab9dd60e3622bf36c93577819402118b29a4c84df3d4d66768102e9091a90b6c5b66038ad849e5015fe02ca7b97cc2d6298d48b84da17c3eb859fc99b32aeaa08f474cd548540547736498c45a437bcdff42c8766430ed61b52f365201de7eca0c8edba05133e8f831c66755de4349bd386bf72c216a71a6ff319de2c61b1e3c0b0bacd5b4cf3da6c13f252e51c6dc334bc8e448e76baedb101151d454cabec94ee5f563d9f6ecca314aafef206f95d6a00230383836be883fa4ad1c7ff74ba5ff7ab5fbf423bf23cd7ff824fb95b023697cf4dbca2901214bdab3c892adcf84247135d3c5b87ddef983a362b47f01835ab44956f876a0fcd202ce8f220a65b37131f553b622f54af930c0b4c26ff0178eb0e6783731637ce063b6df976786a4f01ec7fdcb6ce94f9be85624bdaa879362ef70c5a835b97d9b20417b187c95a8e773894e66c02b86141342f241b3c23a2c113362b3e17313abd69df3f4e1ec5737845ef3613d4bd9f38690dfe75340da224f56ea926258b5aef6f8e0bfd31f890a846dee46ba0e6840d587888528f692e54b5ac79d52eb337dc1b835bccb83647e20fbcf2dd44741bc57040e221c8705f2eef40689a1949cd004820c52108c6b1eb0200eb6cdc28f8ffe316f2a6ce84f50b7cf9c5df9ffcc6755abfbe8fb099d425d831e5542369320029f328c7c3f966e09dc0b5a8b654b0876fd847987530c5be285f327eb05a59dbb4415a15cdf0db5aab639ef15a8e137d47e346b14fcf764f065d734f61616380ef7e0bb7c97bbb72638cd5f6fda0bb555b2a1b243a72f9e5f94cf1361eea8ee6a0b97fd22d1ea3a4bebb117ab9e59149647a0eeb8ad283fd8d4bd3def01915a01655a52fb70b73db49d54f7d6aebb313c1e5ddf03554f6a4b86b40d4e773541e6f525d9f4c2ddc7e63ddf24578633faeed5e664f647c2bc81f37bf6d3a7e3e05aba9109ae53700c16e7e7dd298338da026886d128943603cd57cfed20943c44a7693ca3724bf0f454f3e03a11f0f9cc65cd53b67f66539e66f756f7025fc819d455b928c15ffcf488d205ef55b51075abfba4384147d4652809033c8031ce5d703c7bf27a0d2c58ad22f15a5b1ef4ca5952c4fff680990c04e929bbe1d16cecc274422265b521403d5bd9136a22cea454924c1a1123c47bf0042652287c2b5a509df74577c68f78f18aaf529c38ae09a496b245fa02626b5c67b74aa556c4a03266bc79662f1a5b76b9cb506512aebbec17542f11165ef0dd83f29e331e95eb80bfe22325c598045d8f39be8ca650983c26000eae7860b6af3cb513da21268d78596ece218399e9bf36bbb2ffadf405e0109030e6d6b1ea95ff91a19cb56a8530042e2b3c678a15874dafdf2d287cc54b542c54695ec7c70ac45d0ba2baac647b40fb8964ee5ce1745e66650b2246824b5770460b78734c75dbcffb74544f463f947d2109f23b9a9b924d2d2653bd1095bf25a223fe5dcf442691cd535294c6b047752116695cab851dfc8bea45b207a04a16577c3fe9c5751fa09e0bd0b9351f9254deaaa25299ee86e03a3ea8847f1967f773c76f9eba64b57989520b03e67de2743ddef71cb327885bb7d430e7c0abce09acc41b9ff8b8e55e7dda548aea47b6b292592d15e1a8d00c57581f6190722e4d7fb7cd4d7eb5e21ba8c34c2a110777ced287ddbcf9786ba278f1d602649f4734ed0bb64981547c0c40b9f88bbc7b9951645867e2557c15efe7d7a3cb9894b66ff96b49b40c95427f1d5bb93fbb444aa3b1f00030b9fe4f6169a2c44433dc3f40ce255df88259ec0a7d220669c0b2bfb7cdd2f96377b8a5342a6ef3571dea6c6871985cb0876d18f48f72afa4b11d29df3f9cce25c1b7df898caa8c10303f18c8a5db1fb2b0c7f3ce66d55ef285125b6bd0edeb353690c333d04f30ffc0312f89eaae909caf053af1ef54d8f0c54fc429f26363a7f945b911a89ea1b187f096c73fe68f6bbcaa6a448f09295618c902dce944b00891e248a200002f8e50e323c18a8b7602bd8b784262e5ad86b1c7b67262c0c8ebfda06de166a9dcb58fad3344ee1b6d5407abbf19d7ca86f789b2dc75e7ae22b3e351e1cbd60f4774c2c750e5ad7c23e25cf886f6bbd60ee8fefd894e7f5e4c5bf7c1ddb3ce95e67c333dcb7af5a2a1fff2a6e9723175e05cce25120b2f90e0b01663624c61906b3c4eb15bf384841a2899137327f216da2c7216cba6dfec7a076ddf671358394da0cd46658fb94f670d74c03acf77eee61f5b83088b3206eabd9f5b01218a8892bf0755d4836b3e7e84422b39d69cbdc5beee29989b71330fb0222e39e3f7295cdb3f8edc6c981d4e7f84acc25a2cb9b41b3c6e5bc6ef827e5fa26fd23d41ed97f2867d11797774fe4f53f5d3cd21ea527716fbabe8fc4e35b0ca3f91f8a14648630d3f29fdf6662280bc04d842353eeb006526e8c56b32f535b848394cd5fe55f65fb95b74c09cb87b2b7771943ddbbe84044afc6355aea54b235e23065c55cc86df8ae1014dd1b0e7703b610e2cf585ee74e858952adb8dfeece8e75b86b713919d0d774a7f02e76e3db5c6b52fab81e459d681ffd7cb51d59f7cb3074f038dd25b3884415870efbe00cea0cb21236f7ad02d20d12c8a3198c6b8bcd1038d3da585f9e9a467e9591dd761a625c6deffc9d5ad8e01480738e3a191a2e6a6d3512fb865375edf7f49a4fb7473700b9c040e3a048ad06846f937405cc82675d7e1d102063d7b7564d326233635aa7a291e06433b9271d80086db3767e9d44cfb2c649ad5d86d6722e28365c7c6712072e1c87d6fa0b459b14b463881eaf5bb948e5b7339d0c6ecca354798ac6a1078c7740ba07c2149fbcdfba7b47e753675cbf7c1fd6fd7396530939ec8f93ad8d2eb6ec0389f23152d13821d142646ad2a4cb4398aac05bfe95a2a401a3f47dbb749fee7a33602e1a6859d22a71b521713dc99952483159e212bb06bfe7b698ee0bf2816c71caeab9c63df303b1839eef37e8b9c2172a53146a31527dce805798d76339ac20d9cf5fb954faa9100aaad1136ffd46066c61e7ebcebcafaaea95338c92a3e3d9be4bc6418225f80d4fef900ae9ee5f75d33bdbb7b8e02be0d94bdd328d91d741ed005c04259be1e2a91c414257336ed151bf2235988d46d50f0856292078e56fb7ce2ed1e9246c5fbe70ba73fb0f84637e1ff3238f3635e6f5c59b6f8b7c0d59bce14fbb13e57c9bccdc5a3dd421a1c9e3d828da3422c9b72b5a458a31a1db0c640c9637ef9f66ff11acb33288c256b7ce92fc63285a72cc99e4f3afb32537e0cc98f249f742bad1b3a93be9da75ba17516eb0c613f9a9724ae5a282514863006a7115b56c506772e8d3337f842f9701a95b11424853d7f9c382cfeb5633d221e8847d5b3497421fd3582e51eaba5aff7ffe22a4079e4a1bd200948c24371504af5b3c83d2e5124c5b55c2fe973ef211d07f7b0df0d16391920444284714a38969a5419e7fc7e0a0105375de03fc57e3712aec62bd5d2f815c063955f07a153cabc1083111cb1ff7ed2e1cf219d633a1cbb6223b763b5eeb1a7436f2806fbf737b8446d10cf51369eebb523cd995445cdda35917ea593457db383f6668402504e639d322f85845126852ac679e986d10710b9bd1f1d8f5aed2e5c12e5079da8aa30fbb862e460d501ab26697e2c3db261b7b6370372ea796f4a9e852dd0260e8c663422514fd93bafda626d853cf5de1a25f79b1095c4c28385d936d4a1714a5546e357b91b60c6875eb7c232d2133479a00d199322046330e7cb76aed4ec16bdf35d57ea000c94a220c021a4e61412dabf429463d603048439628cb71fad38f6166351dda4ba06f5fe76578d509f15511ffececd7083a73add25b229cc0a1bcbbebc9f6fd4e9d9bd45b16d13460d1ceea4ca4dd1129c0fa42bb62aa0b4cbe7b358e1fe6321f392f25753484904c5a29c3a98e3e469280fe22a1eff740afdac6c5d8acbae26698b5adcac7b0c9a350161899ad2dc18f5bcaf708029e13db6f894d3ca4737bd6ce1fcd78dfd55123821e1689ec9de240e03e700f7d3c6dbb7b57c02370dcb31fb5945e04c913564ff43215b2ba3b19f4196a99a747387fb832936a7b44b64acab23fec65c36f32949994fce2e9f5ecff46bcca3ac44d64b0996df56aa0a27f3a807ca64f0c111c2c62f37dd6156cb065bd8a44fe74476ec7bbe6d2ba4c6603c17d7bcfffb54af13cfd55ae48c5c2c6af799f4d9b418513e2625053215200feb9c329cdc51319e31d1d15937a452fd767dc6c71aa6b81e2b25f6fd375ccd1e2a397cf019ca305e2a0a6c4450de84cb6179ac4bf4597cb6d1f7f483c6a74d5616dbd2f8746af1a1d2e046d634f76229c6a8e673c99c3b27501fa873f2f301ccdb40be3f844037d7f6adee2ea9ce0aae62c4ce463f5f74215837f19fa64946b1ce47a7ccbf6e4b926e61de2be472e77391bd72f5f847b81bfb3466ba54516403a9e9449dcacb10a6a17355e387939f6001f6e877f1ebed0a0a959970e2c650057269a3fa7351772e07907f04ac986c4c299b0c1338cce921649aa03a042fe3622a5eb0b93527acb96a890ff1135ac24b30718c7bb93deb6cb79e674f84fa17df976b161c6a632e7086f3b6eef86fbc70bee215bed83bc8efe3e0d7d68e24c8308a161fa79b956c53cd5976628ac55bb48da239591fcf2fd764ae5d5308f17ed31687090e48b3321d0b65f62820ca185e15c3d899921550cfa8a54ffd7c9dd2d9f99d9fcaf3e7f78373c66c42c010ac8a891c59f0186206018a7e8462e71628d1e734440464473704677519cf6d37fb297f33c664e79f39f62579282f9db5cb967aef2d786e23c57ef7df7c304677a92b472478b658e35fb5a0d1ca90c8bf5ddae2f5d11d6f4057b6a4dbb9586e022c350a7135391b84e7275a4ca82343ebd5012729a575d0f6e983dffaba3a05d20e04a2bd447845a365fb6225a38b0b74f775646f7683d7fff049274d04b16cdf9ecfe60b177f9433b91463a05da5576330e902d34827d2b27832af2f9ce36bc7c99840aa23f3b0da0d0dd09e063518b85efd5df6fe34cd629da71461bc08e29c1a486d772b518a2a84f772b9c38ec3a2564e9843ec0d2aa775a084ec878507733a1ad35ec182f668c841a6c0ad0c97c6221db9620d94d3ce326bd09696d8d5c5ac835a9d73854349eeaf7f20b9cbed83beb499650f898a03ee2286c14583b3cbe40e88c6ef8ae324519832f6ffdcf5d73eac686d77bd0254c23cd78008a9ac9a31d09a501d7316edc7b7aeebb311abb5ce988cdb51f29e0b3b0e9311d4339e11155bee2ea9cd9f9737f28269dc2b75367b153b1844d24ddcdbf5c1616431000914ab1b2dd5484859fed76de6e5c56f02e1504a6fedaf640b03ef84e8a0707a7adb0a3b8a433cc21505deccf4f672272d0b8c695189688d83a8dd2b02a17935e278c166d5886310b6e8c9d376967cede596d0a12d258c9cb1c847772e3ff25a91e6f3d0adf913539b0e8dcd8a48792917f2c4af544f2e7b5456ce3305370b6e695429c78a948736960cd6d2a87636caed13d18ef2324f902115e001cd210a04782f683fb63be6ccc843c7de958e3696fe199f696f2875da6731e5e5f4921179697d273c1d113f4e4b54923c472e6da3b5bd0b1090e4145396287d6e6e1e71103f5709f820ce986bde1cab2709b23a5dfff3f13ac7562a8f319bd28ab7f50e6168adbc7715b033946ace73230e98fba4effd5b7fdf33ae923fc2e2c05c28305ce071e03ac31a947eb304daf337f1df7b84648fc3b74b79604938a93678dda1b6f4131f1b22d707ce50c1ba1c291f5a448191745b5f123804ad00c74bbc072b7f05f7b71469d9dff4319875736ff313f75487c219ea0e48520700b2b008a789d819ad76417c936bf9df19bd3055e4a40c40df4199b34537f163c138b24416516f05886f708c5a6692daf917ca5f4bca8d895093e5cbb6304d6acdb5c577e4b7cb78c92c4ba5873999ece5df0e006679bc59a9984cc04692a29c14f0d85c9703b215924cea300fda6a203e6d4a401fc7a6a3543eb49fe5279a343c54dd1f272207eed39d5eab630589282e171ff6d7c86db3100652676deba1a81ec7250049fd9e8a881d5dc23e3ffc9f9a4b1d50ca6dd15ee66d2a5c38536b3aea2bba49ea7f933b6df92e2a15136677424f13acd8afe7e741173514b888a23fb83116a17bfd1865f31785a66b57dde15c923880be9f12c0063932abdd86b00ee36e707456fd7d34b7f1673b4835a15e572bd628191284b48fe3c5d85de654f1cfef920ab88e03383340f4dbb30204ef6c96394da4d4918b538d857c108e37a20d2a507178f6217921136a5c8a37c50d064c6b299db39f98b9cc3d033d5b791e1d1bb57bcf595690575212d47d6dec904173ec281ca620d6cb237f1959de96c2f7cd37b5edcc48244013951e72b7904c08bbff79d3a0009f21d6f7451bab29a7a8bc95624e06d51167d33214aa09b8db75a9eee0034998db8ef7e39d7b52b4837b2c6c83d98146479b46ff3fb5e2c71824cc1759d5b570320389920051b7cc135ad6587f01b44fd3434079f5419fa6d02d634bc4ed30440842026925d7e3e0765a1185c8560654c94f0db6071a1a722f94c0c620145c866a4ebe460029c656f673391d25db0813720d84bcb7335769c8f55962d0550dfff5b82927945527413976cd7daaa224eb2feb4ed00e1b209b2ed46dfe2b462524de14da66aa93258469e9dc57774f139b64b2c8c6e5afe7616a1734c7a3d58d323dec4c80791df7b0fb8daf161ea736ce3cffc4c25c2392f36daf0ffbb7b446d8dc8d427f56c32c7ca2f42399e2cad51a23b1fc516799f6a0153c65c074cff4acd8d57c6b671f8a8fc742848f502f1633ef9ddcde5df789c91c19fa27ba9375d9b0bb4fe5da4d3e4948a0355937337a352462268b15da9912b4963e63d2de3bc5993f13dc6785eb99910abc10078485b3f86fce1b262e06ce3c155b251c64339c83bad3fe76270f698ce9fbb1fb4da8dd76127481bcd56ab5c75160d728c331114b3e30584906772b594ba50718c43961933bcb0b8bb6888bc076cf6de6dd30e4a64e6462ba984e013a28b03b43b5a56a93bd09cc912e2de236e1478fcf5fe7e2c3a5ecb1ef7568e4de3ec4c2418495773f82ce6e9cbeff52692a3d65f9a8efd59fc85edf38fdf811c5620f4f05a528f806a5d7876e87aec7c09391af3fa9eed270e4374fa4f240dc4b086c11058c68596c961bfc7673ff2c734d9404c2d1554cebe8bf0f379e455bbd2420001e33a67060bcb56815699366e70577789b926c58ed8964ae17b9963025bccd0b516ae5743f8e5dd2af3ba8ff7228b3d518c97b952c64623ec0b8ece37680a04f3fd3fd32ffe98d056ac3498b080f56a30c4f7f2c049eb9de96f721e097701395b4591099f08f205dc9c3646dee5593b0879ee558971ce8d9fbde07d931d19b1dd656cfa1c84ccc035998cef92d771c29aad8dac50c49bd90e2ecd2315a0e1cfa8776df09d50e1521300af88627d19deaa31cc7233c6f39d75083ab58f884e3cd669b56d6a40168edfc70e4c4365e9edfc13ea9324604d562f6fc963ffcb025df2ebe3221c73d44442dc529f48f4f35aa279d300f1f57893cf637c240237678f00e5aef0d466c27f3d442e6740fe58ef799aa530d92a62e570bf6d5f3014c8a5e233560200c3b275e9946b3eb9ef9f1312dd923b6cedfc789b16f66a4f35fd5de6e718103a47e49334731c8b470f9da962ed519ef7748091d2f3ccdb64437e96ea1feddecdea9853bdc45f1420104ccc88dffd53ce51debf0200bf4862dee29576b02bb965b05524ac310c45aa871da713eae8840bdb5094b1747ec1f217a253dbba60fbb171aab86f740ef1180153b8ef21fd4ff767a0fca6304158d37621eac6ac1cb1d5715cf97ccbf80ac3fa92d215f3cc5aa3dc545a2d1816d90c32c526151ec335ac06c7345faa4a8e61915328bf6ab1ce72694030ea45420aebd727c0d6a316720865be7e47340d5ecf95dcdb3b91bc360cede2d4c4903d4ffca8976e22017b4164d762dc3ba8ed9816bf9cebec5f3b718c07cc80a8a87f375787ad72ff235b950f81fac0a06bf317aa334a58253ac1ba6d4a922f447cfde91b28b6c3a6fa9009b0e08f4688a897233e22db4f3e639a0fb0978d7b981b3320c4d48d1cce4ab0d56a428766739c717b92b2bb60743f2d572943a7d08b83e6797f3857ec3f23ef26657f6b8c763d5e2861a58bc905f51a43387c9f28866bfd9cf8e9a500e023f93ab0dd4adbd22e9b590db5a8a462bbdb804da4485e9ec5cfacc23b14718833ec0e5adb668e91aed65ee6e4a7e35320724172a60efb81c99ce6a798f3d9cc1f52b4f2f97b36802053369ce82728c5708e6fbf6b8c5328a0fca4faacbf92a2714c7809958292d3a30f7a516e8337095bc8ba284aff249cdb90962cca852194ef2edec403d5d5080f4ea44543fbb498462d46e79d645c57228e693706c1715d6e8398ca9fe6a760925b15c07a3d375611ce360cf2d03780c9e9a93c93de9fce19621343fb0331ae326730180bbe3ae59bd0e2419c0c5d9dc3fde333f4b9ce2ee5692979415a58d6db3606a275c7668920099054dacfe16a20afd016dae58ab0fe8af30adfa113f5850a024e5a326bb2e5ad007cc154619a396fdf30d34922710677c7c483623ca24a11d1fab7e6ed169db454c3abb394d965f8fd9324549e55fc5437d9be4107fee071d8de29aef71c7a4f312eaac1f18e906bb1f6a40f305ae96a05cb9c3722442402412b473fc436265c50340a256929d5958e4dbed9921330181ebaf4963167457381b84e674e07a885009b9b4c6c570a5c63dbe2e679c24b0fc923c2fbe679d64cad55d8ef565701b1b5fdb440344e60288d0c5701a0837607e29340d5277aa087de38e6ad2defdad9cf69fa4938300c1903671692c67041842bfc6e283d3b5a908d755b225d943b9f365187e46e2e1d0344a1de3bb3b0e5f370bc9afed504ee2f2e5087c364f8568e1492558d6c9d6f1a58019509643f6da1479a7f5dec53aa36d48e6c095203c46121334cc6d166b489476b18af40c9be03c1e1d4cecb1389d8dfeb3b35feaeddf5e8edb61bce8cae7a1fabfc49ecb8762ec4d5472a3ee13b48ea2d434ea7104569c24c66eee3f531cea2ebb5e9d397dd4bdb9ce1b163d429a00bfd3287db6e0df0dc149585991442d12f92877b966cf13666f451c444ea862391bde3358850aec3ee45506ee9cebd73cd97acac19e3d611398d923364dca873248466b0307ec621b1ebbf9970de0645e5100f3cb4a3ccc25e6f9d7496d5a7cc336efc599fbb4ecab6ec2d06f1c50822fa8ae92df957447ac3eef8abd59828dcca68171c3e6594b707a1d8dea739282d50dd64e89c811ccc792c176b4eb1415f8240cdb34e5fde1eef613b9d2fc039dd1563d1bb2b2dd7fbec5556457e7cbef9a53ce01317a5030d9fceb8826bab3505fc13c71435895ade2bd93034991fac17d026a804123f94fc911111667d053974e64aa2d20081d06548ebfcbc4f77a0ee6badaee32d57f3dc572f1c180b2fa7076801357defd9c5624ac8b9baf4402d977599238a54ad1ce268969ac70f904622f748935ac367c6d0ea7d90a5b1bca03f231c7c9460c52340f0402bdae42b9c2fd41f70da434fe6a8e9d5caaa91fdc7cfe682be3ab6d96c26ae2fecc526cb74622c2ab20c025d0b67f3472f1b4d2aee27b568e33c063df9696073a03432809e666d077c2ce74abe0702a9f3dbc0af4859afc298f6ad262615ab730c019dac630f15e28ec1fb134fe6b1003e9d03e531b332729ae864bdc4544cc018155cca19b622866098f6cea2ffc0e3fc1bc17e879b91435e424652bd7b4ca428f9add8605729cfe09210b80dfdcb59bd53577be7f9f50110d1c365c74532f418248d91797069ef6f42eccfe652572ca5990b78fc231a8f554f06bbf25d9e3754a4f513fce3f1577f08a675bb8494da14c6575d1ae64dabe078eeea87f962920fa5660a8a9cdae604aab25439f615b3668cf6aedba8ad15ea11dec790f79724c6fd75e1e3a64a2442eb15a60a8effffdff2e45ccf25acc53531cba77c569f5c59cb9425984bca30774e9c135826c333591f2d824b6eae0b385e6848606dad91985d23bbc8e5da9e976be5db2207ccd6106795af2523fa793f98db77824cbff1ff50834fb63455c75a32e7419eb446d5a5d279278ebbd1681198fdf52d6aa405326d32f60b307a8d3bede17eefb06e8e5945381a0b2a82f381192ce2071bad370c09a4cd9e4508a8ef61938468c8ef0ad0ac6c7c5a263f2063d6a4895da574063e6e26a9f4f97c086bfa24746e485ea16c1afb369496b22bff9d996564324be43cb9309a52711c4825f017cea0b02a6394ba9ace1098ed59a61f405f2ce8b978c943588f01a96c8dfee636d01354511cf5a814b61c735dc73a226d724e8463156185b755aba62f96d650fcb9247880a8f59d3eae01681cc7d9e0bb2e71d9ab5b9627f2cad98b9bf631e730180ad69702ec545ec23183dca4638681849c59cb4c50cce257d26d2cd3726a34fd6425ec499fd558ce134229fe41029c0a762aafd9889640c19ea3349d04cc894e30bf3229284bf5dd0a9c7bd42be38579a24f478c921362c569170c34b0616b7209ea8fbee3aab600149c20b52a096e35769ae3e14797d00166aa8cb3760ffc15aaa58f8b1e11153cf4507e57cfb4adcb34407968b0db6cee3869bd22dea987dc61045aae85264048d1dc261a4e569320ba24b065f7618d5c94aee4c8aa2a67e7481c5ba1d49fea84df8c9e9b8b0613cb3efea9e163d4b2b1287ddfdfc0e5f5b0cd0f8a9a4c994eba8008e635e01fafff8cafc5127a7806caabd4a84860169ee2a10c35c7aa622b7365ab05b3e052025a51fd4260496b396f40c1d6f20d1eed85033b67bc9231916e6ca5f3a87ac080c04769fe17a19eae4ec4a7e029d3bd17283dec4e30fa66ba792756c3b0495821be2b9e59018dd0342ed8fd93d503010ff4853b6342dc20a5c0a1e274dd2093832bc2d666df6c383de7267739120d502771ded7928850cb86a64686ec32dc9483747622aa1dabffdaa3ff0be21478d584b0fec97a8af87f28bab26d45ea8214527db1e0424091929457dff09c65587efeb9429adf6f78c6f8a550748689c4a8702386b245b0b800141a16fe18713ae339ba12c1a26276ae6f532ee7514abdbc1a78f6faf667f30a47d24da0e9894dc71ce5fb189f472905ffa4cc947b8a0d99ac108592daaddb90e7224334aab5654fc1e32fbe1debbac3a683bd14cc6ee2c5264ca01b102797bb7b383fad2f67798497b7cf361d29b2de9ca38d5451c22b90b660fad4377d6cb97442dc9938e307cb0426abd6342cfaeb96349c3304de2f81f7128c13de09ed671e5a37c6387ecfd6722c0a9b622cde087aa83aa74017c49474e9067b0488b39441303c6a4f5654c14061e33deb50fdf60adeae0252e2e5aef9dd1a5cd994b52577ce8daaa18dcd60f8c2e7f019a001323879bcf93de6c30e0bfd9ff1fd2b8ef33ec0ef9a26db306b0dc9f01e5043206f139a24f18785bc603ca021d07155bfed8e336ecff850f52d85e0a2d09a8bf8e60593930c834b7d28c8467d7fff76cc167ed943b1e18a075771e7394b4b8aa5dab41a42294cdf9ccea418975f211100222605fe8339cc2196f3f52dc686ebc08abfba4e225c0660e05a6c90eb2db7ddb6a13f1acf59ed0188a20d4084117c9ccce2523e74926de48a906fefc8cfcd3ebe7438868bf0cce758ef2affc8ed386d0f07d94b3c5848120d46c4220d212ad51d6b61b0a73ba49860c5659ee9be85f911321486f90a1bea5dde4a08490ac836507e28cda559010950055fe960eaeb4d0bae710d0230f9b2eb9e4bf514760a6881fbbcd64316a27d031950ffabbe021171dc4bcebac3418278911e11345bf9ea6b3b53568a3ca2e8221bd9f1167b35afc37f79513abf88d4e2841bcb83c5066c490f1d8e0eeb771aa67a00d41e981bd2da24481699a73220376fd3aaee6c8ad231a386ca0db0fe2f9f96169eb7d4e64a2cc38a595749f0bfd7a163f3d7b0b4a74bf16b612d5715fc7e04cab8dad36b75c74c756416465c68675bfaa41a54c23a8009e4876c1b90dadc9b0b936827062a7f9db7c762ead0157374e948bfddf4427a97143d4e42ddacf5ced18e03fa3f30e1dea7b10dae2f142557df4201d456403ae9699fe9f8d15a839262185f2e9d40be39dc1ddd14a51fa135cc1c4c7c36e8438378d3ce19261bdfacbee672c6e73d34a0f749975094b8b05952823f1e59e8220a0caf6b3b5a57533f79008ba7ea3f72d676c4649959e6e0e73dbdab99ee07a24add36bcda8c3c431c346770e9e0cd62c6f051f27dbe3085d95a36ec8bfbb3e88e49320901be6b1a3602068fbad031e09900ff79d0bc3cc7c356afe34f2740416e3377b9048748b581924897cf3f62506ffe2416a31be48d9f46d558a28416d15bae8b78a477c33a3dfece20f9b67468a5a5601ce01db2b073a905b59978bab7d7c13d1e4c717c024edafc93d750c1c4ce117684d69680f645891b0727d6e727ecfa3e6564fffba131f80eff7b09dff68fa9a6091c95d68d32cb4e5745b516ef5b6015ccfc894a5954017cf590070092a8dcbd76ea4df9364f41b0dcf2bee385d39d1436e44febe532e39a794b66f9dbaeda8d1923e72e1aa01061a14e6ee37b376e662ffdc6dea93d7165fe88a1bb72034bc10153d269f526511e3bb839bf3fecd592cf7aa82957ad24685c52aad21e97e87d9fc333ae4cd43088b36c9c3b76e7e3b9c28c1ef7b4dc4122da15c15397834b73d9e4566a281f4931eb5ab9cb21c5ce2405d8b6867883cebe2145d47850734480c977a135d3f9098f67d472d68b8e2ecb7c6ff5d2b83c00090cb0cfc7dc46164551db805e3109a91b57856ca40f3b71dc1020df329431f29b05a0fffc153e072103033bf497fad32e1479bb8f9c5845e17d2030971a9ddf393ef10cfd3b7c1ee166c70c98c2ff9149e9d3418b6fedd24b6ea8dfef3731868bbaa32042a5c7e5fd1e416a1b0953fa358d02bb1e6073c216cdd04c3f1219913f677832f6ff6c426c046bd141e0d6b7921720251631a30b56074e57452558fd50d5f02a83be14fcb658f06567fca08959fb5fa9007e95a80d164fae610c156d3041618f6c83beb6649215ad819ef3844b52aa9ffc740345540b3589400cf43dc89a71cb0f3dde347dfe53ff9d81d61d9daf04e526af84cbf179c577fbdbfc4073f39318c151a5109fd7b10fa4a18b40b522de84f2864e4a7c10386b5594f71ab5e32fccdebf938907a3c7bb8e235dafd5089769193db9e4dded31e58c8d41e2aee93889277cdd397614b23b82d317d386242c0a1739b7bd5d876784221e04ae26d9eda273d5c19c18e42bb453b9567a6c112eb448a76719137870bf893485116ab7f7e108af9443dcdfb9d59c22cbfd0641d70930f71fb26ee3fe26a43a12044e2882532737a4c8a611df0dc7b63e88451e90abbfa1d6d60ca4f41878b417cb7ef8622b1f3997a0ccc73f1d0f29717da32957e563e72dead1df0db73e60e68e2e9bffe09c20e342db840aa5950ddfd39d735f900346407dafa3493146a2f4c2815a65deda4bf3a10e3bbf6e88587c4e0ba189675ce5adba15fec9e80f374ed96f3b9c462d1e4b385359f9f27117e4e102867d8c86ada6eef952d48a6a5a56e4cc45375f5326f461f6e29a565950ff9a9a1cfb8c3554591c20614e445ade22e61f32837e279c3094362bd5985b2fe8df2f485bb020ef7878b06805852fc828ea92b931f8a20a99a3ae1122089910d40334c20a7ec6ce19b80827924ca0856ea6b9ed97265a03a60847cb1f8ae9e37f01d84825442b4d4750d02eeba107e02b2ccacd1631e2be71c21dfc9eccb68e798d17e1caf462e96df0abbf39e537dd7fe77243af94f32bc01793ae6d4766e90bbefe640adf23781c8c07d162f4428fc42974345049b300562d60f404401f43f57b8cda3c7ce2cb7c4d590a549fc5d7b7a6a8d05b51fbe8f6ed89d67be970c25a1d077cdcda091db8f75818ccfc9c39db1b341ca212b213ee6a502c72800fdfb333dc02369d0e785cc63d5ea03eeb1dccd8bdfd7b9a757a89b6e6bfb37d2c5e74fa2b5fd7d353bed1b14129fac318620444bdd6bebeb0c37c5cf9f6fe68a9164da3d58fce26cc6bf405ca32073f026280c401948c4dfc7f73dc262e892454733db788f497f0e86d8c53cd306f6a9dc78d639ac8ea96746acc09c33db3cf96b9c8543b94a64e3046eb9d875721120e09d480a00ed737e39257ce2934b247233cff1ea61fa42bceb5b8e1dbd0a2ae9ebcf8e228655e75c948dc5967e9a85afb401ddca2f2b14147726c20a11075bb1955628df91faa552bc8264ce92926727bacefd72c04e288afe39d1006b2367b193bd26e19bef67e7f92fff4828ade1611fce7230ba33cdd5f03f33f988ee175981775a7fc55738e6f1ac30090915edb976f05d4a3a00d85eaef0344361b0ec1cf41f65e5065e34b1f7af4d867f48729d2a1b5817a0c8d0e5aa049fc1e09b7be9761d87926668ecb662c9d61d7b9d2128125e62ff37a652fa6a8a4d171e05e95f06bcc70074aa55a77307e83ed0ab38191fc5ec3703fdd4720477a47ad33a08c9d93973343f3ea619664e183d6aa78bf16edc5d8ba1899683f9515f99ab9243fd9f326c27fc631cd3d72860a0c69261e56eb39ac2dbdc5e33145a68c33132061ef5c56f54c8e5d94e5e71701a120bb25b2b232f7f8a4af4096a0715ae9d804d5b186b40a8067a91e4a00da5c992d885460282474dc7f123917adbad81cc6e3e8d65c8628d61cba62f56a2fd957c20ee7f4231213ee79d0f945ac8fab5cba4571b480c2b137944f074116e06155c3f6f96c819a3688774217f1d16c9fe867378ec41053b44e9b5a89f6fdd63ab70ce8fb677673e8142c5667c96bab67c71ccaf4d2b479f93bd6cd0b7913b53b2b58146e2b86d1203e8849ccd129aa15d3293f5f572d8cf251c03682312d5d54e0f54f17af6e5d2051be04285eadb1adf54c70c92001d95c9794e5367ec7234f1a34e99923dc5baee0ad4b104bcd6e789df043c93fb8eeda3c60d6c0b0523f2bd07573f916633675df1c70f8a1a06617c753954d73ff3b5bc7bba876f7899a1185fe10e5b211cb2fd4425d624877ee30dd72e968fbfe3f923c11c50e013b558f176dd1473c5e69f9de1156cde5ca2e2632c0b99b9a8c9b3ef740bcedf3131498b14bbff682d224aded0dfec38429fa179a0242ecfe7b72b98cc03f65c500556ed643652d89585f8f79a23bc5bb612efd5c4731c5881025bf573cf110f2352ddf8f11e00dcc0e063290fde805b07ae71988fc671d1255deecce45086fe00ba36cf25855bba7be366a84141befd8d3b1dbdde69d719b70d37ad16221c046ac9dbb1c334c24f46a8fc2220ae3c727101c9daf820b4ecbaf2df0310235a38dd9a84656385892fa0fb05fc1b9862b1eb3c7e07c58772bbacc357ab1f535d82f367f0be9af4b06054b7de49a9a0f820d5fbff681a74aba939f267f1419d15ee60bf43a92cb78963d0b3493898edfc9fe75a6fd9214bf10ac56e7b0f49af82bb1abfacacb024a36eb2a7e70b9375bab2f672ccee9cd46863e91aad21351c71c8a9baae9db003aef96267d67f24e5c063264c0079910efee4771a3402cc2b57037e4dfd28add372508b56e14c3e459af6a587f3eaf3caa4ff14059e61aeb3e2e5b58186841cf4cbe9100f18d2cecd4c24525f4bae74f949db70cab3da25ac4bb93118a42119aa8b7e690ad0869d4e066dd4e95a206ffb442236432f9b388d7f2a01046fd10d7e8d760307be6d84d62f8804636a6a3986fea24ddf2929934c015c4dd0f671b3aabc77918bcb14fa454436f07d9c53c61d0b4891d5cddc195f6a387e07ac5b4fd4d0b01b793e6bb6889a19b157cd7c32c3c8943b6607ba531c5ed10675ea272c54eb13966f0a52f425273b6d6c0f943f8e7ca9d18620c2b856e830e4cf157bb002053948328a141ac4c2b1bcd81bc4134db5166054f60df13c267eca8251ec8e7d6627d4a8b7b798c8b4c5d8590d7ed1030a466c206a7fb21f9dabe73f99de833203e53701cd3c6f35fab8d61c50eed6e07f6fb5a3ba3f18ff23cbff3827bb82cb71b7676eaf29ffd7e94e1a0a585ae57f45449123e4d1937db3d001e333300bd0605074435aaffc39ce54e4f21095ade2cf2cc85ed2fca1a1c34577ab16e1f42001b20cebf82486f8d1289ee5eb5c207cc0e9038a24692bb77ca2fb83554e9ffcdd96a4a06ad86d4a610617cdb522650a6b866402765627599252e88a40e251b274e6926443739ce23f64811159b86cf8cefef1d2d6e34fef1e37dde620d0c1da29b91ef24490e2f25432b9e54bf4fa6ed5646e6a6fbac3a59ebb1b915756c489429dd59101ff1f99e2ad4f309185f7f22ced9e3b14b3c68c5cf5d443906128acca122e54a7a4b1708c7404af83056f3fbebb52703fe8a31b63b7b26c091264fb6249be0083b77036912803ef57c81d77df68ac1977480bd54981d0d1ead436c6ec2c0c4ccb29c4f472c8d87df92074f0cba7bf01bd18c56be06528c222deaa28350ae291c8a0260441da34fa8a0aa39f25c9daff12c86462c21f83a88bb551be0df76df9d64ff80c7e5f75a2eaf76abae3fe0aa82bc720f52d003ed3040ea724d1f04c948edeb13b046bcc25bb2642692eda9a435d135b96c485a912f9c213f70dcfa72254d8234af9229e8b7c39f1f80749bad0752c2a675ca99f448a7f6a83a577d2be9c2abce880164abe9020becf62f95be76a407c950e0d7f6a6005c145df851afd8f589fd43599eeb60c8eed8ad2800f46b153f4fdb9a1d827dcbeec583439321f46f79d368d2940ab99cf20e19809a6f76593f68251299ffbb9b10a548a527d87a5f78cef94d2391376e01d4e1da2d68ea184c9e0a72d9210c9220030a5afd9da2f33067211d52d90bd98d7dd591a4d6f8395159bbdb45a28e5e32075025b0de9d24fc13573ed2ffe5b84d21a012e235781230eb3fd45ceefb4cb5c1b212d37b5672c6d403f86ff92fe5fe99cd7e6299b1867fa180ce681c4e78ed91c7d242f71bd7a91c862d07629b35b197f4268c02921dde342c05e01ea4e46bd4cb9a5ae65f17d7f9635503fe403ece116ded09111ad64d38ef73e668165e3a5950199618cff0aa0ab52a9dad501509bfdd71ac850fd5b6112a5315c7801e4d301db71ec7070b5baea0c24859b23781bd8334eca6e1ad76f94f70c4df7cbfbf3d68e4fe0d3e8222f85a5f08c86633e42d4fa47d024008e74bfc8c3100e4b2ee50de0bfb00d8a6a2d1e741f9829d872a7d8fd8d4bc78fa8265e727c603fd09ee2ea66b4a11ed77d15e0fc9d45aa13c53c13456fe82e83eef247708c5cf1acf7a7ede57b0f0336ae5e9d61063c4c4756459dbc49470108e921d31cdc42f99867fca48ab31ee95ae257988462981517befc744a03157f46044fc8bbe62e392979cbc2443163be19fb5f05318cc05f0d7d7ab677e2c86b3e288d6f243651ba089304df59630a826b92da0aa2ed3b6d6d7411c2c956c7fb02f23bdd6a97e81453f5984b9288fe7c2b6a87f22a53ca9fe7f6238de1af17f6fc29852c7dacb76ce41293653dd66c09f40a48f4e20ef09c4b65fbc2048ba449829070a890d27bb5fd5b9a3dc95fa4d6339efeb969c6ba19809e932d6b18abd886259b1692e3401bb7e990505db47c8c4bb901a064c64eab760175d7448f07f8a97aef5b41b48ae9126b200c1536c0e28dc4041cae4fc08671614090d7cad974977ef94504dc807a228fcf97e2f89e9d3c32f5742cde7510effb9b8c20f5ba87e17842ad0153df2c7eae553639f080e20702701db882f21754bc172394bf3e053c089013a5a9daa622bbf60c7e1ba8395676ddc568b2d6bd4b71629e13e44ce357b57384911cc65ce318f0dc8f0e7e4683e7e45724cad816ec3431d6f3229cf7113ea58746af23c34e017290248abf047670076f951775ff6f29da46eff335b851d72e38a76fc7f61bd62aa105fb047743d6ed51ed6e7bc44a701f654ed22d8966632e45d03f8afcec43e54ea5cfc2d98cdaa44b4a9dfc1e4bcb4c9900a38ff270b5373635f726fcc131298c8ada1fe770057005e2e5db2d0cb0c365e66a9558da4439f3ae635919754024c965f7997b98f99c1d509b31a4d5de14981e93678c21de66ca55de8106d5b580cf69dbf76e23a73f3b915e556e9fd977bfd07a76ba74bf514b6d4eb2d48fcb4b1dd7e7e82ad8d44532a4679d604c4875b364515ca0376c59a4b30198d6964c95a4422c2512ca996f42d73f4c5dbb112b22789e863d7b1a37312505917a7a67bda8e86637402ae443620d6792a4e389705867c1082d55338384dae60cfdddb2c15c8847be1d70a799c45937ffd506b0c9ecced0c65bb72035db527ff72900bf948a8b9f12f21c66afe147b92ead31881ddec8408456faac0954e4750053ab8bd3a8ee5c02dff6566cc6bd027c460c21bcb09130ea7b902b1df01e861efdc542be5c8db18ada3d1f0c1ff25b4b2d01f72375452b5412aa5750a02aa6b6876ec7ba5189aac63990823e86afc0969a8dfb7c830d3b3f39e40b06854052322b7f5f6462b31f611d7836ea49a5e2618795a97e7c8ce7cb01b7e44641dcd2adb2471b92c28e1bf253650403307d17ca26e9ec506e7f9dc8d9e9c6c2e30f6c11f3fc26b0cbd36215a764c9db17c3aee1b08de8e06bd49c02a50cb4864f799e4b0fb5de8fa0384fbd67eb05ee78336c4ed3c400eef474df26310c99d1e4a62d66e4bcf0d31632fd9548871aacb16be92dd0f98b6ed2bdb57c90a8db95f02fcbd91064c76b98e2400e29f88405665f394138c1d0c81ff860b7b18ddceb7512c5327c4b2f65cd92eca7b9cea0e7eb9f8ea5d5bf0ed39f78a838fe1a1552e4a79003ea99591b116175cc98bf3da48afe5b1bdf36353d9670869a5750bdf3daf0bea834d830d4c49905d83a999410c102bcda54a36683023e046a4238fd66feb87ce2bc0da529983d626a5fb4b5efa286c03b8d89e6657a463fd734c1f383c29dbb6c389247f40a47e6a122dd245d52039b81e8d4c527a342c8d1fab33eb1324a40ca1a511c424bff1e01e76d465520fa4b28dd7345698eeb19b46dbbf2e7e50a5b64fcac3a9bfa572ba326058f0592f39194ace45dfaf72becea4fedb018391cb6c57291d44f3327387d765dba0f3fcbaa9edc01ff55264f0827f6d55cf24ddbbc06ecb796a7815168809afe088f23e9d564e478379a7ddf5823b3d5ab59085ef8cdeb4699e184e74e601c67ea0edb51311d0580e3e07342af0357aab8772ff72ad7e32d2638a0ca334e23792978dc9a57f893c99ae1c81e2c8bd37dc396a000d9cebcc622cb9a5a9a34b6030d54102136c580b8e06e8aa210d4e1824e636fa8bfe45cf443679c2eeb489d31d2e6037d4ba691298272737c6a2874f6d9ea1e5c0af953b20933bc03e7d61b227146f54e71a118be3be603217bf2f18f037cfc7437c2de430a7e01314daf3b6a9cabcd42d2a3fb7ca0e520bc713ece80287360ff8f84c7ace8967d00ec770cb48ef6a37d7f211fe7316c15bb10081add6eab9edfd6db5ffe5566f145e2508d992352ff38333a74670cd8df75045481379636d1f3f170ef0bf7930687c925041f4133ae1ef313c5eaf4a7e538ebf8218f9bbe463f42e04bc5f1bbf67edf0b297b6bb0b8fc0a9af511ec123fdb97d2ac35e13bdaa4068e2435aed1be1671ebdb4b7098ef898ee99df3796a6ca78a8220faf54c7927af7d180aa23811e92379402305490bc3199a2026ce49589cb122e8cf4c810bb71569baabcd9b7bb550c88a7f01d199d63e2c3010855e98a494921c2bdad5a71a309438dfc7d9c482949ff33d170ef2a44eedf893b446f0d1f986d9592d732bf32daa4fbf0a3b0ffe9fa911793e6d77493a2940ea82bd658d933bba9395cc18e8fbbd0cd4964ca0132014bb4b3e0633747c35391646b4d9b0e1e20389a0ca49aad81b74dace133a54a4e62834007c8e920f81fd262729f646ea270ee4ddd9bd939e8915c1d5116fc8d53886ac4a3dbfa901564f132c6c3d9f885044b313996a84f2378331157eff34e7be268fec106713e76812e24ad873295a35a7fe6e840a5c7358e611f59ae76aa56f820eec253c51d6d3ac4d18675995bda858961efb3bfd53444ec9a93dd5cf018ca38babe0e76ff4efb05936b2579807268ec4dc3c08b7f56d8d90b646144462da69f78a6bb5a8b5a2b67e3ed47c0011d3947749def4961e66384d34b0c01409af47f1076b95332dadce8c606833a629a391adb4c816592e5f603d343543ef8f091eb36a3896426821829b35e8549e2a877109c132c7dbaaf6f523b91717aeb5dd536e30232ae95b0e1bc0502b1eb4b889f2186e976b1eeadd0860a128fa64ee92358e14f4858a91f6e4b8fd3d1d19233b5f7c00a22fdcde343a90f6911f873e574393b89b570ac03fbff8bd1ab3ea4d54200c36d598e06d3e5545b15c7c2d984684d09ae78ad897dfef580cdbfaebe3ef9f07067ebcfda82260d058a9642d9017bbb73d9de72af23f566557286606e7afe7e75bb60eba45e7a88e1708896f5779bf55e9f4d7485e3d0a940364b11e33f9862bcf1eff71110e8cf6e4144c7628ada98b6b3760aab6c2204943b7012535da9fa02c19f7a1486274d14bc25d612af46737e2fcf54664f2918725fd71dc976bb4ecc0c1a50518f9410c6e847a3bba8b4711ec608c173d771ea6143d97291e775953bb5e8177a9fdbc417c1295b63728fb531592e09ce99322c04c34b6c2978c78f281f5570b6c5bd7b068f1cc662ada881bbe09cefd99fda86840dbf0e5a2a29cf8b5413ab58484c8a1ebe51dfa22108ec9b73a55a6a057ca0eb33f975400a3cc5cde65d9c5af7cf3638d30c90f909cfe90b898fba680381370ffed27ee184963958582cad65bcf75071448833e3a94c7fb485cdb10346cbe14f4b6b63f631914922c45baeca1281b54f2e5f868c0ae5ff03223443738ecc0527a33f7a711fa91d8da9ad3f715a22fe9474e4c456598f742b018212ee4d3fe20da4cb810bf2e06a072c2730c94132dd075bbec43a0737d26efa386edf0a0ee923898250df2d35d0641a1f6272ba709437b3208946e1a35dea502b30c71e8217820f821281d73d1af4cc335e4c71fda645593a629c93c64f414714dd3ed714200de47c7c639f0cd15bcf6503fc28a6565c1ef49d57e85711d789aa758f87450fb246b854b66da0ca01453498b2de873558270ceebfa715742aa176b8570af8c6ca5ecb73fd6bf38a577a7e0b8b2733e43df7aabe2a5fa320577908157646411f4cf063de88ee52163c81f3fdaaf4e7d262c1392d1a9e1c2298edfdb98e6a743cbe9d20225573307218a3c4a7f115bf7dc44ba3989fdfa40ee54ec98e14ff89604b68b35101577a9dbe41a132a7651d5e8c6f8fba521df771a410be4042b4cf95f357f5c6dc6a3cb11287d560dfbe69b2f1f071f6eae8edd0858db29915b4e194fb91592656bcbede689f42798498acfd6a4ad4f4a597d89d243b2f26647c0960c9bbdb87b8f05b90ad4c68bf0b49f5d56f7764371d0e71ff07491f7d9c32875ee86867560783c4c60623ef632a82ce66105c60ce0e9b40eb0529f2e8c69f5694ef62275926dcc29dc8b30eb6d72cdeeb4d1fa8f179a530fd89e920e7f370026e725251c9772165e7252f4a686ec70020fd4a62d9ea2a42a750f368546e1a9b0648c4ddf74c48c5c6c2b322213a3a6b7e58e5ccf66562b3a16ff99294d782e78f1f84747e27ada9b359b4aed4997a86690cd1566daf3a95e8f075c149c2ee7003bf32db512867343e83b847033c0a3d8334934d6ccc6b85cf5adef156030372fc5e1a610d1f61970ed36b9fc9ce497c8b3aef68d7eabeab570ef581f45c7cdc2f4762aebda8f512f19da7e52ac16839758fcc0b8be566de51ac72c927cc20bd77457a23823b29dd697e6c3efd0316234f25b7f01842082c8abf1bd35ca7aefbd9aa02786271f6e1e08e76651515ed86df410f4b63f764ce410a80ac40947283ef0052cb1f1752e7b6f96b9ca5a31b366321e4630fb6137adfd210634a8108783003044a6a3a948b9068a7964fa43712552907363bfde745d771ac3ab2a509d38da2072229d66f400010b3023584847da80f9706a642f14fecdcb1a6380d65186ff404d68d0bd54cd4a826bbf18e7dbddff49cbbeee60bac88dc12a6921d7d507966aeffca9176ebde52bbe42fef2b9eced73cb204f29dfa313fb28850077c5855ac3d00fe2523a0942b29bd6d308e2251147326291020a0eca97207cf9a81a755f862f98433e0057a4cb4f3047ab0faa9173b798740c0d4c8ca5ced172dc837bc71597f520f7437e05b313ee7536f11cb2123a9aef52a84107aade3ee60f09219005c94b1a9942d2a150eef9d02689291d098789ae18921b8bdfd52732d6562c522233df60c38d0dd14a37f2e14a59abf117b12829ff52e993972b183ea79f9211f2df4fc0e2921b631d637892443a6a8635bf1e0ed8bdc83189fa89ac47798fdc04c69743b62d8e35be08b3533a55b5a16f1f171655290a66ddf45f0524c92c6844e6bcd7d92d1a5c5613d36191fdf13af47cfee4295a29c5611cab613f244123456047eeb452fe92a1d77025f32f901cab59b847c5797873938aa149c39e455690b1946d4172d3e8e35f937f60d39d3368c36bac11a72c767c77cc3672c0ac5da48a75eba4df118a2a4285ab0999d201439321f25002be55fca1399866a3bf3e60ea1ee237538eb718c7ccdb31c12e30061e187339bfa4dce465d9f5e0e78be60d83ed7c9d13d3a21ec7fc5fa0efd0bdbf970dd776f44bc68c630a86d25618f47af8fffb464d5fc4ed0eb42a99dca5afbe2bf09faccfdc3f49b87afef83bc884e875473dcf22dfb9bb13b318b2201d7c41953069996d1cce74e8eab562a835bfe62cca403e0804f655ce7a1947f90633decbf20a61d1ee46af7383dd4c295aed62d774a3f79b1f004c62a5e3de1259eb6f8fd841337fbb601b0057e9985109d5634f70a3bb4c7e001f1530d3fbb955395187b7a023d865c52cc1eeac622ce6ea3ac12c72a02245a232aabde01427beb4eae2c49990c0673ed58f89e47cfc09888c176d986342d39fe41a74d242755718578b1549557555256c17dba48c27f997a55497a0211cd47adb9a058371688439c50eac5c421c90daff6fa15e8c98c38d59a8880366598a0b1a9cfdb7b8143924aa0e42d7856e2197e1ad75d496254900ba79f903402edfe7e170af881edcf56d28c3b1fa950c2cf7ec4da8ee3df4eb89eea1a5f66ec584450afe9a5250f4a494146d60626a4e0b6a95754e6abcbf6da604a3b33eff09467652cffb3ab7b80a1abd145d91e602b02c8f8124ed9cc04a310867ea90d0091cabf337ca5012fc07b5c4316d2b23f1e6ab820b7bfdefcf8d2a2bc1da58fc3116912cbb3a819aaff7cbee121a5cc3e09a00bdfdc14094185fee4ea1568556c81786145aa3eb98113f5cfa2f6a96f8cac5934cff0e95b63ca2adecb2059697c8b8720ed772cc51793631ef4467be617b1b9e260a08cf9b05fac22babbe698582612a3e2833f5a2c76c2a289af6d3723b440f0ccda49374eb50ae47faa55757b74f113cbc0a2e63c01f866ef76d7d60ec17f6d56b9485b8d590c0119926606010a6ced78e95b43e8acc2c91e6b3e515ce5ec6b5bd9c8ad2a3b1e291c676c9894ac2ac2127640a05bbdbd8ca40294fbc2f2386bb93aea8f308c2dc79419c329e6f07432beb99f3155a4c6337d2e684d7acf15a46495a4fd0936bee73a3ddf7229e564503d6baa9d92c36c7bffc4f4dc0ac83cb8c8b8ff59f49f23747fa3e1abfb18b2d32ee3d7e9d4fb34d82994f565ecfb0f6a29f431edbcd18e3c8a923cb36bbd9322868e41cb4d6feef9190b5445bf9a0057468ebf6d32052d805e5c0e7ea683dd215e9466107d98c2a677c6f64ae46a8010a6029f9afbe3089cad0b893e94dbb18e0d9134b84c056c0aec44df2a0efbaa78fd55d58fa73e7886d70c82b81770f1b44f72adc83545613ef155558f075dedecde676d20ff00710846e11115d5418f33748e0bd35d81db720dfcbe6c824da514be5f076ddfb15f6be70b229e3c4e3b134c328f57454dfcb523e0c821fe0a3f3e7364ba0c384e39cdcace93d04d521eab494b9f8740889a5135c2facb14d4c62fdc736337dfeeb153637362cc15edff958e7e0157d9bba92417f613246f569dd5c37374f997ef6e817aff866bc30ce2dfdf17d22ea472496c7bfeeaf4e725f67b1837aaa427213ea4cfee055353cd48b03b58849a625703c58b374fe5014df7ea2b7cb19d9d3f7899ffa6880a952382f52fbe7e9c93829ca3cd6ba96670ec8d14dedf1419fa0bf629050da871f2be1c5540523d6bbe55c33b689167810442d56464c43aa6163c188415962d014b6c0674f27b26999edeafee67dee9df668d5338012a914f83ad527ae209089d51b0993f9bf254f79ef177073ac567b7de8d6274729396f3538204a1071c68ea2eb932895e9a93a5156c9ab2889a57c2f572e63187373d09ec5c4d1d7efbf6e9db7fdd6191b45ec5583e8a50bbce69ba8051b20a04f08e940d6a28e094ed25ab19b64d25fff6c4e5073433e0a5350c3e384d742e82414e96c85691437b2eefb68407c472da9a544e1826f7be3d160fc85dc469dd3907b15f9a96fec35b7f719e4e6658e6268a9d74073cf90119ea4a6b51ce5ea7d035ae590ca609607791031a985a024a7ce2cb2325511ad811c7ba141020b6c9bd0fd8520708c8de7cef1c4f74d239e06ccdb9372ee43b81e923973730a578e343b80df8a13ee77e9a7570d6037659a2f3d0f7bc6545c5a2eae2f3a8ab990ad6cb31f773607c954195f298947aca8e756c03d8787864eee694fee189948b420fa85738109f27bed50d6175372eb39e72faafc651db748cc3bc366812f66ec58db2fec39215a96c3bf8eb0a00eb96a331770932dd617e2e299a1b7c3f2777fc760f27ab8389daec082d4dce14f083c7bf6849eac8bd07f6159d1c003e92731f5036813f3a164e233c27c74c01cfcd2c3834f95453e4d9a15ffec75e37a815f66300416796e85a87c3c802b802e2fffe0e1b9b83dfe3b22d4d676d1b9f513fe3f0f81ffae02ae93e67524aa9ac199496eee775670c68db0663238f9eb9e9a69c685fcd696fbbc3740612a5088c87f0cc894531461817c2fbddb21a16272873cd4977457df72d98fbab250057ba2a3ebb9453e7e152dbae9aff92202b94f95e78f2f7def96c56bf6399dca56bbfcd2d17cf91964975cd9d71f07d36177610bf7df6c628f5897ffea92c5b3e9b5f2439ea23b176563df254ae161855de0127179423de93c07a13d84a8a2e8e89417d5082500590da7de47411e38de30c36fdeb883aa5d9dc1bb314af61e4bb055afdb20ccfd7a006aa08c574798d5bf0b93f590541a15c5b7b043d1acfd17cef501d2c5784140bfe83d762c09cd837a331ec122b33ab116abe69096d9c7fa42832e9b1c6a852427ef7156d450cbfd6888efbcadcd9cda5bb47a460144dcb125575bff52f0e32e44ee6a05676ccc26c160ea8f0e9f5d24c60a25a095eb35161c27326e7df7cd00d5831c5e4188235ff83778ba0f1e1b562f00bb174631344b15338d4fd7c0508f6d0f97c4c11c3d37a4e86319212e7c12cee1a88f35f97c931abf5524841ed82c68ea2f96c6812a86106f5dbfc23129a5073219ab9d35f5fecbdc03f2779fb51b7dda13dda120a8e9c7b81ee89ebf29ee687c76259272605fc37cf5cf36752819c2c53998c5eed0c3ef3dd9d2d5fe989098a2a49a9ff8bf281effcfcee5255a1f42025773fad173f6820d5451e7a7d2faf1eba4c9823ca637f9324efaf8a483fbc9845253cf5e82a8f7eaa53e319e98168a18d339f6f4918a3a504ea17a6bd1bdf9622a4707c14dce700ae0f4d8570da73253aa69aa383790d92a77fde41a2c3ddf3185fdbf8edb7fbd51155c52fd2d4c0868feda83516857bffb9239b05396f6742ae44dc73ee95b00c98ffc17c2b15b1b25784a6576777e1ea9589f44d057a5aa360afaef22c18988e84234c19480909e32265f857aab9856b65824f4f2a5562106e93db5d135713cf56b2d046db4fb8182318851e20eaee6a944614f5ab2ee734f7bca682adf73e01cdf69dab207996b05d0dba294cbaabcb562b15c07d95a407af828a3cb7eaebe8df8f73c78c33578e0b8944de737f20e6a675be0a70267d0a51cab56af380574786f33ca1d92818e95a45b4ac00eca388ef8be644fc63777106d117676bf2a37c3c41e74eb48c06a1762a78f0ba65af2d62ea2dfb8202ce6bce0ef571297742d13f8c18bf5d777c7ef7255329880e2c1c1ca7419b8d0cc25a5ebf8846bad9fa68abc9587a503fde5f659fb8cfed226b9896fe119cd118dae6dc4256ea1199618f2f85a38fcf3ec2e75bf8558693054c949e253991cae0c1c610015de935d8f2e0368c8a5819d24c0f36b89e1e8d625c38a38bf995812a02ef8133b99918866ff31daf43f711f7a0b5e7747f3dc8f35e6661a67cb3d176d531ad6c99866153cabcbabd0e972c7536ef5492158f6063229d75b29ed099b60e268f6a01ec91abf64f8fdf43a6717bbb0ac854f7c1f67387a0c515a4275ff9466fe8626634a1467efdc48043656643c157d610adbaa8b4852b5e66d57fc7e2954a472dbf81e641220ac0178e783c59961d5df62a14a02decd5856376ce631638501a857c11b441dcab44755e5f717a9f21f71452330a67aacf7f57d5e5545860379dababe1147ee546a4d08ecc3f210ffe77f8076f5ede7cd47fc9f50418d78f63d42ba0e3a1ecb78960d3d4ec7567eb5d5a66d85bf58f20c4a67f55ce5bf688e6a2fa232a70530938a14125a955fd975b931bd4fc1b8b9f9b58c520d5a863f50e6fd5c9c6a4756ce767783b89a2ceb8d84f10a8018be7088a769b0627a10f25967ecb645b2981b475276aa43165c85855ed9504f2e8d0c7fb0a9a42d37b7e585734c4d4fddbaef2d051786c02145ed1186e7a202a2233f35c42e65a41bf495d87368d8c0fd45c44ed554a0f608c520e448a9b30c0d1c431280969847435b7b7052b3f475041c2dc905539d1bd02893b23460bd513eeb65491ad8f0c659f0b711269277e0ad3ee3f776ddb8e5b38db784b15caa405920cd2eab936a838b168e52fdabecb45a286e41cfa3ae84215c9cdae6aae02d22e07a45f24e5ce9caf715c68cdf20a0b945a7b2d56155ce2c0774935a4ad31d63976fc8d9dcf1daae590f19c4ca2cbfdd5b46187cb674c9ffc3e3738c52ec3259029610523cd96c48085256daeb2a7bbec7fd5b6585365f3b00d72faccd1e732544c113d724727afbab6edbd714449d21703c9ad830a4d90eff56f86b37c2dff2bc6bd6a93c838a03952eae52a765779166549d2784c4d60edee1aa5612612fb0d8dd01a236197fe4c0838ab29e04b8a6a82471f380efd493d84cf0a596c6dbc45765b01f45573d27575744686855ceccb6ec1865d726e199ca5351abc809b47a2417399ea1936bdd541cb5deae41717a15e0b92e68fe417695cb22565759fa150e237ae8b640c5a32884170d69fe972d36f32b4f9a8dd13b4cc38b77c50075873954adcdedc103df0c49f18427ce49b7b5ccfd74a577a699547d61e046b19a3d93c28961e62f7a4766cb9176699f349e6eb1442c58fab006b9ae5ba0a3d0e3f56c124ef21c894f7c9335ab47f969b3ac18c934aa8c002bbd866bc3bbba2056273157d24dcf64a8edf1c0b281564774ae7e011295f44f8b9b1b6df8072570da306ec64e95fc0248544c78bac4e949f93ea296cc685e3dde84caca84fb0511c8c98417f258150e151068af4f2359e0d2a6fa87097641261e6a3a951b5452048b591394743fb53dd5b8602e6e51fa6b5fa34e7cbdbe107b0810acf17e72ed589a734426addc30fae1caad31d6b7ccc63edbbdc158baf5029a76ce228bb5539c4dfe71eed1980d04f25df58d180e9be455c7fe81ab816c7e9cda258ae18f05d06b62ad063ec5608dfd65b31bf3d5825db3b1d266364c2f261439c1b9559d18bf5c1542e94ca4983eeddc808951941fc191fad10e7129ebfdb63a92250dae751b31494b875162158cc29448277f24f96fb066d0cfc577bfa69cfc23b84cc5b9bbf3535fcebee5d589aa37e412f62d574742dc53b6b04441bf962ef675a5f01ae8734a8c69c63d26c84a8d69c02094770cc0db501cbc135051c4221b29e9b2f3fc98f1f37361d7b2fc01f14e23e51a8a1d797c3fc01a1e63ca92c7f1f581ec169de0a317756f31b82b156bc017a8e7f50ff42b2d9316ad06aad57900f6facbbc8efa1bf793c251c8bd09e138ed1d7610275e4a86883b985254af506ca60eba247656691c0dbcb0acedb4bf7b1724b394d15cf7f960136641df1fb03c58d7e1e673b44096bef828f39f7a63286e12f62c0f41fefee4c386e8d4a0f910a4f69bc85859d9d727a42afb337493e9875f911c5e5fb134f23d860c93ea98f92f7979d80a74f74cfdd233cf2d7b3f3ab4ddfee9134a4ebd93a8888e04801ed6e12de0be4638c07433cda86bde5dbe8c782aeaeb2ce5a381839185ef6a3643c751ee196baea2c7b561f555f2239e1d8bd29acd5d685bfa430651ce9c539bae6a4bbc89ba116a7ff9bdc8ea401d3dfdf9c38a730f90818ae8a15cc976de2d1472796593d308f42360fbe842626939640b442529eddb4ea0bb0d3a9921ebe1eebdc1175709e72ab4ce1925dc436d61be2a713b1a287ef92998a9b49dbced99891b3fca6e36c5498212eb2ceae066a3a87c7ba7123372e0ee927315e7e477452a5c9fef761cd124f6a5c081015e0c651579f3fe87495009a97a7459e5408c7f218cc21c8e0ecaba727ea553e23040c29dc37d868c36c930145f99db78f5f86056fa9d3ba6e3bbd8cb456028b52e4ed067bbd2c8fa15425f6c565ab7bf0ed801b6e3af49f672099450aceafc78db9b62b827745fa9b9aced5642d4ac3e08475379b4ca2a95f82c940d849013b735c07a8964f23f71a012fdcd87ffa970c5a94f81e9451476323caf02547125e4817aeffd728d28dad27d1fa7cd70f234841aa610b68922a98ac63551a9e4a8e0ad47daf2e840fbffe7f8ba82c9606d95f149328f8cf0169fc975602b398407fbdaab00e578e6389b931468aeeec38263a95ffe5a70e7f430a25a10830ded4115713e24e3e61b07d62cb5d748a037ddf0c1cbe82e112a4c18cd08121cacce2d74331469297703a2ab7d0437d0b0708f8712507570aa16b23b10ace2ab6861263b703c52c301581c69ec4628346e2bc88c0406a9480fa4b2daf8dde169a47ac23f3ef2f1b7f8a810bd8b916343fe39d3c4edf868670fdfdbcbad3478266ea0fb0c428b8aecc4074defc41493f8b9cb25eb73b8b200eab74abaedcb7b75c8ca39d74421eadfd44613fbc7608c46a9e66d3d99222e0b3d8d5c851657e55cd54706e1f905a504c925d46b1a82b0d8e33de7cb5036323e2dfff55270485261faf6e4ff0759f8bccbfbd02d02976ceb82679fe10a9c772190dcf7153991e27416df546daeca0149a1e2c9fc38b90ebcba4a3a21e0a2fadcaef01e067d907138a857c6b61850cff9c91eec50576a0041a930d28ed8616364d539ab605ee8fd1932fed3c09997fd52b4b32c97412b59cceb7fc7d8d8f03e0e77a845c32d9c73228fdeca78fe8d0058de1ef0a576e615f87a105f5d6f39f6f6467edf08db06cb8b3b23df8e68d164f1a5015f41acb03424a95a7820693e58227e4e2e2922ade736f9996b468ab3d958db8da080e080341d76e4bb6fd1bfed368607de41904fe7990627eb9b7f95148303f99e55c452d2eb3a5b6dbe4b9d47b7ab91f20d3cbb98e225269f0a30d1202edf27a73f00e32c2710326e7160ca1f757d2b8b70167f6d13ff7c830e201bbd7ec7b46c6ddf9b4dcc3a930a5158bc4f597b6bc59995d409d2e968c423704f3419e589c3e9603ead4ff0b884cdf1ebc0db8c044e0eef877810b3bca9e693ecb9b3344e96a5703e20e27b7485a9197c412476b10d06d41deeb1c9ddcd1fa8d492e5ddd752783a905d88817ff48dfbfd27d4770d7efcedbe0fb3852096595fffd037254df7ef2f45f8e7aacf5812d2698a0204fbb70fb61e0a2871c54c299195b5b392a54c39a20a35c92e03aa1d5930b3653be63f06d6b96d1773b89850eef7e15e9024f4a735f4995d3317b22add77d03e3d3ee34fb3efe6f31311fd2c7dafc5631cd825434838df5a0fb51b23c9623f71526f83d058e720730e87d896c937201eb3fa4edaa81e4e18359b25de6015bb2541943be39b1f43383030fc38d0ab42a7de33cceace48a8c2374bc363</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-xray">      <input class="hbe hbe-input-field hbe-input-field-xray" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-xray" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-xray">您好, 这里需要密码.</span>      </label>      <svg class="hbe hbe-graphic hbe-graphic-xray" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">        <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>        <path d="M0,2.5c0,0,298.666,0,399.333,0C448.336,2.5,513.994,13,597,13c77.327,0,135-10.5,200.999-10.5c95.996,0,402.001,0,402.001,0"></path>      </svg>    </div>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
    
    
    <summary type="html">Markdown语法续与外挂标签写法汇总</summary>
    
    
    
    <category term="vue" scheme="http://265832.xyz/categories/vue/"/>
    
    
    <category term="我的Markdown" scheme="http://265832.xyz/tags/%E6%88%91%E7%9A%84Markdown/"/>
    
  </entry>
  
</feed>
