From 415f026ab9299cb69dc2412b1d2b1bcba95fc91b Mon Sep 17 00:00:00 2001 From: Lakshya Mittal Date: Thu, 18 Apr 2024 16:34:21 +0530 Subject: [PATCH 1/9] feat: devnet specific restructuring --- docs/Protocol/Specifications/Epoch.md | 2 + docs/build-with-powerloom/devnet/Glossary.md | 80 ++++++ .../devnet/getting-started.md | 229 +++++++++++++++--- .../lite-node/getting-started.md | 4 +- docs/index.md | 7 +- 5 files changed, 283 insertions(+), 39 deletions(-) create mode 100644 docs/build-with-powerloom/devnet/Glossary.md diff --git a/docs/Protocol/Specifications/Epoch.md b/docs/Protocol/Specifications/Epoch.md index 617a263..e5d635f 100644 --- a/docs/Protocol/Specifications/Epoch.md +++ b/docs/Protocol/Specifications/Epoch.md @@ -8,6 +8,8 @@ An epoch denotes a range of block heights on the data source blockchain where sm All peers synchronize and achieve consensus around incremental epochs according to their specific responsibilities. For example, snapshotter peers reach consensus around snapshots—base and aggregate—per epoch. This information gets finalized into the protocol state as snapshot datasets available as content identifiers on decentralized storage mediums like IPFS and Filecoin. +![Epoch](/images/Epoch.png) + The size of an epoch is configurable, referred to as `size(E)`. ## Epoch Generator diff --git a/docs/build-with-powerloom/devnet/Glossary.md b/docs/build-with-powerloom/devnet/Glossary.md new file mode 100644 index 0000000..89f9146 --- /dev/null +++ b/docs/build-with-powerloom/devnet/Glossary.md @@ -0,0 +1,80 @@ +Key terms, concepts, and acronyms used in Powerloom's Devnet + +--- + +### Snapshotter Peers & Nodes + +Snapshotter peers are participants in the Powerloom network who capture and verify data snapshots. Snapshotter nodes, run by Snapshotter peers, generate these snapshots at predetermined intervals or epochs. The peers are crucial for data accuracy and integrity in the decentralized Powerloom ecosystem. + +### Snapshots + +Snapshots are compressed archives of blockchain node states at specific block heights. They serve as a historical record of data changes and are taken by Snapshotter Peers. Each snapshot is a report of the observation, specific to state transitions or event logs between two block heights, and is submitted to the Protocol for consensus. Snapshots are essential for ensuring data integrity, enabling analysis, and tracking changes over time within the network. + +### Epochs + +An Epoch in the context of blockchain typically refers to a range of block heights on the data source blockchain where smart contract applications run, or, simply put, it is a specific period in the blockchain's life. + +Each Snapshotter makes observations specific to the state transitions spanning two block heights termed Epochs. Check out our developer docs [here](https://docs.powerloom.io/docs/Protocol/Specifications/Epoch/) to learn more about Epochs. + +### RPCs + +Remote Procedure Calls (RPCs), allow a program to request a service from another program on a different computer in a network. In the blockchain, an RPC node lets users and applications interact with the blockchain without needing to know network details. + +Extracting data from the blockchain state and generating the snapshot can be complex. The RPC Helper, has many helper functions to make this process easier. It handles all the retry and caching logic so developers can focus on efficiently building their use cases. + +### Prost Chain + +The "Prost Chain" refers to the foundational blockchain infrastructure the Powerloom Network utilizes, serving as the anchor chain for storing proofs. The Prost Chain also coordinates activity between different categories of peers on the network. For, e.g., it coordinates consensus between snapshots to finalize snapshots per epoch; it also acts as the distribution point for releasing epochs. + +### Protocol State (on Prost Chain) + +Protocol State represents the current state of the network, which Snapshotter Peers or anyone else can refer to if the entity needs access to current or historical data references. The protocol state is constantly updated as new epochs are released, and data gets submitted to the protocol state contract residing on the Prost Chain. + +### Devnet +Devnet is a network environment for developers to test and develop blockchain applications. Devnet provides a sandbox environment to test ideas like data dashboards. As an individual, you can develop your own snapshotting logic, write the data application & use these snapshots without requiring any consensus on said snapshots from other snapshotter nodes. + +:::success info +#### Our Devnet is live! +**Powerloom’s Devnet is Live!** Access the Devnet and build exciting data applications; you can mint a no-cost NFT slot on the Sepolia Network 🌟. Devnet mint page: [https://devnet-mint.powerloom.dev](https://devnet-mint.powerloom.dev/) + +💡 To mint the NFT slot, ETH on the Sepolia network is required. If your balance is insufficient, you can obtain Sepolia ETH through the following link: https://faucet.quicknode.com/drip +::: + +### Data Markets + +Data markets are defined by a schema specifying state variables, event log topics, and specific transactions across any smart contract instances that make the decentralized application. eg. A defi protocol like uniswap. In a data market, datasets are snapshotted data collections, while data sources are the contracts that are being snapshotted. + +Click [here](https://docs.powerloom.io/docs/Protocol/data-sources) to learn more about Data Markets. + +### Environment Variables + +Environment variables are external configurations that affect runtime behavior without modifying the code directly. They include network details, contract addresses, token parameters, security settings, feature flags, debugging options, and integration parameters. They offer flexibility, security, and maintainability by enabling dynamic adjustments of contract behavior across different deployment environments. + +### IPFS (InterPlanetary File System) +A decentralized storage protocol and network for storing and sharing files in a peer-to-peer manner. IPFS uses content-addressing and cryptographic hashing to distribute data across multiple nodes securely and efficiently. + +### Burner Wallet + +A lightweight and disposable cryptocurrency wallet designed for temporary or single-use transactions. Burner wallets are often used for small transactions or events where security and long-term storage are not priorities. + +### Project IDs + +All data sources are tracked with a project ID on the protocol. Think of it as a stream of datasets, finalized by consensus against each epoch released on the protocol. The snapshotter node attempts to retrieve data sources corresponding to the projects key from the protocol state. +Find more details in the specifications of [snapshot generation](https://docs.powerloom.io/docs/protocol/specifications/snapshotter/snapshot-build#project-id-generation). + +### Snapshot Composition + +The protocol state collects finalized snapshots for incremental epochs against contracts configured as data sources. These snapshots can be further composed according to the use case. + +We can compose snapshots on top of base snapshots for single or multiple contracts by: +- Combining individual snapshots of trade volume and fees across multiple pair contracts. +- Spanning a specific set of epochs that satisfy a time duration (e.g., 24 hours). + +To learn more about Snapshot Composition, start with this [guide](https://docs.powerloom.io/docs/Protocol/data-composition), then explore [Data Points](https://docs.powerloom.io/docs/build-with-powerloom/use-cases/existing-implementations/uniswapv2-dashboard/data-points) for a use case-driven approach, and finally read through [Closer Look at Snapshots](https://docs.powerloom.io/docs/build-with-powerloom/use-cases/existing-implementations/uniswapv2-dashboard/closer-look-at-snapshots) for a detailed understanding. + +### Relayers +Entities or nodes within a decentralized network responsible for relaying or forwarding messages, transactions, or data between different participants. Relayers play a crucial role in facilitating communication and interoperability within distributed systems. + +### Pre-loaders +Software components, scripts, or routines used to load or initialize data, resources, or configurations before the main application or system starts. Pre-loaders ensure that necessary dependencies are available and set up properly to enable smooth operation of the application. + diff --git a/docs/build-with-powerloom/devnet/getting-started.md b/docs/build-with-powerloom/devnet/getting-started.md index 27b025d..aa26506 100644 --- a/docs/build-with-powerloom/devnet/getting-started.md +++ b/docs/build-with-powerloom/devnet/getting-started.md @@ -3,6 +3,8 @@ sidebar_position: 1 --- import Admonition from '@theme-original/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; # Getting Started This section will guide you through the necessary steps to set up and get started with the Devnet environment. By following these instructions, you'll be able to quickly configure your Devnet and start building data applications on Powerloom. @@ -65,6 +67,14 @@ Your RPC usage depends on your specific use case. If your application requires a If you want to monitor your RPC usage, we recommend signing up with a provider like Alchemy, Infura or Quicknode. ::: +:::info +Setting up the snapshotter node on Windows requires a few additional steps. We suggest using Docker because of its ease of setup and speed. To begin with Docker, you must have the Windows Subsystem for Linux (WSL) installed. Please follow the guide provided below for detailed instructions. +::: + + + +

Deploying a Snapshotter Node on macOS/Linux

+ ### Running the Snapshotter Node Follow the process outlined below to ensure a smooth setup @@ -76,46 +86,184 @@ Clone the repository against the respective branch (main by default). Open the t git clone https://github.com/PowerLoom/deploy.git --single-branch powerloom_deploy --branch devnet && cd powerloom_deploy ``` -#### Step 2: Fork the Snapshotter Computes and Snapshotter Config Repositories +The above command itself navigates you to the Repository Directory `powerloom-deploy` + +#### Step 2: Configure the environment variables + +1. `cp env.example .env` Copies the contents of the file named `env.example` to a new file named `.env`. + +2. Fill in the required variables in the `.env` file: + +#### During the creation of the .env file, add the following details: +- `SOURCE_RPC_URL`: The URL for Source RPC (Local node/Infura/Alchemy) service. +- `SIGNER_ACCOUNT_ADDRESS`: The address of the signer account. This should be an unused "burner" address that does not need to have any token balance. You can create a new burner wallet from [our tool](https://devnet-mint.powerloom.dev/burner). During later steps, this address will be registered against the `SLOT_ID` on the `PROTOCOL_STATE_CONTRACT` that is set in this `.env`. +- `SIGNER_ACCOUNT_PRIVATE_KEY`: The private key corresponding to the burner wallet address +- `SLOT_ID`: Enter your Devnet Slot ID. [You can find the slotID by visiting the [Devnet Dashboard](https://devnet-mint.powerloom.dev/dashboard), or on the [Sepolia block explorer](https://sepolia.etherscan.io/) by searching for the transaction hash of your node mint] +- `PROTOCOL_STATE_CONTRACT`: Choose the contract address for the protocol state with respect to the Epoch size. + +:::note +Currently, there are two variations of Protocol State Contracts available. One where [Epoch](../../Protocol/Specifications/Epoch.md) size is set to 1 and the other where epoch size is set to 10 blocks. + +You can find the latest Epoch Contracts in the [example.env](https://github.com/PowerLoom/deploy/blob/devnet/env.example) file. + +This should allow developers to build and experiment with a variety of use cases. If you have any custom needs, reach out to the [team](https://discord.com/invite/powerloom) +::: -Our system leverages the Git submodule architecture to seamlessly manage these components. To dive deeper into how these elements integrate and function within our larger system, check out the [architecture documentation](https://docs.powerloom.io/docs/build-with-powerloom/snapshotter-node/architecture). +**Pre-supplied:** -To optimize the development process, we recommend forking the templates for: +:::info +Unless it is a customized need or instructed by us, the below need not be changed or modified. + +::: + +- `SNAPSHOT_CONFIG_REPO`: https://github.com/powerloom/snapshotter-configs +- `SNAPSHOT_CONFIG_REPO_BRANCH`: devnet +- `SNAPSHOTTER_COMPUTE_REPO`: https://github.com/powerloom/snapshotter-computes +- `SNAPSHOTTER_COMPUTE_REPO_BRANCH`: devnet +- `PROST_RPC_URL`: The Powerloom Protocol Chain RPC service URL. +- `RELAYER_HOST`: The relayer URL for the Powerloom Protocol Chain. +- `NAMESPACE`: The unique key to identify your project namespace. +- `POWERLOOM_REPORTING_URL`: The URL for reporting to PowerLoom. +- `PROST_CHAIN_ID`: The Devnet chain ID -- Snapshotter Configs: https://github.com/PowerLoom/snapshotter-configs -- Snapshotter Computes: https://github.com/PowerLoom/snapshotter-computes +**Optional variables:** + +- `IPFS_URL`: The URL for the IPFS (InterPlanetary File System) service in HTTP(s) (e.g., `https://ipfs.infura.io:5001`) or multiaddr format (e.g., `/dns4/ipfs.infura.io/tcp/5001/https`). +- `IPFS_API_KEY`: The API key for the IPFS service (if required). +- `IPFS_API_SECRET`: The API secret for the IPFS service (if required). +- `SLACK_REPORTING_URL`: The URL for reporting to Slack. + +#### Step 3: Set Up the Codebase + +Set up the codebase by running the `bootstrap.sh` command in the terminal: + +```bash +bash bootstrap.sh +``` :::info -When forking the repository, ensure that the *"Copy the main branch only" * option is left unchecked. This will allow you to clone all the branches associated with the repository, not just the main branch. +This is a one-time step that resets the codebase to the latest version of the branch. +After completing this one-time setup, you'll be ready to dive into the codebase and start building amazing data applications! ::: -Once you have forked the above repositories, next step is to clone them on your local system. +#### Step 4: + +Install the required dependencies using pip: ```bash -git clone https://github.com//snapshotter-computes +pip3 install -r requirements.txt ``` + +#### Step 5: Run the Snapshotter Node + +Run the command + ```bash -git clone https://github.com//snapshotter-configs +bash build.sh ``` -#### Step 3: Configure the environment variables +#### Step 6: Assign your Burner Wallet + +```bash +Do you want to assign a burner wallet to a slot? (yes/no): +``` + +Enter yes and then enter your burner wallet address when prompted. +- This is the `SIGNER_ACCOUNT_ADDRESS` that was set during [Step 3](#step-3-configure-the-environment-variables). + + +Next, you will be prompted to enter a private key: + +```bash +To assign a burner wallet to a slot, you need to sign a message with the private key of the Account holding the slot. +Private Key: +``` + +- Please note that this is *not* asking for the private key to your burner wallet. +- Enter the private key of the wallet [**used to mint** the devnet slot](#minting-the-devnet-slot). + + +
+ + +

Deploying a Snapshotter Node on Windows

