From c210efd4702864905c6b80ec6940012583b4ffcb Mon Sep 17 00:00:00 2001 From: V1CeVersaa <285424882@qq.com> Date: Wed, 31 Jul 2024 13:38:46 +0800 Subject: [PATCH] update: 240731 ver 1 --- docs/Computer Science/Blockchain/ERC.md | 223 ++++++++++++++++++ docs/Computer Science/Blockchain/Ethereum.md | 0 docs/Computer Science/Blockchain/Solidity.md | 193 +++++++++++++++ docs/Computer Science/CTF/DNS.md | 87 +++++++ ...{Object Oriented Programming.md => OOP.md} | 0 .../Python/{03IO.md => IO.md} | 0 .../Programming Language/Python/OOP.md | 0 .../Python/{01VariableAndTypes.md => VAT.md} | 0 docs/css/MonaspaceArgon-Regular.woff | Bin 0 -> 48612 bytes docs/css/custom.css | 14 +- mkdocs.yml | 15 ++ 11 files changed, 529 insertions(+), 3 deletions(-) create mode 100644 docs/Computer Science/Blockchain/ERC.md create mode 100644 docs/Computer Science/Blockchain/Ethereum.md create mode 100644 docs/Computer Science/Blockchain/Solidity.md create mode 100644 docs/Computer Science/CTF/DNS.md rename docs/Computer Science/Programming Language/C++/{Object Oriented Programming.md => OOP.md} (100%) rename docs/Computer Science/Programming Language/Python/{03IO.md => IO.md} (100%) create mode 100644 docs/Computer Science/Programming Language/Python/OOP.md rename docs/Computer Science/Programming Language/Python/{01VariableAndTypes.md => VAT.md} (100%) create mode 100644 docs/css/MonaspaceArgon-Regular.woff diff --git a/docs/Computer Science/Blockchain/ERC.md b/docs/Computer Science/Blockchain/ERC.md new file mode 100644 index 0000000..49ecdeb --- /dev/null +++ b/docs/Computer Science/Blockchain/ERC.md @@ -0,0 +1,223 @@ +# ERC Standards + +!!! Info + 参考: + + - [openzeppelin 的 ERC 实现]() + - [xg 有关 ERC 的笔记](https://note.tonycrane.cc/ctf/blockchain/eth/erc/) + +## ERC-20 + +## ERC-721 + +### Events + +- `event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);` + - Emitted when `tokenId` token is transferred from `from` to `to`. +- `event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);` + - Emitted when `owner` enables `approved` to manage the `tokenId` token. +- `event ApprovalForAll(address indexed owner, address indexed operator, bool approved);` + - Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. + +### Approve + +- `function approve(address to, uint256 tokenId) public virtual;` + - 作用:授权 `tokenId` 给 `to`。 + - 细节:见 `_approve`,只有在需要发出事件(`emitEvent` 为真)或者授权者不为 0 时才读取所有者,这时候会检查代币拥有者是否是授权者、`auth` 是否被代币的拥有者授权,这两个条件均不满足就会抛出异常。我们经常使用的 `approve` 函数就默认了 `emitEvent` 为真,这时候会仔细检查授权情况。在最后将 `_tokenApprovals[tokenId]` 设置为 `to`。 + - 实现: + ```solidity + function approve(address to, uint256 tokenId) public virtual { + _approve(to, tokenId, _msgSender()); + } + + function _approve(address to, uint256 tokenId, address auth) internal { + _approve(to, tokenId, auth, true); + } + + function _approve(address to, uint256 tokenId, address auth, bool emitEvent) internal virtual { + // Avoid reading the owner unless necessary + if (emitEvent || auth != address(0)) { + address owner = _requireOwned(tokenId); + // We do not use _isAuthorized because single-token approvals should not be able to call approve + if (auth != address(0) && owner != auth && !isApprovedForAll(owner, auth)) { + revert ERC721InvalidApprover(auth); + } + if (emitEvent) { + emit Approval(owner, to, tokenId); + } + } + _tokenApprovals[tokenId] = to; + } + ``` +- `function setApprovalForAll(address operator, bool approved) public virtual;` + - 实现: + ```solidity + function setApprovalForAll(address operator, bool approved) public virtual { + _setApprovalForAll(_msgSender(), operator, approved); + } + + function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { + if (operator == address(0)) { + revert ERC721InvalidOperator(operator); + } + _operatorApprovals[owner][operator] = approved; + emit ApprovalForAll(owner, operator, approved); + } + ``` + +### Inquire + +- `function balanceOf(address owner) public view virtual returns (uint256);` + +- `function ownerOf(uint256 tokenId) public view virtual returns (address);` + +- `function getApproved(uint256 tokenId) public view virtual returns (address);` + - 作用:查询 tokenId 的授权者,也就是返回 `_tokenApprovals[tokenId]`,同时要求该代币存在(拥有者不为 0)。 + - 实现: + ```solidity + function getApproved(uint256 tokenId) public view virtual returns (address) { + _requireOwned(tokenId); + return _getApproved(tokenId); + } + + function _getApproved(uint256 tokenId) internal view virtual returns (address) { + return _tokenApprovals[tokenId]; + } + ``` +- `function isApprovedForAll(address owner, address operator) public view virtual returns (bool);` + - 实现: + ```solidity + function isApprovedForAll(address owner, address operator) public view virtual returns (bool) { + return _operatorApprovals[owner][operator]; + } + ``` + + +### Check + +- `function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool);` + - 作用:检查 `spender` 是否有权限操作 `tokenId`,但是不抛出异常。 + - 细节:要求 `spender` 不为 0,同时需要下面三个要求满足其一: + - `owner` 与 `spender` 相同,拥有者自然有权操纵代币; + - `owner` 授权给 `spender`,全局授权,`spender` 可以操纵 `owner` 的所有代币; + - `tokenId` 的授权者是 `spender`。 + - 实现: + ```solidity + function _isAuthorized(address owner, address spender, uint256 tokenId) internal view virtual returns (bool) { + return + spender != address(0) && + (owner == spender || isApprovedForAll(owner, spender) || _getApproved(tokenId) == spender); + } + ``` +- `function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual;` + - 作用:检查 `spender` 是否有权限操作 `tokenId`,如果没有就抛出异常。 + - 细节:首先调用 `_isAuthorized` 检查权限,如果没有权限就抛出异常,异常分为两种情况: + - `owner` 为 0,代币不存在,抛出 `ERC721NonexistentToken` 异常; + - `owner` 为 0,代币存在,但是 `spender` 没有权限, 抛出 `ERC721InsufficientApproval` 异常。 + - 实现: + ```solidity + function _checkAuthorized(address owner, address spender, uint256 tokenId) internal view virtual { + if (!_isAuthorized(owner, spender, tokenId)) { + if (owner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } else { + revert ERC721InsufficientApproval(spender, tokenId); + } + } + } + ``` +- `function _update(address to, uint256 tokenId, address auth) internal virtual returns (address);` + - 实现: + ```solidity + function _update(address to, uint256 tokenId, address auth) internal virtual returns (address) { + address from = _ownerOf(tokenId); + + // Perform (optional) operator check + if (auth != address(0)) { + _checkAuthorized(from, auth, tokenId); + } + + // Execute the update + if (from != address(0)) { + // Clear approval. No need to re-authorize or emit the Approval event + _approve(address(0), tokenId, address(0), false); + + unchecked { + _balances[from] -= 1; + } + } + + if (to != address(0)) { + unchecked { + _balances[to] += 1; + } + } + + _owners[tokenId] = to; + + emit Transfer(from, to, tokenId); + + return from; + } + ``` +- `function _requireOwned(uint256 tokenId) internal view virtual returns (address);` + - 作用:检查 tokenId 是否存在,如果不存在(也就是拥有者为地址 0)就抛出异常。 + - 实现: + ```solidity + function _requireOwned(uint256 tokenId) internal view returns (address) { + address owner = _ownerOf(tokenId); + if (owner == address(0)) { + revert ERC721NonexistentToken(tokenId); + } + return owner; + } + ``` + +### Transfer + +- `function transferFrom(address from, address to, uint256 tokenId) public virtual;` + - 实现: + ```solidity + function transferFrom(address from, address to, uint256 tokenId) public virtual { + if (to == address(0)) { + revert ERC721InvalidReceiver(address(0)); + } + // Setting an "auth" arguments enables the `_isAuthorized` check which verifies that the token exists + // (from != 0). Therefore, it is not needed to verify that the return value is not 0 here. + address previousOwner = _update(to, tokenId, _msgSender()); + if (previousOwner != from) { + revert ERC721IncorrectOwner(from, tokenId, previousOwner); + } + } + ``` +- `function safeTransferFrom(address from, address to, uint256 tokenId) public;` + - 实现: + ```solidity + function safeTransferFrom(address from, address to, uint256 tokenId) public { + safeTransferFrom(from, to, tokenId, ""); + } + + function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual { + transferFrom(from, to, tokenId); + _checkOnERC721Received(from, to, tokenId, data); + } + + function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory data) private { + if (to.code.length > 0) { + try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { + if (retval != IERC721Receiver.onERC721Received.selector) { + revert ERC721InvalidReceiver(to); + } + } catch (bytes memory reason) { + if (reason.length == 0) { + revert ERC721InvalidReceiver(to); + } else { + /// @solidity memory-safe-assembly + assembly { + revert(add(32, reason), mload(reason)) + } + } + } + } + } + ``` \ No newline at end of file diff --git a/docs/Computer Science/Blockchain/Ethereum.md b/docs/Computer Science/Blockchain/Ethereum.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/Computer Science/Blockchain/Solidity.md b/docs/Computer Science/Blockchain/Solidity.md new file mode 100644 index 0000000..d0ceb6a --- /dev/null +++ b/docs/Computer Science/Blockchain/Solidity.md @@ -0,0 +1,193 @@ +# Solidity + +!!! Info "What is Solidity?" + Solidity is an object-oriented, high-level language for implementing smart contracts. Smart contracts are programs that govern the behavior of accounts within the Ethereum state. + + Solidity is a curly-bracket language designed to target the Ethereum Virtual Machine (EVM). It is influenced by C++, Python, and JavaScript. You can find more details about which languages Solidity has been inspired by in the language influences section. + + Solidity is statically typed, supports inheritance, libraries, and complex user-defined types, among other features. + + 说白了,Solidity 其实就是一种智能合约编程语言,特别是以太坊的官方语言。 + + 参考: + + - [Solidity - Solidity 0.8.26 documentation](https://docs.soliditylang.org/en/v0.8.26/) + - [xg 的 Solidity 笔记](https://note.tonycrane.cc/ctf/blockchain/eth/solidity/) + +## 1 结构 + +## 2 数据类型 + +Solidity 是一个静态类型语言,并且没有 null 或 undefined 类型,取而代之的是默认值:每个新建的变量依据其类型都会有一个默认值。 + +### 2.1 数值类型 + +1. 布尔类型/Boolean: + + - 取值:`true` 与 `false`; + - 支持运算:`||`、`&&`、`!`、`==`、`!=`。 + +2. 整数类型/Integer: + +3. 定点数类型/Fixed Point Numbers: + +4. 地址类型/Address: + +5. 定长字节数组/Fixed-size Byte Arrays: + +6. 枚举类型/Enum: + +7. 用户自定义类型/User-defined Value Types: + +8. 合约类型/Contract: + +### 2.2 函数类型 + +其实函数类型也隶属于数值类型 QAQ,但是单提出来了。 + +### 2.3 引用类型 + +### 2.4 映射类型 + +映射/Mapping 的语法是 `#!solidity mapping(KeyType KeyName? => ValueType ValueName?) VariableName`,其中 `KeyName` 和 `ValueName` 可以省略。键的类型只能是内置类型,比如 bytes、address、contact、enum 等,但是值的类型就可以是任意类型了,用户自定义类型也可以。 + +给映射新增的键值对的语法为 `_Var[_Key] = _Value`,其中 `_Var` 是映射变量名,`_Key` 和 `_Value` 对应新增的键值对。 + +映射类型**不存储键**,使用 `keccak256(abi.encodePacked(key, slot))` 当成 offset 存取 value,`slot` 是映射变量定义所在的插槽位置。因而映射类型没有长度属性。 + +映射中未初始化的值会被初始化为其类型的默认值。 + +映射的存储位置必须是 `storage`,因此可以用于合约的状态变量,函数中的 `storage` 变量,和 library 函数的参数。不能用于 `public` 函数的参数或返回结果中,因为 `mapping` 记录的是一种关系(键值对)。 + +如果映射声明为 `public`,那么 solidity 会自动给你创建一个 `getter` 函数,可以通过 `Key` 来查询对应的 `Value`,比如文档中的例子: + +```solidity +contract MappingExample { + mapping(address addr => uint balance) public balances; + + function update(uint newBalance) public { + balances[msg.sender] = newBalance; + } +} + +contract MappingUser { + function f() public returns (uint) { + MappingExample m = new MappingExample(); + m.update(100); + return m.balances(address(this)); + } +} +``` + +尽管一般的映射没法遍历,因为没法枚举键,但是我们可以建立一个在映射之上的数据结构,这样间接对映射进行遍历,就实现了 Iterable Mapping,下面是实现: + +??? Info "Implementation of Iterable Mapping" + + ```solidity + // SPDX-License-Identifier: GPL-3.0 + pragma solidity ^0.8.8; + + struct IndexValue { uint keyIndex; uint value; } + struct KeyFlag { uint key; bool deleted; } + + struct itmap { + mapping(uint => IndexValue) data; + KeyFlag[] keys; + uint size; + } + + type Iterator is uint; + + library IterableMapping { + function insert(itmap storage self, uint key, uint value) internal returns (bool replaced) { + uint keyIndex = self.data[key].keyIndex; + self.data[key].value = value; + if (keyIndex > 0) + return true; + else { + keyIndex = self.keys.length; + self.keys.push(); + self.data[key].keyIndex = keyIndex + 1; + self.keys[keyIndex].key = key; + self.size++; + return false; + } + } + + function remove(itmap storage self, uint key) internal returns (bool success) { + uint keyIndex = self.data[key].keyIndex; + if (keyIndex == 0) + return false; + delete self.data[key]; + self.keys[keyIndex - 1].deleted = true; + self.size --; + } + + function contains(itmap storage self, uint key) internal view returns (bool) { + return self.data[key].keyIndex > 0; + } + + function iterateStart(itmap storage self) internal view returns (Iterator) { + return iteratorSkipDeleted(self, 0); + } + + function iterateValid(itmap storage self, Iterator iterator) internal view returns (bool) { + return Iterator.unwrap(iterator) < self.keys.length; + } + + function iterateNext(itmap storage self, Iterator iterator) internal view returns (Iterator) { + return iteratorSkipDeleted(self, Iterator.unwrap(iterator) + 1); + } + + function iterateGet(itmap storage self, Iterator iterator) internal view returns (uint key, uint value) { + uint keyIndex = Iterator.unwrap(iterator); + key = self.keys[keyIndex].key; + value = self.data[key].value; + } + + function iteratorSkipDeleted(itmap storage self, uint keyIndex) private view returns (Iterator) { + while (keyIndex < self.keys.length && self.keys[keyIndex].deleted) + keyIndex++; + return Iterator.wrap(keyIndex); + } + } + + // How to use it + contract User { + // Just a struct holding our data. + itmap data; + // Apply library functions to the data type. + using IterableMapping for itmap; + + // Insert something + function insert(uint k, uint v) public returns (uint size) { + // This calls IterableMapping.insert(data, k, v) + data.insert(k, v); + // We can still access members of the struct, + // but we should take care not to mess with them. + return data.size; + } + + // Computes the sum of all stored data. + function sum() public view returns (uint s) { + for ( + Iterator i = data.iterateStart(); + data.iterateValid(i); + i = data.iterateNext(i) + ) { + (, uint value) = data.iterateGet(i); + s += value; + } + } + } + ``` + + +### 2.5 运算符 + +## 3 单位与变量 + +## 4 表达式与控制流 + + +## 5 合约 diff --git a/docs/Computer Science/CTF/DNS.md b/docs/Computer Science/CTF/DNS.md new file mode 100644 index 0000000..843a881 --- /dev/null +++ b/docs/Computer Science/CTF/DNS.md @@ -0,0 +1,87 @@ +# DNS Transport Protocol + +## 报文格式 + +DNS 报文分为**请求**和**应答**两种,这两种报文结构类似,大致有五部分: + +- 报文头/Header:长 12 字节,描述报文类型,以及下面四个小节的情况; +- 问题节/Question:保存查询信息,长度不定; +- 答案节/Answer:保存查询结果,长度不定; +- 授权信息节/Authority:保存授权信息,长度不定; +- 附加信息节/Additional:保存附加信息,长度不定。 + +### 报文头/Header + +报文头的长度是固定的,一共是 12 个字节,包含了报文的基本信息: + +- **标识/Identifier**:一个 16 位 2 字节的 ID,在应答之中原样返回,以此匹配请求与应答; +- **标志/Flags**:一些标志位,一共 16 位 2 字节,从低到高依次为: + - **QR**:占 1 位,标识报文类型,0 为请求,1 为应答,DNS 回复时将其置为 1; + - **Opcode**:占 4 位,定义查询和应答的类型。0 表示标准查询,1 表示反向查询(由 IP 地址获得主机域名),2 表示请求服务器状态; + - **AA/授权应答/Authoritative Answer**:占 1 位,这个比特位在应答的时候才有意义,指出给出应答的服务器是否为查询域名的授权解析服务器,0 表示结果不是由域名的权威服务器返回的,因为查询对象是本地的 DNS 缓存服务器,1 表示结果是由域名的权威服务器返回的; + - **TC/截断/TrunCation**:占 1 位,用来指出是否报文比允许的长度还要长,进而导致被截断; + - **RD/期望递归/Recursion Desired**:占 1 位,在请求的时候设置,并且要在应答时返回,如果该位为 1,服务器就必须处理这个请求,如果服务器没有授权回答,它必须替客户端请求其他 DNS 服务器,这也是所谓的 **递归查询**;该位为 0 时,如果服务器没有授权回答,它就返回一个能够处理该查询的服务器列表给客户端,由客户端自己进行 **迭代查询**; + - **RA/支持递归/Recursion Available**:占 1 位,如果服务器支持递归查询,就会在应答中设置该位,以告知客户端; + - **Z/ZERO**:占 3 位,未用保留值,值都为 0; + - **RCODE**:占 4 位,返回码,表示请求结果,通常为 0/没有差错 和 3/名字差错,当出现差错的时候,这个差错由权威服务器返回,表示待查询的域名不存在; + - **QDCOUNT**:占 16 位 2 字节,表示一个 16 位无符号整数,指明报文请求段中的问题记录数,就是要查询的域名,一般为 1; + - **ANCOUNT**:占 16 位 2 字节,表示一个 16 位无符号整数,指明报文回答段中的回答记录数,查询报文中该字段为 0; + - **NSCOUNT**:占 16 位 2 字节,表示一个 16 位无符号整数,指明报文授权段中的授权记录数,查询报文中该字段为 0; + - **ARCOUNT**:占 16 位 2 字节,表示一个 16 位无符号整数,指明报文附加段中的附加记录数,查询报文中该字段为 0。 + +### 问题节/Question + +查询包只有报文头和问题节两部分,报文头的 QDCOUNT 指明报文含有多少个查询结构,每个查询结构都由下面的字段组成: + +- QNAME:查询的域名,长度不固定,ascii 编码,域名内以 `.` 切分,具体分隔方法(DNS 标准名称表示法)如下: + - 比如查询 `example.com.`,由于长度不固定,加之以 `.` 进行了切分,切分下来的部分都叫做 label,所以我们在每个 label 前面都加上一个**前导字节**,表示该 label 的字节长度,所以例子的域名就变成 `\x07example\x03com\x00`,这里最后的空字符串代表根域。 + - 但是域名表示还有相应的域名压缩方法,对于这种不需要域名压缩的一般的域名,前导字节的高两位必须需要为 `0`,后边表示该 label 的长度,由此可见,每一级域名的长度**理论上**最多可以达到 63/`0x3f` 个字符。 +- QTYPE:查询的类型,长 16 位 2 字节,常见的有: + - A 记录类型,值为 1,查询主机 IP 地址; + - NS 记录类型,值为 2,查询权威名称服务器; + - CNAME 记录类型,值为 5,查询 CNAME 别名; + - MX 记录类型,值为 15/`0x0f`,邮件交换; + - TXT 记录类型,值为 16/`0x10`,文本记录; +- QCLASS:查询的类,长 16 位 2 字节,常见的有: + - IN 类,值为 1,Internet 类; + - CH 类,值为 3,Chaos 类(这是啥); + - HS 类,值为 4,Hesiod 类(这是啥); + - `*` 类,值为 255/`0xff`,所有类。 + +### 资源记录格式/Resource Record/RR + +答案节、授权信息节与附加信息节这些字段都应该使用**资源记录/RR** 格式,分为 6 个部分: + +- NAME:回复查询的域名,长度不固定,跟查询域名对应,这里为了减少包长度,一般进行**域名压缩**,下面会讲; +- TYPE:占 16 位 2 字节,跟上面的 QTYPE 意思基本一样。 +- CLASS:占 16 位 2 字节,跟上面的 QCLASS 基本一样。 +- TTL:占 32 位,表示一个 32 位无符号整数,标识资源记录可以缓存的时间,单位是秒。0 代表只能被传输,但是不能被缓存。 +- RDLENGTH:占 16 位 2 字节,表示一个 16 位无符号整数,标识 RDATA 的长度。 +- RDATA:不定长字符串来表示记录,格式根 TYPE 和 CLASS 有关。比如:TYPE 是 A,CLASS 是 IN,那么 RDATA 就是一个 4 个字节的 ARPA 网络地址。 + +但是问题节与答案节等的 NAME 部分会有很大的重叠,所以我们会进行**域名压缩**,这样可以减少包的长度,节约报文空间:当域名在报文之中第二次出现的时候,只用两个字节来保存。第一个字节的最高两位都是 `1`,余下部分和第二个字节组合在一起,表示域名第一次出现时在报文内的偏移量/Offset,可以叫它**压缩指针**,通过这个压缩指针就可以找到对应的域名,真实的域名在整个数据包的 Offset 处。由于一般的报文头的域名位置还是很靠前的,所以我们一般会见到 `0x0Cxx` 这样的压缩指针。 + +一个域名 NAME 里边最多只能有一个压缩指针,换句话说,一个域名只有可能有下面三种形式: + +- 一堆 label 后边跟着一个 `0x00` 表示的根域(也表示了结束); +- 一个压缩指针; +- 一堆 label 序列,后边跟一个压缩指针。 + +有时候我们甚至还要在一个字段里边表示一个电子邮件,位了方便复用,我们将电子邮件里边的 `@` 替换成一个 `.`,这样编码就都一样了。 + +## dnscat Protocol + + + + + + \ No newline at end of file diff --git a/docs/Computer Science/Programming Language/C++/Object Oriented Programming.md b/docs/Computer Science/Programming Language/C++/OOP.md similarity index 100% rename from docs/Computer Science/Programming Language/C++/Object Oriented Programming.md rename to docs/Computer Science/Programming Language/C++/OOP.md diff --git a/docs/Computer Science/Programming Language/Python/03IO.md b/docs/Computer Science/Programming Language/Python/IO.md similarity index 100% rename from docs/Computer Science/Programming Language/Python/03IO.md rename to docs/Computer Science/Programming Language/Python/IO.md diff --git a/docs/Computer Science/Programming Language/Python/OOP.md b/docs/Computer Science/Programming Language/Python/OOP.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/Computer Science/Programming Language/Python/01VariableAndTypes.md b/docs/Computer Science/Programming Language/Python/VAT.md similarity index 100% rename from docs/Computer Science/Programming Language/Python/01VariableAndTypes.md rename to docs/Computer Science/Programming Language/Python/VAT.md diff --git a/docs/css/MonaspaceArgon-Regular.woff b/docs/css/MonaspaceArgon-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..adcd7ba7d4bde2178d0723b64108bf0f6c1824a4 GIT binary patch literal 48612 zcmZsCbC4)M@aMkuTidp6+qP}nwr$(CZQFQj+rIt&?&|9PxT*BiOi!nisSZ9#cU)yf zL}ZneWB~xW4*?(n0091wEdAd9zn7qh2p#|c}2A zk^PnGwZ= z>j!}NOL#xs0Ac_DasWW^003@(4E2ok0QSf~FEkF`ta}*f8g=ym0z%Qfhw0vZM|5G* zl`kLswOl|+;>ZBBDxgMx6}bJWUIdDx5=RQ&vjQH0s+)V2pomfqYUv_^TVv#N|w#G1NP>&>dT&>S1Xx{ zG;ZLB=?D{~w1WF<-H^kHJf|`~5JE@DO(iUd%J@)DY~vyiXzVbjN%RP^<4VsV@O|?Q zJ`$9kht&E3@pbO)lW$McB6MGTJfA(WYOk9XI+&x|VlG{Mn;sfMW8*?k7n_sHo_2!| znLWq<6y%i=R^m21h{Bb>JA0dzm!RC*XjKpOLWiR%B(Pa^BIBM!l6{MHtjF0f$2=tf zdojN-oZ@8>QK_9Y%FT{OjPMS*NSN+_sN-!~WlV8w5U^}XdO#T5W4~^x_+CkvKKn+^ zW#f)Rdq7@hN|PY(CU>nc5JigHcO{Y5x-}#2SsB)9k7JJJ|7{k!pcc_{8k1r+*mZN; zJ+fembAitqe?^CwJqK8=N%|WLad0@Kp4(=nDCi z>s86~#0<02iosY9Q$#M@q{bE@Iu^8O`u1 zWSoj=Ska6MF|NdeW`7Q7Q(ou&!dCl^ZU6G=^bOrBruEMM_-XJ1E$XGOaaPtvc_&;} z4zYV)`Fw2gzKTfz-Ac*iKF4xi$~}?(SkchyX3xa%v)stg5O8pu%>8d5`U|sr>`0Hl z?JbixX>Y@c=k(D>?)~&jU-z5h_()hn>c7hm%X=IzAXD1q0Me;`Ux1KCHlF|8xAYRf zPA1v-RsQ*o+*~nK`Vo-%slx#z=7AFY_g#P5G^?*~qOYG~puykYUmqjLWMeRH;5GKo zUn)Jl*V(>2Ip~8>kI)Z#EIqk76r=x9=Fc4!F8M3WAQlsx?hF~Hpr`i-paBC0@V~w( zHA5^QB#$*Rzx%^8y3Kr$aT`L+AX738V}h(0GM_!g$FI^4p(EOBw;2wW)`SQJP>5lbL2-j zc@$^dN-cWX4#sXWuY5F=vz3{}fWR|>E~+noZNzRhsh!hl9@4&b;{Dz|>*tDgNJf$E z+bV%m6%Ry@1ZTq_w{rCDdPK|1OaMYV!!V!WPYdi(Ai zY=)6VG|_tfVrdJ@uybPRaY7S&ob-lJ;({eQqljVt*~s1b#SEF#Og}D9R5X(xUoAj* z?+rg`2Z0bXFp=d=HBi(QDe2Q4Sp(k$=A?YG6fl=sA#g66gf?g}at&nffgLQje~ zr`BSnm?RtcNEkcnX>}rpm0Y$#%pGvZmw*RQt#j2?eOOrG?Z$$oV1)+LY?=Q)L`+lv z12&BJ&m`v4mG@&73ThMkct)-Lql^0DYZso|QIr1-vX`CgO}R@xuEmV`bZCX3#~Y!t z0IjcLH%O%A$aM?B5KH@koCyZeBZUR5xg}Y1fU(-H@@?i~K2hrG#aOI3Lc&R{YHvla z=P04nnta_TM6mlO#-WnO#^QVL1o_XKuh7(LQTZ%M6~ki-eLsUreI(%q%!*@ZFWNs& zmb^0WWvs)%-P`E*J>CRzt7f-9K?y*0*z`zzwl)@<(_4o>FD{mwBW1r+N{cnL#b(QN zwvEqrjKvFcv<|iC9F!4MxqyPrGko77S%)#RZ5G!WS zL7qB*;~@hzh|B|kt}qzcp~O2SuCPt7#x$yxFz5X`Hkz79)&0g-@pLk4gGmbn&G2xW^#jiv@av~EV?O|Le3^@;Y7^snr3DCxp?6Ni~q5|3S z#Pa5X+0}L@E)|McGv-l@b?a~wy~TF#yE1;a-=)5xKiWYQ`d@w3ebIcV0N&EB!D2y& zf2$Egr=Z3QR!_-Eo)&DSJZf^!INw`($~sSH0It1Ow@Mz&7uKCrUWnYMM zqY+_YuE=Yf+;wttQICe*#TO~ZC+{QT0Jzw^e93mugAJ=595MGp^nI#qzc0ytDrGL;%N`a-J=l}w?cVnBaH*q#wRMJ2|w0m-ZJZ)MxDVxJJx8!AtLj%oIJsy?M_+hhV>$V(4>$$x#wb;3d_DWmxKy zt&JQa7_*GAo0}H+5Vx5|9i144$quCKcu}oRNP7;zd=5l?j$FT;%OA8(30ym;v9Fo* zQ-qH*Y=c4Wx{P(60#ds!%a&sr{c^?cxgpmE2=E8qHgSL>|l<({L!;t*}+C|3y4$wT5f9I4q*rtWCvjLv0NEWp5o* zn{>^jp{75OEb17pU~U}&z_N`5avej-vW*_hILtLWsZA(+=S@0zSR1b4;J7f<qsH>YfFD|g4&48)%ft*5p=#WGPh0=f`^{K6bxa(kJ`qVJdtRJ zsA;jh^60>~Y0A7t>3q8O`<>kuE2EDx7BuKc1)9kO@6Q z(k|+J4Ctw66}7{X8A)g3P2HQ&%H_24#hFHQ2c11J?h0YO)8UyhePh@?{P+ymePE^E z$Nxs4peL#?N}x&*gpd?3$4f3MVTwCm5cimnL#IYG4w;G(Y%+_ znG}7iQQ>CdGc@y(t|Dg+G+FJ^5TdkzuCA4CN_Lss;Sdr%Q_8N6bSkb{&F;{RJqPj5 zvwdRazXhODLjVG(JLhCXC$as18;JG6%Cqy2znvT(9AW~W#~7?}J}8qv%p7z`KUx}0 zq#pKV(3c$&O&_+~AKN{~PehR+WO5;ocxfbrBO&j3nMZ`dVI+FZD)`J{AA5~0IN2e~ zJNeIKg^{>BV}^8bl$2y6?sbjlq`*TncJ-O$$s^EqO`LesLu7YZp46KoS1A4=fCGI7 zsZjPhyp#b6HLy&5&&v>Rd+?YMaW+KMe-2uqn)a|bBZ_YDw*S1nLTqmtzZLKyl(>>b zjue}fA(xe-l^mBroyD>hS(hoFghS1i?wm2Q1ydKAohi2kW0xEsS-gdImw2JlPDz@_ zO(HTWN_x)p-ZSk@D%1^FG6#>7+Rb$`c3GAzFc(W2+^y_22U(i6ujn|}Y3eGkR6J*N z8euOvQTGtqlxSipPcSfD-l={9{Ve!C_mT%d375JhB`wISQ1A_xV=WhqEQNT? z!DR?YngLxE95@B)EU3N@>Q}Mu9()3g`8?*DQ}i#;Oe%0#`B z*y-DJ$HhHj^h&qAGyIO_z1zj(>hlXw>n7n==Dx0RSuM-ykP|ds)_l_O zmcv~peNy+9*Ij0P68w_))$N5SY4@~O?%0^`cZoyGG&PT-ZdmI6+f=W7CLm&Yo;g?J zph^6&)(vT@ZeHbVzCNg2Tf=+{5DX;We|3GG zXYS0x{Fc5YdIAqo=v++~R)#E3Nuhc-mF@a|jjgl4OOrpbbY{GLhH+*oeuMju?d;6S zo)8mqFw;1hMoNdczI+1HtU&;bRoE(mm}8q!qBn35tO%znvwDAxt4g+|(=qCs^u7Lj zTeO^W>&W?*NbvNl^chYTYd@U#JE?YI81dT&d^n#B+LSW2(?A&twcXv`upOQ7PkFa? z*kddySuT@j&qkKX(S3Y<4uW4H;JbS`JJW3({5H5SY8N_WRO6rX>9uJ|9ti;|f4G65 zh1jk$u$51MGT-#B03`fWu_@^m9$5d6F!(~K;TJKo#JE~%gm5h(_WhJC;zFk0q}|8a zWOFX&KFT355pu7%fgjtLBE|w=@4ncuTa>(NY1?7~033#h%eqCKE)YvFY;^Ja$6vJs_MPP8=j%s67Po zcbOT@O!Tm~duBUlpKZ4(jHS&fz3JC-;ImK7yjUQck+aPL?KX=Wni17?v#kJSTnYw? zWtJR}vduR6mxo*Dr#a_)UNog}2^FHrhhN8fxrMi|7#h9bwt0ZQ*yIJ*Vm^jFrX0x29MzdE>8|~kX8X2 zbw<_UQT=7d@2L8VIgnCEc==}&j(9SHTVH(4ToZmJ2wGoq4gR^c_CtDIF{ne?xOO9V zq1!4M`o)2QllJ`jrtugU`TFDkWXyj2B!C;+&6ULQwe?9dBMYeWF1jtpC3OBw4SX{!KPRvxUJd6~Af5u%QYZ6k?kBD+-pF!4AFj$PBLI6Q= zdjh65u)6DcUqb~R|DGZH{)Yv|3 zKK87DPtq;*4iOLnmac|qBS>-$fo@th-E`m3pYh2HP$gr{aK$l8SCHsAD;>l>9+Ab* zSm(Lz<*Wct7*%8Kg%nI|-ap01+K7xrZ)hQuAkB_fB%(Asv9)I5)pmIg8_*=m+bWo0r_6# z-NQIneUNw8kjK#Q*2JLKCr-{u(&G}t3h#xZ-mn*DM8<;>^y z>0fA&y;p^d94B<3N8^|kUZ4D3r!e%s^C3H zpJcBhw?MB=eERCdK5Mz#W;EB|!IfX7^V+4>U%0Z*dDJX$AOLpBTdiS=|839yCKuS> z)%5Svl?{6@{ZB5%^-WpC2Wy4hh3?|vxoJdcDmnK=h(sPn8H|PhMt<-qSx3lq9xNM& zOqk+9RvR9T|Kwh{8%9nv>c3?-$Q{A`cq1alatV#N9V6g$v62M!rGjKLZ*K0w$Ggh{ zuruTLfS!EZ^nNasY+`+MH5`?wWaH(>TPA}mHPq+6F^eTS63maNOcI8J^z@o6FpnId=t~)7>CDlDzf0i#Innw>PJhV(3UP6TpE1 z(f!MF&<~-~1J`?HcHVB+q`#1p5*Q5>fNt~YL-5xUD{=qXC3>CZcL#k!v90o1bqO_E zSeIV?5&?CHG@hzwGNK^`i;Q$a`aZ;q(%Z$8koBK{l#4oVC{qU30Ldb?_3Za|5SI_0sUd8qunT z@-oQsUq_q1O+@AeOWWXehUeu@2VUyF4?lUG9At(7D;kWV9=TQEfgKReASt-N+F0(Fgr5Fi;8(vru$A7XUKHk}f4~ihrIr@8EYm z`|FM88&Tr)F7wkyMOiZ}-G=RY;LjC8`oN_#uIa{`yI<)QnR^fRd>|&X=k+a{;R+yR z@4VZnZsPKER#6o=ad}A=u*NU{hkrN#0~3YFWoV~(Ji!dflZSp-2Oe_;&C`|~V-eAl z)kV5_=&);>^YjKf?fFI+v9vq;W5WF<$1y~;S&6z@kIX~@jbhQ0NznmKvOetyKVnt@ zcvc{Zt@Z*td?V_!w$;-^%#jiJpD8e%(;c<^4mCv*naOn_os*LK3C1$ms$3xAb790a zww2*&B|F1>7^nWA2r#2N$hpK+EB74dXb6weH`soogcy=-E99A?7p_1_W z2T*yJ%#_H530n92LJr>Xy)LF1l!Le@5e5ZjIgKvq-*JYCd%AF0L{UO110)zsWxfqr zJKI;Bf=UNlLVg3Wt4J1?3WAryHC1ybqT-G8duheLN4f<3tJF0krI_w0u=_51zzCVA&%v#MmsL;vEw^XHN?h zaGXWiaKmq|^Osgdp9FJvbz(y(C$mco@lSYOtWQ#Tsc0}7ok`#kQbFE!| z>Orb^`OkjV%+smUKg*>w5R;eM7<*4))@r!~QvtI9UB#72W6ZM4zMn#>g$d8%x&naF zR7@Y}g4_b@iDn0Da@ic7EM5lbq2y_P?86W&ua(ng=~ewTQOvU3a%b0PMAyr+vqWYQ zqUzW>tbMg(hQDiGnLr$`lmun+%dt(;X3F{H`*Y3IRua=Z;1Z@@6F@%}R zO5K=)3rLfP%UIkNWq^)0mHaT2!s44IbdanJQIh)kd@uv644GB@KqmaTDSJ5_*A{DS zdoTYaZbh#=?KW|b>F>RXHQ20r?MX8UKJlckOG)LAF*1P~Um?8^CU^Kp@axuWG_}ul zyKlY;EGee%d!cz2%tixGUv(jEciUE7s};9<#Tu93*+o5mMR0@3@T|)&!{;}AEXqVh z!k#l3rLF0BkNN0`_(pfvdXr|5m|X_%c4+mYD!gg&#s+&2iHfliyfBG~LE%6b2Ea|m z5qNHP9*QTR;SJIYIfBfiFd>vxjW*8v-SAnqkZh_Vm)@p?;)iqO0d;;;6OGa9(nBW9 zCC2|myU3zZ;HUF??zK{{#)dCfkulyl+E?KhqQCTwIKtjyaS~4yLRq%W<0aHY7(O@stv>1@5^ZNKb@*xn?Iepj?uMFAQ;KL90> ziI6v6C5sY`xQ>gx1rFao=FywUb`U3NGe$ODVe2C#yB;?`S^0JnA zEbFNN68Govb;m9!D(LZI;SB^ofSP^$1#QFCC*LG>F+O*rG1xX{7}Hn&>0O;Oht8eM z5AO3Y>G|e)vZ;_m$?$kB)Ua{f$F$Dtg7OHhon}4ysJ8i2=CWm23d_lZ%|?t79D=CYKtHa5U)DcDe;>=#8g6 zfXX6W?%1T9a_J9)28lh4tmtu6FO4c*o)|g?{YLsdXHCwTL<1BUZv*@nAlZy`!DkjGl92cyRRIUqNJDY4eIZ z<`l|RY_Jz}@JPE{^Al%2c%R>TktcL*8l9--@_t*-8a}O`{ZUe`lZ;hXvA1mMx{B&^#*<%+(^33T`f5|lf@Yr8|F^+|DZn#18Xt{E8 zQIag}BmYj^D+c#jAW7fbhOc7WI=NeVSdiURqLMxQq|71YdA?AZ6p;sam{4TMlN_uI zu?!V~%cy4+;(2)+M2}RUKs0>KAtm#rZ9xg`9Uw6{op5`a7`5XqYBa=*t8qJwlwGA* zgpEOHd6UKi&)@9+lY2(G+2zf-y0vcD+XD3cAx{HdD}+@rVIzXb3$f!$ZnoI)gbBHI zgWJ`CRa*ug!pI4o{D^LlB}KIw`=eGvdF-G~mpTdDaoH7=Vn)c0TR_~LUcsIOVrR|P zXkY2AxECX=xg46yQW7@qu6Uewb|0rAh39;Jc~KK&cKOG38~PvAGe?~v;AepR&fDC@ zXp)Mk;!HMY$IsUK&WA?xId@(2roY)ZF@+n4u%s9EAST9(=m!%Kop92?#b1r6vOpVt zVmd@lcz?JaH2m}&fRLOF!nw|}77^XfB7TtwuK08D*FIr+CpDAwFp`w3Xnw<-NRQ(g z<~Q1m38Q=c7FoiJBVe_4`E&b>5#AyvPQi1;B*9~*Y(OK2r|@D2rJ7mgwk;@6>sK2_ z3<4N*ekep{Fak?164Z8!r980^R`_AjupdOBdT$-U64jAs?94M9)-2=v`qjV{_)O1EUW;;YZ#$%KRh`WhpY$1}N4_h}GNNA(a?|s_8QMUf zYR@1flVc;y++k9}fwZZ{E|zrT4~l|sU|E2UJRoO2gxo$W&Eb%|(Xk6E%jKxgtc?Bs%&3Z>m%nHAj(w(u>xmb`f7y;N=Hk%e z{nlXvcv&qnm1e0yl}asIW~1Rmkjq%Pm$JbUtY##oe6kCOuuzWrvb=6Ec3pz6=T$5W zl#IR`nM6v>fTtNr7#dh1OK5Piiwo1!!4cJXEW{GuS!b_n5Dc->AyD?Qg>C^-s2}}I zo6$7Eh8p7jl*t6V7!k~HqF7Id9>HVxH84r_7jVh?A9Lv@;~x4%Jm_%k2tznQbu(Ws z`2}*AP+OE(y zvn@6<=!~cNRBIA&mp#glL=%`dZSO=_`*vxA>`K_!q9K_LOGMa{17M+ zP8Vf#zbfLh%2=4~fbmOTUx1G)RXjm17mF+Cr?yCHRxrh;D759vH5MuzskF&Fk)t+S z=EIPPpXKJ}c*z$Jem?f1kGkSY=hVrvR$#=v>t;TW+VY#3Dap5G{@`Pqb<}A@=ONJS z)9evk>1sA`D4XtDz%-6^g{Ghk$*xxQeAD zj=8(~jX7B}C@u(>U~Y3qV^IXly~Yd@UEG98v0nbMBFw8`i}nc{Ht24AK2^8ju;Q2$ z;*7RMIx<$ko^~(FIiAv37jwa(XEC_>Q7Nbsqt2TnPIf-#TFe3)S(rd+A_*Y@KSz(| z-yUpUJwiJq(py%mYEoo%2jl)qzQ)hOS(BIf1~E6K|0X0_e=s(k5s97_#_vwOa>j$c z!@1M>d78nxA?J5MMrXeJ$5LbCuV1Rt@W2OZeJU2YPd>;a?}NOJKyQqOu_m4jrWhEL zw3*Qn0Y*)ik9llr5SZODra9IotO~Dy@PSX_9X;i3W~z&Ca8uHvE4PB3K_q5F;r;rN zxey}#k&3HSdxe&<#z9;?TuJ_>dw5QC0`biLqOS{FS>}GDsN_$5jRfK%JMC>))&q)6 zeEFkpLLBg{oAw_5PMF^E6P$+|CosNNnCbV%TUvHmY<875uW}O{pCPu|&7`{itdg3A z3=Ta?l=_KSpuOYIu;C!=Al@56sq5SRicUOH6mNC_U1XN3g{K&Rzwrtlo<_2o~sCOc@=9UA$DWirUK>{Bv2#Y|d0I7OJ zS?9zY)rnb4sWpx@zARSDjEP>W(Bz^%h9I!cy2@*E4;H+Fh(jXZ=Eyz|Y;(AKlf*qj+rbYzB#o_LthZ%_^~OUzYud1>Pw@vi#)O*N+36k%v$ zpA&cM^iKzmC@II%Sc?=H7Nr%m4$U|D@5q4@Jj}QK8za`{L~|5p)VLk?wX(Iyi;Sz-qTKuy!*@4(8 zh}h${rI>f2L{7-ahd58FXS_uU#uE5f4;HBc&LX++x)NKLfk0S;sfw z)Aj2@M*Mp+2H46E6BMFfjtn*qPYTQmtF#z$Q5;#S4H%AOj*SWksrf{y=uYBOaHv9aR1n*SQfd5_2Gv)wtzTbKl*Na!GLQ?d+3YSflTUBYeo`MyB#0 z&8Xb(9aDQiluV?8j`*ydEabjqkVbmKQ#!kpkCqt{pSCM71HPzL4<`J#O{QU*l$av#Sy-@%rK|f;?G5D3 ze-A2zYMdNZTPh7DGU7G;*;;>`ou`zIkg_u-jr*_aa7(lpUdSa$;0W(kyBiogdF??T zg4sg@y1(rE(3MHR=#&uwgNG=MV4Do}^&>uZmOlI$x)`FmtbL>KCxH3u5im&NH#pAJ zTJ>%sJP@s2-ZWq%Kl-vOL~KZMCU-t;pSUT79CdLj`^s({F%o&986o)5F2@OoyQ%71~Hx5Pml~TVS5HbUjF^zSHPqXma1;g5PSRzjQgyDkW=DQ)+Y)I z!$Y@8xmts&c--15FBh}LGg{avXzj}!x&mLBh7I%E5Lu^CiR+3B-m(hYqGyGXw@sX& z@-;vERlQTI(HO{Bd*U!s61-4|fsSY_o+)lCH7{rm)FB3VLE~=}3)i?UDDh9}r2>s9 z&N8=3?B-(R$RP`d40426WX=L5#eK_i)A-)#jZn#@t&nHfqJnq0y!D=grDIQud!BsO zD4a*((zw0B$Gt&>Q6{>VHno6ot^|;!^TGs>(QbbgUCGoYMRJHD zi5nkR4(rX&qfF;E;XPwBzcbG!gCnbfej$nD9%bV2KwZR!AXf=+KCe1s?b6F`J#(!{#zlbmKSkw<8Bt#A8t;f@`eM zr^+4AO&ga+1IKgP%89EyZWfIMerECfOT3II7W}bl!wz*{h_*NbFl)aO#;kzgb9C#| zkLP}Fg~z08{e$w3v^eC?xF9&qc(#>diXFB=Lg^Ozszi6xC{do=8EFBwMX|XvB0+9j zS|`N7%GN2wKFmVqW)TF$ke@w+!Ctfv-OM%8pUNvAZ>Q!q)Oy{}Cvqz zDnDDjHgy2q<=i&N>$au)IMJLoMdvrQBwQ=%1x7zvFh zjYs>G86Tlfot2OiVCt`pw`B>yN>^T=s6!)0nx>Gi=Em zib`z3%uA#bQ*FTMuA)%N2<#ms8lZH*Fe(394L;UoeYs`2@$F_wJIrE&^l8j#hj~sE zjY9rv04NdFC(KIy25>^L!uLDE%}*iPO}tFKWuIBL+Z@}jDzGZmJjUS|WsOE#x{b z=vtm!=j}lN@jAT69khbpT$Z&Zg^+x7wpzjdY3ajyjdelTo55B8Zn{z464{crS@w3c zt}@N)&Skq0U~ z=Kb*QxDCoJG>0O&Q;r{~6n|P5m{tJ_gQIUS#lfLUx+W|ZveEQKY=;*$Mg)1J<9Y*C z*;QmKLx--xPx{}I*F;hAbUg;-eO`oUW<+n&N5o1KM>kcpP#+;=lE?*|nB#;8^hr<8 znC&;0n);Q`Z&t8scRCHt^xnxI>wF_}MH7VQE1_UVvl<2=1)_v<|5M@&9-*s2H0H$_ zILkdnc;h3}^@Pjj^&Wv)jX%=6Y>>M#BqRttdF`iy((Tp=5A2M|o2@NYUs9%YR9ya( zD&JZC;WBKkd@nYpYDRmAb;FRQy$B5Pr_P zww# zUda)9l6aQcc3iTmZ}XnvhN$*7r%R(Inbj@#LM`4?o!q^#is0tfziYFK0+*%oF5hcH zbllX7AlFrm`>jNsktg}iiv)3EgCTv^c*37$AF`Q4SEU+$cL>^onnk7>+i$3bjIgS5dJ)PT(vC~D!M{cCafIh`l%s02+@7ek5uY1t7##~cnvhLN(@h3) zVR{^EM3HMEn`^9xtMBhdM^;(&>J6WI$l%#hiv`R=%K@DA2R;zj2;$bP*M`s3Y}dxO zeXI-Kha=~OCD_yXKGjv4wDy#67GkPBj;bAgs-2J4#Ll}@O8XEoW=f>Yf+mm=Nwp?_)a9B4&o01}KSzN6j^+Qsc@G-%Mjz8^(R&@K|K-Wnc#7vuo35*7;W7r2dL77-xA_l?-`lXX6a} zb(X_*XHDj|^>vK{ZM!Ykw&bz$Q;G+spi?vJp-TAI^S7IC{?FnM;y*l3IXW{GE2tJ= z(!f#sgP|``I4-_!=wCZ!S#wtG8`WbhU9tXWrHTWqxk>v@9r1qhwrcM$Hr$O3Q7rS5TLcgx{0aMy|R)uavAnA&AFI! zL5H>?vt(r<_x!_!4|mzig6Uc2Q=0rW3}>Bg+aZF zrDcip7>C6+xZz&=UaE_IX8pxRafF@sfgn+mYD0PHt zo6i(#vzc!#);~T=SsN`^ooADyhlf16xY}HIBzHV_)Z=L3O84c5Ax_OqvhUSZu~L*D zGS8h>ja(u;BG+-f_&-`cBJ>*c%JjPR0{ALw$n6mh!i5FO@CshVYvpW3NMxoIkjb@_ zuoWH^DP;{xV$I6Vs@Zutl{HE~dEcst)o&t>>YQ?(G9OZ?g_yOPm5ygD=g+4!=Y&s$ zPa57eJ<7fOKYXz7FoL*)4nW4Q8+Maz3$Ky(iFY~mi%oM)D@le8nKcNG;JEO30>A`3 zge(Z6VVgsUjz#Qd;`LN@Xw*T)!ww4^BNcTm>aA-9R)y9CncL4LR~F}YOTLRJrNzbF zSuMO*`tNg(0gsSps*FMC3sGB9sf^F2&(m6oZ{{fRPk5X>nPWTgj6^51TOnJB?t%B7 z$3Mz(s&(abHFi>a3j*eQJ-A+w;;bzI)iMa1C%xTGx1+ zevEvtPcPE;$y~e++V-=qsGM3jdmWkEd0esWMLUJBEnZr$Evc2MOEoDsO|zQnL`tYbfLU{3--a!?q7CdFrv{2Po1%b^v=4*#915@7uPK~?y`t+nxDJVqxO4veZ!|G^3_Vjb`?jLm2 z#`@^tQTB;&R`|$3r>NL-fG|+-!_<&K2Ar$-Q|5?A&QK!%vESi=#)Pd=h6V;->aP3o z1oDk_JUcKv57pJ^K}%xNH36|r@z4J>X@hAYt*)Tzo4na1c>g^pXmE7xr(v-w^Mj^Z zlS8_MHoU|}E-cFcObR0jf2bM$~ zVOu`IzQ{IK@sXe2$Aw4R6Y31cm-Np`u4X6i2G1lX-m{_0s=7p_2qR9n4U(xz_oH%w z!n?_ILNLtp8s(}*l`C|cwfnt4@RuO*KW7)1hoM()qZFFnAYlV$<`gpl zy3ID1RoTI_1DjJAwt{-(5LE^>u%4-BHjlkV3(V%e0h~NR69x3hMz%&CL14U#pqy-8 zyQM#d9Gw1G7w8>exm6;|fcIOdMSNra>kF=-*grPO$CLXIVbGw57>wI{-;=qJ6M=OJ z?a22cTU2aV7n*-uMQll#>2WAO7cP*%64Mq0uT8|x0Za`SB!EbL!f$p zBG}gSZ?GAXr|F0G8nU{SeF?d6;a?e&*WeRUS>`Z#+utJH6E^II&c+9*1m%~T-3IMP z4^xUkh>Fhk*NO=XhRRnU5IEe4N(M6tM!dfXoC`#AA@)b;z?RY)8Rj(>(&q{=VXSZR z6h~)tKFIsg?6+fCK(Yry2{ds!iP*uj8K^#eq_^s>CQ+}-whr$+MHZ+O9^=bKyq3}% zVX?|`EhL_xl@^SKpC-NIANE(wVGP$`po@K1jA7s$HBx&&8t!orko3o456BAhX8_qF zn~SK;*JL%^jR_u&DWJ~HvHARPT~M`_u6Q6H3v(Xlzo(?3CYz%-XfC0&A34_0bkSK_ z+8t3sBsFb$wgK^7u9|D>fOedo?=D+Ux8`V^{<)wwl4rPx=7gMhFky02%yC^S=j^|_ ziG^gL%T(G^$w_YVjRMZ$CVVlQ)=~0JHX4Nst^!&IS_W~!pNr2<&hfWeT@8PM+WnYh z>EuB?A(^)coK19fE(o;*|gKT=uiIQsdv! zjvCEDIf9Q_Eme!~)(5EqM$Xv{$m#I}c%d%SyVL4(W>G7h|ISxYEPBKe7vG$56=3(05w3$zhAU}cj&COfNuWY>s{SxNyT~+Ofjx^-|RMwu6IYq zjK^1?9QPcBKpS*+*T>GXRglr>0ROX49x7&#A6$o^uOK-ef=HhpS`jqU6bkjt9C25r z6i~!VlqHL@h#AtD7pQVb>cllR(>re1VA%XX_bQF%CuBq-!$@-SkWG+()~|aVUxLX zp_l*NqBewhV<3rOrQk023{(To7V7M^CI+Ce^?R6AoFDFCu*VY}#wIiCWcGo8pUF&f z;H(`yii3s2hbn9dV+&1{@zUk#lzEQ!ewv@SlhbO!0)KY|$jmd`lW6pAPfJIuAl zecz@BVS=RX#bl4wf(a4Ebxgv2$y3Q4V)5qC?pm}Uf>Rnh;>_$Q$w>%sFH-hG3!#eH zS#@`kpoy$}xtpS;_hfk2^S*RbhWW1dr8RPnim4LB$ek&zgb5_AJhP>lGA?$_rdviv z4?Gby8%wBb)*50sv=4@8HDK~;`6njB9;2G(Jq<23RO~Iq%o{j1 z)hJJzy+4(wyK|c;PhR@&!&6V&tveV!FxYiDlv9Ok{4PLs;QY#bE(}thjOH|CVOL=L3(?xmr`XdlYRTV{cx_ux!Ze}PqVKQ zda2mCqK^c}%S3q#$G9T8KK-AauFG$VpgB;Mg8r_`=cn<_&p&KoPMrNDyQ3k(Fr$Fd z5CxyZAb(dNl(BhL&`q6mCvdJW6EOSau5Ja_I7ei3O6zE$b|55^p?v-1dnZi$9KvCq zRwtxT>)c`8!06eaO1Va}gq!_kR$0+?zmMtdJI~`5Y#~&|s&8_PfC!`I;4*YnCTqXY zO}o6&PlFh0# z7lP-{(lSk|Du0$lipV_vzvl39I9_moA`R6)sG=PQPjbX$O3LBQSoQon5?rMfBD8>aLtp~d{SE8nIv_<`CBe(j z!z{`a(UsP(m{?)dfyUa9LY0%Xt~xeY?x9^SMSK8_@dIs$7Au#y$JdA8a+z}DaxqTK zo}XnZt_aau59>j)xRsd&;Upm)T)DRg-;Nql-YdIWv)#dR?lJMu8UHzalep)7KfI)~4ul4sm`{eA4!mK2H$HdKV_| zn*{s>JD|NNEF(yO`dVijX2DC?7rt2FXcRN3b<7J;+94NSgCN)y@}C(rTC7vV*wi0& zNrT@X85P?rwzB)Fa;K4| zb?7cJQfH(osf@#h8mp~U?Wwg5w6Dg2){ zTkVXV^5xX8s`9<&%*mWZ_t0eTPLo}SMyS(dKOvV?1ESgPktrA6R4uRDV1Nu` zFd4=|vPAEMiAyC+m#zAr@S3*zJSW2Q`89}89)g`K_xIvf8ERzS8r3|cLx;iG%25wr z`&EXVpKbt$&>CkkW|LESG9TJ`=Y1)jB;?ChX5Gs04`YY38dgYJ|0Q2<_qWfIPmMW!*3Ze~$&I4sc|utfPag_doe zE~@;qE$$?3_)g|txzaPYWy_ue;vBAW!6NMHDGKY68*79KGW}qMpFzf-7^|vH_7)`kZgVJ9f8 zmp9Byq8~p2OZ~erm@6`h<};hhY(A^L23A7WSq9To?QBIxdD=pzpI}RQE@%yGAesg0 z%P5+OXo_tgl;-zfl}$SXW%V;OqUsW)?V88>aX1K##es?Dk{dMa-?C9iA$7c^SRU$f`P$$JMd44ib1@yGRisQ7^s zgLX(w(uel%RWAj?kRtT3mQh$~s?!S7x%XJ(2Nufww2t%+jq5QuDr|C&%GSRMgtMyj z_cUWK{i`2rhL?^*@=;(V(*&vVUK^@2f56hv*$!QPfYPAOa3YhN4{B4f(x5NDahO}~ znQgxa5-gO0;`y)9-rEMv#4M-+(P9=<#%KweL0d+-I*3m14)flDXA9&&HOac1%~k`(DSNL8^lf5*Z&L!_ zQ(o}R^{k<*X4vCeL*RSf0N>_v69an*7;-%;#1=ZoMffnE)1yxmdapeNKJ=Gy7G{cY z&lv5oP=$AIkbRk?ElaND4T)BX@wp{cs4=c|F3b8XAHc|#Txr_ zPU2qc7sj4&A%BF5_bvE0rfrrde8@@0JdmwVI9^aKDK_XW!w~EWL!hff?|2LsOPD5G zp`pmvjTfngA16W0Ur-nCCOWn^_iL>Nc>H6SwdfVk8Ny;RM6%wTiaI~xT#$%Tp2jf! zp%K?rtVX&)M{$nc4LeHE6*7q!41;M#(&yV?A$$Rg6fK5u)8nVg4+H=TYs)K!wPnwN zgq&x{B$-(a9t(ZU_0LsHe;aIuQG7YKF6XdM$cZE|4*Hao6WdKWaaPEQ=Dbi&JP3pC zUO6#S$cdPN@gyhw2Y#OCAaVyO5yYBuqBhA1ddF!*6nhkx6Wav}dc9E`gm}s!>&LZW2zDEbB=Boq=7S$mJ1xOWi4z(GRd*)DOG4sJQ%K|qA@TkX>^`^N=Wwo=0MJ?hJ7Efd>kJeV_GjEPVZXBh`!fyL zPia%BQc6kKFEF6;$_;kifcvJ!;J%80`=-U<{t3)q4oQn)KEeHsddz1vS{(0B61MmB z;eDbI_C+$FXK}nIzE|19B9M=eu|si?H{zj8ab(xBe8_&qM0Q^R3}nAkvJPcFW30lXq(H(q3|V*u|97CZ*yh#A1U+XUW41iTBCU*pBXy|e&c0$J^>0H13HAkkQEX&Ad3 zJQn(xdx3Wo0qb}-eWS=Ok&7db&QYqg7$~H;l`jJkKDl_FsEvDo)WZ27>dIqd4REJh( zP>z#=5#{j6s`S<^rks5ETsy|JCT=Z*nbeEYPp0%a-t_t0O4$5HLR5Fkae{K(rW{8;Xs}CG@(M2{Gq_VZVYuFKD7QVs z;E=(rkx;BQ*j*M!5vz#6%oar9REt`i-iRx`3ftjh?6Mm0whis#aDq-IK8958q&VY* zBE=G2 z#<~J2%5lR-5}&0ZCdo>=>h>e`i{mFwOMQNNIvxV-e`gE0bpglrkm}V`A1vciyf0Cp zo~(Ta{tT04tM|S<2Fpx#mxeY$!l?(Oi0krG;{Z3yyyu*r(^>&_4I?V z7c6xsyCL}g+3Ru4Lmb9E)%0FFT>TFy{RD+NZgW zy+^+MFwcJW{M2DroF0c|K!YYDo7-_fAH$ea$#Fe$trgyK4uB?M16h=1Fpv`p*eqH+ zN3{4M(c+T?%gNN@0T2Ixm%?N!UM)|z31FlEI7+mjG7bNBimL*xSfP{KMW{CWR|D1PLcN$Xjy}=&s@ECE zKhcLWZWn|wT!rR{s_q+izBI~Xk;t{JvS8sew0(@LpfLS(SXrFnKiu_f!h-V~(}J_P zVZo`b4t~MXQ{)w+w>YCm?glpHnJ`DXW4b$Q>`)#@n&-MRik#(@sKH&2ry?`UT_U_T zwFfMPnVc9=rm`g>BVD)Xw6`$<=7&(P1X*YbQIJWgzGip^qOcQu^`@g?6y2Ob2Yzz* zxu0%3AFs~e^y&H)5MB;sgL>ZqMb!Z64E))3-d1QuboTK{>;?7g3V`L-Q%Lx*(Cu3n zyMk3ss~fb$7>+%xsSrkG38XSL@PiuAj)*4syEZ_KZQPKKsdela+c+N@u3orm(MqRw zQGOH4bZMV5D$v7VoDHY^jve6;?1L*RQfLX6vNRvY-|fhp&H05cDQsGo8pLf zoSwJHS{kamM#2;h-7hlFNZf7Ngw-Y28hImBm+-M`q&7m{L$CT07$`qp2T}YYSFV*x zWY&qsP=u)*%U9+#4YxB&{+Fg}k4NhdF(t1HO^e%I26GBFJ$U@r-FGN?p^1$0Ep`Wt zB98CTy5I>TzBo|d{{@@q9jNQL@|D+b$#*RdG5R2mU#}lb!T%HYB=4!xN*d}nLu(PM z79{5fJ`ebUUEs>i7Kse1x<=aYrLU5|%R6^8|5lgdjc3nVIDfWd$JbvSy?L}~IUwA-UZ)ItMie0215Sm={)4H*%Em9VlS*Vm?cbxVA9cGZ}X z<QYlI)smEld$`8wgo4&+Eg}hMKHe)FqiIqkR~{Ct(G#lC!$|fngVn-mPd>-> zTDb)NF7p#EDEwdWKtaX$Ywr_QB4KnuKG)M=;R`E^^}9_qklpNi73kuUlrG0XEv><|cV$=CqqVjOhDO27l(vp{{Q0k1+?s&foUbGaVA6p9Mg zz?y-Wq*cJA=c{GwJDeWPuFAGh{tnrHs{yG(wdQ9IH#}EqV@GTc!yGN%Yt#pugig&p zklFJd`eB>sq`&lZAYkov?oM};0z?jmN!k&8m&J_LXUMn%?S`7o4p1fiy#9)%h>)v_ z3^`Ci5|hLV4TN{7>d*)qK}#4y{||-cO17&w>iZ;F0Yo><9LwwRCz&0nIYk z^;CkO?q@4kitSjhkK--*$*k_j>)0!`pf6{ptmHtjMajlS{aKpIAitTE^Q< zxt>wX-C0hC@OO47qsTwq&5T&)2{6|1ls=YIz(y`g)C@!xY_gc0MlBzo@RKL8CN(oc^+Mnne@!GcukcD z_hQ&V5Gjh-&kneTPY?lOePO1&q)Kh3@eiJdzTw-D)u8=J2vjpl4NV}568BK0&F$LUMG|!S45~u|I2Ph_KIBmD zKx5{#UgGq8=6)=iNi0dI9UeELWt&cRtPQA39>)qj*<^aj_bhyar$RV}Lj&z^5D28S zixr?k5M3a^Nl3s1NF->hF8X*WS0-n?3*pkJR&9T0p(uC8%1I6g?bYBCmbPOIR>SJL z-APIH04Rmg(DP}*XTU#kV3|)J#zPsqr?&RBZ4nIIdSmmB!0j7%tje~7x*jKB-v!PE zIB;xq>X^W>lSa-MY{!r(Fai26aw@wsv}yTk_&O#gUnI1_Hr{>RCEC{&vq^U-SG{KG z&WXZbq9pt!wo%>bl)SP${_4%?x9!TMzq57BkhzJFsO3Nk!I!WUz(iG>O(9Ns^2IMR zzqZ3Um<|24ARlpbhW3bW;PfmGaMiNxyZhaiZ|#urDJEiX9NjS{@pb2*#H8sh>`^fv z>}=+=PNJ>Uhfr~Dn$OZ#x$%cK#D<3<412;y5DwCr>pwbH=yM=hRt~Gust)A&Eup=1 zB%<<0EM@n)mI-n~%5fWvxp4EdgC$+dD3<=kT+8%!T8A)tI%}_2<3kwUavkc%qBzv% zN)n9cN>`}Dl|it8EA8pJT2k&o9LEl-yLJR0%&dbM_JxThZL}#+AF7?{=F|9zKt=4U z>jgm~M8UvLEC*th+b7uCVhTTz5-i^Vp}?R;NEUOfrp4Z-`Zcm>U|7>2!Zi=-nWrfR z4ecNi$lpd>U}Dk4w2H$lGp(O5mA`A8JKKi4@cr7DiZ$VHaWJHZ6XqlUpNIh=gVV>1 zd($zxZ>!8mJGQ{s>_Zsl%)<84xS!yqRN*f(F_9QOhMtApw z`ohzq!R<;Xrf8xlUZE%Ce{CZRQf8j!Oky#zr8}D-c znJSH6!uK)jJ_a?!s<0l1)dIsw@3%{3-mMQ;j+COYdN`vJQ>J7fiN`lf)fItNX-8eE z3#}GKmUUtnwPs2-CEZOaM~j4GC|!0{j)BGsCZ`rf(}1GXAHhn4fi{WAAEzuwDa%xm zCB4vbxpJIxR`)J1XF_Qjjg&Bt5*`%^j}z_us{9w#J*^@$3qb5k(xN0pBw}_^{4R>$ zLGdF*{3tVi0xX;$s&EC${+9~X#8@cShw`x6=UUy&=MPamC~F>Ny-8V*VDLIBXLy6Y zEhFjjqmkiQqP*~eyZz|LdoDit!MTV|{Y=7^e{w%B8flPu;762KivzzkrjKemcq979 zTM&cv7DnMRL^U#~H%?`&)*5@y{opm`AWfu~MAhecR}57DT+x*|qAMpGU704j@)&g` zR)O8!IK{_`?~QyR^m2Wj=J(9K!v7kBnhcsS>sOo}Bo#eZHNKFUU2ZxHoIH`b_rK>E zup|4|ZUHCHV){v9Q<>Vo@K9qi4ISc2L&xNqPCSqQ-|slHZ%@iKfyv-7$hCc#u$Z?3J^BIu3;hstY4Ls0sIXXL3Mce4SZ1^ljT^vQXN;Kidj@Ww8K2K!menz z95}|9&QA+_=24+vw+2T4M6*t*%q&zin>(9c#oUT!%V^?=k9h-_DCx7EOmTNHhTSt7 zb?%LP46}}5`dFA(Qu0xtXR4OhjV*#mS09L|^aNH^V^GQ6QMm+VxUx%o;#wvtm(rg| z`bN!WQ?AlB?2@sYe--M{vGY7=hRq-zp8Q$r5a|^A4J1Y7cv{@|4xZ;aC!M%;W5Z?p zgZ%@VIX$bPgJquUnglhfUdEtGo_uHkSEtYfqryYQ3?GiEW+F?go(XEv*)WJ zUM6xEEXQtsL!^E@V34v{+p+{^{6SY+4)2R9(bnbyRf$5i_4$6)RB4^RyVO7qE#U#Y z1W$6|$3Sc&55*-laerNWGjOsT22+zEvLo~l#9%oQ+r?u724GrXnp_8_HH5u`VM!ph zeJ=h844*(VG3;KIe}jQ{Vc3^2IB>mu5eMDE;g2yT(342zNS0wStb`@FQlfXfZ+h*b z62SpjnLwrxs<{pw_GXzJXFt)=OwFV6nb4qrn%Xbn%Ct}Jb&#W=uP zDh{yLLllSJT&p8|Ho9}ckK=om16V_Hb-l+{9ohFibYm4cyi1$&1Vi+;X~A);R>pVA zL6LqU#@~n-4GYE1<$dqXC6$x%&KB}*1;|(E4hm#N6Df78cH4#{XWYcH(1vcCq3sPQ z3nS@DSe7w(M8ohJBff)R2W1x<^T=<5wC)D?1j^b~Fli`5I4l>pXyLeAf`$+win$zC z1VJ<`Jpf5VUkFdDy@gYDVw$q%IfQ6D+DrdL!%gRhyiV&DuZ2x4z1uSP2MKPb#R<{ z9c(E2d}Le)=Y$LQ*_WXV^BrqU=kN}-`a|eJ^_~C{YcT*F_DTuAFkGW434FRy)P~;$ zy_jU}hF;G7*h-qc`!hCyStl^~T9s{Sd;)X5Oj`Kh$D;Tnl2o26q#D$Z8MSpwWO{@1 zpgDs*dZvtN7-$>`q(PvhpTXl6Q3cnkWz1DghI#O+aUk$Fs817qDnwxvw1NXvn|aE45|?slE3sdJLmx$}wWWL^ zq_{2!;at%l&I`2fFMs)nVS+pWk2J0m2eXnlvsyPl^b_uk6_%@LYKjl=QACNRy!Gn zKs}CqWkG2-N#>Y=%(a8ytUf&W1%BLXdV*Ar|5u2n&u53)F1+QvIX#v&9XqAEE9RU z-D4|{?4u((%XiZzTz6W%`17kk0MjcXjlw@=0YeF#@JGb>7mpa_gCXh}OQKNtKckRll;JmG^{&@Doe4*gg>Y0|z)@r|ILd=12O;SVSV}CP z2}IaQP*far2#OMeV@?%=q8`Pe=yy@MN5wg|6qqz#U{XX$Ofnn7YCsaKTQMB3FU|GuLSbOeQGM!k(wd^+t|( zYnCH@YD)umI=ui*t{Ko%xuMBWpN$$Zr!ZyZP6DC!353f2jQxXK|H0uaLMR(_DE^BW z0-Ej##mdW@coA?>pw9^`%=ICd2yw3y2sT$BSoU8a*f9gaOdtOO!{(O2FsKgE7!9rA zz@Me|iB(HzMkxczcG0TkjCAp)AgsSqNp(1ZAzgPHv&j*;Cr({BNA1Pu|82go~G9s6ex@s`nRy1OCS z#9JbKl?a~}gio7Sv#3KWa7bCc!EMW3v@@b9dB2YeLO7I)%i zX2XCBW*7|Fon0UW5|U8TArwPN=+b+UVg~^wp%alVB_LIbu>%4E4*{`YK|uus9@0^i zA_z~U{_pIW4d1z&P+t4`Z+|=G+;dOAXYSpZo#X!TlTi(PnNEE@wVFeHUZN&ZF^AeA zV!pGqOgTKphn_nl;ow#b|2%w!L_Kc zZ27ENuY2iH=deKoM)z>H8@%RoDHy zVa6j9Suoj0UVA_lB>cGN{DuAPDS_hiI@Yb1`wil~uF)Rlcql%bVmhpfsA&B8&H4{F z`cT!h+Z?3H;Nnbc1Qlo^W`P0cXI~xuy|`{BslB@7BG~>Liu(_Yca7@MMD5O%z@6?&xRI6`ms_b2YcFH$+1l2a8CjTbs zQTBu)+~37vt!Dv@K$iMBOJi+PH&8u0%kogR1U$L!YvzZhb!uoT;JO8f2(MH7EThksOE?L%S{9anqWl@&2D0XY;+ z!=va2x=Lwut6jhO^9OtTp_?-4^KT}fbK^}cxPk`Arp34Im>+zntvto`5~_-8s3qE< zS@7)()D3;bEws~b;!&%8+_HIjK(+4M00;if^zJ3y_8h$W1s$Z=n*`h(qdcsEA5v5`_-rLlUj_a?h(J#|>2e z?L6X+d6!RF@yg06;dqZ6HyTk?RA%?y&%fv${&e0Ds_Ld;6oC+=b3wC@t?9;z5B~Pv zo8EWUe7p89H`3v4NSRb6HHIF_^^ILHcEOm}!fD)dWpf}N+%A+sb@O*Itk=|l;8oe}_lKXV--hr}` z?21!(ZV@St%)?5o6U9-1&oRM3$A7@YV_sdLA51p#N3(pnb?A}SB>xjbX>~55y-yB` z)AE=1?f3xO999G(jmwwb`u@1@=ywNL*!5B3X-Y#|`ddPBew#+#Chc30lejFv(@2x0 zF1&&2;+!EC;4{1mzlg^3wA;?J7tqHvo5-#~!?8!?dBv1s1IpenPMqD5n@C}8x@On! z^Wz`E#Bw4O?JygQ@v1`{L1p90(f2?7#`pDShi_q5l;}g@7)Wd4o4nAolecrP915i! zQFc!_>3OX6+ULYoL(IWKOvmq{CX(s89m9b%pQh7AJC5q%x`^?L&dUs_yS_YzY8vOF zr_oL3B5Qjv7tuLR1r1a?eY%O`rX)k1MXK}7mq$z0IV)4^wtMQFm#Ou?sngc)ag>h1C#5P%pDd{Ujs|N63FtbI;<^`G9BE1rGIeD#Vb|9ga}FxKR$?|HFjkU4pr zCic8)zKWq~zouP|u#!XZBM{ZG7(3i}08^`499wa`j56 z^#aN}M2^@wRGa)C-YPBj3^Y02_FJrpon5raD@?Ixi1rFJ?UgyEzcM4=ceFG8#vBu0TR(@Qja3pX?=!{-ycd{KTAx&L z1r3EueKcHSTLlWA)%21=`di>-<3H6&WQ4^gBb1d=bWOg5S|^cGO5jE&_ig&DMqieU zFgBX{ox-ao1JKF5j}~;xKgOD9&B#=YA6Z&M4;25;YBN&tVzYM1o`&XK!t@0b=FXk& zdedsqM-zM5UT+-NP_g9MhNj-%u23?|z~`#|20e;$PQ8E7icQ#x{ey1S-$1f(^TH~W2kpcIJ zlm={s=!EikL=q`PEXTzmllGPDWc&SCGR_FTgWf9zXmD4S!Uu{G$c73M7Oa(WUqb6| zS0b#IO!FqPnIuw7yJ?W-ru#InOOjU}sBiYM$qVay#D6pCqkkQ}GY#~w`!m&}dOSVr zPu(sgqaNyAxQK3EJG=_2ZT|SonazEv8dV?MH$8pu$EfZ-INjK|>dg%sR^<D0B(I4oP|GqT3%o3bya`3(^>!j%0|DP&5xtQ|5 zry6V=XrkqnP*GiUb%^SCzY9z7JBH??hb+z~y<>%7qoH59U;E9+Zs9v+H#eJJGVBC) z!j=ngpO}%4o|hu-zSdp;R9vSmNH=}@sR!yedjG9{qyA}G1xNi99yR?(WqMNva(X+% z_V=hYIHjH8l%^IA;>L0E;8o6lKR#$T|C#SK?wG`l1w-XgmdR)Xc~fPvgmq!q3JKyY zb_^PC<}it&W%Wiq4-W|z95p-@s{g8aZk$nF)$TTh&natiw&EtSotx~6`JuS8T5~al z(qnY;Xz8mtU50x6Zy3l`F%6xt6r03bQQ{q1iVukaUgCz8G!gl<(w-HCF($Ja2Ah^4 zGeWfRIQ#1ZJj!TU_*5@0>78YumRap-*rDQWkFvmF^?BNmMNbu|nR{a&C_`%5Xl0PX zl@+h`F}WBYH+ZFN+!eD~3npD5-Qg+MN~#gI3Yi`nsCvZH_Sx~8e<)(jAZ|A_G_6Gp76$J zO@Dq#i17zi{m*qY9za%RGxGCxZvz#z`--!bMMJ3(uN`+dtbR`~)$Ud6x?EbVEBQUs zOON}z8!Ygf9{jbVh?yXmBmK%_)cwhDY6?-?pxc*2cj- z6Y{_IQ3JcCf)*+~_(f@j3aIcHIv~d6)o%2jJrwGLinYqnzn{#%D$AurC{&@WT#CCz zhh=Yc_Mw5O8I;IFzbLwYKet!-i8{EcGu6&yqdn?7OA*Qf4e>YHw@0XtR9dU7Y1Xi~ z=3Gs-=(iV?8Ll~UOt#pik%qJo*RhmEF4J0YkxPAa(!tKZdhJR6D<5l~u%AmF8z1ar zErX5cWVb#ZXV}ntHBUYMC;itx=G)*1(fo1NHg?oq7HJV^fcAGnel83_R`69#=ziy+ z*B+?np--}6S%ia9gq@dK+!bNcJrNAFAFCj5`Q^iC;6}=o(kdubn^UW@Dky2{T*PaX zhX{I$mQXKp(uP;Op0IgU&`$PTQP%T6)lZp=Mhcp2M)pO_jKTuSEhExf5}D%Fcd|;Q zS<&O1j!q8Ve$A=!C?0Pd%#j|&Ul4l9^YC8BC2LJ%HrDb#&zZcnhjDwg+S(;g_0ONmsn``LZ|v2WB)30Y@?iT`P26}_vu`|U z-o@)`qEQuDWKP^ryKzx-UJC8iB;oKM93Eu@_q1*!BXC>w_?HAW80geML$-RF`%^{_ zO%)ZYbTzFilwtTAA)};`DkVjtCw#{-Qz{iadAQCoR^%rSJ!N#4$)OKZAMNm8vCeYl z+b*-+%)c~`vVxEN?*{XpM0xn}GL&*f+;Dpnqi8Sj(XD;V#G|;8#7~}k!aeA$4-nI- zkHJ^CWRG&zA03Fq!&=EI>jinMIWR&NBMgdFl`IQrerGrzX`tVxr0J=4;^>weUSw_qCSd%7Pz zwuf8Vf7ZB3`<`iDQM(GmjvXz9HEAqiuCm-H-s8MD-0CFr;>Oav=(3x06Ya##2=VTn zkS&EFda>9bIvZnTdhD%^=Jco!phD5dNIcN>*Iy5Q`Nzc;yVBBHc1mWlcZao6HmvW2 zyer@B#shi06?!+9eENy0kC(~UYZu-h!B-9=%Z*f|nsa!-mW{QgcL%JCg-i3V$Iejn zK=;z@(7++?_%|7n^@F1L?1m))gBBo{BG@EL&>K#yU*M&7D-_BbTe}%Ga8pX{eax#P zA`hYUHs3T%QYc-WL5&n@GMKWHX=ap53}Zja>#R$}i20%Li(;-PB4P~0qTFSqAdSjh zq*(rxOQtkRLAlz9^|?w1y?>+Ql7G)R)78oJ|K<=b4z|*QkPWo|UJbHz1j z9?C8`-2A!&=&msl4!BTs<#T^I8NR{toEV^5xxo>ELsn|22ob+HM2LT+5lD54UvN%w ztus4&lw1eSbDz(cwJ4u#qKhgIQOvC8s9&-aWrq?j& zx%=xZp6n$ms9hP(JSg0wI30NHuBw8u+Ltn!&y*)hRm%?l&}cr>nHcO!MSM7ckry(_ zAdU#;EjFD;Dd!OF9wgY|KEX*+>as&77^D&;SVp_2&4~X>bC@YV!8z`$p0HyMaWIT` zGGWzHU1Xz5DVXdaxXJ@y|8NQQ4@Z@f;bkxsF%U&$8+XB_v*I&m@W5&&D`PhMT61BD zDaNBaRYg_)%IB{;=ob+w<{J=G;h-wHG_Rm}ByG!vMyc51##^XK160aMIgEL`eJhVC z`nm70lr$vK?7xNUzhU+klt)rqEFE(+l4;HBaP}wUxG?~6^p>jsMO&yGrO>wHzBiij zP2Bx7j~=2&NlXh53iB#Dun_Ib1nQxmL!`}t%{_m^7HCMtwrpR)A?BKkd2pZ##Qboy zb&@Eehw$ir%zNYSk=S;e${~fexalp5<1j?d*~e&J2j7?`ivCwyT8i?NgxLeb^@}un z5NVY39W7niI8r}H^LD4?P>x&9iSf9G>*(OXb(X-2K~4J^kGf7ggPMVuV5`-cTm3F> z^*9d&VyLEg#$$D{pP`ygPO);CfF!P9gus899pWgR{#J8Y&mvHU3IE@XapPvr80TAu z@)vKhcA>Sw!!P?{Q-s|-wHGSF8XY8u7pF-xDEs%OP;Q(Kg0mSsZajDO-qKut+#?zA zgSnSau1-}b^l~F+K2=NJYEqaiqaGB&xZFrV##F7&UFhq}XU|*ieeQ0jaF$S3r%mN6 zg9u0oB^%!@?cex&ImhfRxO)xpqwFGbkJ2Bd?C)Pn!b4MTQL;h zib0hAC0(%jW}tj_Fjp)$^wl_TuSCX|jPZOBBjZa&c142hYt`|~muK0}EBb2s)*g)X zZnz*;(FL(m(R&0Mmb_pfqbtsfH|V@rNqqRNJydbc$oKCq2*qKs(P91dqd_M{SDX|b zsLlo3ur~<9UVj%yRAL-a$=}()3A-zuusfhmU15j~wjmga)8XsEw@lv&9l;xU5-DUC~sc21}pSA;&DjbfW??$e*N()FYWLZP^_|K=!l}H-1JbFKJ@f3-*D0*%ws}EG1 z`@blITPiBL{q27$OXBaDT{=Lin@1!&{an|&TkuR}ycj;>GI<{L8n59f z*H}7}rwP__Wtr3C|I}JOaVC4tW0jZPk>m8J%}UroDNc{|SxK_AY$Z)DJfB7?&mE_k zfxcgu`cjW_g?ijws>+F<#CkaIe}+}MX5}_vd=c!DX5#1yO?2f+r}_t4>EmTzbkG8Q zG2PT>d(?7t{)DEdid+xnGh7%9cU3E083y_A0Wv)(QUiU%?j1|g)1@$s!(~kQ0MVZ7 z+hrlsd&k&$@0cwls-QB~!?^dm3rDHPSw}@AMe#bBFEg(Mmzmg!3iK-eK#WN{sRCZ5OLMi-C82)P9wDAGC8E=H;M<=}qn>HBWsu0EJDEt3$ z&tuh)Eni;xiAU+^5POkrc$B8d@c6$_$KrzV3Dxr`)kTtmERK<1L{e|6=if@lmC??- zzfe6YE#)a!NgOoT>|#4~Cb~H&MCURgkSB%kcj&F5qQ(MPYDxJ0kSW(9%@lti(|U^i z?{vst2s}z+kX%48HGR7$jO;EaG%=`zW3yacxn?CW5^{$lY5uY)Xci$2@QR*?rsg|}zO**PRZPJoymyig;hdY(cwfXq zK`&JDQN%fgV#rawF;#WzOXzZ>2aF7Atz~Y`k|41!(2g+u(W0{C&6H0`DHjK8$qhQ!(-o?Z>-r zOxcaOjWE~u+9*5Pt`3D1MURJ9n=)ECPVc4AXkrqvG_(N@kt9LyG@^YplF8D@<}B|! zZhECX%|1qReXkThP^2*^bS^b#)4UCHap40pchu{%dEQp^xD*__%*J`vt+zzcZ!F|~ zx84aq{K7&mcIykU_zWGuQ8&7xAr#0Lpi$HbMNgo5@=aZhDS}?Bj|0TLTGRdvmTM7H zqJ@oFt{>cbefl7e7XC^*eADKz9p%Ebt9*ZdpWd4PN??tGA#y#bjt?$g>v;U0lHpco zER+WKC|)G+suv%lvq$>^o%P}VFYb5KH(I?t$^~8kyX69Sxm*AbRs(%J{-~0dtgcL> zny7MMwW zEoo`-1 zJf24?{z4u77tu$MK^>g*^L46-MsR$+^WazBcjdctmVDUvq@zbknNz(G}a#DwFf!v)tJf9JE)Dy7;aM4C#kNR-lU#*NHq6}p-vIShHi{y z7<`RFX=Rajf_k8H$4@E5t^Y!)6hi%EVTEhn$9NFbCp&eJ>@TUV7I@Hf%5f6 zPaHR4;<&24-y690xsA)0Enl*7NjT+~#2M)DmO{hcLAl4!k_YIG-w?}Wv@Mi>#zzIe zQR5335OsaqnFHT>d+i!_=yDXMpatC6gIVYpO&`7HeTqmz_?Y^)sRMUiD16!F^taFCol$U8xh+)it2gKUy!Se; z3m^LQ`2O9ZTrVEQak#`_RK$^^5#OGakMLp!9-)d1dFdqIAQVN`Faz1U_8!^0rB~)_ zUQ}G9AY**p)8uwjT{(28(UiYPMO~k~AsKb?6tZ6T(IX3$jLAcKwRSU!rk(a9(`R>` zW7s1xf!5*_PGTa~ijiU%@t);BMGUuxc~4dmZ7>io<9+@Nq?heBc6%B~lj(i_48&y7 z-pewJz2~vwPDoEV>F!Y&ax|0$|9}M^jLIyuLu?Y!21aaju6b|HytjS7QGtS*Dy#Im za%|h0pH4=>lYWq*XL)JdEG3ZWB*L%%UqlmeqYSJ#=DfJ6PotK@T2O8I@<1^@%An!0#y($TFh6W)9cCx6_r`o`F0D0TlJ}eO4aET zWvWWm@QFgY>auR3l4yrYGQCw6^Pw1rK)IlUYA%O3D8Jsi1j-M$Zh*c46+zlWzaI=ZRA zT40C)zaRqTj&AElkI)dROpjA1%J9zoc-H4%MY+H;UNM%16HSDIOk3fT2+baAtCT5J zyNP_GN$_EpY{ZJU5%Xd}#6`CC-}&phISHdC-O|xi%&&qJRlnL)7Syj?vVDw`-tcc% zC|%b2sOpzCKm%%0ekiAUsnkFr>@O(VADngEt#}{@@cXevCaV$ zMtM(C3peeVqoFtA@ct}qg8EBd$`|yIn|o6|stdz}^Wdf7>3hBQZfCvRBw1;^d`7U+ z_&a7Z^lpwmq6GEy9af1o(x8wDHD5^c(n*|A^sVHEm(;7M90kYOQ%FP7*_@aiUNrqm zLGxTP|3P!z^ck};IhNdelg`)n={qPpjhqxkPejoyWKkA=KtIGDfb%L}lTeRR6)aNe zN3M);;~lsb;nAuXh%~yxm#M%cJH-H+sB#JukbeITC`dYIe_6xFKB?_Ul)_?f1T=>Yo>;E!^DY5BIta3tnF%ClF1> z6|e*2&@|}4DrNP=!zlMjYU!rk?7?35J(zmegY`-N0CrK%4I+#SPP}#Q5Y&SghiB~b z+TWq0`HuM#dNxH5@i`JH5hvJ<=TXl5dv5iu?558Zv~EwvCCYcx+Z4yD4kY&vaX-gP zH`Pxe2YIM}6is6#GO!tKP<1~-ztluIyFp~bwusf!)mivuU9HjhFU2?b}#OO@elBCZ}e3_slH^%zLx6iRv%8Z0^u9 za|Z{E$^#~o2h8_D3!nWL3;VmUg%9Ue|LDJ1*z-fppKIN-u)Ea4$!y^*Y~jd#c!({m z*$pGJ+XO9qF=*fSjQRL?s{S^T| zg2f8*8-6;6OgW8?rrtgm8ktX%Gp-9gI<@LvtL9&04s~6fRCR|ISdI1u2H(1YtQFoi z0aKyMA7)=it0T&ViyCYW@tQ%i-1U>%T!sizcTUM3&|4HF^ zR+Nhp`RI!0ar9&F2Sp#uT|avywTOIX`mt?K-wr1*!)HHI~{O60Fnfrqn$XHL%t}iEjHg@Z%svW4#Gs~V@JaA!EYUS~tR-S!+ z&Yb6cZ=<;~XJ5+O!qWqvq`C~{tX{>FY2|h9}76p z8f?(yFR0dqG%srSmnxLgmBOeFU5&zcd$qAO|I>*(r=q?mY(nImQ7_IO=^j2}){GHs zu;-8@4kNKefqd^rmRN&KeY+Kc=ZrsoerNlSJ|t6pREAFJsHc2%;H{r8M*TkO=Ycj4auml z=-d1K_{+#kZdxVU8Tv6a{0k2w3t89bVQNSXV|kb5)wfet9K##>c&d~|G5PQEI^{&c zn=EZCy5ngiP&7;oLw`M~(4XZ0)TS+m{x zoI<BnvN1G@$zvR4UZ6!c zy`s|ruZBzY8fft-%_5U-)9Lo}?bQ4hPeN-bI`RLO}J`xHuc zK5!QBVSrOK!9w&AV^{F7RmYM|^(l+ay%H{dbfN@N3Mx6Ngm|C)&*$=g8r@MB@z9Wk z^1M$9#aQ$d^(5~mRk$(4iRDN@2zq|&Lk2YRsq;3@*|a5U#jDF_E%zb{<*Am67y486 zpE*U_kI+|?O68GCS-jVf8knIn!5f^?gv(iLKt@lBaaY3|2C_sQ=j?*n`J4qY-B9NIia6=ij<9Vy^Qh9ygB#1j+&uZ6f7Ov#UXlD!FbUc33h8Vzv&dUQ6K&A zAr4Z%tF+o@M+T-+9>pV%n)5z^_v2;lv+f3yNp#{VINQ<-)Hj|g(z`ykdL~ni6CcR? z@YB&f7H##vto2qE197z5IqKqwpLu`}f@3EhLENt`sqHE+@>VF=JcU}oK{Mp-fQ}Tx znmgW2d#ApSqA5<*FQU0xG-Tc&zBo1NMwKWs!%NZr#>fnGa-KQ+2`V8g>cg4qrhnj- zZa9YoYapIBPXq=kl*KZ)R`=TH*kdZ3g73U6wQ zXDTvxyzitjODOJ_e&|M>IC;!1#9UKmjrvZBT#pwL456;q=;}{iG1-aE9kGw4ZO_Go|5 zSLeOrWhXMnU1Oz%oU@XR<@^y4a?2Rs@edybvv1v2NWYac6%Do(or&-`n z@22Pbsky35&5-YwO@ga0#Ya&BIZ~(>JxT{>a8(YV$2f+M1|Cx=o#N3_JrGcXG2GH0&!LB` zl6V=z2P}rRL_DRdN3F+X49Avi<47dk`dS7t)eL;iL0j9uO_5$fJbK{0pj)c5TLwtC zth?uyMgQcM)zU3k*mw?0!n60SoR-X$m-3?8=ExjzGG8mCn zrRp*oQC}l>CXJ&}6nzZOJ}JGrJ;*4Ty}8E3T?pGq@J6W`;rTJni1WX9bv_NOo zH5*H4@^|Jn|C@K{hP=(bkE>`_L=XM>Yw~}UB87k7Rq&)L>Uxw)3NlNIop^$Bj73(( zm!0}X`k`cr!Uept+CrrG`m`T_r5?k{^&hEqRd%?Pt> zyTW&<9mv5K%1Wn|gU{O`F~Go5_Tv0K&!zg)4H3?!Zh^DH$!2ik9JQcxcDP!S7*-~e z3y+}rB{WAin(;0a)#RUWk68rf}0m_ zJ`e=I#o%CvuP52SvB)8`e16 z!9n+)6w;&A#8aWSc?NykT5O<31KhDRWx0ww0S(co>^9bHg%Vhqeb!^4yZnBK*ds0( z)0RzLI&I0a4U0A}*z^-U964jsjKb-Koi9YrT{3s^yv2*wE?&L#z2(DSe}37sMHA*v zESfao>6Zsj88T)~tWOlJG${M<-Y!46j~&^CSVTYeLsoK5gBnk88XVzY8hX|Ljzhk0VuWEA@=~vv zY7Z}2Dqp^Y{Z z_-_xzP+|$8youU=!VEK*BHzRkzSDUPJ*c9+GOutdEOrJ? zal;~~z6U?}mnchA?B$g5vQs`+$0-t-oJB>J9b@o`sKFT&%_KOEQ_(w=i8zKhOEa!w zb0j0fAK^d-tuz*rTk)6U44tfs9BZ+iZOv7zTHLLiI+@(!@xX_{Og+w{e9Zlpdcr0< zthefFw&}6nmdf|Hq9~;gmIV$eC{RTbb5*binR0%ZY`q9C_9H6-5$Gvyq9=7ncm1Zt zf%k(!<*3|?gR1*Jpd@9(x$`T2cIyIzpvBPDmA;p!E0-xGW*b#>(=Mtn^+z0S^KpVLHW=naE}pyc*N`Ts`L5zLYD)E~lbhm`{=`t9G?jQ5 zb;z0jPQHIhaIM}^j7CSwMXtVIu$qRxK~!_<`zC#`Y0AfLG=_c}p1=DRs`^Um?$lQy z*S~~123o25ev0T4+l1WinEKn0>a%jGqsKqg>3Z>6r+iWUnizN;hpzFj`zKKmqxl=j z-!X9MpL~IX{;mc*e_cZwQsVw14|(F^D23AgiiO9g7kokWN+g16y~7tHg*<9t3>6yO z^Y$m7@7uqlM>PuR(>>42n5}y6M2L@DL_x_=gHr#BfrlwyN9qTr7Zt0>4(MsN>iq>m zyeu02UM83nt1(dlJYW$P5K}o&(H(zWo3AXIt|A}nr-7POKD4b|r<$onUo`j7P zu;m*Q20E}0Pa1zBL#tJ@VJlK8>}2j$ALUuMjo{(^7O$WHXZpIPl@rEW9(VPuzNp6| z0Now%3r>6MQ2Qtrda(%gXqQT-sDPsEigqRN9;bZR#qdQcEhI);?+XeNii-Yx2fk$? z{yOy|!k{+T7Z;Zml;m{oUp_OXJ%-QmFh>_vJmX&?muGP_RAv8ojahF`22 zI8W1M_}%#Yo0BI$>lj_V=i?1!^fm19?X6(&{aiADqu~aHA|46X5sFl##xU^&ijQXE zsnVA>KjY4ycdSvP$Kwqf_WbsySI+64r~aZQ=WS$CWtG07SUIN~=M!g#|aB@@F;YbCllc+zI=VL=0XDAQ8$ni)`47krvjekST@SnO|a zpvLuEL7{F?4T_G9rc@5z>WB`iTepM}s;Sn&pt{x3TKf#uwVq#>>h=LN^YCX~s#ojT zB`2rXSGR+=e*urUCGYx*B*ciMlMZ}k)iyATHX{a`F$*4=h0PR0n`xFx)ARoS+;>Jp zjeGZSV4^k5u;0FGy+&*sL!~b%uFQJp*m~!J){A57?R3Lnj7Drdq-q!`4LDL7(9lp& z#rjU#?mM=fQ`*iMw4KaZGok-V|!@IT`}ZUkD+Rw&6S;^!=wV2`jzKqV(zbL5h#v+Q^UNvg{-ksb=u|ANCW zq?yKw@f6B@w$P@j6PORBTN!H61mbfrTyfnAeSzuM4z&&i`7s|6X3Vx)Fdub}9Y0~J zJwl8ir{rUgoI1&lX9*IWE{tJKFvbw$#aLp2i3Oifq*%-#knWr?jaV@Xkqm^ROp(xs zf{I`XGq76DWO1E#{H&?V#Bed3R5+zV6N_ex1cmM?Qqe!mfr_k%7;BH0hGFw;Dq6;T zzbsZL`5<^7dPVJlWU)P02vLfB$A`GCemv01VMA{*jqtPE-7f(~{E6&2H zGyvUd*I+6wG=C%HIL?cHhTyl++`dg4uueg~id#rPByQp+CBUFtKD!;IizihKx{^er zXjDRN8swvSDj2`o?I0x>$YGr(GA;Wl@pQFn;2KB@!(T0ih6>CBuj2en3>?6|OA7Fho z#>7*M=?S}G*rV*1ZdU_?Ilk>9_7l|53bQ6Sm(B-wzkNGM^i@+59Tg<{0j=i%5=X=n zXc!0!OmI$|O6#zplqh2ciRK51GI;4!B{0DXLqlG~9gzcvyGx=MHJrZ_vXmp>&QmfB z*6}9P%Yl)p?-08@N+)BceOCTtGYdx*G;RTtqA6cK%2S(K(5w8ZjTRUS=f*Ri9rTj- z7bQ2jA2}&5ijLp~nv5&_8H!hM7;C9M+R%_IUR<8V6rK7J`!O136n(s-=$Qg32{SGe z0UcQ^7GbNEEk&^Zm?MAY#$_H$LlUSywV}09bQnYFl_32WFd0V>*ALFzi!4Ki@>z?G z>Ew)}vHv9HIOM}bG#VfD&Z47IDg6Y!C>k3(rWN%avzG1F%G@oI4WZc;u3x7%XkD~a zvED}Az}xDyCE)Xz>k6Gi2g7<>267u}eLY6eHwsOZw>42AhEEQFq0=TR+(nY}gsotL zHY3Eu1Y0I?3)PkVC*JEHnCPD^nU=qPoe2c_F1g2dX&GO>+Na9(M{4MwyuA2R4)JDz zVG45PG<=xNUxjj2ni?2p;E32S7iCB7{ls5o9E-Bj-!}A^|B&MtRvP|8s=dYEmi2At zKNN~K{jGT>U^?R z0?*6MpK|lL?6qBPwgd_KB+y=h1txFOTp@t^%cx= zpoC8huKRjeR=#b2pTyv6bKB$f#Tj)+b4~Vd=Mu zbcfYL)_bQRn9AX;qKKv{WzAwWH;dK5V*L_wPhEzL(SnfHdn2&Y>ZKQBrKEz^sy+aZ zp}C?LH`B`caJz$>ojvPmLE-w|2*r_D(;>Pr%%BLBk|$q_msQc8xb_bu2aBR*_G(QP zxhC3Pemz;xu5jt)fRoFOTyXgS18s zD7wJ+KiE14DA{!|0H;lpOff~8<>1=3ZQHhO+qP}nwr$&Hb~cyKJXZ2sM;{MwiSEqU zxb@JxEg}I=>-(v%cKs$#I46z>Uxu>uXi&SH&%JvjVE+2g=3i)JdqUyx=ZQ?Rg?$Yd z5utEw?$Nj>@H70kw0{NuQQ&o8x3*Q=sQrxSwZOB$2%h>Uf|2Ky?(@oAd&H+d;`%S} zQ{YE&e=_sAPcU&_jLs@j2rA;o5m#bVo?5JVN_asY#{Il1KNlU7P&DOL#3gZ2H2b+T zClu#+Kvd-gL|8DjSS?b=c=#0}93DR_Pr*k=^Yh%t8L#`(U9lVHXi{uqUJu58;8_CA za8p6iF)nj`2Pgl_$PgZ(tU4t?oI)ZB72p!54SDcS;Konr*@D<93u00&*tP(F$+>_8 z=VtkCsM8E>grW1Q8c)5+F#O6@=GS~-TU{xo3?zVnA7lpEKtWI%)BtrrBhV6b1l>Vj zFbs?Y6Tnn36D$Mkz)o-ooB;R1OYjK@2}*6GtFkF4l9S3s514N0ZTXv=;3|`_N@{6NS)sY-1mei&Nu*xC(BLJK^ql03L}a z;Td=_UWfPKQ}`mjhhO0k{zg>7NRT8Y=}Asfh?FK(NL|vHv?85IFEYrJ#dFAWUX|3$ zYGJj!+DvV)c2>Kqw=_#@tF6{Gy^-EWAF9vLcj#C2m-;s&+9+v^GS(Qky+LnoZ!K>N z?*i{??@iM*GnmE9GG;TgyE(*MXC5(6m}kw4<`eU!#jI3TI;*Nx%j$29wANaOtTWaV z>$COEHti@og`M6mZMU$8+LP=B_E!6leck@#*pAOh?qqd}I8~h5P8Vm4Gs{`&9B_^} z=banQQ|ANqP=f|&I+~Rhr0vp#GDo5*Id;ZerzJ@7b_K)7q0xqs=>)Y_bIWs-0ou=>}n#|0ei5t*35FmvR>1~t{SBQI!=#9IO z)FpO*m&V+&z7~1G=<%j{(i zHXkx4nRCr2%oXN3bEkROe8qe-ueBia?PTqe(ImBmiu}3aB|nX4#Rmre3+*`*az+Ht z)^(=?QURzz7nCnNsDa9_6<(LI5i*gkqb;7+2t7kpRcxwfaaE1-CJIv0t|(G8u7dG2 z0n#j7bv((%!uW9ND6 zjJvgYJe5)M$x)tpUKVA7AS4-l7TJo{79@n>LAWc!Lyqn98oHC-%WkDnxMb!>Y%(ac zW|4`2jt17GLTlkRYlK@4ybtn?R(7pa{@VR_Jq3F+@k%xpxw)pE%`@8Yi3Hy5o+K~$ z?r&E02XVvAS^746M4>Gcy6s7BnEDlbbPC_@MV^LOX?BR7R!l#k`rQP-OK zq4n5CYk-?G^hfx7C%Z~>E|QPc1}i(^%utMVa}|9skL}23TJcJWY;BHnSytc?oNs5? z13t1JLtT5S8+YmF@YyT)ZV#T4I)nm#@;DcM$Dg^$v|_7sK1=8m--ZcbOkhSM+{XF% z#EQMv0hzX+ZQZ>G+hRTqKnZ@i>6_7Q8i&yMKSc#nBJ;9wE)FBRfot_wk$osD%N+TV1*5_lsS; z47YP1ydNNRi3#l(YtXy52oZvQ9}i2{3=bL!4;Q%j;8<=UN3SWW{-7&IlBwnsKb>C$ zRIPl-sch#Qz1XR2Cv9AtBx{FGga8X!{+X-?0$k!1c zPH3XcH{n#KJtGD9olFTi=}F!MN>^%?BpScUpz*)76sRfO8LDqwha%*i!5#^(z5xws_>CpL? z{8u^B=_3Q0!n4u;5cUh*UpGsEuMPknacvZRjZZehR$T?@ zD+|OJBx=PwekWUdQ3Hc z{^@)=Kn2|T4Ic9iPj-{_ne??da(py12;&8Ydyz_IW>8Xrs>XywYcA?r^3_r)Se_qt zQy}__FpNQbT|TrVNQ zGnX${_2wf89XaU`KX63dTaNWL29TW2qL7eenMfj)zaMw&E4mejB)R=YQspfbYO$1y z%3K+Z@e%w@;l?va;3}vZ^*R#p1)A_Zh{fBe6a8GelGAlN_Ov6XYkl2l7~j86hd}hQ zW9Pcp*vsL*dtyiB+#4Ll_iL}-xVib1FM3n@=Y=`!4YKay-qZO&OJ45fhF94@Y9Ye5 z7JU=gs>{1gdg;^bYrf(}c+-qtd+fF6j}&eQtUmGelW+ST<**g?*JZf-wn%yCexJN5 zhi9I;5TpsH<&WHm`r*qA8BP?)9f4_l8)^qp4WDt-6MPr%)K+%yu%xB$xZp>&@KoH! zwN>WS=V;mz6|h6gJ@(qv6F%M)I&I=Gri(X^P8zi3YT#?reZ{5$K{_h<3k>33R^;b`(9|C(`I_NaHcKWS z?D0q1=8Rzm^kMM(@ILw=1z zQ5_?kBjmg#qQ9WS#&6l!=t~iLUSW_Z_k^GcCk6fQYlSEeDb@lcS)(vogzAJ&n!Ho~ z->oB7aJal=r(SHtAhx(Z;zhBWV|7oN_0;-jsrVEflsV9m;{LYygt2qg#x_Ovhl^^CX z?!xtXjGONd-Nijr{QK37~PF9NF5o7JuSE@3W7;7FDqdqUT za;+HM>4=}vIVA5useg*BY8npcyactSj2F#AGqkUZXUOAR$=3GCfpC}fgpE;}unE!< zwy&0;M1v1n?-v+kmMAd;=Z#WDW{~`m-((wV=^g!^B_j%H<_iL?9c<>mq z5yarHhP>Kue-N{mjzWzZbE{`}7*>g##`z1r4&@_LcH?ove%IP7#;|r4m`lyG~PU!vp9_pdHFfi z;$-CZ4UFPL8e;YJ*ov`_q4mvU=v0Z!SJxcAu_5s9jcD;Gj0J9K3+cv@eEUNQKK7-4 za4|?7MRehIUZtb*jMJmiy=^lGadIG;?>w(#{kI>&hd_f@xPjavzP1383jW{JDw03) z8e+<0D|$O8wvs#Zs-v7=FFbxNQpw;aV~GqQ$rC2-HI(-~XvM&sZus>TnUWNcE28Z- z1{JC59j~$k&C_`^-rIX~HSSacX!L$$loXkMtQRNRNv6!)I)Cx4z!P(xnEk|Tl6P@N z-i6i1@K_g3OcZ~SDoN$xhT?qNV}_z!`_Ek1boMvn74;kD?`jhCpo_5YRkD-DI;!Jw zB|E9kk8ARzR3#5ntF5-W$2^~^AyJaK)(VHS5|lL82{9adM33uFm{2;KH&2`4@@$QoK)SHmpbme4*8^DZL|v5MKhghxyM(1L*7d4WbT zq4{!^JO7BFn-bb=^6joeM^|s%9ptyUQC+L;1#WEhlV^6HmNcTbk4(fEzl1ZAsoI=u zdI3VJ!9}*gi+@tRvx(Dad3o&7@ho={=#8!sgJTPP22ZmDVMF92#oH%Tyog(F+i(@u#6-Rvo=Sc_cb1 zkHkM6K?TX~+OO5XQ!d>5ZF{c4JvohC{A7G^(EyEB2D!G%VH$@dL8^(!)-vun9j(Ya`#t03V6$-i_y2cu7R#m$)l*ut8<1*p2#4p?ioA4KiKnm1kdJE1IV(C`W1XYm3dnXsbQfyVFx0ef0X3>$|S_ zZoJ=*D+Y@PQdd6CVZ4cJ@}n~PL_cTJ6Z9FFDR3uJWbrTLWU6}Rm(9IjjZu%2`6z9)*CKs0uMkl;+Lc;8!zb-k*HDG zVl+((e~2q+);>GiHHqUjLZ!2p;Ds;#B3B|!>3F6S>VI<-5pVU}-FgElgp*St5$dnj z!ul>)YWYmhjI-`WV(34R5Kf9;`Gfzqf{4&Q()l5UO3czdzABBDKA#q(+TGBT8~8{s z-o~?4-poxxw~6rNqDJ&TNNKTOJ^fv9rB2ES^0MBOQ`ILJZheZxh)_JqE_kt`@8#-b zS4S;LenYKra&~i_eO($^j&!4PeVPj5dHxe0mu(aP0RR913;+NC000000ssR700Jfe z0s>S5Z2$rS=K}!%0{{Sc0es9QU{z5Z$MNs|pSiosbDR6{xx3@f-RA3&Nbg~ZNFtF* zBoc{8qTpW7EuZoe44};L6dWOQ3u}8+r2}VKW+(vo`IAPVkTR-ipp`D{^f1U6H@U|g z%WSaA5swKHqX{)Ty=P%zeRIvi)z0R+h3o$>21S%pLnCc;J;)@&{#uXILF0wH;=GjSG3%Nw2PTqrGX|N8Eq+4Ibayw{mK31{Vl z&eKFTDj&6;4i3pD6NlxCi6aUVM^%xDW2(Z$aaCvHglaKyQgvxP51uNA-u$WZ=>!BY zfHDL{0fiJ%ObMlwQ4Sci0YU|pfI<6T8-QQ6m<4bgS(1joKdZMbHpwKDEVEZ@kXff; zo>|^uW`?`lV>1q$L6Vu7nMr154>RM^FlD^x=&0CRhREnYUuRbSm6fleUv@^+p)U0R z(I{Z`fO!FH14exs0HS8V76FR_HV@b&VAFuj0u}~r9I!^fT6Ex6y_h6fknEEDY4ZN$ z;N;}w+G-iquFd#qMpedFnN2dUb-6opT;_jd4s@KE`D#|XtRH6e&;B?kE9a*hlI4(m-V@qq(ls zm9+2-`_odRHJb0MLX#-gVlAeVR%$IJp6?#IYrpo>Q)l!FrPjr|aG~eglZ!mZAzbSD zjpk=I-YWTpd4^nLRaV8dw%7J@oxNr6alL(DzvdRARP`0z$W3fz7Y8`T8D8Xd-sNLH z;VYRkl&5?Zs8Fp`tP=Im*}71d>!)7l8+E7d*T3q&yrzToghr`S)3wmE-KZ)Z&9~MXjte>MxQH{3 zi+RRz3C}t%E6QbUl)dyhVahY~pPmam#2n^N#B=Y~fwkW7*1kuE(*B_g#-?J0G|%X9pi*+MoeM z8l=e@h-t8C`HmyB zz;UD&I*!sJBK6W}EygrPOB}~)soTbBnQp{1UdtWJwZd(^RiTxx`>0Z@T=&%kt#;i{ z6Sc;5e@)U_OzX6sYVtQ;`}Mv)(HR{gsl7U&5A>;?(P0w$P@m~p9r4vi`drWHsINZO z7kXaDeDy1RsTXwISHIR*dQm4lexDBNH~LyH>7?6#t8etOPWkG0`c|*#G?8_;9@Z1H zbL?FI*2ntWAlH3ufDLxt&j#8M*Q0E-jdxvc6;_GaHrwU6-F7?fus!bCYE`xuaT5hJ zq!Ep2LQ@K9MiI?vK}%ZGiOzJPE8XZxDgVNGoX-VZ$i-a3o!rIU+{3-xhj%VK#KSy7 zANtad{tVzF)mCFQRiT=xNG;S#t<^^D)LtFbQJvITU39Ik*A2Q+_vwB;pa=Dk9@ao@ z(q?VZR&CRE?NF6=YL|7kv+ZGf#Cq8iHr6KDWSe5^Ndh8+2vBAY%6=FDEn^;KUx_k) z4G3rz_fYQMQpDSTz}MS-O;S;?qO5mQF>T{9Za;!liGX(T81j)o z>YwtN+bf(MRr2Om;1v4}7j;oPK6NI1jSrClxi# z&m?MDAL~bL^K*#0=I0Rg!moV&z%wSr<2vw&2CQH`8`#JuHnWATY-2k+G+Gs^)C5h` zB<-;t*53x$KpSlpRuz~o4@|COOfT{VZ}Jvz^A7Lw9`Ex3A8N5yYL!-Njn-BSRWepB@XcD|&))8?Y0*d1{wNKkpk*uXd?Av^L#=cFYX6#$?+r^HuE-~Bx(J=jd zMWmi4s}>;O2aeLKr0khrr0s@uNT*}fX+eZSW~pe}JDST!q~d9m_88J8?E-}H6P1xj z=aiq)3F}3qGHZ?D`t~ zjv?lR-4fPWR>;fN&Pu4u+g7UjI%enE?ZFpWN9$qh5jCx~^R#o0_Eut@J&&$dYUkM_ z_Fv9A$L89i*dAqJ8lZs)!%rI0J3$Xzr)t@V7PPZusB)=g1U<_#gPv;%%&l3W8ba1O z#!^P)3{7Z*ktD}jVxCWt)NPL4m#SM7a-SPxYZ5Zf50O`=IqnP< z6^`+%`DwU!n~*~WHK=P1oU_EG0CVp8j_0TD-86W*SQE@jQno1A&NmA-rLH(Hc85l| zPF>x|{heJJV%8ZU$3L9;t*J^S?5@*XS#y5 ziENfjEzB`L#@H<7Da1Vd6n@um8% zFp)`2W(rf8#&l*dlUdAW4s)5ud={{fMJ#3sOIgNpR|rna*v|nDa)`qm;V8#A&IwL(iqo9o8J^`ip63OI@e(id3a|1S zum8dS&yzJpQ#DP~HA6EsOS3gcb2U%%wLlBCNWHW~OSMePwIcR!dcAhb`yA_T=cfNF zm)kDeZF_7h;;Mg67yNhiz*T>^>y1_UfBu%PCl=r1Z|c9~QJ4I|r|lAZhE3KvmU}$w zL)`g?v;O<1EAi+4i>565wOcOMGc{8Qb@~I7mGL&pr7}HT*=t+P1*0jKxZw481kr~9 zBtvhU%?g*gVV+Wt7hRf#c}kJGs0+njsfYPN=$}i%Jf%mNr}PZ-l(WM;YAy})l*`Pk%MZQ2z4&pMt^C9*{RG#B3Cnd}^Re6z<}5ebdRxz}A>Z4= zwB`0NZMh@1CxzsyiQ4|rz9*r^Y7A3o_N3b e35LR)==Zu=`J_$$2~5UM_()~n0edZ|4gdf)aF~$* literal 0 HcmV?d00001 diff --git a/docs/css/custom.css b/docs/css/custom.css index b024564..0f5f069 100644 --- a/docs/css/custom.css +++ b/docs/css/custom.css @@ -3,15 +3,23 @@ src: url("MonaspaceArgon-Light.woff"); } + @font-face { + font-family: "Monaspace Argon"; + src: url("MonaspaceArgon-Regular.woff"); + } + :root { - --md-text-font: "Monaspace Argon Light", "LXGW WenKai Screen"; - --md-code-font: 'Monaspace Argon Light', "JetBrains Mono", 'LXGW WenKai Screen'; + --md-text-font: "LXGW WenKai Screen"; + --md-code-font: 'Monaspace Argon', 'LXGW WenKai Screen'; --md-code-font-size: .075em; } + + /* "JetBrains mono", "Monaspace Argon Light", */ p code, li code { - font-family: 'Monaspace Argon Light', 'LXGW WenKai Screen'; + font-family: 'Monaspace Argon Light', "Monaspace Argon", 'LXGW WenKai Screen'; src: url(https://v1ceversaa.github.io/docs/css/MonaspaceArgon-Light.woff) format("woff"); + src: url(https://v1ceversaa.github.io/docs/css/MonaspaceArgon-Regular.woff) format("woff"); } .md-typeset code, .md-typeset kbd, diff --git a/mkdocs.yml b/mkdocs.yml index dbc7a1b..c276985 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -138,9 +138,15 @@ nav: - C++: - Computer Science/Programming Language/C++/C++.md - Basic Syntax: Computer Science/Programming Language/C++/Basic Syntax.md + - Object Oriented Programming: Computer Science/Programming Language/C++/OOP.md - Standard Library: Computer Science/Programming Language/C++/Standard Library.md - Python: - Computer Science/Programming Language/Python/Python.md + - Variable and Types: Computer Science/Programming Language/Python/VAT.md + - Input and Output: Computer Science/Programming Language/Python/IO.md + - Object Oriented Programming: Computer Science/Programming Language/Python/OOP.md + - Library: Computer Science/Programming Language/Python/Library.md + - Pwntools: Computer Science/Programming Language/Python/Pwntools.md - Java: Computer Science/Programming Language/Java.md - Rust: - Computer Science/Programming Language/Rust/Rust.md @@ -155,6 +161,12 @@ nav: - Graph: Computer Science/Algorithm/04 Graph.md - Sorting: Computer Science/Algorithm/05 Sorting.md - Hash: Computer Science/Algorithm/06 Hash.md + - Blockchain: + - Computer Science/Blockchain/Blockchain.md + - Ethereum: + - Computer Science/Blockchain/Ethereum.md + - Solidity: Computer Science/Blockchain/Solidity.md + - ERC Standard: Computer Science/Blockchain/ERC.md - Web: - Computer Science/Web/index.md - CSS: Computer Science/Web/CSS.md @@ -163,6 +175,8 @@ nav: - Javascript: Computer Science/Web/Javascript/Javascript.md - Vue: Computer Science/Web/Javascript/Vue.md - YAML: Computer Science/Web/YAML.md + - CTF: + - DNS Protocol: Computer Science/CTF/DNS.md - System: - System/index.md @@ -243,6 +257,7 @@ nav: - The Western Heritage: - Reading/The Western Heritage/The Western Heritage.md - Chapter 0: Reading/The Western Heritage/Chapter00.md + - Chapter 1: Reading/The Western Heritage/Chapter01.md - Taking Sides: - Reading/Taking Sides/index.md - Sustainability: Reading/Taking Sides/Sustainability.md