+ +### Initial Setup | Docker + +- **Open PowerShell:** + - Start by opening PowerShell on your Windows machine. Search for `"PowerShell"` in the start menu and launch it. +- **Install Windows Subsystem for Linux (WSL):** + - In the PowerShell window, enter the following command: + + ```bash + wsl --install + + ``` + + - This command installs the Windows Subsystem for Linux, necessary for running Docker. +- **Download and Install Docker:** + - Download Docker from the [official website](https://docs.docker.com/get-docker/). + - Follow the installation instructions provided on the website. +- **Restart Your Computer:** + - After installing Docker, restart your computer to apply all changes. +- **Open Docker:** + - Post-restart, open Docker. This should automatically launch a Powershell console which will have WSL installed. +- **Set Up Linux User Account:** + - In the newly opened powershell console, set up a new user account by entering a username and password. + +### Granting Docker Permissions[](https://docs.powerloom.io/docs/build-with-powerloom/snapshotter-node/lite-node/getting-started?current-os=win&setup-type=docker-setup-windows#granting-docker-permissions) + +- **Modify Docker Group Permissions:** + - To grant Docker the necessary permissions, add your user to the Docker group with this command: + + ```bash + sudo usermod -aG docker $USER + + ``` + + - Logout and login again or restart the Docker service for the changes to take effect. +- **Verify Docker Installation:** + - To confirm Docker is set up correctly, run: + + ```bash + docker run hello-world + + ``` + + - This command should display a message confirming Docker is functioning. + +### Running the Snapshotter Node +Follow the process outlined below to ensure a smooth setup + +#### Step 1: Clone the Snapshotter Deploy Repository + +Clone the repository against the respective branch (main by default). Open the terminal and run the below command to clone the deploy repo in a directory named `powerloom-deploy`. + +```bash +git clone https://github.com/PowerLoom/deploy.git --single-branch powerloom_deploy --branch devnet && cd powerloom_deploy +``` + +The above command itself navigates you to the Repository Directory `powerloom-deploy` + +#### Step 2: Configure the environment variables 1. In the deploy repo's directory, create a new file named `.env`. 2. Copy the contents of [`env.example`](https://github.com/PowerLoom/deploy/blob/devnet/env.example) to `.env`. -3. Fill in the required variables in the `.env` file: - +3. Fill in the required variables in the `.env` file: + - use `dir` to check all existing files under the created directory “powerloom_deploy” + - use `start env.example` to open env.example file + - to create a new .env file use syntax `echo. > .env` + - to copy contents from `env.example` to `.env` use code `type env.example > .env` + - to open & check contents of `.env` use code `type .env` + +#### During the creation of the .env file, add the following details: - `SOURCE_RPC_URL`: The URL for Source RPC (Local node/Infura/Alchemy) service. - - `SIGNER_ACCOUNT_ADDRESS`: The address of the signer account. This should be an unused "burner" address that does not need to have any token balance. You can create a new burner wallet from [our tool](https://devnet-mint.powerloom.dev/burner). During later steps, this address will be registered against the `SLOT_ID` on the `PROTOCOL_STATE_CONTRACT` that is set in this `.env`. -- `SIGNER_ACCOUNT_PRIVATE_KEY`: The private key corresponding to the burner wallet addresss -- `SNAPSHOT_CONFIG_REPO`: https://github.com/your-username/snapshotter-configs [Change the username to your GitHub profile to point to your forked snapshotter-configs repository.] -- `SNAPSHOT_CONFIG_REPO_BRANCH`: Change to your own branch or use the `devnet` branch if you are getting started. -- `SNAPSHOTTER_COMPUTE_REPO`: https://github.com/your-username/snapshotter-computes [Change the username to your GitHub profile to point to your forked snapshotter-computes repository.] -- `SNAPSHOTTER_COMPUTE_REPO_BRANCH`: Change to your own branch or use the `devnet` branch if you are getting started. -- `PROST_RPC_URL`: The URL for the Powerloom Protocol Chain RPC service. -- `PROTOCOL_STATE_CONTRACT`: The contract address for the protocol state. +- `SIGNER_ACCOUNT_PRIVATE_KEY`: The private key corresponding to the burner wallet address +- `SLOT_ID`: Enter your Devnet Slot ID. [You can find the slotID by visiting the [Devnet Dashboard](https://devnet-mint.powerloom.dev/dashboard), or on the [Sepolia block explorer](https://sepolia.etherscan.io/) by searching for the transaction hash of your node mint] +- `PROTOCOL_STATE_CONTRACT`: Choose the contract address for the protocol state with respect to the Epoch size. :::note Currently, there are two variations of Protocol State Contracts available. One where [Epoch](../../Protocol/Specifications/Epoch.md) size is set to 1 and other where epoch size is set to 10 blocks. @@ -125,20 +273,26 @@ You can find the latest Epoch Contracts in the [example.env](https://github.com/ This should allow developers to build and experiment with a variety of use cases. If you have any custom needs, reach out to the [team](https://discord.com/invite/powerloom) ::: +**Already Given:** + +- `SNAPSHOT_CONFIG_REPO`: https://github.com/powerloom/snapshotter-configs +- `SNAPSHOT_CONFIG_REPO_BRANCH`: devnet +- `SNAPSHOTTER_COMPUTE_REPO`: https://github.com/powerloom/snapshotter-computes +- `SNAPSHOTTER_COMPUTE_REPO_BRANCH`: devnet +- `PROST_RPC_URL`: The URL for the Powerloom Protocol Chain RPC service. - `RELAYER_HOST`: The relayer URL for the Powerloom Protocol Chain. - `NAMESPACE`: The unique key used to identify your project namespace. - `POWERLOOM_REPORTING_URL`: The URL for reporting to PowerLoom. -- `PROST_CHAIN_ID`: Enter the Devnet chain ID -- `SLOT_ID`: Enter your Devnet Slot ID. [You can find the slotID by visiting the [Devnet Dashboard](https://devnet-mint.powerloom.dev/dashboard), or on the [Sepolia block explorer](https://sepolia.etherscan.io/) by searching for the transaction hash of your node mint] +- `PROST_CHAIN_ID`: The Devnet chain ID -Optional variables: +**Optional variables:** -- `IPFS_URL`: The URL for the IPFS (InterPlanetary File System) service in HTTP(s) (e.g., `https://ipfs.infura.io:5001`) or multiaddr format (e.g., `/dns4/ipfs.infura.io/tcp/5001/https`). +- `IPFS_URL`: The URL for the IPFS (InterPlanetary File System) service in HTTP(s) (e.g., `https://ipfs.infura.io:5001`) or multiaddr format (e.g., `/dns4/ipfs.infura.io/tcp/5001/https`). - `IPFS_API_KEY`: The API key for the IPFS service (if required). - `IPFS_API_SECRET`: The API secret for the IPFS service (if required). - `SLACK_REPORTING_URL`: The URL for reporting to Slack. -#### Step 4: Set Up the Codebase +#### Step 3: Set Up the Codebase Set up the codebase by running the `bootstrap.sh` command in the terminal: @@ -151,15 +305,15 @@ This is a one-time step that resets the codebase to the latest version of the br After completing this one-time setup, you'll be ready to dive into the codebase and start building amazing data applications! ::: -#### Step 5: +#### Step 4: Install the required dependencies using pip: ```bash -pip install -r requirements.txt +pip3 install -r requirements.txt ``` -#### Step 6: Run the Snapshotter Node +#### Step 5: Run the Snapshotter Node Run the command @@ -167,7 +321,7 @@ Run the command bash build.sh ``` -#### Step 7: Assign your Burner Wallet +#### Step 6: Assign your Burner Wallet ```bash Do you want to assign a burner wallet to a slot? (yes/no): @@ -187,7 +341,10 @@ Private Key: - Please note that this is *not* asking for the private key to your burner wallet. - Enter the private key of the wallet [**used to mint** the devnet slot](#minting-the-devnet-slot). -### Troubleshooting Errors +
+
+ +

Troubleshooting Errors

If the `.env` file is filled up correctly, all services will execute one by one. @@ -198,23 +355,27 @@ If the `.env` file is filled up correctly, all services will execute one by one. powerloom_depoy-pooler-1 exited with code 1 ``` -Make sure your snapshotter address is registered. Ensure that you have minted the Devnet Slot from the [devnet dashboard](https://mint-devnet.powerloom.network) and your burner wallet has been added correctly during Step 6. +Make sure your snapshotter address is registered. Ensure you have minted the Devnet Slot from the [devnet dashboard](https://mint-devnet.powerloom.network) and your burner wallet has been added correctly during Step 6. Refer to our [troubleshooting section](../../build-with-powerloom/snapshotter-node/full-node/troubleshooting.md) if you encounter any other issues with your node. -### Stopping the Node +

Stopping the Node

-1. To shutdown services, press `Ctrl+C` (and again to force). +1. To shut down services, press `Ctrl+C` for macOS/Linux & `Ctrl + Break` for Windows (and again to force). 2. If you encounter issues with data, you can do a clean **reset** by running the following command before restarting from [Step 5](#step-5-run-the-snapshotter-node): ```bash docker-compose --profile ipfs down --volumes ``` +or +```bash +docker compose --profile ipfs down --volumes +``` --- ## Quick Links - [Protocol Overview](../../category/protocol-overview) - [Use Cases](../../category/use-cases) -- [Discord Support](https://discord.com/invite/powerloom) \ No newline at end of file +- [Discord Support](https://discord.com/invite/powerloom) diff --git a/docs/build-with-powerloom/snapshotter-node/lite-node/getting-started.md b/docs/build-with-powerloom/snapshotter-node/lite-node/getting-started.md index 7668312..eb7ed9f 100644 --- a/docs/build-with-powerloom/snapshotter-node/lite-node/getting-started.md +++ b/docs/build-with-powerloom/snapshotter-node/lite-node/getting-started.md @@ -13,7 +13,7 @@ This guide provides instructions for installing and running the Snapshotter Lite The Snapshotter Lite Node can be set up using either the Docker image or by running natively on the local machine. However, using the Docker image is the recommended approach, as it provides the simplest and most reliable method for deployment. :::tip Node Mint -Node Mint is now live at: https://mint.powerloom.network. For detailed information on our rewards structure, frequently asked questions, and other aspects related to node minting, please visit: https://powerloom.network/mint-docs/. +Node Mint is now live at: https://mint.powerloom.network/. For detailed information on our rewards structure, frequently asked questions, and other aspects related to node minting, please visit: https://powerloom.network/mint-docs/. ::: @@ -615,7 +615,7 @@ eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" ``` -To save changes in the `.bashrc` file, press `ctrl + x`. +To save changes in the `.bashrc` file, press `ctrl + o`. Refresh the terminal by typing: diff --git a/docs/index.md b/docs/index.md index d630fa4..54cb4f3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -66,13 +66,14 @@ Discover the practical application of Powerloom through Pooler, a Uniswap V2 Das ## Building with Powerloom To begin using the Powerloom Protocol, you need to understand the workflow and architecture of the system. This involves familiarizing yourself with the different components and how they interact within the protocol. -The best way to start is by exploring the existing implementations present in [existing-implementations](/docs/category/existing-implementations), understanding how they work, and how you can leverage them to build your own use cases. We have also provided examples of how you can build your own use cases in the [building-use-cases](/docs/category/building-a-new-use-case) section. +The best way to start is by exploring the [existing-implementations](/docs/category/existing-implementations), understanding how they work, and how you can leverage them to [build your own use cases](/docs/category/building-a-new-use-case). ### Utilizing Existing Implementations to Build Your Data Application -Although the data generated by the Powerloom Protocol is decentralized and accessible to anyone, it's not always easy to understand how to use it. To make it easier for developers, each snapshotter node comes with a set of APIs that can be used to access the data. These APIs are designed to be easy to use and can be employed to build data applications such as dashboards, bots, aggregators, and insights trackers. +The data generated by the Powerloom Protocol is decentralized and accessible to everyone, and it is not always easy to understand how to use it. +To make it easier for developers, each snapshotter node comes with a set of APIs that can be used to access the data. These are easy to use and can be employed to build data applications such as dashboards, bots, aggregators, and insights trackers. +Discover [Snapshotter Core APIs Docs](/docs/category/snapshotter-core-api) here. -Discover Snapshotter core APIs connected to nodes currently hosted by the Powerloom Foundation to build your own data applications. [Snapshotter Core APIs Docs](/docs/category/snapshotter-core-api) ## Walkthrough We've been working on the Powerloom Protocol for quite some time now, and the protocol has evolved significantly. We have a detailed walkthrough of our network, how it functions, and how one can leverage the power of data using Powerloom. You can watch these technical community calls: From f047eb657112078468fd7bd3c1d60b861378140f Mon Sep 17 00:00:00 2001 From: Lakshya Mittal Date: Thu, 18 Apr 2024 18:27:40 +0530 Subject: [PATCH 2/9] updated content fixes --- docs/build-with-powerloom/devnet/Glossary.md | 2 +- .../devnet/getting-started.md | 32 +++++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/docs/build-with-powerloom/devnet/Glossary.md b/docs/build-with-powerloom/devnet/Glossary.md index 89f9146..fa4dc65 100644 --- a/docs/build-with-powerloom/devnet/Glossary.md +++ b/docs/build-with-powerloom/devnet/Glossary.md @@ -28,7 +28,7 @@ The "Prost Chain" refers to the foundational blockchain infrastructure the Power ### Protocol State (on Prost Chain) -Protocol State represents the current state of the network, which Snapshotter Peers or anyone else can refer to if the entity needs access to current or historical data references. The protocol state is constantly updated as new epochs are released, and data gets submitted to the protocol state contract residing on the Prost Chain. +Protocol State represents the current state of the network, which Snapshotter Peers or anyone else can refer to if the entity needs access to current or historical data references. ### Devnet Devnet is a network environment for developers to test and develop blockchain applications. Devnet provides a sandbox environment to test ideas like data dashboards. As an individual, you can develop your own snapshotting logic, write the data application & use these snapshots without requiring any consensus on said snapshots from other snapshotter nodes. diff --git a/docs/build-with-powerloom/devnet/getting-started.md b/docs/build-with-powerloom/devnet/getting-started.md index aa26506..fa99b8b 100644 --- a/docs/build-with-powerloom/devnet/getting-started.md +++ b/docs/build-with-powerloom/devnet/getting-started.md @@ -134,12 +134,16 @@ Unless it is a customized need or instructed by us, the below need not be change - `SLACK_REPORTING_URL`: The URL for reporting to Slack. #### Step 3: Set Up the Codebase +Set up the codebase by running the `bootstrap.sh` command in the terminal. Developers may use different shells, such as bash or zsh. Adjust the command accordingly: -Set up the codebase by running the `bootstrap.sh` command in the terminal: +For bash: ```bash bash bootstrap.sh ``` +```zsh +zsh bootstrap.sh +``` :::info This is a one-time step that resets the codebase to the latest version of the branch. @@ -161,6 +165,9 @@ Run the command ```bash bash build.sh ``` +```zsh +zsh build.sh +``` #### Step 6: Assign your Burner Wallet @@ -171,7 +178,6 @@ Do you want to assign a burner wallet to a slot? (yes/no): Enter yes and then enter your burner wallet address when prompted. - This is the `SIGNER_ACCOUNT_ADDRESS` that was set during [Step 3](#step-3-configure-the-environment-variables). - Next, you will be prompted to enter a private key: ```bash @@ -273,15 +279,20 @@ You can find the latest Epoch Contracts in the [example.env](https://github.com/ This should allow developers to build and experiment with a variety of use cases. If you have any custom needs, reach out to the [team](https://discord.com/invite/powerloom) ::: -**Already Given:** +**Pre-supplied:** + +:::info +Unless it is a customized need or instructed by us, the below need not be changed or modified. + +::: - `SNAPSHOT_CONFIG_REPO`: https://github.com/powerloom/snapshotter-configs - `SNAPSHOT_CONFIG_REPO_BRANCH`: devnet - `SNAPSHOTTER_COMPUTE_REPO`: https://github.com/powerloom/snapshotter-computes - `SNAPSHOTTER_COMPUTE_REPO_BRANCH`: devnet -- `PROST_RPC_URL`: The URL for the Powerloom Protocol Chain RPC service. +- `PROST_RPC_URL`: The Powerloom Protocol Chain RPC service URL. - `RELAYER_HOST`: The relayer URL for the Powerloom Protocol Chain. -- `NAMESPACE`: The unique key used to identify your project namespace. +- `NAMESPACE`: The unique key to identify your project namespace. - `POWERLOOM_REPORTING_URL`: The URL for reporting to PowerLoom. - `PROST_CHAIN_ID`: The Devnet chain ID @@ -294,11 +305,16 @@ This should allow developers to build and experiment with a variety of use cases #### Step 3: Set Up the Codebase -Set up the codebase by running the `bootstrap.sh` command in the terminal: +Set up the codebase by running the `bootstrap.sh` command in the terminal. Developers may use different shells, such as bash or zsh. Adjust the command accordingly: + +For bash: ```bash bash bootstrap.sh ``` +```zsh +zsh bootstrap.sh +``` :::info This is a one-time step that resets the codebase to the latest version of the branch. @@ -320,6 +336,9 @@ Run the command ```bash bash build.sh ``` +```zsh +zsh build.sh +``` #### Step 6: Assign your Burner Wallet @@ -330,7 +349,6 @@ Do you want to assign a burner wallet to a slot? (yes/no): Enter yes and then enter your burner wallet address when prompted. - This is the `SIGNER_ACCOUNT_ADDRESS` that was set during [Step 3](#step-3-configure-the-environment-variables). - Next, you will be prompted to enter a private key: ```bash From 1dfa0998abd57a7a3201c22549b97cc32259aa3c Mon Sep 17 00:00:00 2001 From: havealakshya <165628020+havealakshya@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:54:58 +0530 Subject: [PATCH 3/9] Updated link for devnet dashboarf --- docs/build-with-powerloom/devnet/getting-started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build-with-powerloom/devnet/getting-started.md b/docs/build-with-powerloom/devnet/getting-started.md index fa99b8b..d9fc165 100644 --- a/docs/build-with-powerloom/devnet/getting-started.md +++ b/docs/build-with-powerloom/devnet/getting-started.md @@ -373,7 +373,7 @@ If the `.env` file is filled up correctly, all services will execute one by one. powerloom_depoy-pooler-1 exited with code 1 ``` -Make sure your snapshotter address is registered. Ensure you have minted the Devnet Slot from the [devnet dashboard](https://mint-devnet.powerloom.network) and your burner wallet has been added correctly during Step 6. +Make sure your snapshotter address is registered. Ensure you have minted the Devnet Slot from the [devnet dashboard](https://devnet-mint.powerloom.dev/dashboard) and your burner wallet has been added correctly during Step 6. Refer to our [troubleshooting section](../../build-with-powerloom/snapshotter-node/full-node/troubleshooting.md) if you encounter any other issues with your node. From 8bdbfa522643d59eec03a996863de38da6cee132 Mon Sep 17 00:00:00 2001 From: havealakshya <165628020+havealakshya@users.noreply.github.com> Date: Fri, 19 Apr 2024 14:08:39 +0530 Subject: [PATCH 4/9] final check & updated links of devnet dashboard --- docs/build-with-powerloom/devnet/getting-started.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/build-with-powerloom/devnet/getting-started.md b/docs/build-with-powerloom/devnet/getting-started.md index d9fc165..4657099 100644 --- a/docs/build-with-powerloom/devnet/getting-started.md +++ b/docs/build-with-powerloom/devnet/getting-started.md @@ -31,7 +31,7 @@ Follow these steps: - Search for the transaction hash of your NFT mint on the [Sepolia block explorer](https://sepolia.etherscan.io/). - For Metamask: The transaction will be under the `Activity` section. - - For other wallets: Search for your wallet address in the Sepolia block explorer and the mint will be the latest transaction. + - For other wallets: Search for your wallet address in the Sepolia block explorer; the mint will be the latest transaction. - Locate the minted Token ID under the `ERC-1155 Tokens Transferred` section. ![Block Explorer](/images/sepolia_blockexplorer_example.png) @@ -141,12 +141,13 @@ For bash: ```bash bash bootstrap.sh ``` +or ```zsh zsh bootstrap.sh ``` :::info -This is a one-time step that resets the codebase to the latest version of the branch. +This one-time step resets the `powerloom_deploy` codebase to the latest version of the `devnet` branch. After completing this one-time setup, you'll be ready to dive into the codebase and start building amazing data applications! ::: @@ -165,6 +166,7 @@ Run the command ```bash bash build.sh ``` +or ```zsh zsh build.sh ``` @@ -312,12 +314,13 @@ For bash: ```bash bash bootstrap.sh ``` +or ```zsh zsh bootstrap.sh ``` :::info -This is a one-time step that resets the codebase to the latest version of the branch. +This is a one-time step that resets the `powerloom_deploy` codebase to the latest version of the `devnet` branch. After completing this one-time setup, you'll be ready to dive into the codebase and start building amazing data applications! ::: @@ -336,6 +339,7 @@ Run the command ```bash bash build.sh ``` +or ```zsh zsh build.sh ``` From 7894dd2b9102acdc3e7634f1d60169c9f5c78a19 Mon Sep 17 00:00:00 2001 From: havealakshya <165628020+havealakshya@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:08:56 +0530 Subject: [PATCH 5/9] added epoch image --- static/images/Epoch.png | Bin 0 -> 64455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/images/Epoch.png diff --git a/static/images/Epoch.png b/static/images/Epoch.png new file mode 100644 index 0000000000000000000000000000000000000000..05fa3e0e82abcf8d1f2e4bf17ada79a2d356ab27 GIT binary patch literal 64455 zcmeFXg;!m>wm1wFC|azz7KZ{GE$;5c9g4fVOL2F1r?|VjySqCZclq`?_rCky_O1vXh<6nXJqt(=tPT%7`Mu;lP1`fgy^E3CV+jLG^%vfsesJgKF+aR~x~=5V%bR z1%HYQ3KIRavo=i9!XQ?>{8~lvWf#C5p%T z#NQuDN8RL9?SrU=E>|@}L#byhcjj50on00N)p|`1<*=^O!Me%H^zn8$<~@S3U=%Ko zvHkdd^w|Vu&q6|-u?0JR)9#x@3RYUOK#`4Z2+2;~hj9eUhgUq>i*cV7`F@SDZO&n;^7mH>3dVoB58Nlyl=UGNC zh=-L|1sESCR0lMWNp?m4-1-EiX4`%J`pZ%?lE$kEb#0V%o? z|8yIES09~&PzcJ4;kubkI3Bm4YEb&AnO}b6tKQ*jk7~arR}Pq!STj%NH|pTfxWN!i zLwkYTy{oNJeym^M-h7`?RcE^mq7fnSJrO-GC3sL_*!U0_!3meXC+A>?)S!H`(C0^a zL?h-IBFsFbz}^2XFyxJIv|r9W6di#vVzlQ|gna1xGa9~6$O zes?@TiQ^sk^zELr*Iz2xF9yLizZ6jo^;7VB-!DC)Y3Rklc3W94gochPj%|cBPZRvj zb68o}41ZDoQ-8Xib8$btD_Oa~-*m-<#Y4i+QO#YnIfd{SLGJvH#o?!0&s_x0fnLc? zNVjJYYKg>FrpiaWrXQA2ylaR7_{%Zjv7*tQ!wbBViuFp4*vc^n&x5Z+`qG3GtmZCz z#vf&bHIu(Rk0ukBh|h?eFgQap1|#(leIo0BMW}K*NreVEFQP49;9O&ngi(AxfqCDy zKAMnVN&%|wE}cFK^C)*^k$Z}MS}>S)s3u}6^_lS3f#k`c-Qx()C{*;u$@+l=)}{{q`E!)Vp@2Hr5)hj3qY#+R^2v)M9-M8lFCiFyACJxw=8`rC zI*Xb67vz`^i)Iv>4OC_qCZrECGVBf?V=_$Mq~D7sLZM&EF9J$%!(Z&GpMLm^|H55@ zy7&8(4UPvz(T#0`q6xj&t<~h-(hWa_wBb7m;}?xgEg*P{tltMwEtrlBy%PaRq$`FH z8=n6yB^Wt|h$-et47&z(*~dcoPt2PbnjI>8lml^NOpqAh8t2JhuNdx608Vb=kx9HS z?c z4;bkesIn^u%zOJz54M={f-PA z>_jPs{N#t<{kw~t6onC10hY|)uIEdSZjb3BjU(CyN{A4CF8VYgPuOsu#SX#_>W+vW z{uN|(++#8uA92jBm=h^Lo-{;|nkXT9A?`j}T}(x6Js(M8L}EZfM#5KuN09l(kZi{OeN!)axiFuyg4Wu|5M#O#_1&)jI5IpZPKYhuKV z5h0l-yDGyeeY!wwre<1QUsFF)cW>rsa%XOC#%WGrB0F0##Z$Om@cUTxq{`9GG4U90 zsyXMz)PEc10OmcopTta56Z=ZrIlrQkPNz|^QRboLf`Yq6+ebTc1Fjvq{pGo-qui_R zUGYu&x#;di#4O?#Zx~;V@rYETzoEuII1NcDU#D4X#S_~juruq-nd(~t0>hjPs zv$6{{g>uibB2^VNo!W0J^cHp&KUOpwge|o!YAwE70G4x{Dx4r%Bb+kwVDi>PVMUc9 zT1+eTChGuomDS!y*}KRGKhLJNF74``j^d}ki)7)yjZgP8EZVm2t}~?S3k-aXG9|cK z8D0oERor&4q;a&^T4LA79qh1cus`6mw(Hmzu!nV4JDNGUo}V9AI#WMgIW@XSJWxJ% zip%K_)}zr)x2I@&X`Zy@J$aw*ozLsq^%>O3yw7CMY~^+zP>a}&TIIQ@PAb71G%r<2 zVqNDPcMo$;iV8s*EE+kCsZ0S(ItKxn3K5yonuDHZCZ}c3oR@&yqrX|g9D4|FkgfrD zK$t0nV5BAFOQI=edZsG!D&8S76OpNqUjjBJm!Vr}7J@&Lw8k%xY~fSTXE6St;^4M? zyOm3}OlB)%$3sMd)j{_H^biYRO(Vk+FUOP;14Y$@r9(JSrNbjbD}udnn8=Nc#+Fsp z&+?bntARVOJBj`45si^aeU0SBWclQZ6m7D%vYIJN3CtX($}{~2ZwCB!`fyZa-wZ`Z zx*mP5%m1GyC*IT)$1Eh<|pc@lqWN4>s zOd8rQ+UZ<+xR$!MdjQ@g-fIym!xON%Q?ye`8Qp6=YDQ|GA!)jyyGzfu&c>I4_Qdv1 z2M7n`2MhaD`vvUzbB9gtQd63d>Sv0AJ97L!#Fdd#o5H-Gon0 zA@zHh!@UB)p3oj71++qf^g;${wsOyw^V|N}EOaQ0w;!Lfx-+IZW(^M7Qjm-pj4d-F z#$>YAIR-5z{Mgs+e;-_=il!tn0Uz`RcM|%o4=EZ3t1fFh8%4c{h3|}fa$K+cEy z&hy==d`?xZ?)vJ_rP5vLajB$Arxugx_>rgewc(=!0K=7(nG zWodCKbFrr8lNX8gZh~}2ni(su72WEqY1psP@^XHS(^8t!kw%n8bSw83ZrzvVO{`8O z;MAsE!|tif_C$piL+i?)^*^P~xM$kRzZb;J+#d2Tn%fq=t@X=2&lfl{T53FhWf^SV zyqUgOsTK8=>IWpZDEz)k3XRbCk>a0_>-8@~ax%;~pJj?@=clI%-vD4H7)_ zT6lkbIl9ol*u|8+&hj|czKnmadri5jJs~K{%xm{;Ps)n&-gpzZ-Lcmh&cg9l?x^!} zJpycYuDrxOx9WuGAa-b9ivY(b8YiqZKIcLcw2ityJb4~}Zbxe6VdTkti+?;`J}l7@ z(^>GWe_DB^yFhd zn1y24kM5)X_(8D#`NPTzqRN_+%ZuN$UJ)#}7_6`Plf&84Hiv_9T*mi;0GLT|4ZV)S z!-C)53VX&AggfuepXHT|FYP}7w-p{_?}OyFAbTRzP*vPWS{jTRRE7bA1jhk`0+ql) zi3c3_KV=bcO0Z9V*F%7T1(||D{u@RHl>hZagVJ9(|H?nb27-MC{X+#Mmu!gtfrjeI z{`5a(@G(#u7{7v`xHu?R(6=)*w6Zs`c90gjPy$uJ+K8#ygMnd?{guGQQ`6K z+R=fVnE0=O{`36nI}Ke-|92!S`+rXhG(o^$EdT~Odcc4B2BC8ORm<_y)Wy(3O~}*| zL^IGBJj_4nx&DU#e_H-`#Q%e-`oEYA%&g4+7xn)%{r^#w><#S%tt~-gI`I7Odi@*u z|2F;`kqhwG)c+4D{zd1%Ye9tOf#U-FXVG}zmIHckK}b0ocG)E0s6_wp z`kF`(K|^g%*BQEMkn%zN!A!%cTU=f3{~7M9e=Slp80`!EZ^0XvY(SMpADIY)E%Rdek%~wax$L~^SrM-do zPoEzB7ok4=GXeffsK3|#zl8elj{58L{`ctpmq&pZ!hf0hf2H1EGWws?gQkS8r<+6D z^A(o0c6Us83>v;9IxS=p5rj81CL^i7Q1nq(I&>7?)4@;*(W}~uea&>oa~!Lu&%Elk zzh6e{*Dwpo&)XHxD%KsEWciP8?2T zgmrkn5PJq93>AB27QMVZY}#I|v9GncqD2vK`&Cu~R_aWDzdQhUyMKS4$O=Lt?0JrH zv9rS8?|6R!@_KsjP%PSgr4ZfLTW?KoZP{8xJy-#h*_Q&;L`$vJue4q&=T*wtDs*Gt z)fSaK7TIao*zJw-rPGxC zxHjaFFRrBf;9~z@y~XDc1z9&1rqpV!$v1_`IM;HuL7k7RhvEq(C;oK$Iw>#Tk-G)1 zoW@(y#t^oA&m==K8J*6c%$&Ui?pk$!AMaA%~MOsFO@HY#1ik95&o z#hbm+zuhjLaCGuI3ZL^{;eCgK7j+R1$txU1>Q}W|BjJ&F zD#2E*M*j>RPaMf4fC9w$X7u%Z{7@?QcliSGfC%#+xwfMNEl95qKc9c2s{eVvR*j6J z*)F&xnLn6W_;c=vTWV8^6#Rj9{vk9d7qNTx*^ViSFpOyB8$zN-zxWHcGVjbawIbJ? z8bXH5inI=q~Y1L*svRG1aKZpRht@^Rb zZ~VC`^v(-h%+{*{iyF1I+viP$%{t8yKJK$Bk>(|iG}}2BYUzE`mif(nGhVSpB!uYs z&(cy)s}2TO$OO@i`ARZ799lkEjcmTAi|0Bv8g) z(HWTqH$&zBkml|V4H%WX=(THlyb(@+d2jndC!Y_)(QxYH4~xdJUr%DF0 zDPCY+Z)auQws=fuNbAhzC6Lz2)r{DAUV%CK^p()Y3sN@?a?F>k5UKOw>{yZhS<_FE9OV@{TRxM2I{j%in~>LA90mU684^**>eTmK5nwXb;Kum%`Jvd_;*@SC+^&=!RwdtIyD39vfI@WyK zU$e{EH|(#DL|wG2I84kso!0w>UryibwGcI5M9P)#WpKyxT`DrSda6cAl2j&M)tsj7 zY5-SRjw`kcUX~9M!gw-s9#{)HA*THCZ9z1?Fa@JId_Rj z;^1iKI6VAGAHE#FSMIQ^U8MuIB>14LUHrpWpPI~1C&jZ+ni`XkuB7URGhmVSPp!_( zK_pyNre%k|k3-Fl2p0fvpmOr=np+}d2T8w9kpfU+u=P71QO>m^3wYUFFGD#?||1@0B<=x^8jGQY`IDJTYAwR`k8o5b`kMpUJ@CAg zz3X1f%-09~?vzS(hU9woi(kSy)CHumKbXztU@F_L;TR1^{2MpiMn_ikBN;>2>)k09 z%G62+29Yi&UVy~hy=m3u^ijVZSl(j;pKm@`CE^ z6yL-kcxQf12>G5Li+x*+E%FM4>a!n^TU3_! zRJ_X9-YH|~;DEGoEc63A-y*XBuSlC2PXsLH3w&wHmUx!CL*160#^Wgg z>#fdtN`niO3LW9ABf0|@-)s&i@XIvnF+{)Mb!Y4Tj$xgAq4N$q7>#!>Xrkk8C6XSf zYavVn1hBV+b+xxXR5>3K%o{J{B&h)6sdiJmZzh$H=|*)sKHlAFnWGC38Bb@c6+{mu zg$dRwKAF2>4@nA7K0|Tc?(b*o@PGs0-i8(rsmtLMe6I3AfEcQ-_gUccT(nCr=qZtd(=a3`UmmWSIy*ZUb-(#BtbFcq8pYD7?&!q!14Z z;N)8n#1u*KMMu(Dturx%3dCX{tUI2_QAx#!)ZEMB-miC~cy|V@S?MiLnCr|J=`Klr zdaprwoR!#@S`SZiG(yvMN7?lzW~G}a+M$k#3UIVM4>vo~nwH-Xo#P`9!qrBi zZn9)1X!n#8Ue%_T>Rj4~ka&H=uQ#sJQPv#ge5~IGx~21a^QhNb6+qv^M)PQK?2V<& zvMeRqqrg2rJ?So1Xoz9A1bN5;(5nlq=r|)Gxe115Yn$5F9)Wefz z&LiP@k`onhb>8Zz^EHihozOl@8Rk^hcarqE9USBN^(_Xl?VNg$iSWHE^F#{yI!-U5 z(q?Od4rrO%=LheD`dg;&Q~R0^P@ee66$IZ;O!K|ip9{R`O8jS>KS3d!z>+Q!b43-@ zY0cFRSr1Dnmdhb7(&_XgZD#dr`!6#)`~9`wvgw4W4*Z0EK-^c3XcUdYz-*&fWB!Ak3W1d@l1MGMy{1(z%)i z60Kw6ozrf&0E+LEc(UtR6uF*$C7M6MH26a*a~%^VX5s0F1SaHtDk<+#lK3=lX`0nR!WdiGYerh}qD6yi`fb40@~vU#*jy>N zuKLdQLhQSveLTez+m3ivtzGnccDv(pi!~damY3vHY^_B8pdfLyO?ZL>=|1f_z;(pF zheIMcA?rjdR`D>`yYyDR!k^Piu?b!0$+SE4I>rP4N@;`oQ*+{jQm5BjG(Ro8Ocqc3 z*WDPakM}p#ePAV!X>zqWhFp-tLcI}Xe1&=Ou09jiZren3(30&9UG^IgA?`5vwKnoZ zvnBS6^A)D`mHk2K?r1_DFSI{oh<-n!orC6(^?4cBe$U++3eKa(3QMtlUG<~*vT{|e zH6$s_lX}7Yn}|H;bMRe9&2!iV@AX=2dI2xgEt6=c-R(DHJXjT!e6jBy1#VgMe{|rz z*IqyIW^zVJ@_zV95Go6dCenUOO>=6-=XCD!uJ6p;lTG5m-x!NQ40<3G$is-Zx_tjc zJLOSK{=T0<)+1d$T)M%VTk@18j}RS#CW+0r!5`_Y(d8co7dM==1*AW09XU}rDSlJ@ zn0}*Pl4H$=Ab$HPJcSStbz!C4`^S9!2lynU$^xpMmPU_)sJmFJc(NJ5l+f{l>yHN> zkbH2nlk1a1)8lBf1PKr$L-}>?MdZ~`K&aEbE=$U%nCnwdnR9&Gpx)_2oM4;^ul}67 z_=YXVr0R7?+(Ytn%vIE%q|KRxV(n7s3e6TjrpqK^Xf8uLX6sp0Y(}>Wrt4#ZJM_Ip^2vGl0ScDEeGt5~bj<5)w<%jv;Edei%_ zZx6c-e#zCVu$nE8@XrrtpR@Sib;)@GVuT*j}yd=w9b^ zt|$56;Qs37c#gUukS?0>|Px z4T|Dh`Iw_7Y#bZMqK|;)M8D{BoQITHqC6{#9UG86TSnRTWF{snv~)CKtUeA;QI&7Q zt|Eg(VX)*GU-11RKimhw(G{Gk0HPyIC0inby2;~-aiX+^gL_D4EO2p|AECVaXU>PD>^xwJ%)Il}JOuiU5`;C>|RvjXBM zKmOR?Y0mThIe0F9g@B6T@7>3?=ug5;uy=Jo`hBDR6$&Er5?oZ2OI(*-vOYOkvL-w;8u>cL2-l* z4*RZ0#2eaz~`H zifll*uB#I;u}W^;^EOs{_Wr=*vBCQEjMUW%T)F9hJEptfZH^*GOv|pAp|4QA>y6Hx z0z!Se1fF|O*Gn5C;L*cCU1QQ~pKf}+Ag;Hy=&rPx24nJeT)n2`yg^!Nc7hXDdZ{*A zW!N%N5tGCNZy9C>uW{Gk3mr8=GE$xU=BN~6WT^PvVr#XKc}%8=G&{ZU-{z&{Pr^+v zFRuh;ce-2r`L`-TOtBM4?cs1l(ti6<&Nb;=vT@PwUS;tlA5W54gs()0mISVvD>&8^|*& zr#1_*<8Dmo4PO`Bn&f@&6DctDycknMz~w+Vp5f{QZ>LePnkoi|jvxp>W3OpF3`{Ad zh4gB^g@=B?4*&KWnnb6=!-`7b*d)(tonz#{9C5B#W0uyCUcnt^?fDHO@PRPW%k!C7 zmf(eA(-3{ROZU?^3DJ2orN+ZTwNMS%*VoQ0hO*6{7Rz=0F6;`0()=}w!*gcID+4!1 zfs;{P6Xl$jhvU4{1%jA)3CNuH8SaiE2W6GG<4GypIuKb|j|dcz={`fg+{4S%FobM2 zMDLHgNK)zSC`goG5BXlm+bte<{VJ-A)(jqPp3$7n7cfPvF~52T5SQwmF-4@XN-U33 zhT>egcp(%9rTItlsiyNTjAE8I;1ki?Kg|r=%_uGs>9|Dp7%MTr!XRI z&F+)u=X>FcMmq(V3yhX~wu;A)GL~4nc&or5$jcIeNnq-cR zF~QVX&OzhOagN5NTl!skzTBHyj^*eF?j(?AS{kp!;S9x{+CAUQCUZE!HCQd1xw8PY zTJm`y-G3dY7BnP{L#&JbTAQjiS<9}zBFp08;aMSY;jFyBDCM$m$mpsGkc?*5WvsKB zURkJdzds9!KbHR^t=Y1oP6uxf@HK=_BEFAXI$9`5oA!HGT4}}Ss25$GIKQ;oaE>?_ zAIn7YC7gT=F zlJxMqHSKCc-&wzX`2KJ>S5Q|IivITO;OF5ua#ne&WmcQRjtrCal8Bhs6G@>@wn*+*AesE^X#j#rTfcg+r-(>}3l0n>MxysD;(YDWj3efvUF-3ET zFEj=S$mpf;s37!8t;VvalbKe}vP&eB=#Hi*;Y(%;LKWMShnQf4F|2_T?NyGoo^iH% zjm;`q+LtGrXyS2XcT)6aO8GFa1yVXLjwd1GxMOC9GU<%qjlg&K$_{Q4B>?%g6oe!u z4LCs`AAp6ysOWUPkrk)j%CAhVc1ew9)Q$-p`$LM56(4Od4P6xpixF)9yGob)(^@A| zSQ-k0J0`@##kyc+B=3_X^-#@O4Zvhy7W z#7_q1o@RCE<;$#GVCt+FzAzO|(Eq8P%C`N4fM04MQRMCQqoCIw7>>pOQRBJ}R{4IZ zwT)ZtFBh)WY-adqsgB;SnY@MuTPG(O)V~%$MRA{g%2FI8>=h<$IPAd{%-7hU#h`Zt zV=$~YnZK0v@fva!H;@O+_977SRbmkSH5VO&#bd*UN+w}II;u}d*!z?%%w09*|Th3?Eb+!{C1$j-z03 zJHw(;_>p^*OXy2i&Y|C5gWf=klvuzt`j(it`I8Pl(yJZzQsW@3&GkA*4222MBN+5$ z`?9)M{WmMewc9e#bgXLHM70v-x;<$TcCiwN1hlX;zpMf;bq5(FUf*c+zULU8~&*eb!huXmaYkA%0NcjEr7) z&&A<%3GsNgh*kb_{&bO^AC@jC65EKB*Jwu#@<1xgW}m}rOfV4rL1kO zv4+X2PB6$aqkQ5Q*H5cjDA&LYzJr8Uu_K;%UvTgaDaUCLdS$z+cDpkp31EMQSM*jh z_*akWtY!f&)w|fI0P>3o5P9y;SFeUkWVg7BD?>P#kdR2|MN>pew90?j?T;8rj(@>p z^SMcy$m5?4{MQHD`~rgac_5?Jo6j@KUruCj+TJ~wn{8;Ry#) zVZ6Xit44HDmRfY-eSY~3>*7nim^?Gwj7*B0J*{2;3PX8MQh0SiO zN}K<3#?;?>r4F|9%@geoXE6+!Uc`$5W{8i*e4va{xh$C$eWSq>_kyQ6?3!>UFrK!{ zl5Q_ff6(@D!E&zD{J^!_w{;xR#NIX+6a_tIzED&v4~Jl!F?T-B3+Q=E;8`m@5Cs%^E?`HD>uENw196L0hHnRMMRh_mpx4d$yd z1|BRV67iI}qugg3?YIy6JbWQD_wmM~($&ZmzTBJ-L|QdnZ>RH(fX@ts*PiJ3 zoMA0RS{ly8hPm+r%#6J~q`SwRbD?b1!~w!5{Rq5Hdsr7Awn&WIW^~SWmkm8q^`ufv^zKo zg~_b9mxoQaqWErtaKjq21fWd$OuE1CNdN+du+LJIexB|pCijMO?k3F6jn{<9B+MFCf34#rW#kTnVN_CygkZ^% zo(mFyLHH;42a=AZ;6D}vB8sZWKdd*(ew4nXA&pe=wP$aezb#OA8-cfdyuXNC{2Fbb zZMxaSmr2LUId)BYMD_aMMTQk@RTR zZFI5L9HD4En<%Z0JW-%5V&kSsURyXOR3AEjx#136mS=T+Z;PezMfIO$_Wg_b8ib%) zBvNa_JzeiJ$zOxKO*U80!ZK?(e^GKQl>?1T$(u@dC|*U?xykFzjnsn$g@^K)UsVqK z9Rl@IXFF;KDs20_ar1}#3;K5zB3-z;;7`hpx~*H~5nUs>MwubZB>&>)Tt5|a7DanT3$%*E=ZssB=em+Gw0^xiPhXj2>M z<*U~vkiDKx(C185|1CrD6#OoQ0C_|nCv_!aY3#HtjNGNXIHltqTJ9(+Z>4JMV@9yL zN>WniuZ}!qwr-3YL+{~adJxj6hlz!rFyuC`)>8-$9l*#Lrgi~@(idd- zotnRiJMC~pNHdmMT&_4c1sz^@gNS5FqRaUTE*_vp&}_HQD1WhIC>c%T$OzZ-_xc}5 zr-jj^)MWGjhHg-_+8u~!dOvhzwpbWSyjBfvhm;}U4FT{zL4XV%5jX-SCj>^LaWP>q z5@v1y8Uq>DjjdFj>HGjlyTe}!(4qVAbBj2|{g-;D{}M&apAJc>GGTxJSlci1xMaH< zO|@#SiLN8i>50aDh{!a$PehepTm2vw3P#R~Fb%`G0ervy$4M zdGd(*Xy1upc%85CPJZMnXk+>L&SFYDW7NU=&qCDhDZ+NXO37(`%B1$>MVS zN>;3%L;aWjw}*j2r|q+6s$f%V^VeMC*cFVn@4~IK#pB2u6lJ7(wOSn!rPWgz0)9yr zsEIYfrgPZBWfAcBf?^ngIHgTcf}*e@$CerMM6}$$?hBN{_l}{dmfwq^%u=4OrdCsR z>VL>+wm8I~SstW~kl1mxe88ag$@pCFkGcza=A(j)2GMXVUsgLq{`u7VrRaOC7J#_$ zy~Sok6T?of)A&lmTJ@QL=jkTzREwaw#)$s6d(>nWQ}UGti!hJ^icRHm*D~Mqa!JR+ z`1c|Q-s1XAoO58$X2YL;@$~eJ;gYt4>*TxV$8n4ylf)n~ zoXlj^NFxWyReR>D@HH%^X-Fg4%mArlrW}yv*nq6oXoX)<%neYlW6+1|PL!yPwn2M5 z+cRcsIHVM^((ggUVZ>6iH`;zkf=wn!4zgIleG#{Cu-KdyJ8w8&j|{`~J`hU#+pL)O z6h+}x=29$Eoz|x|4kOYu!l-S}h>+ChDqJ2{Hh8$#3dSVK1R41O@R&Ob=NcxP^}m;K zb*%{af2}N09c>hRmM@et&F866o6GpP$aV5`CpQaMOil4mU%^Crpx>p*O5TA?#_xeU+}*oH9ag&_ro%D57O7*o24bjf5g#{I@>+^< zfdL2X=^8^x4Kwn>6uR|CC`*py|LiOe+Y|V+%?>2}!Ei+9)G6ZU+Xw!J#v1pths9;W zi5}1$*6qnA?r$(QKu*xqGeI{_5p?bGpCO9MXK`2ms+L zPC}7u4eSt0WiE+1skqe%asOC9Jiz^%U$wX1`pFU!>idmWUD$v)xEPh+CF2?m6OA%J z@6kVIce=umQy(XV(DN3B=i>mL+1fm6U?XhkRk*^wa)Nt0S4}dWT5cwBH9Dlp!8%{` z9qD>io&df&sVh8$X{ylG++ZwuTC7{4P`2A#jVT8YL^hB%O>SRA8S$Yqn=6g$4mn#R zI?}HL$o0geCU#ZVp_j`7@V=nB{{Rj=UhPU71Z{Y_ku0{d&p#v?rv|36865kZqyim_iC{Lr(LaQ{1>+&Jm(EuI?*YRNZ=~e zYcTPDxVre=xZw@YasrATVxYCIB5rNC5PDs@l4}j*#%W|Sp6CO9yheiTC1{|Znk$^I zt>B>UQT8{nXd>Sj>Zgk9{`R1UpN-YVU;4t=_9WBAAMV%b4Z4sGMia*|;Pg_d90Qpt z`qHq4yK#^O9W7a-meTi+@7fAEB3z#J1|_T^&HI?(JeI^mHaN{ z8x%FkcV>)-`S_b?>&^iNf7DSHt1U(IK~}EVHd>KX-|6yZHqqMOdd5XOy9>)xsmW$X zJ8eQ7H=I|;GZTjs&_L2PhSq;KVu|Q3UI5SS4qP+-bJ& zuTT|i3<9$^j41prWfavvo9zsvO44clYybd2o5rQqO7L~E5vvADE7Z0^kxc)1r&aDG zpLH#3&l;CsS2BMdgV7vTUkKWun5Xh%dDr^KMGlX1&X1niS;pg;7N$TXY^yXPkKtG{ zF%r-g1SFb%HS6%NJdDKQLgj9~XD*C+8m7qF%2OaLjiO;ngAD-EVU5y3WT-m|1vTLR zY*94T2#pVE3b*b!VDPhnOCS63(iej^)o$+$3Kd%r8`vd}6kgC==8{LA=s>$8*UtWt zB%8>_&f!ocDyVT!`FK3?F;!n=TsgGwLSg4A39>>KEqpzU(`>X_o%%VUHu$+&J-k^; z)*&}N?V+)?M}s|}ZocUkA`HE{85xYnNK-Ky2%Ifd_qGL?q7~{b`x%w`U!GWrAa|H9lBaVz6P$A!$om0{i&nX)dGv6|4tA4^)#vT+!|Q~RH_F{v z+jNdR=W-)9if;*{q+9JzzqI8#`Ic+tCDJ;kGn=AXz1n_y3qq_aXdA-l`E0T`6oE&N z8b=`|5RSz_oWx(HIO>tKy^;4~GL_F?g*@3|@Bypy;$X5tkS7`*x!`B>7ij^>!7O%L zFfI?bKN{33VS1u6*+Rdpk6Dl#>=2{`u|u4vH7ei=I|?k%7>*g@NXRgvBvEOQ@7*BJ zQhsF%m{E;^!C`fvadW>DIhiXViFrOI%^QpmxNo#`%O^_rJUqS+EuPF(gO8!~B6c`2 zhzh(PN%(HNodkchF&Mt}J^uwnXj1C?N6))`m8HE#l-VL#R{39|^MFmjEx}3a_DiYE zK1Y+y#US!2wg#2Fp#sEJ>If=-ed>HPk?zp<@S^avaP%>SYD}lK(qo`xtYAvU?1xEw|7E(L(1}b#I?3hp7J;soQ zGMT8&ec$rcTl7Lu{dxI7TA(1zohINu>#|-tZJ?aNYs^IhYTGnH#6=gErKjWxwWH$~ z@xmo|FMSn|FJB^IM97KF>y_<`mjiM}``FS?W_hXv*g;Msu?EW-=nM`gfo8^g3y~(5 zD?NjWrTYLlqp@V&{3@sO)o(g6 zuU2wGE$^p@9?w^{ug|BI$$3ApF?1VE{B@c=pu9is8f)J}P$>k~MH~~J;wpmCIFBTD zugqkzKK4te+O3i5tTtCt2Jk6BS3x~Hu3Nt7MZ(SCbL|K~Zp#wz@JHaV zaOLvI!)ico<8wIi`Q}1#d)0ElWfCs}gpo5TwTb77&144&n2ZoA*4qM6c11-hdbY*- zKbx=-HB*gLbqF$e{=v3{EZNyH472^X`owIuFeJ_5#i4PZRg}^+TBOvQn9OFCYw2f$ zB2+M%ECbtfUW+0#j_G`tS#*Pc!UQS!8R4%8&a5xt{*$2V>nh--w!`^4H)_dxlK(C~ zlZ6Jz)i;sBk>{~|ZN!K`k|Z34v3;j$jfLW`u=N$%B56w!6Yx!Y%|$GZE+VY*X?B~Z zm)@o8m;Pi{4oT3?`NO7&T5pNqc-H!h zU9Y&{02I1sf9JH?4AbNNcuez*aJ1XN$hKjNyF$eIiQakHL#tee?#*wK=MAAWKKi9?h8{yDR|-}tlZh;tUQ=qj z{6PmPOZRQPg60l%`6zeWPK@k(JFuSSkg;}kS_P@q? zAO5&X@gxn!i+FMIR2gT>wW92mmj>CE{zWQ3dPY}_Nzy?w+B7BGR%q9C^qJOVsq7mg zm3z##qu}$GfnwdfXlB!yOLAD2OqiYryp__#*fcbM`!+OcJB?2oEG9W)s173i*XWj1 zDv;aOdn0~rP&XpYTyW_vh+?%s;{~Jv^y>L$AJy_tAQExu?&It__+^lVwqg7 zr1mhW7E@LHE|p#GAl>^c6zV>MZ(^20rWbUvSU+|A-u}{b1H^xQ*!1>AnOojlj*E~L z5d$y9c-aOm!O_P0+6$Rj|8K1_)oO^%k4Nt3FBh0JeQRWcoVvAbwr{L>A4mEu)7QM3 zA9pPcaayv&s<|9;6n>X1k}CT5XUn=O#CQzq4Q3^Kya97;W1gX6SsAYgmbi`lpqPfO zPD96N^$?;Z>tzWkxin;6*K48g1}zojgfrGK4OUBj+q*$|BKQv#W=X~ZzM4;W{!1a& zyuxcuw!i1*`}!}=Tj`4@i4Jc>&x$aq<&lj$Im4JnGFzHVZ;Emh)tKB_4MRB{MLDrwa2VBTWs}hMA4Lb9>NRPqY;q?Mij>!S)cY(7+gf z*zP#Lh~Kn~*Aa1vM&elkB;k+>nRu;iR6WOrZ8Kk<1~7+6GD44TJaZ%DOX0;?ZR1iQiS5h%g@M>gXZ}g;9Rp z4owe`??8XSF1ENm0I82PBBvuAXu-2Z#=K`64V+UX{6PSPt!% z_sbnN8O#G~A<9OZu>Ds$wWV^u%cv-?aJq8NU6z8&s`IWNDx?!P!uFVY3wvtFtJ@Tl z=|W@4434TF+B{43j+o>V>A}|t)NH%0r}>J$v5z-Vyw%#vJzh*2%6a{uz%baF!3da- z+QX5Y!SsMI^aa0%kUWYW>thM6jc5izxz(vmPyL_>{y$$!#$bA`AWs|0XCamdpzn#c zI8Tl*SiBdw&em$s6b_^XK~b{lC_=Wy{PWKfr&|=)&P*O>^ok|eEbN;x>p}HIZ6M!b zcbJRSBFIPwIn>Gt{T=5&m$c$R$zBlSI&~1k$W|l{C|0PlpAA9lArNq3C3&}pQ`r~d z4AJh*Y~pY*-S_6-`9T%wq@+Lh@g&4m~EB9=&OmTE0+#xf8ut`H3} zKDq?fT^c~{;e7Ed%A8prtbc(vp_gDDq z?r%8c_$|)C(e3=xFoe8rT&ScluJ&Zc-?q6>A}-I}owJ?2nIuIER3n{xU^fFzXir!d zfAoA;Dl-r?_4yGIE4U29+N4GfB_qqaURF|DWzwLJhsx<>!ECjx3II+LZwbx1=b{*v&(Ak}(d1tH zER;Eg{R1`218s}s(?#0vFYM0yNCj>YFipv!xE?D84Vqphs`O2*u7lM+;J&5v+-0Qd z65*)NQ2zwVYsmRZ%N34*Sw7Yeoz9eafnz5NdXJ~9W$ooA#Tb#tw)?-G(A+NfI6jXT zz99wdyf0i&KcAjt>w`6zSg7D_=gM)z;u$y9h3_|@fBv2AMk<*u99WCK)pGMEsOTim zloS%$RZTxXU4wgaIqf~Ba8#@pn(ULVZhhhsBD$xfk7kLWRDM;r2s#3jm!esnF`8(#CRG-!(o=D^=XrTB;BAC=HX%cRq&{1wK0+GMrJnlGQUq>jHaC#QJzq1pA02(LttLdHL? zNY*a_-z$dHNCGKFkch_(M_}o0g4mA_^(<_{VIxNx>^0T=WgxL4jKu5c)cTwV=cXWU zPR^m-C<)b#9vn44ctX|-^11wcpo|2VY z;d}U8_Cp}VOL_1lo*3t8H{cB?;{I{O-=GliGCX|AjZMP`Fd_Od^mdl zGH|xPy1XK0X*P>4e9tB11+8)QDW^YL8fTCX#ltYO#Iwz2X(h;vRYT>a#QezgPhtEQ zdMe0!NmRn_l>^6%y$YfFCjK^Q4eCgQX{z95!Iu=kCVGzo7}L$isz zi=|Kq?k$SaluDOe*T(=Y4R9x+n*L4t7f$3-P!^Z8->0pZ!@6Pwy;cAM}fc+ z%{Y*?cSZ5mmrsZH`fGPHukUEmO@=}#;87Xfus80btoiJArcBta)^N0HJ3-`nn%JX9 zoc;4fU6V$u)^LqS7iA0N#2m)?b8fD31{E$G5$Vj3S-Ppc+7_=z_JheLg>|XDZxmk7 z+ck6WLV4;G$tw{_XVic12dO61DpIS}n_3WiOpF#;iQ~I{QHc)=HR~75(f!&~nTh8Z1F`=6^0spN>@-Z9a|@;(6qi+%$}!?CHBLYs}0hx7M%A*MUZ2C_tK z4<$Qp>Jj%{P$r<&vMT~&XSDFr zX{}55$l!~1k>WenSTyS#kc~f?Y(V-+1#Klzaf6)8=5pK)Hj`VJ4WE!hNW36{G{2&y z&`+log!*?gbS5+qzRK}Mxe|!=YR?@&yl489{%tVIG~&kqCZJP~Pqo5|aeRU{|HH;2 z8@Nh165uwVLXnU_yhCt#W-3uB{IHm1OGdX67L!$JO{ohR79;F&uD-Syj7kf@Ommy@ zyK~EfvN17j)}Gp+8Ie$TE17$}(+9uOpe0Js`!V?s;|PBr`^x;fZzLe73c}?o1pyNU znr@?AiTdZ*vPQk79Lw=+d<6YA2jtqJyP+*AXQ&4(%Zd8;+V$2C@g#FGTXnv^cPFmr z2G52FJr&=7nU#-e?koP1NoFSXQHOjg>f(+>w&dgu^74kg6`of2Tlc?w#bRT#Y^)NG zO848vG$Bsp=qw|R%T4m>%n$kta4XsCA2{M0t)%Dz=I$%HBSNQ1q0H=AgRK^G)PCJM zUW44i0eO+lg6QnIn+VsZ|Bms0;|S#fZS0tLEj@R=fy^(NxIy@@gw>pTG8M zyV0DnD2a8HbE0A9bbS%N|K$^Kp&cwM!QMl>#WH839d6qt5U?h=OL<%VdQqD?7NfRU z8#bdxI(m~qPU#G&1Pe7(>9t$nYp2MY>(u{<&puCW=>1HPxbIC;MEeKaWR}73zKb6e zrrbr-9uU@A7RieZUfJIkuS?n1q6Xcmg3P^Xn2tQF#WY20gzOFnRWuF>;{-iVn8 z!lC%&rkiuKeSLc`DD=>>)+Yg5k{IXrl+S{0|8@NR3B|Xc3PkEXqi*W)cEsXng7(j1 z+kix8#XR?u5@)!F8UvvxQK6E)%V-i^QdO=*i^U_)jBPP0UQqS>I4ddDN+}+JNmiRB zZZAy^LrOX^G(qdBdOIcxlrpAJ60hl7xqYras`6qG%AVVx-|_Fvm;KfLi;eirS&aLq zD&KVCgi6J%2LIn2@?zsUrKksu*2_8Cn4T~jWFe4rhBzf*?ho=&>Pg=v8*0@^&!{Hb z2{_C#0R76RNk&k?{hHp>*QIUq0hkSMuSYX+a+S2a4_!RB8GpqH=6fGe`*)qwX19G1 z1#r`7oh|a!w_vAj?soN>9WKIv3!f4Kl;rA~Ub%IM%0tKT79mmyd^2CeadB5o-}7L| zMP9lohq2dco29M5T8wQStcBw_Fqer*mxw{og`2Gsd5i`=mfcem;&a(VZ0>}$seyIx z>us?b6D>|)8(565CrIv8nxyrf-ER3CX_q(W3J(p(%;H%e>@R$=1Ns^m%WeM#%i(M5 zC$rkHs?%$4w7Uq{6aLipKL^D0n=7b$*KGq~Pk?gpB1fB)4j*6gT8lJ{IQQMB6--8b z9DxL_PGCaqW`#DIVu$<|guZyROo=oL6jH|90Ca4A3ngc4zgPO!hF_y<0~e-jMW^7C zx(FZeE!G-&JOqrOMCyBXbaZYFc`p|y?JA<+*RXfAtpeA(9Ep+f*x_mJTkaQgL2J1t zNEmc_BUq8=KwZU{8;R!gNP+K}E|3qO>R+w9W_8Qx=;*ND*hA86xA<~SvNg~21U&=g zakP7;-ApdiXPiCjYvxNQMf~J`)1P_b`HSJZOZjpqqm-r?Q)}ZPR9AuzNbYvzzHXN` za$;dz5^d}ieSyAq_+_Bs$o}{*%iigZdhuPhU`%E)KqaCN$o*cn?Xou6o6ExrEb_q& z8pg7>UT($0R?% zV>tg-yR=MZy~GakiQ1PXyC?(vBEY26s>~{d6FQ?n1sdhm!d0o2Eh&OVzOO#xCJBSR z4+L$U?`8Rxg*JE1jIRr;D?s`nm(FzOw{50_G*3+@DydaMqMhN#cEG;Vd$<16Kq9-SyPg8`xeA-aQDRH7#!!kxo!LCZ2~chs(qpNAg7BJko z?B0lRB^!^HJsxvV>9DU#78Lfqtr-I$kYCCbPTn9uGCE$SQ`A?-2qo@@V1EWC_%eL zO&;dr|G#^!fbj@ni#uIvM8};n6&oU>$iy8q{%qR-b3TZ)S8Zker>=@}*kh46yOO@i zY9S)e;z4~+UoYU8lir@5&ysWz$9WXYzn7uoRG)xi;j0w`yl_}qWPr5-~D^Z+-sa=!G1 zu54cWaVitsE$!&~7|N(Y&0_MwjjV-Tk}i|*iwpwMYqK*_*V}EI$~(}?oSxf~wiS_l zni(K&@j3GNhy!Fo^-EHZ4GXT-eB~&chFSNzVX&C3G8vBbF4N^{w3$I<(5@F7wcyb0 zSao6a#4sL-1wA0{ajC<8ke?v-=YY&l3=f((ifVl!1FY~N5rkAIh}0_VvzBU-1&0Zd z_NX*q_s-FD&fa8_c8xB5YOO{L>3Em%`*iQY$uL7vHTExAJC~RvMd~;ap;Hn@q&wbb zd&0WhuHC?-m9*{^8UyKzZ(9ZadkAB9*d|LNl-?$ek{U^XJtn!qjZ=U4IEdXGe5A0aFxJ<@WG3XAO8$VTOpZ-JuQ<+sP%tG>|2X_hU z7ehZ*ne>&)mHlGZQYLhMDzwHa=QKFmo<%rmbDHq!{;*LS=CM+LF>sq-bBHsgG@=^T z0uj!G&9UkAAQca-&Z6!%8P2UAMYc+$DO6Io)r_?5Qu06d+m%JQB-}Am*IG2F(RBCz zhR|_$w)Rud0y8!F;$iz}Yy9{pz#s|31Qx{d5qq^-lurs@w?;Eq;I6)ppkBjs z#~~l5HknttmSAm|ie=Ex;|VyhuK`n32xX+ImynQ9$I3$htDiPF215NQ6aWR-?gMVl z$9~Z$z8H)iz>wQ_ZV%Gw5s)=cSIDxGz?Y_V-<(F*>@tCdMd4xsaL*uLkA|SzFs&S> z)+LX&^@47JsoF*3XoL9*-e@X^WW^zeHI2$GwbYx0$2ODhZ%ua$?)PNIrRtQ|o#3+~ zp5a|_ts~a@;G@+NY*YCxb6K>t>9(RJ<|^5E$~4h3rl+WYC@WQ9XPcqz?LhqGdNRND zZL-obpR?1G>WojpdY=GqIwX*A)e{Ct{SsgA+=Y?MN$4`0Bm>}fyvJPYGJpdzzF#!l zeyQo1{w@`bz(%!M;ks7aPUijm`b1o9bATtC!OJn_-b`sVQylXtFiDkj7^8}gd( z<>;Zcou0Z-TqXT5d#8}ewz#l6?%n1Ieo9-6MCf_py0@IBro5Zk;Db!oz20?YDapv) zhU>IBc5o)uxxE^Wq;o^_IPCSMR#*~%MDMMKSl7ni1QRRuu|y)y-9sboK!IFV`<;8j z_ZFXUhJoI%UZI^Ml|lv(VHE=&i%H5s>{sXu$EM?r)=Oa{7IlHK;xZ|t_qZ+YH`hI= zdt*JmbvzXt-!TeKC_9cD2Q&KzE?qe^zKWnt=9qg{fEZ<_WSep8iom8Tn&aYVW7u|I zk-~mkoJO?V>o4NPjk4-Bu#>CDd=h7tFqfrJ!RrLs*OJbLd;|aDvi-x?DM?;+-gk3% zr{OFcyhjSmQsH?)osXB6CI&vlr)w?v`9qa@9lIE@!^+nsSA`M_yTh6xMDl7(8s(iJ+vSmX>j1mHDN0 zy#%*R?`^hg>(l#(>-}^Utshw3kVWe0n3;O1#T*tWm^CXsJ?0bs5(czh@nQ3Efa&hm zYh0{Q7UDUt@mTXlTI3r-0oZq@&R3|sS<2c|7lJc>InDU@7HZ`|1~X45Y9_e~YxcE> z@|{V+k@&$DK&XW33aT_v`yY5^Gx>RF7rCb`gx&g;%_jQ1IsMMo+oDBmF=tFra9Gf8 z@aJ6O*JKnYt$0Nj+;&4o|#DGl|w{?u)E&|**)T9Ylfo-Lw(TPHoxBplL z??H3z!*2d$+_k$MX}emZbA02IVoG7N`xfOTHY6HY63N1a_6+=03drzxqw5^XgTKAn z8!7tmO!f!EuMlBgaGxOq+pJ&T zAb($SmqK46K51I3yJS^R^dGS1tN70QjJ-GiQxfp_Z*?RJi!A*5ybB{LECcV+U^Ov3&u^|TY^bH1hUI2YE8vWkPfR(Ef3*n8SZ z(zgh+ZBcEHS8KRtTo|-#sZAMD2@jBcM26c%uWrp0yWStpl%i|18+|)P`*#Wd=>%@* z;C%9~uMa}8taW&oM>$s1@+NS*C%&AG0mNATNy90ou?fPp86vfS9 zb>fK*E&i%NR%xA=(eF;zrYY;&;oS4&19(Xh8}zJ0!(#^qB?Z;X zq~?y=kuYfjk6UWX5^6YN>x6N6pWwzw!p03$9}g)Zsze6eF!QY<(t7XUa_=PaBp#W) z(pd~~vel8Fu7o`uzGuRefB5_V4NZk|_!x{7{&si1)QacZ``VRU;wP(+##woFPz;b0%7t7QFI?5$-xyLoAs&O8x z{`!xeTowmm&6W@`u)SBfUphWsblfjHjvrz?seQlMzH`;f5Mrg(#RGdw9O(an5RY_& zj^(muu2L_&?+dyRwlFt`fru^Fktmop?H1)&;2m4x2>gX8<@J;(iZguAJdN=E-(O&{ z?xZckua^s7&h?Iu@~P2l$nM8V5FSdcHVS-37F{m@Bd7KX8C^OA;S)_+C1n4lsJ>nUwz(iYGj$bbyv8L^w6*TRf8 z0b&kUAt0(59>QNPYbd zvRL}QW<&6b?JBL;cTKc0*Ldir27lGc@{34KC!FJxd(Oq`@6#$zT|+Pm6{wbnU$U!5 ziUJpkyZQUsA;2x|4D>&5v~G}aJ9+dQMhU24arx362W=w7CNw|-H*EG&>g>igoJOtJ z?o^F-r|WVy37y1f5D}Y^dp;L|I`LWAv2eV*)WoOxW&Gr`LQ-AuD1OejItisrbHKTD zX)+wS_$R%Ry=SX0I?tM;Rdqg51(3NIy{eoztyPi~PGAkst_Wg5Fh6>uI5H%^A$61Rv$ruQb*_o8Bq{lOey$@e2DRFUb3PLJ6R`ztCNA zv$^ub+**`bMMdLqLoqBh*ewwy?d_!>)YUi)Ne>2(I$IWdTN4zn>Bi#oV6x%RVO9Lz z``!iLl&hrq;qG`l$aT#JyTgOOB8XUh>F-7~(8Jexg}hvM`SS2Kyd-&~hPPuPnEJHR zdLd#;4XkR{IFg)B`pph8b++(LN}>{m%LCTDkq94ti1MMD<8Lr!NVv7RoG5ChNR+5m zB?cdi8DQ}9><6=7Z84s*;-_wn5;U3zx}HrECROPVY^uquILnNAJ-ljEc(HWGoRBZ$-z`&|XqSjc6t;TRx4!Dr*mtHU%$3p6KfoJ<& zhL{7zFf6+%iB^W~|K(5I# zE0N-Y&|?BVh(FNhC@^$Fq*g2vhgr`;I#R!H+_9K=OYk5b=VTHMB3|Z_3oT#fve|0 zROYuUMz!UU{Iy1y;HLb`d5R;thNXkt^AT4`bkr)}0Rmx)RqOSY_=Q9nN<}>`i8m<7 zfT@C{9q@cZ*rmTwtk`vt0H{zB71?~33elTuCjYhb^-l@|6=WeF^iMgd+vcM-s>^`V zpkD~}@a}_!uO^aENm6|?Fw-CG>;h8Xsrgzlh1b){XNScWcG<)r`3yb=W&HS1iTh{w zs~FY-T)!Z*z(H?{N+Os8#O3EBlQW@9veia+zAy|rf7h$dC)tf{XpZcYoJ4P;w|y8O zBqR!iE)iT-&?jLVT`8bgU+ig>4O`V$D3^xDB3V)FuAa*5UG@RW;d zi_hw#;pTlPApSOw4@VPrJM-yiAkiH#E+lx8|3hwqZfDu6)&{d-;QdG;?_=0RqRZX` zJ*p5W3wG!vI13z;8yFJx4yMjY+#a|Sk9ipuhNOLi|KR>6*4OG(y za&!_%+R1?+D5f_M=`GV?+f|j0@8<1^?={SB2A``_LM)X+7Vc(cP$bFCihvkpVO4Gjsr(r`3CtTG4+-!D0SaQMSwHT zq-A0yB7=`kBFUWEw!lf*2FdrnqGK#xhfY^Jy(*ui@LF4VWha_-CGvn-O-Djh4Ag12~rp)9ajBUEKdoM4kda%-@9;N@}Md(W~JSssFp+$Jd4p;UAEbIG)##G~#kP*yn*PEA^4 zZg&-r-7@4=lyJ$FbdYoF>1JqJ8}0Oj&}@1^c8qlIpZ_r(Sfpa}jgSsTq%(1N_YR)S zoi&{Ud&n&g6U342zH~ruXT2DnBloIZXT(Jb*4UT_elIusxcq2q9!@tl<1NdlpcJD;fflA1;e@ zkZ?T4^W;TzjmZ<%M`mMrzpaey(ZxJbR{|b8G0!kUWi9t)MsJS>mbov0y%8RJ?4`K( z5&1?K-0(BVd~dY_l{T@gn7!vHWsJA)xsP3C(>PQqTWo@2jZ^}qKMtx$@ozIsC~RTL z3zTlH_il-7UnC(1R_-K@8dX}f``sC!-^5h z=d6yacfWFXH}CTT^zv!^v&o>OF+V7I#4&atLP1TXT{~Q_h5w#hCd|l_85B9wQ{;u0 zQu(d$n3S|i(CgsZ=C-(UeCq4Ol(N0kv7J=ScSRW&;=M8@#?6vKRq#T>8P;L{!fP@d z6Hpt*)r?LleP5qzmT#pyWEr@Qz%S``wL3~9nMtted{;a98{1upJ2TT1eKszus30$i z)p}F)k$LN94@jTdBaEMZwcP}%)$IWlPsrN;Cq<^*M}zE`t4$4)%CL;OEOZ5ohlKV& zQN3`eDy1_e+q+~jLt=>l)`rGow?pf=nbV00p^e-^$S>=KFjXBmN5^EPjAa- z@G}r75B5`1OK$VJaaFGWLREczJYuT(G6;S+H1w!R|8V9qUdNlYgIS)4tTQoh;4KHF z3HvTpV=E^z=t$IT^|Lgxhhe9_OHe}FpQshMIhu|BL?urU6u+m{Wo06H|H--z+P>q8 z{AqM^gTBhXSpUe2HEG+b1@I0|HjU!9nVR#QO_T~?(rETAMA+%4hH@Q6R)W*${}e zmV`%T)dI*zS61I_wbQwtE_A)v3_Mf$bxS%EbN*XUtBx_LIa|g1SQg z0$T6osuV-&)x)8Ms(T*!P&rr@H37;@vy};0-in4yQ22r1XMGaho(DMIBdW#XnWV?L6#Elx?o8d#WWFqR zpHC*E@j-~#%ysP2Wtrk z)JA!FvRY!P&$AHfZ6~8j)yt(nAf+zmecgd1Trx8Uz+-&V-JYPI-66~&UpOW z2K>5og^r{zYys718jBIE^?F-?$L-lcD7Ud!#P1yFpJq=3)=L8_;aCiPMD|&Vp|y5_ zPYa6Y#jWk^x?=>yDnK#jk9DPDH#+_J_;QCnlWUFSn)~NY80r|l>+Q_DRCjR%|1pz< zl@*+xMQ{2-UUpALfAA%PWXlMK(uY`fQE-HoU_(4&rrmjY&gu49E0tMbAw&R&MJ8Ko zwQ#1yhzgR-l84o6G!U5sGfqXWFNF2;4Ya>fh@QZtl8K1Tc|~F~TdH==d@Bmk`#oZs z@;YyHYokO}!!A4@rMHhsP?Za@c*+^fk(689=x`oQYd%vaT|zvvUb_J(vW3Z90)fK?v5CwdjXybnf;&w3CJQ zfcsHP^udu7HuJr;jF}FDUkHxX-;#fKzrdN_jkkpmF7Tpc!l$q)$kVE~HlsLCd}D)Z zk0)V@RPM6zX5dI;aiz@QcaKeNuqhNLj$a6W#}w(nghsg0KBu~yu2sz434g*t#xYCj zb_{a>&!k*kOc|+EW)29%GkCqj{J+abXrr|Ve#sVp*_{EB+aR$N;fasYghGj*!Z>=m z%60X_1*vPW{Z3C>l@C6d6a%3(sGI6l`f_)~tG!dyw|KBi7SlIvj5C$ae9{@b4Okgz zJ`XW-(c1wN!B}7)G1JN_@0mT=VwWLw|>mYs0fe%d|z>V5z#HSlJ2T zJYs|i(N|bJJk=eo$>l`5_3AH*H*l(X%g&AT>mA-)7PIA;1wf3u%nRphd+404b~FcS z!$f^n?E8*Kl`$)xlAa{fHSSF=Wuksch}yd-yQj$D{du#m(XTVt%ck)_MDjizI$rDD zf&2$V?D(S{OC@-UMlw51?jBd$Rq@f(1AE<8OIXW6eaNe8!V|k1RL8-5AYcEd5 z^WQe*7@Y}@-!?*jiAyJ^6zArRO>FS^*_^Z~N0svwk7+pbGhqa6mp{}UjHFD@6fZU@ zNs$g~AXI~&H&%bD*5sxLIP-59_kq?rJY6Bb7{HixS|f41!UKcw+yonof#8)0aH;4X ziqrNVP%7{D)aV!y;7HH);u>c@mvh}-40`Cl5MlG{kH9N@Hla(r>f;CM#OJP4?;VMb z{;-q>?|+W#7tc2!tKHiw-A#KnGsC~wJkNBA^Jw+_3ik1$h`5Ajj{mwI$xGVCZoS)( z>@#Ox)cMaEx4N|z!G454X%VDfCczLrEJpDs>fCW}Oeug8Iro!jX7s0pY6}5@)~66!Rc1E(K6F_L zf(;;`A@@3EeGpw(!J`k(Bp>`Nx&hB*JOElNv7}n+@)a6Q7Mg}L&w-r6J6TQoSeK44jFcrE%~ut@)qn{s1E2ny*&FPv z>3J&kwjv*N+^sn>9sBhKXK_u9r}-8ZR-}56AcG9R%wB()A?YmPc7bVH9>X>4)7~5K zgG3)XIo0_~&dz;AOXMr68aiU8zAF+#;?5i)u?%%oyQDygMG58TK|NklSog6sh1~%x z*5+p$-q(72XI>E)rAG*U9c{N$p`u+Xz=QIGT3R@wW`zAfx^?ICl%VZCzJ1``(R}pU&^;r; z#!_%>2ZkKZmL|Bpm{ihjKD)Bsa!)?Bfx1thL=m3>rnT`vM2%K0XI$t_H@q`cg)(fE z6FM%e6%Bh*k<#f-V=3U@Y>2eiwIxOC)yi z{#`90t9Lt)IQ%F(h7Kbk3b;E0a($|HVQ4ls>b>zS1vno8DTd{g#q?>PzLz!$PXHAh zR~3~2HVkb%ULc6_;EhJH{>Oii0onsOn;w@hv#~*K&aT|g;)DpIJ5)) zJmP!-)lj9y;nrPrJp`QI1wWmy0M?J}##6e*i}kQT=jYVq2aSjn5^M-~++_p4-O2iv z=^OTU+E(J(-+vORHaclRvV^)4J>*h2Q#M0!Hzy7$?>i{DuNcx|G^hJD-4KArL8 z$_!r7@BOS}J%EBQn$T4)doWcno$ELeA{@^)Kd1?OqfG9JhNt@J-An6Rabp4fN`u{G zuDH|rg0RKX(n#v|>0y9Z2aLy5ZO{-@;o7codIO&yD*+xmNNb0A9(gWoY1**sf%l47DrhL~3A7>QO> zalFiF+EhNzEp&4d+eBKd$%5Ke6lyCFObdi?UH4;~avJRxDA}xbh-YC#EJgAD75tAU zLV>i2B~n_o#-Ww8TA73!fY!UvBl7Tn7xCiht8~(?0IkNr$drylw7;jJIpqj^)BNWN z)wI8p=*1)0Ci}qmMdowu?~^y;Z}P0{0xfgQg(v`rMjpDPPf@G$5nhR|rX~*ItDaS1 z$mnszIj6Pp{H>nT&T*D%gM}JH;a~)=sBLFl>?IbY>i^)t@BMFiG+TVQ^%W28Bv$YB zIz3WK=cd?tSM=)@({6;yi`-DRU^Bs9*ZY=&ggpOpln7(P;Xf|B`tK6&52{#32E zQvze+GrRrJ1bY!jX0p%yAE^5JHTu0Ovw<+Jve-C2IotQ~eD2Uq#S3Lqf&x?X?xk(} zIBJzv*#XnQI`H9K$MR+mQIwr8fj1Z~I-9kBSg{ev6J@u3DZHtFJNIcnED0)niI+vr z6tOMxkZkWaHVqD6$@_aM)B}ntNIB-h%QXNVqDZj@N}NWeP^2weD&Jp6KK_@4EedalVc0y z<=v4sJ+zP%(`ZtdU7$LsD53T}z&4Yy;!ZnNbgDI_nHS&Lbl)2gW`c;`l=y)}+kbT_ z1te&*!Y$3%34etRymqhmRbQ9-O5$1cV1aUOn(r<%+{Oiz}({jl%_O83AfIkhZQwspveD7YNbxC zg7?0jl+?E90@7o60TY-0&5X#jkF=?Lim$p;u*I*-b$FiC~|BE1-YBm{8oD999DpuEH zi*f}=`p4KoEjL*eEo;~)JzRQl`eq7x^LC^^V{-TOB0OmXz6jYCdFd>FT<@2`p1w(& zFVUrVvMSs+5WuRdSZp>0Q)J((<_3DNO>k|(XK~w;btJMP>5vG7547-!hROn1Fx zvPj++*W~T*S4o!K{T0-=0L=`L`m=o!IBVi{sYv;HZY z#lX}ThRtM?|G*D^K5OH;@H7o z{sE|ZRtl*#oRYe4`O=wT(uve1{eP!+WDW*S@Kq0G*ydIK0}KnzrqC2&8Gjb~I2342 z`#@s~Fb1-Zp9tVGuS0-5E->w?&Ox!%Hvt)~W>IEAw{|Cbr-Q}W4C+hoU%&Hf&}pVU zQ~tfdUpJsUaNaI9;xM`QIxB{By}FDxU!9#2H8Meq|6pm>|l|HQtNMS9l)^a_M6VNntBWlo)|e z5vEb@5+?Re7yS?a6Y9837$n)4=|Fn)jsW45ICiCeHWS@Z3d`{r(dFo;h39G0+&6)# zThB(j4Uw=X5#2}NFV_*8|5*YgihVcZM@s~0bm|rPU2k{Tm~rsH|_o3me4qRwfi3nzx^s7lnH<^-jX z)LbOL?&jlOpX!`hI0iBS4p-Do!EAr=YDqu7+ss0}@}?JHwP?6DdoMJC#4_5WWHYp1<|w_;r$wk{^2 z=X2;6_ag;btpP#H_Ed_~^*Nu13+ymYh2xU^1LWbI;iTyoH&kjSf(;)YJ0H!)Fn!Mr z4r@=33hkGG=C0PrC+98#2C=j`>-@bf{wnMC{oerA7PMXC4|`LF;_h+2PDXY-r*&m;%%#I%BMiHm4{&c5}1;+R;cFN0M@pRK>N+4 zBE!W^llbd`d{y1)OsrG9KWQdw7*Tdsg1b@iw!2lp7Yx>jpjd*p0>8D6R26oezEZ4JvpaSbA!A^;i~Svp6q<63mrBbk zHS7-)vnNtIANfMG`16-7=)Tp0P#QxB6ciX}R>B>fq-k$78Hn5cA1d>Hr z_kUcUZx}t_(cpQDykP=Hgmq49G4X4V=2I`82ggR4YIAkU8L>;?x(5m8FnzLt0XTbz z6UImL0=mFW%jz`4K;f+tGwPhKsZyE6YR)oEa83)92}-yR>Qk)`NrAHmz!3wG7!_rg z(P2icXQ@$)x}=N7U~fb_)#$S;(u5_rSIq*eVR#gJ5? z$;heFEKkAGI|gq%EinfV=wQYv<~YGQ$_3Kb)VHD|Qp~F{!N&)gF@GzUqHr0>2heR` zR%JryS%7>a>F|Hwv6zVR<||&(nEel| z;sCaD@AMrb>sLa;3bsx7!JxLN%GxTFRfS)x4H#QPgrw_Zdl&H}m4cEpe$a4cN14{D zHK}gms6W?1e@9u_3Wmj691j*(CJ3_&Wcn+2-+C)|Pq`l~1iLI=rM66!_yZVS+85kr zr#0XL(>&5TU$xqeSzey@QP!C4rkOfZU#<$X4!SFzmgc4{QKN#$s zmfh&HyONp=B?mbev(@1qcK5=WO($j*^Af0a@*3xsb1_AJIuq8VRcaTDcgQq7U2cjl z98H(ddvdv|2U1T$K9622|0Ed{ElD|BFE%FJ5-kN3D3MWYFXQU? zEQ;LOuH~^7+_dvLUhT@^v3kKb>`zQJb!Xp#KH;#KanF`0{hVq~pzQHl4Yln1xPIc< zq_Tw->0A~ph>x~VZwl^6{wr>6%N-Ot>T%ZB3N0Cr{5XfNris@2BewlMm2 zAyz()NwO;O7U#&uG_P=HqLBtu>S@MEhAeGsZ zQJna!(`2jEl(|}LY0J&o@U9^xR!imkR1uF*!Le4IWyvD2bS<{&Xl3_+;QX8D1YyQ9 zc_afoK4#-ie>ba89hxdI+wDowb{0tyfUmcFB>WJK+9+v~-oU&G|F)B4V0JWCq1t3G zpu<6wFe#e-Jt7Db(!~FjP#Gk{1N6jC%4(KWX7QItLYt>zz*ulK3=>Tk@{+MvfNaJm7xQO<`DAgBW2gg z?CwtW4wo9k+wHitt{#!Qa&A}o6l3$NQrMAn^eNH84V8)#3C)jjyis|^G6iJv2BULP zRyRT}9q#%=9bZ z``vBV#_n&%vvUIW1CEK6fz*%V_wO4fME*7zbxrrNpqo8wcEkn$BRumYB0tr6eV-J) zAVyiIvfG|e!V@qfAI&WAwe=Tzy$@);+n0xyK)&`?G!y3bTf*$h{fp2Y&+mSD&dw(m z!QIo6^DJiPb`I}B{@S}C1ao_`CJE%L6c&7wiR3(7E{rUe+dJEDAh#34{b2iBGtyz! zy!-h>k9mevTEorJ{Pd#Gm~sllgY(CvItz6emY=vG+#y$Nr!WvWyV_hL8BHW+*du$@ z$dIe%i_wVfca&5)$;<+dvt4o`GJzz3P;ExXmZr6Q_rubEyUKOug>G)HZBOQ?z(EYk z-+5miP*INdBqkx08`Nc@94{ycuLjg>9|~m)nY@tWd&k0UiPJ6Ms5cr8IY{Ghk*Wbn zEoO2HO0)Uy==>3E(yLDcsdJVhqiIdq3WATCZ8cGZe4m)grajGwJ?`Ph>`s0l)AIYC z@;jSPr{Hl}$O8F5H(@*WTLY6fT~#W1>gyijzOr;3P8Y0t=(d(7e~hylYCHM^sc?`_ zIerN~T{{}t$_vWqMDX+gqAKZ!u-s{Way{{% z(S(J(>oXh{*aPh{U$>T!F*vy*3guHuR}~j)P0Sykag$@RGpt6afqWQP@A-O$(Ja1o zw-2w+R|&IoN{~)Pxx=VUUL8KdL1_Vigp@$y2t5CGI33t7ygL+Hcu{z7%(jK}v(bsBX7PR5 zJi>{{Y5Hr0S^Fc_h*QDClYPXtyYJpfo}mIa99*~jR%__On@T%GKcQjqtZ!E8(_X#q z5^vE^KcUFG9=rw8Z_)3F?#jQ}yb<`Z5|^ASg3EkNa){4X4TD^$HGXF|OEzs5MLH+x02YkNX`>671c0MDT=D$@KPWzit1m zL~EP_?bB9k2Do~~WN1u9Vjw;n3d+4asYef#S$f1sI@j@PGf}hNhDZl|300qF&C+O8 zr!J5;uzlqEtW!jwI_y^RmDu5rVuRt@}4qHD{O5mZ^ zN&lj_IV}(@8N&RKrRRWg)=nsdfWAO}Ra;i3U(nj7i^ZMu% zZ;yFT$1&kZE5r8KYlVMJc&%XF-JJ^hMVUADcI)dj2dBWcmqYnR=S1t?bgU^Gfnqe$Ue_ju-*2>j*qz1^Lbv=mLw!(-3|{< z6Xht`p-6F8V3H!_W2-@M>(#8z4Vo6TXhj3REk^?Qi zH+0Un;>^Flg(*A+#rtwVVcdw@awG-8%(w=@Ru*nnR&3*LR?(25+@~@(vm@Xb$Ow|m z4W{*X-w`J33%9mAatlqqT~*1%N;p2DwLdDjYltUYd|cn9 z)p~reWx5sB{q2K}j5EWA%mh1njV^7G>jwLD4>#<7%IgDzwcGFG+e);Ych%25xRc1jjb@YpqTo*5#OB*mdIPDh2b*8i(cMQXV=rza6vSk1q~bqAuTmqZBQdc5`qFWx z68pa4@%1<^hf0fq&tF?-Ox{{OS{*C)cE;FAcj&8K9jFW<=J!?2)0QeF9n7Tu^3HMK zMudxB{YQgV)5bPy8!jV22v!@+5`QW-um$Dewh@W^(?@VZ=c93lJEoUknL{&1Vc(+S z$e?7emUyn;h2yxq9DcjS1G|+n3)oQWTBRsX9y8p?O9kRoE$P5)kIDRcJN`=SEhG|luL6KBL#oy(6Rjk;&b2ZWNV=1X2E^hf0N<#gmc zR_PzF2n)EQT&a@8r*xP(gBxB?~cp0RQv)XPE zpIp#6qCltWc0xO@DG1Aa%T}a;@2k!vwARr;$qo$M{Pnv_GVk)5nFMKd=Gd8$*n%C& z6L`nsd!Q9kpV zctBu*?HmgsB_6$6IZu?*e1o2SGOZSnZrvr%Q9gL0{MnWF9g(nZ;NYc}1DUUR$!eU#CW&OC{R8}ql+K5So^ygYt!Y}#`aVugpsjv2_^GAWmGwVkeoOzvXcutClu&Zh=Vk=l-n?_ zR5jg?Jx#2--tLRV8Fq`CbRGK-#GPqWqz^_(VVHa@H_KH7lpQ~N83g((K7AX|MQ?G) zqZT#Uj*i32QuyReUY82Gj8E|OOZWaZbqxT zLju+;EmtXV7+T*32Hd0RA1HrsEYC}U%c#?ig{_dmJ2$&9b?=U{Z)di^Jrk9~Pm`v~ z#j;X-w)0Hnf_6TA=~ALZJ$mVyr7xUb=8GDaJTG$Tu~-_+CnaQ6N&q>ZvKuo;Fj-wQ zmlI}a=RM}6I{)AmVQM{W79G&WA?_wSeS~VBx;(e#M7k`c5q?SLlK?;dyE&?YN%y|g z8BROMbQQU@rP>ZA7(^xRV~4|^i6^!x)mbLA7=DurNwBA{m6)w4Ii4X_m6mr^Ya_jb z_l}h)wg={*4JF=mNakGIw{ShyF%pDxH$xM7B`A$fdK-9-WjZzzXODLsyOPgVw}{WG z;5W~DtT(J_`7Pe5#2wZc_~EtYbGNXw824IN#$eM~6gUkg2J##CZ^-hu=J6%nqcakF zyH##89}z=NXC%uzO)b|I6LvryVk{eZN9Q#(Nl50>E_r%%^Y>dIwJ5!hPNtJDZokB3 z&mxY;l==h#1BLfLU~F3)+C>P6vBy#J>FJ*N^t4se7dSoA<2TaeGd9`e4Z-HU+s|td z-cteNji5BvhJLdP4x(=f+B}=&GhVGeAmrU(O@Yqdjo=LW0-gO&RK-PX5-fvetzvqFrsrM}>8Zc~-h>Bc;(o$5aHIH->}@vxN(i-aGLL3ZnL_1?WE1%-H}o-72W*R48c(NooqBe?*Op`UL2j^m372TiGug| zXC>}VZR^(LbB-=~bjMXvOE<*InS;;70+-uX2~u~OoDGxMnl~AHp7w4;_wPSW<%EXg z)t&5WIUmeL&&kS-%dkl`?W3bnO-7;Ar9yG9(aR?+sNO)Epwl12gLaRU7~@_DfEs5> z&zr|C?r`f7;dJfacmKu%(aqu;KiOj$uW<-j3%GL6U2v14b-;|h@zzfBm+JEMCq%QZ z_gd;61qU#+Uf@1s%b|Sy`J@?_ir(Mblb!(2RswLI9tP+vbprzg0F) zPE)Gn$SjA3>Z1tq)0%l0#3~V5&Sz{qNMju59O=77Mk&F&9Ii(kUC1GMWwTMXhI*!G zrds_~7mW7rGnQ2VG!;ON(Lx(bfh6><9IXb;)}k#$(>BVzG_~sRp=aqc zZ&_P3#AkDGqir+WFY@({rkd%#e#$mzI}L%=IX2b z(>U}IpIACR(kyjK&n;G$H_VYXl)>a>;9r(i0S}bk_~r^fa~#&b%Urz|db2{@L8BX} zi@6zD=(1TVa5^y+FMPT-MJjyCGEFKP+QRL^L}PhK;Xx^A&C$l~^{jebLXg?MnRj)= zOrs;GpoNehfB!u^iYLqZAPe`Ncp^6eyTWdXsI*vxF!`krP6 zIYR1aC|ciCubXrrutN)Lxz%;Y>v=o)5>Och$E>L=cc(jSLM$=Jq3HIuck~MJx!-O~ zw}kT@B(Ppz@(+qi_BeHN-sU25Q?A;qoEl2$@2c`q|kdD z>&(K_g8=_yg@h~V)GRpA>(&P@R0_P2M;)O(Hm+@_k#iMHXEG`WIH>aBbQLM0B@y9E z8gH-9SnFFqk*Ue+OchP=r9A%LJmcxM^l{q%vFhN{_%BWg*`kA?@waHGReT`6?6Y=I zhZ~c8)~_S*ot9cOJ~xCi(8bbws6#a#UAIkdw+-!pZ6p*HT;YLoXhYNrS&W%zrNSNw zDLYNQAxaqRz7WvV*z6rn7bfG2%l?>s%3qVs_||~wZEYescSIR#uc6Kb_Qb(7(1&~@K21!S$HEiBG*VXcPi#{ zY}cwJapA*Z_|R12NI1`#ZjR{uTU(afGi2`wIK>ZOUR?wp`+E@Oim*m&r(n=4oWlC#nj!GpX7ga-U` z31_>p7(`L#gAg z)kQKAz87~$!wd%;uAiN*??)c`P=9Wy^WJok$}F)lCQq~pwnW#sBB4_*Hg)DowrDO9 z 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 Date: Fri, 19 Apr 2024 16:46:18 +0530 Subject: [PATCH 6/9] spelling fix "throughput" --- .../existing-implementations/activity-tracking/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build-with-powerloom/use-cases/existing-implementations/activity-tracking/index.md b/docs/build-with-powerloom/use-cases/existing-implementations/activity-tracking/index.md index 14c2029..fc686c0 100644 --- a/docs/build-with-powerloom/use-cases/existing-implementations/activity-tracking/index.md +++ b/docs/build-with-powerloom/use-cases/existing-implementations/activity-tracking/index.md @@ -42,7 +42,7 @@ The `compute` function is the main part where we create and process snapshots. I https://github.com/PowerLoom/pooler/blob/main/snapshotter/utils/models/message_models.py#L46-L50 ``` -The Infrastructure is scalable enough to handle high throughtput chains like ZkEvm in close to real time even with `Epoch` size of 1 block. +The Infrastructure is scalable enough to handle high throughput chains like ZkEvm in close to real time even with `Epoch` size of 1 block. The `BungeeBridgeProcessor` then goes through all preloaded block transactions, filters out, and then generates relevant snapshots for wallet addresses that received funds from the Bungee Bridge refuel contract during that epoch. From 4433a1bc997836f6df93219784eb26f180f8f5bd Mon Sep 17 00:00:00 2001 From: KANIKA MISHRA Date: Fri, 19 Apr 2024 16:55:52 +0530 Subject: [PATCH 7/9] Update Glossary.md punctuations --- docs/build-with-powerloom/devnet/Glossary.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build-with-powerloom/devnet/Glossary.md b/docs/build-with-powerloom/devnet/Glossary.md index fa4dc65..987553e 100644 --- a/docs/build-with-powerloom/devnet/Glossary.md +++ b/docs/build-with-powerloom/devnet/Glossary.md @@ -24,7 +24,7 @@ Extracting data from the blockchain state and generating the snapshot can be com ### Prost Chain -The "Prost Chain" refers to the foundational blockchain infrastructure the Powerloom Network utilizes, serving as the anchor chain for storing proofs. The Prost Chain also coordinates activity between different categories of peers on the network. For, e.g., it coordinates consensus between snapshots to finalize snapshots per epoch; it also acts as the distribution point for releasing epochs. +The "Prost Chain" refers to the foundational blockchain infrastructure the Powerloom Network utilizes, serving as the anchor chain for storing proofs. The Prost Chain also coordinates activity between different categories of peers on the network. For example, it coordinates consensus between snapshots to finalize snapshots per epoch; it also acts as the distribution point for releasing epochs. ### Protocol State (on Prost Chain) From 14b13503cb4e416e25bf918c7b39a50c7132e1c0 Mon Sep 17 00:00:00 2001 From: anomit ghosh Date: Sat, 20 Apr 2024 11:52:09 +0530 Subject: [PATCH 8/9] fix: typo in dir name --- docs/build-with-powerloom/devnet/getting-started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build-with-powerloom/devnet/getting-started.md b/docs/build-with-powerloom/devnet/getting-started.md index 4657099..3076a1e 100644 --- a/docs/build-with-powerloom/devnet/getting-started.md +++ b/docs/build-with-powerloom/devnet/getting-started.md @@ -80,13 +80,13 @@ Follow the process outlined below to ensure a smooth setup #### Step 1: Clone the Snapshotter Deploy Repository -Clone the repository against the respective branch (main by default). Open the terminal and run the below command to clone the deploy repo in a directory named `powerloom-deploy`. +Clone the repository against the respective branch (main by default). Open the terminal and run the below command to clone the deploy repo in a directory named `powerloom_deploy`. ```bash git clone https://github.com/PowerLoom/deploy.git --single-branch powerloom_deploy --branch devnet && cd powerloom_deploy ``` -The above command itself navigates you to the Repository Directory `powerloom-deploy` +The above command itself navigates you to the Repository Directory `powerloom_deploy` #### Step 2: Configure the environment variables From 2a6397c85c6a58550e3c741f4a4126defe741c9e Mon Sep 17 00:00:00 2001 From: anomit ghosh Date: Sat, 20 Apr 2024 12:13:06 +0530 Subject: [PATCH 9/9] chore: fix order --- docs/build-with-powerloom/devnet/Glossary.md | 6 +++++- docs/build-with-powerloom/devnet/faq.md | 5 ----- docs/build-with-powerloom/devnet/getting-started.md | 3 ++- .../devnet/troubleshooting-monitoring.md | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) delete mode 100644 docs/build-with-powerloom/devnet/faq.md diff --git a/docs/build-with-powerloom/devnet/Glossary.md b/docs/build-with-powerloom/devnet/Glossary.md index 987553e..3cfa0c8 100644 --- a/docs/build-with-powerloom/devnet/Glossary.md +++ b/docs/build-with-powerloom/devnet/Glossary.md @@ -1,4 +1,8 @@ -Key terms, concepts, and acronyms used in Powerloom's Devnet +--- +sidebar_position: 3 +--- + +## Key terms, concepts, and acronyms used in Powerloom's Devnet --- diff --git a/docs/build-with-powerloom/devnet/faq.md b/docs/build-with-powerloom/devnet/faq.md deleted file mode 100644 index c8e0ae6..0000000 --- a/docs/build-with-powerloom/devnet/faq.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -sidebar_position: 4 ---- - -# Frequently Asked Questions diff --git a/docs/build-with-powerloom/devnet/getting-started.md b/docs/build-with-powerloom/devnet/getting-started.md index 3076a1e..7b7dcd1 100644 --- a/docs/build-with-powerloom/devnet/getting-started.md +++ b/docs/build-with-powerloom/devnet/getting-started.md @@ -219,7 +219,8 @@ Private Key: - **Set Up Linux User Account:** - In the newly opened powershell console, set up a new user account by entering a username and password. -### Granting Docker Permissions[](https://docs.powerloom.io/docs/build-with-powerloom/snapshotter-node/lite-node/getting-started?current-os=win&setup-type=docker-setup-windows#granting-docker-permissions) +### Granting Docker Permissions + - **Modify Docker Group Permissions:** - To grant Docker the necessary permissions, add your user to the Docker group with this command: diff --git a/docs/build-with-powerloom/devnet/troubleshooting-monitoring.md b/docs/build-with-powerloom/devnet/troubleshooting-monitoring.md index 3430124..f80c4c7 100644 --- a/docs/build-with-powerloom/devnet/troubleshooting-monitoring.md +++ b/docs/build-with-powerloom/devnet/troubleshooting-monitoring.md @@ -1,5 +1,5 @@ --- -sidebar_position: 3 +sidebar_position: 2 --- # Troubleshooting and Monitoring